using System.Collections.Generic; using System.Diagnostics; using AutoHotInterception.Helpers; using NUnit.Framework; using static AutoHotInterception.Helpers.ManagedWrapper; namespace UnitTests { public class TestKey { public string Name { get; } public List PressStrokes { get; } public List ReleaseStrokes { get; } public ExpectedResult PressResult { get; } public ExpectedResult ReleaseResult { get; } public TestKey(string name, List pressStrokes, List releaseStrokes, ExpectedResult pressResult, ExpectedResult releaseResult) { Name = name; PressStrokes = pressStrokes; ReleaseStrokes = releaseStrokes; PressResult = pressResult; ReleaseResult = releaseResult; } } public class ExpectedResult { public ushort Code { get; } public ushort State { get; } public ExpectedResult(ushort code, ushort state) { Code = code; State = state; } } [TestFixture] class TranslateScanCodesTests { private static List Stroke(ushort code1, ushort state1, ushort code2 = 0, ushort state2 = 0) { var strokes = new List(); strokes.Add(new Stroke() { key = { code = code1, state = state1 } }); if (code2 != 0) { strokes.Add(new Stroke() { key = { code = code2, state = state2 } }); } return strokes; } private static ExpectedResult Result(ushort code, ushort state) { var results = new ExpectedResult(code, state); return results; } [Test, TestCaseSource("TestKeyProvider")] public void PressRelease(string name, List pressStrokes, List releaseStrokes, ExpectedResult pressResult, ExpectedResult releaseResult ) { Debug.WriteLine($"\nTesting key {name}..."); Debug.WriteLine("Testing Press"); var expectedResult = pressResult; var actualResult = ScanCodeHelper.TranslateScanCodes(pressStrokes); AssertResult(actualResult, expectedResult); Debug.WriteLine("Testing Release"); expectedResult = releaseResult; actualResult = ScanCodeHelper.TranslateScanCodes(releaseStrokes); AssertResult(actualResult, expectedResult); Debug.WriteLine("OK!"); } private static IEnumerable TestKeyProvider() { yield return new TestCaseData("One", Stroke(2, 0), Stroke(2, 1), Result(2, 1), Result(2, 0)); yield return new TestCaseData("Scroll Lock", Stroke(70, 0), Stroke(70, 1), Result(70, 1), Result(70, 0)); yield return new TestCaseData("Numpad Enter", Stroke(28, 0), Stroke(28, 1), Result(284, 1), Result(284, 0)); yield return new TestCaseData("Right Control", Stroke(29, 2), Stroke(29, 3), Result(285, 1), Result(285, 0)); yield return new TestCaseData("Numpad Div", Stroke(53, 2), Stroke(53, 3), Result(309, 1), Result(309, 0)); yield return new TestCaseData("Right Shift", Stroke(54, 0), Stroke(54, 1), Result(310, 1), Result(310, 0)); yield return new TestCaseData("Print Screen", Stroke(42, 2, 55, 2), Stroke(55, 3, 42, 3), Result(311, 1), Result(311, 0)); yield return new TestCaseData("Right Alt", Stroke(56, 2), Stroke(56, 3), Result(312, 1), Result(312, 0)); yield return new TestCaseData("Numlock", Stroke(69, 0), Stroke(69, 1), Result(325, 1), Result(325, 0)); yield return new TestCaseData("Pause", Stroke(29, 4, 69, 0), Stroke(29, 5, 69, 1), Result(69, 1), Result(69, 0)); yield return new TestCaseData("Home", Stroke(42, 2, 71, 2), Stroke(71, 3, 42, 3), Result(327, 1), Result(327, 0)); yield return new TestCaseData("Up", Stroke(42, 2, 72, 2), Stroke(72, 3, 42, 3), Result(328, 1), Result(328, 0)); yield return new TestCaseData("PgUp", Stroke(42, 2, 73, 2), Stroke(73, 3, 42, 3), Result(329, 1), Result(329, 0)); yield return new TestCaseData("Left", Stroke(42, 2, 75, 2), Stroke(75, 3, 42, 3), Result(331, 1), Result(331, 0)); yield return new TestCaseData("Right", Stroke(42, 2, 77, 2), Stroke(77, 3, 42, 3), Result(333, 1), Result(333, 0)); yield return new TestCaseData("End", Stroke(42, 2, 79, 2), Stroke(79, 3, 42, 3), Result(335, 1), Result(335, 0)); yield return new TestCaseData("Down", Stroke(42, 2, 80, 2), Stroke(80, 3, 42, 3), Result(336, 1), Result(336, 0)); yield return new TestCaseData("PgDn", Stroke(42, 2, 81, 2), Stroke(81, 3, 42, 3), Result(337, 1), Result(337, 0)); yield return new TestCaseData("Insert", Stroke(42, 2, 82, 2), Stroke(82, 3, 42, 3), Result(338, 1), Result(338, 0)); yield return new TestCaseData("Delete", Stroke(42, 2, 83, 2), Stroke(83, 3, 42, 3), Result(339, 1), Result(339, 0)); yield return new TestCaseData("Left Windows", Stroke(91, 2), Stroke(91, 3), Result(347, 1), Result(347, 0)); yield return new TestCaseData("Right Windows", Stroke(92, 2), Stroke(92, 3), Result(348, 1), Result(348, 0)); yield return new TestCaseData("Apps", Stroke(93, 2), Stroke(93, 3), Result(349, 1), Result(349, 0)); // Test Home block in E0 mode (Numlock on) yield return new TestCaseData("HomeE0", Stroke(71, 2), Stroke(71, 3), Result(327, 1), Result(327, 0)); yield return new TestCaseData("UpE0", Stroke(72, 2), Stroke(72, 3), Result(328, 1), Result(328, 0)); yield return new TestCaseData("PgUpE0", Stroke(73, 2), Stroke(73, 3), Result(329, 1), Result(329, 0)); yield return new TestCaseData("LeftE0", Stroke(75, 2), Stroke(75, 3), Result(331, 1), Result(331, 0)); yield return new TestCaseData("RightE0", Stroke(77, 2), Stroke(77, 3), Result(333, 1), Result(333, 0)); yield return new TestCaseData("EndE0", Stroke(79, 2), Stroke(79, 3), Result(335, 1), Result(335, 0)); yield return new TestCaseData("DownE0", Stroke(80, 2), Stroke(80, 3), Result(336, 1), Result(336, 0)); yield return new TestCaseData("PgDnE0", Stroke(81, 2), Stroke(81, 3), Result(337, 1), Result(337, 0)); yield return new TestCaseData("InsertE0", Stroke(82, 2), Stroke(82, 3), Result(338, 1), Result(338, 0)); yield return new TestCaseData("DeleteE0", Stroke(83, 2), Stroke(83, 3), Result(339, 1), Result(339, 0)); } void AssertResult(TranslatedKey actualResult, ExpectedResult expectedResult) { Debug.WriteLine($"Expecting code of {expectedResult.Code}, state of {expectedResult.State}"); Assert.That(actualResult.Code, Is.EqualTo(expectedResult.Code), $"Code should be {expectedResult.Code}, got {actualResult.Code}"); Assert.That(actualResult.State, Is.EqualTo(expectedResult.State), $"State should be {expectedResult.State}, got {actualResult.State}"); } } }