KeyBindingTests.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. using UICatalog.Scenarios;
  2. using Xunit.Abstractions;
  3. namespace Terminal.Gui.InputTests;
  4. public class KeyBindingTests
  5. {
  6. private readonly ITestOutputHelper _output;
  7. public KeyBindingTests (ITestOutputHelper output) { _output = output; }
  8. [Fact]
  9. public void Add_Empty_Throws ()
  10. {
  11. var keyBindings = new KeyBindings ();
  12. List<Command> commands = new ();
  13. Assert.Throws<ArgumentException> (() => keyBindings.Add (Key.A, commands.ToArray ()));
  14. }
  15. [Fact]
  16. public void Add_Multiple_Adds ()
  17. {
  18. var keyBindings = new KeyBindings ();
  19. Command [] commands = { Command.Right, Command.Left };
  20. keyBindings.Add (Key.A, commands);
  21. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  22. Assert.Contains (Command.Right, resultCommands);
  23. Assert.Contains (Command.Left, resultCommands);
  24. keyBindings.Add (Key.B, commands);
  25. resultCommands = keyBindings.GetCommands (Key.B);
  26. Assert.Contains (Command.Right, resultCommands);
  27. Assert.Contains (Command.Left, resultCommands);
  28. }
  29. [Fact]
  30. public void Add_Single_Adds ()
  31. {
  32. var keyBindings = new KeyBindings ();
  33. keyBindings.Add (Key.A, Command.HotKey);
  34. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  35. Assert.Contains (Command.HotKey, resultCommands);
  36. keyBindings.Add (Key.B, Command.HotKey);
  37. resultCommands = keyBindings.GetCommands (Key.B);
  38. Assert.Contains (Command.HotKey, resultCommands);
  39. }
  40. // Clear
  41. [Fact]
  42. public void Clear_Clears ()
  43. {
  44. var keyBindings = new KeyBindings ();
  45. keyBindings.Add (Key.B, Command.HotKey);
  46. keyBindings.Clear ();
  47. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  48. Assert.Empty (resultCommands);
  49. resultCommands = keyBindings.GetCommands (Key.B);
  50. Assert.Empty (resultCommands);
  51. }
  52. [Fact]
  53. public void Defaults ()
  54. {
  55. var keyBindings = new KeyBindings ();
  56. Assert.Throws<InvalidOperationException> (() => keyBindings.GetKeyFromCommands (Command.Accept));
  57. }
  58. // GetCommands
  59. [Fact]
  60. public void GetCommands_Unknown_ReturnsEmpty ()
  61. {
  62. var keyBindings = new KeyBindings ();
  63. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  64. Assert.Empty (resultCommands);
  65. }
  66. [Fact]
  67. public void GetCommands_WithCommands_ReturnsCommands ()
  68. {
  69. var keyBindings = new KeyBindings ();
  70. keyBindings.Add (Key.A, Command.HotKey);
  71. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  72. Assert.Contains (Command.HotKey, resultCommands);
  73. }
  74. [Fact]
  75. public void GetCommands_WithMultipleBindings_ReturnsCommands ()
  76. {
  77. var keyBindings = new KeyBindings ();
  78. Command [] commands = { Command.Right, Command.Left };
  79. keyBindings.Add (Key.A, commands);
  80. keyBindings.Add (Key.B, commands);
  81. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  82. Assert.Contains (Command.Right, resultCommands);
  83. Assert.Contains (Command.Left, resultCommands);
  84. resultCommands = keyBindings.GetCommands (Key.B);
  85. Assert.Contains (Command.Right, resultCommands);
  86. Assert.Contains (Command.Left, resultCommands);
  87. }
  88. [Fact]
  89. public void GetCommands_WithMultipleCommands_ReturnsCommands ()
  90. {
  91. var keyBindings = new KeyBindings ();
  92. Command [] commands = { Command.Right, Command.Left };
  93. keyBindings.Add (Key.A, commands);
  94. Command [] resultCommands = keyBindings.GetCommands (Key.A);
  95. Assert.Contains (Command.Right, resultCommands);
  96. Assert.Contains (Command.Left, resultCommands);
  97. }
  98. [Fact]
  99. public void GetKeyFromCommands_MultipleCommands ()
  100. {
  101. var keyBindings = new KeyBindings ();
  102. Command [] commands1 = { Command.Right, Command.Left };
  103. keyBindings.Add (Key.A, commands1);
  104. Command [] commands2 = { Command.LineUp, Command.LineDown };
  105. keyBindings.Add (Key.B, commands2);
  106. Key key = keyBindings.GetKeyFromCommands (commands1);
  107. Assert.Equal (Key.A, key);
  108. key = keyBindings.GetKeyFromCommands (commands2);
  109. Assert.Equal (Key.B, key);
  110. // Negative case
  111. Assert.Throws<InvalidOperationException> (() => key = keyBindings.GetKeyFromCommands (Command.EndOfLine));
  112. }
  113. [Fact]
  114. public void GetKeyFromCommands_OneCommand ()
  115. {
  116. var keyBindings = new KeyBindings ();
  117. keyBindings.Add (Key.A, Command.Right);
  118. Key key = keyBindings.GetKeyFromCommands (Command.Right);
  119. Assert.Equal (Key.A, key);
  120. // Negative case
  121. Assert.Throws<InvalidOperationException> (() => key = keyBindings.GetKeyFromCommands (Command.Left));
  122. }
  123. // GetKeyFromCommands
  124. [Fact]
  125. public void GetKeyFromCommands_Unknown_Throws_InvalidOperationException ()
  126. {
  127. var keyBindings = new KeyBindings ();
  128. Assert.Throws<InvalidOperationException> (() => keyBindings.GetKeyFromCommands (Command.Accept));
  129. }
  130. [Fact]
  131. public void GetKeyFromCommands_WithCommands_ReturnsKey ()
  132. {
  133. var keyBindings = new KeyBindings ();
  134. keyBindings.Add (Key.A, Command.HotKey);
  135. Key resultKey = keyBindings.GetKeyFromCommands (Command.HotKey);
  136. Assert.Equal (Key.A, resultKey);
  137. }
  138. [Fact]
  139. public void Replace_Key ()
  140. {
  141. var keyBindings = new KeyBindings ();
  142. keyBindings.Add (Key.A, Command.HotKey);
  143. keyBindings.Add (Key.B, Command.HotKey);
  144. keyBindings.Add (Key.C, Command.HotKey);
  145. keyBindings.Add (Key.D, Command.HotKey);
  146. keyBindings.Replace (Key.A, Key.E);
  147. Assert.Empty (keyBindings.GetCommands (Key.A));
  148. Assert.Contains (Command.HotKey, keyBindings.GetCommands (Key.E));
  149. keyBindings.Replace (Key.B, Key.E);
  150. Assert.Empty (keyBindings.GetCommands (Key.B));
  151. Assert.Contains (Command.HotKey, keyBindings.GetCommands (Key.E));
  152. keyBindings.Replace (Key.C, Key.E);
  153. Assert.Empty (keyBindings.GetCommands (Key.C));
  154. Assert.Contains (Command.HotKey, keyBindings.GetCommands (Key.E));
  155. keyBindings.Replace (Key.D, Key.E);
  156. Assert.Empty (keyBindings.GetCommands (Key.D));
  157. Assert.Contains (Command.HotKey, keyBindings.GetCommands (Key.E));
  158. }
  159. // Add with scope does the right things
  160. [Theory]
  161. [InlineData (KeyBindingScope.Focused)]
  162. [InlineData (KeyBindingScope.HotKey)]
  163. [InlineData (KeyBindingScope.Application)]
  164. public void Scope_Add_Adds (KeyBindingScope scope)
  165. {
  166. var keyBindings = new KeyBindings ();
  167. Command [] commands = { Command.Right, Command.Left };
  168. var key = new Key (Key.A);
  169. keyBindings.Add (Key.A, scope, commands);
  170. KeyBinding binding = keyBindings.Get (key);
  171. Assert.Contains (Command.Right, binding.Commands);
  172. Assert.Contains (Command.Left, binding.Commands);
  173. binding = keyBindings.Get (key, scope);
  174. Assert.Contains (Command.Right, binding.Commands);
  175. Assert.Contains (Command.Left, binding.Commands);
  176. Command [] resultCommands = keyBindings.GetCommands (key);
  177. Assert.Contains (Command.Right, resultCommands);
  178. Assert.Contains (Command.Left, resultCommands);
  179. }
  180. [Theory]
  181. [InlineData (KeyBindingScope.Focused)]
  182. [InlineData (KeyBindingScope.HotKey)]
  183. [InlineData (KeyBindingScope.Application)]
  184. public void Scope_Get_Filters (KeyBindingScope scope)
  185. {
  186. var keyBindings = new KeyBindings ();
  187. Command [] commands = { Command.Right, Command.Left };
  188. var key = new Key (Key.A);
  189. keyBindings.Add (key, scope, commands);
  190. KeyBinding binding = keyBindings.Get (key);
  191. Assert.Contains (Command.Right, binding.Commands);
  192. Assert.Contains (Command.Left, binding.Commands);
  193. binding = keyBindings.Get (key, scope);
  194. Assert.Contains (Command.Right, binding.Commands);
  195. Assert.Contains (Command.Left, binding.Commands);
  196. // negative test
  197. binding = keyBindings.Get (key, (KeyBindingScope)0);
  198. Assert.Null (binding);
  199. Command [] resultCommands = keyBindings.GetCommands (key);
  200. Assert.Contains (Command.Right, resultCommands);
  201. Assert.Contains (Command.Left, resultCommands);
  202. }
  203. [Theory]
  204. [InlineData (KeyBindingScope.Focused)]
  205. [InlineData (KeyBindingScope.HotKey)]
  206. [InlineData (KeyBindingScope.Application)]
  207. public void Scope_TryGet_Filters (KeyBindingScope scope)
  208. {
  209. var keyBindings = new KeyBindings ();
  210. Command [] commands = { Command.Right, Command.Left };
  211. var key = new Key (Key.A);
  212. keyBindings.Add (key, scope, commands);
  213. bool success = keyBindings.TryGet (key, out KeyBinding binding);
  214. Assert.Contains (Command.Right, binding.Commands);
  215. Assert.Contains (Command.Left, binding.Commands);
  216. success = keyBindings.TryGet (key, scope, out binding);
  217. Assert.Contains (Command.Right, binding.Commands);
  218. Assert.Contains (Command.Left, binding.Commands);
  219. // negative test
  220. success = keyBindings.TryGet (key, (KeyBindingScope)0, out binding);
  221. Assert.False (success);
  222. Command [] resultCommands = keyBindings.GetCommands (key);
  223. Assert.Contains (Command.Right, resultCommands);
  224. Assert.Contains (Command.Left, resultCommands);
  225. }
  226. // TryGet
  227. [Fact]
  228. public void TryGet_Unknown_ReturnsFalse ()
  229. {
  230. var keyBindings = new KeyBindings ();
  231. bool result = keyBindings.TryGet (Key.A, out KeyBinding _);
  232. Assert.False (result);
  233. }
  234. [Fact]
  235. public void TryGet_WithCommands_ReturnsTrue ()
  236. {
  237. var keyBindings = new KeyBindings ();
  238. keyBindings.Add (Key.A, Command.HotKey);
  239. bool result = keyBindings.TryGet (Key.A, out KeyBinding bindings);
  240. Assert.True (result);
  241. Assert.Contains (Command.HotKey, bindings.Commands);
  242. }
  243. }