* Added new command wrapper, abstracts static and dynamic commands - All uses of the `Command` are replaced with either `AppCommand`, for a command that is static to the scope of the application, or a reference to an ICommand (specifically, an `EnumCommand<AppCommand>()` instance), which provides the abstract wrapper. - Functionality seems intact. - Next step is to have the MainViewModel add the per-shell commands via SettingsService.CreateShellKeyboardShortcuts(), and have the SettingsService.ParseCommandString() function parse the command strings passed around properly. - Finally, add the keyboard chord input to each shell's settings page. * First kick at adding a new terminal keyboard command. - It isn't presented anywhere, but references to keybindings should be using the ICommand key as their identifier for recognizing anything, and when xterm passes back a keyboard command event, the SettingsService is asked to convert the string into an ICommand. * Renaming ICommand to Command. It's not longer an interface, so this makes more sense. * Renaming back to Command, and new class is AbstractCommand. Going to simplify the PR diff considerably. * Shortcuts for default shells work. Need to get the shell profile edit UI elements working. * Added keyboard shortcut UI elements to shell profile pages. * New and deleted shell profiles propagate to all terminal views. * A bit of cleanup. * Camel-casing command text to fix Ctrl+C and copy behaviour. * Fixed failing test. The new on disk store uses a .ToString(), not the Enum description, since the command isn't an Enum, it's a class now in general, and those semantics make more sense. * Adding default value for null keybindings in shell profiles. * Merge branch 'shell_commands' of https://github.com/Riebart/FluentTerminal into pr/85 Improved default value for keybinding property * Renamed KeyBinding collection to KeyBindings * Use strings as Command parameter of KeyBinding * Added missing Commands to keyBindings of default shellProfiles * fix build and unit tests after merge with master * improve UI * Split OnShellProfileCollectionChanged event
81 lines
2.9 KiB
C#
81 lines
2.9 KiB
C#
using AutoFixture;
|
|
using FluentAssertions;
|
|
using FluentTerminal.App.Services.Implementation;
|
|
using FluentTerminal.Models.Enums;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using Xunit;
|
|
|
|
namespace FluentTerminal.App.Services.Test
|
|
{
|
|
public class KeyboardCommandServiceTests
|
|
{
|
|
private readonly Fixture _fixture;
|
|
|
|
public KeyboardCommandServiceTests()
|
|
{
|
|
_fixture = new Fixture();
|
|
}
|
|
|
|
[Fact]
|
|
public void RegisterCommandHandler_HandlerIsNull_ThrowsArgumentNullException()
|
|
{
|
|
var command = ((Command)new Random().Next(1, Enum.GetValues(typeof(Command)).Length)).ToString();
|
|
Action handler = null;
|
|
var keyboardCommandService = new KeyboardCommandService();
|
|
|
|
Action invoke = () => keyboardCommandService.RegisterCommandHandler(command, handler);
|
|
|
|
invoke.Should().Throw<ArgumentNullException>().And.ParamName.Should().Be("handler");
|
|
}
|
|
|
|
[Fact]
|
|
public void RegisterCommandHandler_CommandAlreadyRegisted_ThrowsInvalidOperationException()
|
|
{
|
|
var command = ((Command)new Random().Next(1, Enum.GetValues(typeof(Command)).Length)).ToString();
|
|
var handler = _fixture.Create<Action>();
|
|
var keyboardCommandService = new KeyboardCommandService();
|
|
keyboardCommandService.RegisterCommandHandler(command, handler);
|
|
|
|
Action invoke = () => keyboardCommandService.RegisterCommandHandler(command, handler);
|
|
|
|
invoke.Should().Throw<InvalidOperationException>();
|
|
}
|
|
|
|
[Fact]
|
|
public void SendCommand_CommandIsRegistered_HandlerGetsInvoked()
|
|
{
|
|
var command = ((Command)new Random().Next(1, Enum.GetValues(typeof(Command)).Length)).ToString();
|
|
var handlerCalled = false;
|
|
var keyboardCommandService = new KeyboardCommandService();
|
|
keyboardCommandService.RegisterCommandHandler(command, () => handlerCalled = true);
|
|
|
|
keyboardCommandService.SendCommand(command);
|
|
|
|
handlerCalled.Should().BeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void SendCommand_CommandIsNotRegisted_KeyNotFoundExceptionIsThrown()
|
|
{
|
|
var command = ((Command)new Random().Next(1, Enum.GetValues(typeof(Command)).Length)).ToString();
|
|
var keyboardCommandService = new KeyboardCommandService();
|
|
|
|
Action invoke = () => keyboardCommandService.SendCommand(command);
|
|
|
|
invoke.Should().Throw<KeyNotFoundException>();
|
|
}
|
|
|
|
[Fact]
|
|
public void SendCommand_CommandIsToggleWindow_ShouldNotThrow()
|
|
{
|
|
var command = nameof(Command.ToggleWindow);
|
|
var keyboardCommandService = new KeyboardCommandService();
|
|
|
|
Action invoke = () => keyboardCommandService.SendCommand(command);
|
|
|
|
invoke.Should().NotThrow();
|
|
}
|
|
}
|
|
}
|