using KeyOverlay.Core; using Xunit; namespace KeyOverlay.Core.Tests; public class KeyLocalizerTests { // Pretends to be a Russian layout: only a few keys are mapped. private static string? FakeRussian(string keycode, bool shift) => (keycode, shift) switch { ("KC_Q", false) => "й", ("KC_Q", true) => "Й", ("KC_1", true) => "!", ("KC_SLASH", true) => ",", ("KC_COMMA", false) => "б", _ => null, }; [Fact] public void Letter_IsShownUppercaseInTheActiveLanguage() { var localized = KeyLocalizer.Localize(Keycodes.Describe("KC_Q"), FakeRussian); Assert.Equal("Й", localized.Main); } [Fact] public void ShiftWrappedKey_UsesShiftedCharacter() { var localized = KeyLocalizer.Localize(Keycodes.Describe("LSFT(KC_SLASH)"), FakeRussian); Assert.Equal(",", localized.Main); } [Fact] public void Punctuation_IsReplacedWithLayoutCharacter() { var localized = KeyLocalizer.Localize(Keycodes.Describe("KC_COMMA"), FakeRussian); Assert.Equal("Б", localized.Main); // a letter on a punctuation key is still shown uppercase } [Fact] public void Localizing_KeepsBaseKeycodeForHighlighting() { var localized = KeyLocalizer.Localize(Keycodes.Describe("KC_Q"), FakeRussian); Assert.Equal("KC_Q", localized.BaseKeycode); } [Fact] public void ModTap_KeepsModifierHintAndLocalizesTapKey() { var localized = KeyLocalizer.Localize(Keycodes.Describe("LCTL_T(KC_Q)"), FakeRussian); Assert.Equal("Й", localized.Main); Assert.Equal("Ctrl", localized.Sub); } [Theory] [InlineData("KC_ESCAPE")] [InlineData("KC_SPACE")] [InlineData("KC_LSHIFT")] [InlineData("KC_RIGHT")] [InlineData("MO(2)")] [InlineData("LCTL(KC_Q)")] public void NonCharacterKeys_AreLeftUntouched(string code) { var original = Keycodes.Describe(code); Assert.Equal(original, KeyLocalizer.Localize(original, FakeRussian)); } [Fact] public void UnknownCharacter_FallsBackToDefaultLabel() { var original = Keycodes.Describe("KC_W"); // FakeRussian has no mapping for W Assert.Equal(original, KeyLocalizer.Localize(original, FakeRussian)); } [Fact] public void ControlCharacterResult_FallsBackToDefaultLabel() { var original = Keycodes.Describe("KC_Q"); var localized = KeyLocalizer.Localize(original, (_, _) => "\u0011"); Assert.Equal(original, localized); } [Theory] [InlineData("KC_A", true)] [InlineData("KC_5", true)] [InlineData("KC_GRAVE", true)] [InlineData("KC_SCOLON", true)] [InlineData("KC_F1", false)] [InlineData("KC_ENTER", false)] public void IsCharacterKey_CoversLettersDigitsAndPunctuation(string code, bool expected) => Assert.Equal(expected, Keycodes.IsCharacterKey(code)); [Theory] [InlineData("KC_A", 0x1E)] [InlineData("KC_1", 0x02)] [InlineData("KC_SLASH", 0x35)] public void ToScanCode_ReturnsPhysicalKeyCode(string code, int expected) => Assert.Equal(expected, ScanCodes.ToScanCode(code)); [Fact] public void ToScanCode_ReturnsNullForUnknownKeycode() => Assert.Null(ScanCodes.ToScanCode("KC_NOPE")); }