KeyBindingTests.cs 7.9 KB

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