KeyBindingsTests.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. using Xunit.Abstractions;
  2. namespace Terminal.Gui.InputTests;
  3. public class KeyBindingsTests ()
  4. {
  5. [Fact]
  6. public void Add_Adds ()
  7. {
  8. var keyBindings = new KeyBindings (new ());
  9. Command [] commands = { Command.Right, Command.Left };
  10. var key = new Key (Key.A);
  11. keyBindings.Add (Key.A, commands);
  12. KeyBinding binding = keyBindings.Get (key);
  13. Assert.Contains (Command.Right, binding.Commands);
  14. Assert.Contains (Command.Left, binding.Commands);
  15. binding = keyBindings.Get (key);
  16. Assert.Contains (Command.Right, binding.Commands);
  17. Assert.Contains (Command.Left, binding.Commands);
  18. Command [] resultCommands = keyBindings.GetCommands (key);
  19. Assert.Contains (Command.Right, resultCommands);
  20. Assert.Contains (Command.Left, resultCommands);
  21. }
  22. [Fact]
  23. public void Add_Invalid_Key_Throws ()
  24. {
  25. var keyBindings = new KeyBindings (new View ());
  26. List<Command> commands = new ();
  27. Assert.Throws<ArgumentException> (() => keyBindings.Add (Key.Empty, Command.Accept));
  28. }
  29. [Fact]
  30. public void Add_Multiple_Commands_Adds ()
  31. {
  32. var keyBindings = new KeyBindings (new ());
  33. Command [] commands = [Command.Right, Command.Left];
  34. keyBindings.Add (Key.A, commands);
  35. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  36. Assert.Contains (Command.Right, resultCommands);
  37. Assert.Contains (Command.Left, resultCommands);
  38. keyBindings.Add (Key.B, commands);
  39. resultCommands = keyBindings.GetCommands (Key.B);
  40. Assert.Contains (Command.Right, resultCommands);
  41. Assert.Contains (Command.Left, resultCommands);
  42. }
  43. [Fact]
  44. public void Add_No_Commands_Throws ()
  45. {
  46. var keyBindings = new KeyBindings (new ());
  47. List<Command> commands = new ();
  48. Assert.Throws<ArgumentException> (() => keyBindings.Add (Key.A, commands.ToArray ()));
  49. }
  50. [Fact]
  51. public void Add_Single_Command_Adds ()
  52. {
  53. var keyBindings = new KeyBindings (new ());
  54. keyBindings.Add (Key.A, Command.HotKey);
  55. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  56. Assert.Contains (Command.HotKey, resultCommands);
  57. keyBindings.Add (Key.B, Command.HotKey);
  58. resultCommands = keyBindings.GetCommands (Key.B);
  59. Assert.Contains (Command.HotKey, resultCommands);
  60. }
  61. // Add should not allow duplicates
  62. [Fact]
  63. public void Add_Throws_If_Exists ()
  64. {
  65. var keyBindings = new KeyBindings (new View ());
  66. keyBindings.Add (Key.A, Command.HotKey);
  67. Assert.Throws<InvalidOperationException> (() => keyBindings.Add (Key.A, Command.Accept));
  68. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  69. Assert.Contains (Command.HotKey, resultCommands);
  70. keyBindings = new (new View ());
  71. keyBindings.Add (Key.A, Command.HotKey);
  72. Assert.Throws<InvalidOperationException> (() => keyBindings.Add (Key.A, Command.Accept));
  73. resultCommands = keyBindings.GetCommands (Key.A);
  74. Assert.Contains (Command.HotKey, resultCommands);
  75. keyBindings = new (new View ());
  76. keyBindings.Add (Key.A, Command.HotKey);
  77. Assert.Throws<InvalidOperationException> (() => keyBindings.Add (Key.A, Command.Accept));
  78. resultCommands = keyBindings.GetCommands (Key.A);
  79. Assert.Contains (Command.HotKey, resultCommands);
  80. keyBindings = new (new View ());
  81. keyBindings.Add (Key.A, Command.Accept);
  82. Assert.Throws<InvalidOperationException> (() => keyBindings.Add (Key.A, Command.ScrollDown));
  83. resultCommands = keyBindings.GetCommands (Key.A);
  84. Assert.Contains (Command.Accept, resultCommands);
  85. keyBindings = new (new View ());
  86. keyBindings.Add (Key.A, new KeyBinding ([Command.HotKey]));
  87. Assert.Throws<InvalidOperationException> (() => keyBindings.Add (Key.A, new KeyBinding (new [] { Command.Accept })));
  88. resultCommands = keyBindings.GetCommands (Key.A);
  89. Assert.Contains (Command.HotKey, resultCommands);
  90. }
  91. // Clear
  92. [Fact]
  93. public void Clear_Clears ()
  94. {
  95. var keyBindings = new KeyBindings (new ());
  96. keyBindings.Add (Key.B, Command.HotKey);
  97. keyBindings.Clear ();
  98. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  99. Assert.Empty (resultCommands);
  100. resultCommands = keyBindings.GetCommands (Key.B);
  101. Assert.Empty (resultCommands);
  102. }
  103. [Fact]
  104. public void Defaults ()
  105. {
  106. var keyBindings = new KeyBindings (new ());
  107. Assert.Empty (keyBindings.GetBindings ());
  108. Assert.Null (keyBindings.GetFirstFromCommands (Command.Accept));
  109. Assert.NotNull (keyBindings.Target);
  110. }
  111. [Fact]
  112. public void Get_Binding_Not_Found_Throws ()
  113. {
  114. var keyBindings = new KeyBindings (new ());
  115. Assert.Throws<InvalidOperationException> (() => keyBindings.Get (Key.A));
  116. Assert.Throws<InvalidOperationException> (() => keyBindings.Get (Key.B));
  117. }
  118. // GetCommands
  119. [Fact]
  120. public void GetCommands_Unknown_ReturnsEmpty ()
  121. {
  122. var keyBindings = new KeyBindings (new ());
  123. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  124. Assert.Empty (resultCommands);
  125. }
  126. [Fact]
  127. public void GetCommands_WithCommands_ReturnsCommands ()
  128. {
  129. var keyBindings = new KeyBindings (new ());
  130. keyBindings.Add (Key.A, Command.HotKey);
  131. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  132. Assert.Contains (Command.HotKey, resultCommands);
  133. }
  134. [Fact]
  135. public void GetCommands_WithMultipleBindings_ReturnsCommands ()
  136. {
  137. var keyBindings = new KeyBindings (new ());
  138. Command [] commands = { Command.Right, Command.Left };
  139. keyBindings.Add (Key.A, commands);
  140. keyBindings.Add (Key.B, commands);
  141. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  142. Assert.Contains (Command.Right, resultCommands);
  143. Assert.Contains (Command.Left, resultCommands);
  144. resultCommands = keyBindings.GetCommands (Key.B);
  145. Assert.Contains (Command.Right, resultCommands);
  146. Assert.Contains (Command.Left, resultCommands);
  147. }
  148. [Fact]
  149. public void GetCommands_WithMultipleCommands_ReturnsCommands ()
  150. {
  151. var keyBindings = new KeyBindings (new ());
  152. Command [] commands = { Command.Right, Command.Left };
  153. keyBindings.Add (Key.A, commands);
  154. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  155. Assert.Contains (Command.Right, resultCommands);
  156. Assert.Contains (Command.Left, resultCommands);
  157. }
  158. [Fact]
  159. public void GetKeyFromCommands_MultipleCommands ()
  160. {
  161. var keyBindings = new KeyBindings (new ());
  162. Command [] commands1 = { Command.Right, Command.Left };
  163. keyBindings.Add (Key.A, commands1);
  164. Command [] commands2 = { Command.Up, Command.Down };
  165. keyBindings.Add (Key.B, commands2);
  166. Key key = keyBindings.GetFirstFromCommands (commands1);
  167. Assert.Equal (Key.A, key);
  168. key = keyBindings.GetFirstFromCommands (commands2);
  169. Assert.Equal (Key.B, key);
  170. }
  171. [Fact]
  172. public void GetKeyFromCommands_OneCommand ()
  173. {
  174. var keyBindings = new KeyBindings (new ());
  175. keyBindings.Add (Key.A, Command.Right);
  176. Key key = keyBindings.GetFirstFromCommands (Command.Right);
  177. Assert.Equal (Key.A, key);
  178. }
  179. // GetKeyFromCommands
  180. [Fact]
  181. public void GetKeyFromCommands_Unknown_Returns_Key_Empty ()
  182. {
  183. var keyBindings = new KeyBindings (new ());
  184. Assert.Null (keyBindings.GetFirstFromCommands (Command.Accept));
  185. }
  186. [Fact]
  187. public void GetKeyFromCommands_WithCommands_ReturnsKey ()
  188. {
  189. var keyBindings = new KeyBindings (new ());
  190. keyBindings.Add (Key.A, Command.HotKey);
  191. Key resultKey = keyBindings.GetFirstFromCommands (Command.HotKey);
  192. Assert.Equal (Key.A, resultKey);
  193. }
  194. [Fact]
  195. public void ReplaceKey_Replaces ()
  196. {
  197. var keyBindings = new KeyBindings (new ());
  198. keyBindings.Add (Key.A, Command.HotKey);
  199. keyBindings.Add (Key.B, Command.HotKey);
  200. keyBindings.Add (Key.C, Command.HotKey);
  201. keyBindings.Add (Key.D, Command.HotKey);
  202. keyBindings.Replace (Key.A, Key.E);
  203. Assert.Empty (keyBindings.GetCommands (Key.A));
  204. Assert.Contains (Command.HotKey, keyBindings.GetCommands (Key.E));
  205. keyBindings.Replace (Key.B, Key.F);
  206. Assert.Empty (keyBindings.GetCommands (Key.B));
  207. Assert.Contains (Command.HotKey, keyBindings.GetCommands (Key.F));
  208. keyBindings.Replace (Key.C, Key.G);
  209. Assert.Empty (keyBindings.GetCommands (Key.C));
  210. Assert.Contains (Command.HotKey, keyBindings.GetCommands (Key.G));
  211. keyBindings.Replace (Key.D, Key.H);
  212. Assert.Empty (keyBindings.GetCommands (Key.D));
  213. Assert.Contains (Command.HotKey, keyBindings.GetCommands (Key.H));
  214. }
  215. [Fact]
  216. public void ReplaceKey_Replaces_Leaves_Old_Binding ()
  217. {
  218. var keyBindings = new KeyBindings (new ());
  219. keyBindings.Add (Key.A, Command.Accept);
  220. keyBindings.Add (Key.B, Command.HotKey);
  221. keyBindings.Replace (keyBindings.GetFirstFromCommands (Command.Accept), Key.C);
  222. Assert.Empty (keyBindings.GetCommands (Key.A));
  223. Assert.Contains (Command.Accept, keyBindings.GetCommands (Key.C));
  224. }
  225. [Fact]
  226. public void ReplaceKey_Adds_If_DoesNotContain_Old ()
  227. {
  228. var keyBindings = new KeyBindings (new ());
  229. keyBindings.Replace (Key.A, Key.B);
  230. Assert.True (keyBindings.TryGet (Key.B, out _));
  231. }
  232. [Fact]
  233. public void ReplaceKey_Throws_If_New_Is_Empty ()
  234. {
  235. var keyBindings = new KeyBindings (new ());
  236. keyBindings.Add (Key.A, Command.HotKey);
  237. Assert.Throws<ArgumentException> (() => keyBindings.Replace (Key.A, Key.Empty));
  238. }
  239. [Fact]
  240. public void Get_Gets ()
  241. {
  242. var keyBindings = new KeyBindings (new ());
  243. Command [] commands = [Command.Right, Command.Left];
  244. var key = new Key (Key.A);
  245. keyBindings.Add (key, commands);
  246. KeyBinding binding = keyBindings.Get (key);
  247. Assert.Contains (Command.Right, binding.Commands);
  248. Assert.Contains (Command.Left, binding.Commands);
  249. binding = keyBindings.Get (key);
  250. Assert.Contains (Command.Right, binding.Commands);
  251. Assert.Contains (Command.Left, binding.Commands);
  252. }
  253. // TryGet
  254. [Fact]
  255. public void TryGet_Succeeds ()
  256. {
  257. var keyBindings = new KeyBindings (new ());
  258. keyBindings.Add (Key.Q.WithCtrl, Command.HotKey);
  259. var key = new Key (Key.Q.WithCtrl);
  260. bool result = keyBindings.TryGet (key, out KeyBinding _);
  261. Assert.True (result); ;
  262. }
  263. [Fact]
  264. public void TryGet_Unknown_ReturnsFalse ()
  265. {
  266. var keyBindings = new KeyBindings (new ());
  267. bool result = keyBindings.TryGet (Key.A, out KeyBinding _);
  268. Assert.False (result);
  269. }
  270. [Fact]
  271. public void TryGet_WithCommands_ReturnsTrue ()
  272. {
  273. var keyBindings = new KeyBindings (new ());
  274. keyBindings.Add (Key.A, Command.HotKey);
  275. bool result = keyBindings.TryGet (Key.A, out KeyBinding bindings);
  276. Assert.True (result);
  277. Assert.Contains (Command.HotKey, bindings.Commands);
  278. }
  279. [Fact]
  280. public void ReplaceCommands_Replaces ()
  281. {
  282. var keyBindings = new KeyBindings (new ());
  283. keyBindings.Add (Key.A, Command.Accept);
  284. keyBindings.ReplaceCommands (Key.A, Command.Refresh);
  285. bool result = keyBindings.TryGet (Key.A, out KeyBinding bindings);
  286. Assert.True (result);
  287. Assert.Contains (Command.Refresh, bindings.Commands);
  288. }
  289. }