KeyBindingsTests.cs 12 KB

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