Forge
csharpdeeb25a2
1using System.Reflection;
2using CascadeIDE.Services;
3using Xunit;
4
5namespace CascadeIDE.Tests;
6
7public sealed class IdeCommandRegistryTests
8{
9 [Fact]
10 public void WindowHotkeyByTomlKey_NoDuplicateEffectiveKeys()
11 {
12 var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
13 foreach (var e in IdeCommandRegistry.AllEntries)
14 {
15 if (e.WindowHotkey is null)
16 continue;
17 var k = e.EffectiveHotkeysTomlKey;
18 Assert.True(seen.Add(k), $"Дубликат ключа hotkeys.toml для окна: {k}");
19 }
20 }
21
22 [Fact]
23 public void TunnelShortcutKeyOrder_EveryKeyResolvesInWindowIndex()
24 {
25 foreach (var k in IdeCommandRegistry.TunnelShortcutKeyOrder)
26 {
27 Assert.True(
28 IdeCommandRegistry.WindowHotkeyByTomlKey.ContainsKey(k),
29 $"Tunnel order ссылается на неизвестный ключ: {k}");
30 }
31 }
32
33 /// <summary>
34 /// Обратная согласованность: tunnel не «забывает» ни одного окна-хоткея и не ссылается на лишние ключи.
35 /// </summary>
36 [Fact]
37 public void TunnelShortcutKeyOrder_KeySet_Matches_WindowHotkeyByTomlKey()
38 {
39 var tunnel = IdeCommandRegistry.TunnelShortcutKeyOrder.ToHashSet(StringComparer.OrdinalIgnoreCase);
40 var window = IdeCommandRegistry.WindowHotkeyByTomlKey.Keys.ToHashSet(StringComparer.OrdinalIgnoreCase);
41 Assert.True(
42 tunnel.SetEquals(window),
43 "Множество ключей tunnel ≠ множеству записей с WindowHotkey. " +
44 $"Только в tunnel: {string.Join(", ", tunnel.Except(window))}. " +
45 $"Только в окне: {string.Join(", ", window.Except(tunnel))}.");
46 }
47
48 [Fact]
49 public void TunnelShortcutKeyOrder_HasNoDuplicateKeys()
50 {
51 var order = IdeCommandRegistry.TunnelShortcutKeyOrder;
52 var distinct = order.ToHashSet(StringComparer.OrdinalIgnoreCase);
53 Assert.Equal(order.Length, distinct.Count);
54 }
55
56 [Fact]
57 public void PaletteEntries_HaveMcpCommandId()
58 {
59 foreach (var e in IdeCommandRegistry.AllEntries)
60 {
61 if (!e.IncludeInPalette)
62 continue;
63 Assert.False(string.IsNullOrEmpty(e.CommandId), $"Палитра без CommandId: {e.PaletteId}");
64 }
65 }
66
67 /// <summary>
68 /// Каждый непустой <see cref="IdeCommandRegistry.IdeCommandRegistryEntry.CommandId"/> — значение из констант <see cref="IdeCommands"/> (нет опечаток в строке).
69 /// </summary>
70 [Fact]
71 public void Registry_CommandIds_AreIdeCommandsConstValues()
72 {
73 var validIds = GetIdeCommandsStringConstants();
74 foreach (var e in IdeCommandRegistry.AllEntries)
75 {
76 if (string.IsNullOrEmpty(e.CommandId))
77 continue;
78 Assert.True(
79 validIds.Contains(e.CommandId),
80 $"CommandId не найден среди констант IdeCommands: «{e.CommandId}» (PaletteId={e.PaletteId}).");
81 }
82 }
83
84 private static HashSet<string> GetIdeCommandsStringConstants()
85 {
86 var comparer = StringComparer.Ordinal;
87 var set = new HashSet<string>(comparer);
88 foreach (var fi in typeof(IdeCommands).GetFields(BindingFlags.Public | BindingFlags.Static))
89 {
90 if (fi.FieldType != typeof(string) || !fi.IsLiteral)
91 continue;
92 if (fi.GetRawConstantValue() is string s)
93 set.Add(s);
94 }
95
96 return set;
97 }
98}
99
View only · write via MCP/CIDE