From 715754c09aae29870f3fcdfba30c87167de8b3e6 Mon Sep 17 00:00:00 2001 From: tznind Date: Sat, 18 Jan 2025 09:14:45 +0000 Subject: [PATCH] Add ConsoleKeyInfoToKey test cases --- .../ConsoleDrivers/V2/NetInputProcessor.cs | 16 ++++ .../V2/NetInputProcessorTests.cs | 88 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 UnitTests/ConsoleDrivers/V2/NetInputProcessorTests.cs diff --git a/Terminal.Gui/ConsoleDrivers/V2/NetInputProcessor.cs b/Terminal.Gui/ConsoleDrivers/V2/NetInputProcessor.cs index 72e4a08c37..0c83f4f8aa 100644 --- a/Terminal.Gui/ConsoleDrivers/V2/NetInputProcessor.cs +++ b/Terminal.Gui/ConsoleDrivers/V2/NetInputProcessor.cs @@ -1,4 +1,5 @@ using System.Collections.Concurrent; +using Microsoft.Extensions.Logging; namespace Terminal.Gui; @@ -22,6 +23,9 @@ protected override void Process (ConsoleKeyInfo consoleKeyInfo) /// protected override void ProcessAfterParsing (ConsoleKeyInfo input) { + // For building test cases + //Logging.Logger.LogTrace (FormatConsoleKeyInfoForTestCase (input)); + Key key = ConsoleKeyInfoToKey (input); OnKeyDown (key); OnKeyUp (key); @@ -46,4 +50,16 @@ public static Key ConsoleKeyInfoToKey (ConsoleKeyInfo input) return EscSeqUtils.MapKey (adjustedInput); } + + /* For building test cases + public static string FormatConsoleKeyInfoForTestCase (ConsoleKeyInfo input) + { + string charLiteral = input.KeyChar == '\0' ? @"'\0'" : $"'{input.KeyChar}'"; + string expectedLiteral = $"new Rune('todo')"; + + return $"yield return new object[] {{ new ConsoleKeyInfo({charLiteral}, ConsoleKey.{input.Key}, " + + $"{input.Modifiers.HasFlag (ConsoleModifiers.Shift).ToString ().ToLower ()}, " + + $"{input.Modifiers.HasFlag (ConsoleModifiers.Alt).ToString ().ToLower ()}, " + + $"{input.Modifiers.HasFlag (ConsoleModifiers.Control).ToString ().ToLower ()}), {expectedLiteral} }};"; + }*/ } diff --git a/UnitTests/ConsoleDrivers/V2/NetInputProcessorTests.cs b/UnitTests/ConsoleDrivers/V2/NetInputProcessorTests.cs new file mode 100644 index 0000000000..ac5af431e6 --- /dev/null +++ b/UnitTests/ConsoleDrivers/V2/NetInputProcessorTests.cs @@ -0,0 +1,88 @@ +using System.Text; + +namespace UnitTests.ConsoleDrivers.V2; +public class NetInputProcessorTests +{ + public static IEnumerable GetConsoleKeyInfoToKeyTestCases_Rune () + { + yield return new object [] { new ConsoleKeyInfo ('C', ConsoleKey.None, false, false, false), new Rune('C') }; + yield return new object [] { new ConsoleKeyInfo ('\\', ConsoleKey.Oem5, false, false, false), new Rune ('\\') }; + yield return new object [] { new ConsoleKeyInfo ('+', ConsoleKey.OemPlus, true, false, false), new Rune ('+') }; + yield return new object [] { new ConsoleKeyInfo ('=', ConsoleKey.OemPlus, false, false, false), new Rune ('=') }; + yield return new object [] { new ConsoleKeyInfo ('_', ConsoleKey.OemMinus, true, false, false), new Rune ('_') }; + yield return new object [] { new ConsoleKeyInfo ('-', ConsoleKey.OemMinus, false, false, false), new Rune ('-') }; + yield return new object [] { new ConsoleKeyInfo (')', ConsoleKey.None, false, false, false), new Rune (')') }; + yield return new object [] { new ConsoleKeyInfo ('0', ConsoleKey.None, false, false, false), new Rune ('0') }; + yield return new object [] { new ConsoleKeyInfo ('(', ConsoleKey.None, false, false, false), new Rune ('(') }; + yield return new object [] { new ConsoleKeyInfo ('9', ConsoleKey.None, false, false, false), new Rune ('9') }; + yield return new object [] { new ConsoleKeyInfo ('*', ConsoleKey.None, false, false, false), new Rune ('*') }; + yield return new object [] { new ConsoleKeyInfo ('8', ConsoleKey.None, false, false, false), new Rune ('8') }; + yield return new object [] { new ConsoleKeyInfo ('&', ConsoleKey.None, false, false, false), new Rune ('&') }; + yield return new object [] { new ConsoleKeyInfo ('7', ConsoleKey.None, false, false, false), new Rune ('7') }; + yield return new object [] { new ConsoleKeyInfo ('^', ConsoleKey.None, false, false, false), new Rune ('^') }; + yield return new object [] { new ConsoleKeyInfo ('6', ConsoleKey.None, false, false, false), new Rune ('6') }; + yield return new object [] { new ConsoleKeyInfo ('%', ConsoleKey.None, false, false, false), new Rune ('%') }; + yield return new object [] { new ConsoleKeyInfo ('5', ConsoleKey.None, false, false, false), new Rune ('5') }; + yield return new object [] { new ConsoleKeyInfo ('$', ConsoleKey.None, false, false, false), new Rune ('$') }; + yield return new object [] { new ConsoleKeyInfo ('4', ConsoleKey.None, false, false, false), new Rune ('4') }; + yield return new object [] { new ConsoleKeyInfo ('#', ConsoleKey.None, false, false, false), new Rune ('#') }; + yield return new object [] { new ConsoleKeyInfo ('@', ConsoleKey.None, false, false, false), new Rune ('@') }; + yield return new object [] { new ConsoleKeyInfo ('2', ConsoleKey.None, false, false, false), new Rune ('2') }; + yield return new object [] { new ConsoleKeyInfo ('!', ConsoleKey.None, false, false, false), new Rune ('!') }; + yield return new object [] { new ConsoleKeyInfo ('1', ConsoleKey.None, false, false, false), new Rune ('1') }; + yield return new object [] { new ConsoleKeyInfo ('\t', ConsoleKey.None, false, false, false), new Rune ('\t') }; + yield return new object [] { new ConsoleKeyInfo ('}', ConsoleKey.Oem6, true, false, false), new Rune ('}') }; + yield return new object [] { new ConsoleKeyInfo (']', ConsoleKey.Oem6, false, false, false), new Rune (']') }; + yield return new object [] { new ConsoleKeyInfo ('{', ConsoleKey.Oem4, true, false, false), new Rune ('{') }; + yield return new object [] { new ConsoleKeyInfo ('[', ConsoleKey.Oem4, false, false, false), new Rune ('[') }; + yield return new object [] { new ConsoleKeyInfo ('\"', ConsoleKey.Oem7, true, false, false), new Rune ('\"') }; + yield return new object [] { new ConsoleKeyInfo ('\'', ConsoleKey.Oem7, false, false, false), new Rune ('\'') }; + yield return new object [] { new ConsoleKeyInfo (':', ConsoleKey.Oem1, true, false, false), new Rune (':') }; + yield return new object [] { new ConsoleKeyInfo (';', ConsoleKey.Oem1, false, false, false), new Rune (';') }; + yield return new object [] { new ConsoleKeyInfo ('?', ConsoleKey.Oem2, true, false, false), new Rune ('?') }; + yield return new object [] { new ConsoleKeyInfo ('/', ConsoleKey.Oem2, false, false, false), new Rune ('/') }; + yield return new object [] { new ConsoleKeyInfo ('>', ConsoleKey.OemPeriod, true, false, false), new Rune ('>') }; + yield return new object [] { new ConsoleKeyInfo ('.', ConsoleKey.OemPeriod, false, false, false), new Rune ('.') }; + yield return new object [] { new ConsoleKeyInfo ('<', ConsoleKey.OemComma, true, false, false), new Rune ('<') }; + yield return new object [] { new ConsoleKeyInfo (',', ConsoleKey.OemComma, false, false, false), new Rune (',') }; + yield return new object [] { new ConsoleKeyInfo ('w', ConsoleKey.None, false, false, false), new Rune ('w') }; + yield return new object [] { new ConsoleKeyInfo ('e', ConsoleKey.None, false, false, false), new Rune ('e') }; + yield return new object [] { new ConsoleKeyInfo ('a', ConsoleKey.None, false, false, false), new Rune ('a') }; + yield return new object [] { new ConsoleKeyInfo ('s', ConsoleKey.None, false, false, false), new Rune ('s') }; + } + + [Theory] + [MemberData (nameof (GetConsoleKeyInfoToKeyTestCases_Rune))] + public void ConsoleKeyInfoToKey_ValidInput_AsRune (ConsoleKeyInfo input, Rune expected) + { + // Act + var result = NetInputProcessor.ConsoleKeyInfoToKey (input); + + // Assert + Assert.Equal (expected, result.AsRune); + } + + public static IEnumerable GetConsoleKeyInfoToKeyTestCases_Key () + { + yield return new object [] { new ConsoleKeyInfo ('\t', ConsoleKey.None, false, false, false), Key.Tab}; + + // TODO: Terminal.Gui does not have a Key for this mapped + // TODO: null and default(Key) are both not same as Null. Why user has to do (Key)0 to get a null key?! + yield return new object [] { new ConsoleKeyInfo ('\0', ConsoleKey.LeftWindows, false, false, false), (Key)0 }; + + + } + + + + [Theory] + [MemberData (nameof (GetConsoleKeyInfoToKeyTestCases_Key))] + public void ConsoleKeyInfoToKey_ValidInput_AsKey (ConsoleKeyInfo input, Key expected) + { + // Act + var result = NetInputProcessor.ConsoleKeyInfoToKey (input); + + // Assert + Assert.Equal (expected, result); + } +}