KeyBindingsTests.cs 12 KB

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