| 1 | using Avalonia.Input; |
| 2 | using CascadeIDE.Features.Shell.Application; |
| 3 | using Xunit; |
| 4 | |
| 5 | namespace CascadeIDE.Tests; |
| 6 | |
| 7 | public sealed class CascadeChordMelodyKeyMapTests |
| 8 | { |
| 9 | [Theory] |
| 10 | [InlineData(Key.Space, KeyModifiers.None, PhysicalKey.Space, ' ')] |
| 11 | [InlineData(Key.Space, KeyModifiers.Shift, PhysicalKey.Space, ' ')] |
| 12 | public void Maps_space(Key key, KeyModifiers mods, PhysicalKey physical, char expected) |
| 13 | { |
| 14 | Assert.True(CascadeChordMelodyKeyMap.TryMapChordMelodyGlyph(key, mods, physical, out var ch)); |
| 15 | Assert.Equal(expected, ch); |
| 16 | } |
| 17 | |
| 18 | [Fact] |
| 19 | public void Maps_semicolon_us_no_shift_physical_semicolon() |
| 20 | { |
| 21 | Assert.True(CascadeChordMelodyKeyMap.TryMapChordMelodyGlyph( |
| 22 | Key.OemSemicolon, |
| 23 | KeyModifiers.None, |
| 24 | PhysicalKey.Semicolon, |
| 25 | out var ch)); |
| 26 | Assert.Equal(';', ch); |
| 27 | } |
| 28 | |
| 29 | [Fact] |
| 30 | public void Maps_semicolon_windows_oem1_no_shift() |
| 31 | { |
| 32 | Assert.True(CascadeChordMelodyKeyMap.TryMapChordMelodyGlyph( |
| 33 | Key.Oem1, |
| 34 | KeyModifiers.None, |
| 35 | PhysicalKey.None, |
| 36 | out var ch)); |
| 37 | Assert.Equal(';', ch); |
| 38 | } |
| 39 | |
| 40 | [Fact] |
| 41 | public void Maps_colon_us_shift_semicolon_virtual_key() |
| 42 | { |
| 43 | Assert.True(CascadeChordMelodyKeyMap.TryMapChordMelodyGlyph( |
| 44 | Key.OemSemicolon, |
| 45 | KeyModifiers.Shift, |
| 46 | PhysicalKey.Semicolon, |
| 47 | out var ch)); |
| 48 | Assert.Equal(':', ch); |
| 49 | } |
| 50 | |
| 51 | [Fact] |
| 52 | public void Maps_colon_by_physical_semicolon_when_layout_hides_oem_semicolon() |
| 53 | { |
| 54 | // Не-US: Key может быть не OemSemicolon, позиция ; на QWERTY всё та же. |
| 55 | Assert.True(CascadeChordMelodyKeyMap.TryMapChordMelodyGlyph( |
| 56 | Key.Oem1, |
| 57 | KeyModifiers.Shift, |
| 58 | PhysicalKey.Semicolon, |
| 59 | out var ch)); |
| 60 | Assert.Equal(':', ch); |
| 61 | } |
| 62 | |
| 63 | [Fact] |
| 64 | public void Maps_colon_ru_shift_digit6_physical() |
| 65 | { |
| 66 | Assert.True(CascadeChordMelodyKeyMap.TryMapChordMelodyGlyph( |
| 67 | Key.D6, |
| 68 | KeyModifiers.Shift, |
| 69 | PhysicalKey.Digit6, |
| 70 | out var ch)); |
| 71 | Assert.Equal(':', ch); |
| 72 | } |
| 73 | |
| 74 | [Fact] |
| 75 | public void Does_not_map_when_alt_held() |
| 76 | { |
| 77 | Assert.False(CascadeChordMelodyKeyMap.TryMapChordMelodyGlyph( |
| 78 | Key.Space, |
| 79 | KeyModifiers.Alt, |
| 80 | PhysicalKey.Space, |
| 81 | out _)); |
| 82 | } |
| 83 | |
| 84 | [Theory] |
| 85 | [InlineData(Key.Oem2, PhysicalKey.Slash)] |
| 86 | [InlineData(Key.Divide, PhysicalKey.None)] |
| 87 | public void Maps_slash_even_when_ctrl_held(Key key, PhysicalKey physical) |
| 88 | { |
| 89 | Assert.True(CascadeChordMelodyKeyMap.TryMapChordMelodyGlyph( |
| 90 | key, |
| 91 | KeyModifiers.Control, |
| 92 | physical, |
| 93 | out var ch)); |
| 94 | Assert.Equal('/', ch); |
| 95 | } |
| 96 | |
| 97 | [Theory] |
| 98 | [InlineData(Key.A, PhysicalKey.A, 'a')] |
| 99 | [InlineData(Key.D7, PhysicalKey.Digit7, '7')] |
| 100 | public void Maps_letters_and_digits_even_when_ctrl_held(Key key, PhysicalKey physical, char expected) |
| 101 | { |
| 102 | Assert.True(CascadeChordMelodyKeyMap.TryMapChordMelodyGlyph( |
| 103 | key, |
| 104 | KeyModifiers.Control, |
| 105 | physical, |
| 106 | out var ch)); |
| 107 | Assert.Equal(expected, ch); |
| 108 | } |
| 109 | } |
| 110 | |