Forge
csharpdeeb25a2
1using CascadeIDE.Services.ChordNotation;
2using Xunit;
3
4namespace CascadeIDE.Tests;
5
6public sealed class ChordNotationParserTests
7{
8 [Fact]
9 public void Empty_string_yields_success_zero_steps()
10 {
11 var r = ChordNotationParser.Parse("");
12 Assert.True(r.IsSuccess);
13 Assert.Empty(r.Steps);
14 }
15
16 [Fact]
17 public void CascadeChord_ctrl_k_palette_steps_for_map_and_mfd()
18 {
19 var r = ChordNotationParser.Parse("<C-k> s p");
20 Assert.True(r.IsSuccess);
21 Assert.Collection(
22 r.Steps,
23 s => AssertChord(s, ["C-"], "k"),
24 s => AssertPlain(s, "s"),
25 s => AssertPlain(s, "p"));
26
27 var z = ChordNotationParser.Parse("<C-k> m m");
28 Assert.True(z.IsSuccess);
29 Assert.Collection(
30 z.Steps,
31 s => AssertChord(s, ["C-"], "k"),
32 s => AssertPlain(s, "m"),
33 s => AssertPlain(s, "m"));
34 }
35
36 [Fact]
37 public void Bracket_multi_modifiers_and_plain_Esc()
38 {
39 var r = ChordNotationParser.Parse("<C-M-n>");
40 Assert.True(r.IsSuccess);
41 Assert.Single(r.Steps);
42 AssertChord(r.Steps[0], ["C-", "M-"], "n");
43
44 var e = ChordNotationParser.Parse("Esc");
45 Assert.True(e.IsSuccess);
46 AssertPlain(e.Steps[0], "Esc");
47 }
48
49 [Fact]
50 public void FMS_style_plain_tokens()
51 {
52 var r = ChordNotationParser.Parse("L1 R2 EXEC");
53 Assert.True(r.IsSuccess);
54 Assert.Collection(
55 r.Steps,
56 s => AssertPlain(s, "L1"),
57 s => AssertPlain(s, "R2"),
58 s => AssertPlain(s, "EXEC"));
59 }
60
61 [Fact]
62 public void Unclosed_bracket_fails()
63 {
64 var r = ChordNotationParser.Parse("<C-k");
65 Assert.False(r.IsSuccess);
66 Assert.NotEmpty(r.Error);
67 }
68
69 private static void AssertPlain(ChordNotationStep step, string token)
70 {
71 var p = Assert.IsType<ChordNotationPlainStep>(step);
72 Assert.Equal(token, p.Token);
73 }
74
75 private static void AssertChord(ChordNotationStep step, string[] mods, string key)
76 {
77 var c = Assert.IsType<ChordNotationChordStep>(step);
78 Assert.Equal(mods, c.ModifierPrefixes);
79 Assert.Equal(key, c.Key);
80 }
81}
82
View only · write via MCP/CIDE