KeyTests.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. using System;
  2. using System.Text;
  3. using Xunit;
  4. using Xunit.Abstractions;
  5. namespace Terminal.Gui.InputTests;
  6. public class KeyTests {
  7. readonly ITestOutputHelper _output;
  8. public KeyTests (ITestOutputHelper output) => _output = output;
  9. [Fact]
  10. public void Constructor_Default_ShouldSetKeyToNull ()
  11. {
  12. var eventArgs = new Key ();
  13. Assert.Equal (KeyCode.Null, eventArgs.KeyCode);
  14. }
  15. [Theory]
  16. [InlineData (KeyCode.Enter)]
  17. [InlineData (KeyCode.Esc)]
  18. [InlineData (KeyCode.A)]
  19. public void Constructor_WithKey_ShouldSetCorrectKey (KeyCode key)
  20. {
  21. var eventArgs = new Key (key);
  22. Assert.Equal (key, eventArgs.KeyCode);
  23. }
  24. // IsValid
  25. [Theory]
  26. [InlineData (KeyCode.A, true)]
  27. [InlineData (KeyCode.B, true)]
  28. [InlineData (KeyCode.F1 | KeyCode.ShiftMask, true)]
  29. [InlineData (KeyCode.Null, false)]
  30. [InlineData (KeyCode.ShiftMask, false)]
  31. [InlineData (KeyCode.CtrlMask, false)]
  32. [InlineData (KeyCode.AltMask, false)]
  33. [InlineData (KeyCode.ShiftMask | KeyCode.AltMask, false)]
  34. public void IsValid (Key key, bool expected) => Assert.Equal (expected, key.IsValid);
  35. [Fact]
  36. public void HandledProperty_ShouldBeFalseByDefault ()
  37. {
  38. var eventArgs = new Key ();
  39. Assert.False (eventArgs.Handled);
  40. }
  41. [Theory]
  42. [InlineData (KeyCode.Enter, KeyCode.Enter)]
  43. [InlineData (KeyCode.Esc, KeyCode.Esc)]
  44. [InlineData (KeyCode.A, (KeyCode)'a')]
  45. [InlineData (KeyCode.A | KeyCode.ShiftMask, KeyCode.A | KeyCode.ShiftMask)]
  46. [InlineData (KeyCode.Z, (KeyCode)'z')]
  47. [InlineData (KeyCode.Space, KeyCode.Space)]
  48. public void Cast_KeyCode_To_Key (KeyCode cdk, Key expected)
  49. {
  50. // explicit
  51. var key = (Key)cdk;
  52. Assert.Equal (expected.ToString (), key.ToString ());
  53. // implicit
  54. key = cdk;
  55. Assert.Equal (expected.ToString (), key.ToString ());
  56. }
  57. [Theory]
  58. [InlineData ((KeyCode)'a', true)]
  59. [InlineData ((KeyCode)'a' | KeyCode.ShiftMask, true)]
  60. [InlineData (KeyCode.A, true)]
  61. [InlineData (KeyCode.A | KeyCode.ShiftMask, true)]
  62. [InlineData (KeyCode.F, true)]
  63. [InlineData (KeyCode.F | KeyCode.ShiftMask, true)]
  64. // these have alt or ctrl modifiers or are not a..z
  65. [InlineData (KeyCode.A | KeyCode.CtrlMask, false)]
  66. [InlineData (KeyCode.A | KeyCode.AltMask, false)]
  67. [InlineData (KeyCode.D0, false)]
  68. [InlineData (KeyCode.Esc, false)]
  69. [InlineData (KeyCode.Tab, false)]
  70. public void IsKeyCodeAtoZ (KeyCode key, bool expected)
  71. {
  72. var eventArgs = new Key (key);
  73. Assert.Equal (expected, eventArgs.IsKeyCodeAtoZ);
  74. }
  75. [Theory]
  76. [InlineData ((KeyCode)'❿', '❿')]
  77. [InlineData ((KeyCode)'☑', '☑')]
  78. [InlineData ((KeyCode)'英', '英')]
  79. [InlineData ((KeyCode)'{', '{')]
  80. [InlineData ((KeyCode)'\'', '\'')]
  81. [InlineData ((KeyCode)'\r', '\r')]
  82. [InlineData ((KeyCode)'ó', 'ó')]
  83. [InlineData ((KeyCode)'ó' | KeyCode.ShiftMask, 'ó')]
  84. [InlineData ((KeyCode)'Ó', 'Ó')]
  85. [InlineData ((KeyCode)'ç' | KeyCode.ShiftMask | KeyCode.AltMask | KeyCode.CtrlMask, '\0')]
  86. [InlineData ((KeyCode)'a', 97)] // 97 or Key.Space | Key.A
  87. [InlineData ((KeyCode)'A', 97)] // 65 or equivalent to Key.A, but A-Z are mapped to lower case by drivers
  88. //[InlineData (Key.A, 97)] // 65 equivalent to (Key)'A', but A-Z are mapped to lower case by drivers
  89. [InlineData (KeyCode.ShiftMask | KeyCode.A, 65)]
  90. [InlineData (KeyCode.CtrlMask | KeyCode.A, '\0')]
  91. [InlineData (KeyCode.AltMask | KeyCode.A, '\0')]
  92. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.A, '\0')]
  93. [InlineData (KeyCode.ShiftMask | KeyCode.AltMask | KeyCode.A, '\0')]
  94. [InlineData (KeyCode.AltMask | KeyCode.CtrlMask | KeyCode.A, '\0')]
  95. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.A, '\0')]
  96. [InlineData ((KeyCode)'z', 'z')]
  97. [InlineData ((KeyCode)'Z', 'z')]
  98. [InlineData (KeyCode.ShiftMask | KeyCode.Z, 'Z')]
  99. [InlineData ((KeyCode)'1', '1')]
  100. [InlineData (KeyCode.ShiftMask | KeyCode.D1, '1')]
  101. [InlineData (KeyCode.CtrlMask | KeyCode.D1, '\0')]
  102. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.D1, '\0')]
  103. [InlineData (KeyCode.F1, '\0')]
  104. [InlineData (KeyCode.ShiftMask | KeyCode.F1, '\0')]
  105. [InlineData (KeyCode.CtrlMask | KeyCode.F1, '\0')]
  106. [InlineData (KeyCode.Enter, '\n')]
  107. [InlineData (KeyCode.Tab, '\t')]
  108. [InlineData (KeyCode.Esc, 0x1b)]
  109. [InlineData (KeyCode.Space, ' ')]
  110. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.Enter, '\0')]
  111. [InlineData (KeyCode.Null, '\0')]
  112. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.Null, '\0')]
  113. [InlineData (KeyCode.CharMask, '\0')]
  114. [InlineData (KeyCode.SpecialMask, '\0')]
  115. public void AsRune_ShouldReturnCorrectIntValue (KeyCode key, Rune expected)
  116. {
  117. var eventArgs = new Key (key);
  118. Assert.Equal (expected, eventArgs.AsRune);
  119. }
  120. [Theory]
  121. [InlineData (KeyCode.AltMask, true)]
  122. [InlineData (KeyCode.A, false)]
  123. public void IsAlt_ShouldReturnCorrectValue (KeyCode key, bool expected)
  124. {
  125. var eventArgs = new Key (key);
  126. Assert.Equal (expected, eventArgs.IsAlt);
  127. }
  128. [Fact]
  129. public void WithShift_ShouldReturnCorrectValue ()
  130. {
  131. var a = new Key (KeyCode.A);
  132. Assert.Equal (KeyCode.A | KeyCode.ShiftMask, a.WithShift);
  133. var CAD = Key.Delete.WithCtrl.WithAlt;
  134. Assert.Equal (KeyCode.Delete | KeyCode.CtrlMask | KeyCode.AltMask, CAD);
  135. }
  136. [Fact]
  137. public void NoShift_ShouldReturnCorrectValue ()
  138. {
  139. var CAD = Key.Delete.WithCtrl.WithAlt;
  140. Assert.Equal (KeyCode.Delete | KeyCode.CtrlMask | KeyCode.AltMask, CAD);
  141. Assert.Equal (KeyCode.Delete | KeyCode.AltMask, CAD.NoCtrl);
  142. var a = new Key (KeyCode.A).WithCtrl.WithAlt.WithShift;
  143. Assert.Equal (KeyCode.A, a.NoCtrl.NoShift.NoAlt);
  144. Assert.Equal (KeyCode.A, a.NoAlt.NoShift.NoCtrl);
  145. Assert.Equal (KeyCode.A, a.NoAlt.NoShift.NoCtrl.NoCtrl.NoAlt.NoShift);
  146. Assert.Equal (Key.Delete, Key.Delete.WithCtrl.NoCtrl);
  147. Assert.Equal ((KeyCode)Key.Delete | KeyCode.CtrlMask, Key.Delete.NoCtrl.WithCtrl);
  148. }
  149. [Fact]
  150. public void Standard_Keys_Should_Equal_KeyCode ()
  151. {
  152. Assert.Equal (KeyCode.A, Key.A);
  153. Assert.Equal (KeyCode.Delete, Key.Delete);
  154. }
  155. // TODO: Create equality operator for KeyCode
  156. //Assert.Equal (KeyCode.Delete, Key.Delete);
  157. // Similar tests for IsShift and IsCtrl
  158. [Fact]
  159. public void ToString_ShouldReturnReadableString ()
  160. {
  161. var eventArgs = new Key (KeyCode.CtrlMask | KeyCode.A);
  162. Assert.Equal ("Ctrl+A", eventArgs.ToString ());
  163. }
  164. [Theory]
  165. [InlineData (KeyCode.CtrlMask | KeyCode.A, '+', "Ctrl+A")]
  166. [InlineData (KeyCode.AltMask | KeyCode.B, '-', "Alt-B")]
  167. public void ToStringWithSeparator_ShouldReturnFormattedString (KeyCode key, char separator, string expected) => Assert.Equal (expected, Key.ToString (key, (Rune)separator));
  168. [Theory]
  169. [InlineData ((KeyCode)'☑', "☑")]
  170. //[InlineData ((ConsoleDriverKey)'英', "英")]
  171. //[InlineData ((ConsoleDriverKey)'{', "{")]
  172. [InlineData ((KeyCode)'\'', "\'")]
  173. [InlineData ((KeyCode)'ó', "ó")]
  174. [InlineData ((KeyCode)'ó' | KeyCode.ShiftMask, "Shift+ó")] // is this right???
  175. [InlineData ((KeyCode)'Ó', "Ó")]
  176. [InlineData ((KeyCode)'ç' | KeyCode.ShiftMask | KeyCode.AltMask | KeyCode.CtrlMask, "Ctrl+Alt+Shift+ç")]
  177. [InlineData ((KeyCode)'a', "a")] // 97 or Key.Space | Key.A
  178. [InlineData ((KeyCode)'A', "a")] // 65 or equivalent to Key.A, but A-Z are mapped to lower case by drivers
  179. [InlineData (KeyCode.ShiftMask | KeyCode.A, "A")]
  180. [InlineData ((KeyCode)'a' | KeyCode.ShiftMask, "A")]
  181. [InlineData (KeyCode.CtrlMask | KeyCode.A, "Ctrl+A")]
  182. [InlineData (KeyCode.AltMask | KeyCode.A, "Alt+A")]
  183. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.A, "Ctrl+Shift+A")]
  184. [InlineData (KeyCode.ShiftMask | KeyCode.AltMask | KeyCode.A, "Alt+Shift+A")]
  185. [InlineData (KeyCode.AltMask | KeyCode.CtrlMask | KeyCode.A, "Ctrl+Alt+A")]
  186. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.A, "Ctrl+Alt+Shift+A")]
  187. [InlineData (KeyCode.ShiftMask | KeyCode.Z, "Z")]
  188. [InlineData (KeyCode.CtrlMask | KeyCode.Z, "Ctrl+Z")]
  189. [InlineData (KeyCode.AltMask | KeyCode.Z, "Alt+Z")]
  190. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.Z, "Ctrl+Shift+Z")]
  191. [InlineData (KeyCode.ShiftMask | KeyCode.AltMask | KeyCode.Z, "Alt+Shift+Z")]
  192. [InlineData (KeyCode.AltMask | KeyCode.CtrlMask | KeyCode.Z, "Ctrl+Alt+Z")]
  193. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.Z, "Ctrl+Alt+Shift+Z")]
  194. [InlineData ((KeyCode)'1', "1")]
  195. [InlineData (KeyCode.ShiftMask | KeyCode.D1, "Shift+1")]
  196. [InlineData (KeyCode.CtrlMask | KeyCode.D1, "Ctrl+1")]
  197. [InlineData (KeyCode.AltMask | KeyCode.D1, "Alt+1")]
  198. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.D1, "Ctrl+Shift+1")]
  199. [InlineData (KeyCode.ShiftMask | KeyCode.AltMask | KeyCode.D1, "Alt+Shift+1")]
  200. [InlineData (KeyCode.AltMask | KeyCode.CtrlMask | KeyCode.D1, "Ctrl+Alt+1")]
  201. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.D1, "Ctrl+Alt+Shift+1")]
  202. [InlineData (KeyCode.F1, "F1")]
  203. [InlineData (KeyCode.ShiftMask | KeyCode.F1, "Shift+F1")]
  204. [InlineData (KeyCode.CtrlMask | KeyCode.F1, "Ctrl+F1")]
  205. [InlineData (KeyCode.AltMask | KeyCode.F1, "Alt+F1")]
  206. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.F1, "Ctrl+Shift+F1")]
  207. [InlineData (KeyCode.ShiftMask | KeyCode.AltMask | KeyCode.F1, "Alt+Shift+F1")]
  208. [InlineData (KeyCode.AltMask | KeyCode.CtrlMask | KeyCode.F1, "Ctrl+Alt+F1")]
  209. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.F1, "Ctrl+Alt+Shift+F1")]
  210. [InlineData (KeyCode.Enter, "Enter")]
  211. [InlineData (KeyCode.ShiftMask | KeyCode.Enter, "Shift+Enter")]
  212. [InlineData (KeyCode.CtrlMask | KeyCode.Enter, "Ctrl+Enter")]
  213. [InlineData (KeyCode.AltMask | KeyCode.Enter, "Alt+Enter")]
  214. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.Enter, "Ctrl+Shift+Enter")]
  215. [InlineData (KeyCode.ShiftMask | KeyCode.AltMask | KeyCode.Enter, "Alt+Shift+Enter")]
  216. [InlineData (KeyCode.AltMask | KeyCode.CtrlMask | KeyCode.Enter, "Ctrl+Alt+Enter")]
  217. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.Enter, "Ctrl+Alt+Shift+Enter")]
  218. [InlineData (KeyCode.Delete, "Delete")]
  219. [InlineData (KeyCode.ShiftMask | KeyCode.Delete, "Shift+Delete")]
  220. [InlineData (KeyCode.CtrlMask | KeyCode.Delete, "Ctrl+Delete")]
  221. [InlineData (KeyCode.AltMask | KeyCode.Delete, "Alt+Delete")]
  222. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.Delete, "Ctrl+Shift+Delete")]
  223. [InlineData (KeyCode.ShiftMask | KeyCode.AltMask | KeyCode.Delete, "Alt+Shift+Delete")]
  224. [InlineData (KeyCode.AltMask | KeyCode.CtrlMask | KeyCode.Delete, "Ctrl+Alt+Delete")]
  225. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.Delete, "Ctrl+Alt+Shift+Delete")]
  226. [InlineData (KeyCode.CursorUp, "CursorUp")]
  227. [InlineData (KeyCode.ShiftMask | KeyCode.CursorUp, "Shift+CursorUp")]
  228. [InlineData (KeyCode.CtrlMask | KeyCode.CursorUp, "Ctrl+CursorUp")]
  229. [InlineData (KeyCode.AltMask | KeyCode.CursorUp, "Alt+CursorUp")]
  230. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.CursorUp, "Ctrl+Shift+CursorUp")]
  231. [InlineData (KeyCode.ShiftMask | KeyCode.AltMask | KeyCode.CursorUp, "Alt+Shift+CursorUp")]
  232. [InlineData (KeyCode.AltMask | KeyCode.CtrlMask | KeyCode.CursorUp, "Ctrl+Alt+CursorUp")]
  233. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.CursorUp, "Ctrl+Alt+Shift+CursorUp")]
  234. [InlineData (KeyCode.Null, "Null")]
  235. [InlineData (KeyCode.ShiftMask | KeyCode.Null, "Null")]
  236. [InlineData (KeyCode.CtrlMask | KeyCode.Null, "Null")]
  237. [InlineData (KeyCode.AltMask | KeyCode.Null, "Null")]
  238. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.Null, "Null")]
  239. [InlineData (KeyCode.ShiftMask | KeyCode.AltMask | KeyCode.Null, "Null")]
  240. [InlineData (KeyCode.AltMask | KeyCode.CtrlMask | KeyCode.Null, "Null")]
  241. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.Null, "Null")]
  242. [InlineData (KeyCode.Null, "Null")]
  243. [InlineData (KeyCode.ShiftMask | KeyCode.Null, "Null")]
  244. [InlineData (KeyCode.CtrlMask | KeyCode.Null, "Null")]
  245. [InlineData (KeyCode.AltMask | KeyCode.Null, "Null")]
  246. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.Null, "Null")]
  247. [InlineData (KeyCode.ShiftMask | KeyCode.AltMask | KeyCode.Null, "Null")]
  248. [InlineData (KeyCode.AltMask | KeyCode.CtrlMask | KeyCode.Null, "Null")]
  249. [InlineData (KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.Null, "Null")]
  250. [InlineData (KeyCode.AltKey, "AltKey")]
  251. [InlineData (KeyCode.CtrlKey, "CtrlKey")]
  252. [InlineData (KeyCode.ShiftKey, "ShiftKey")]
  253. [InlineData (KeyCode.CharMask, "CharMask")]
  254. [InlineData (KeyCode.SpecialMask, "Ctrl+Alt+Shift")]
  255. public void ToString_ShouldReturnFormattedString (KeyCode key, string expected) => Assert.Equal (expected, Key.ToString (key));
  256. // TryParse
  257. [Theory]
  258. [InlineData ("a", KeyCode.A)]
  259. [InlineData ("Ctrl+A", KeyCode.A | KeyCode.CtrlMask)]
  260. [InlineData ("Alt+A", KeyCode.A | KeyCode.AltMask)]
  261. [InlineData ("Shift+A", KeyCode.A | KeyCode.ShiftMask)]
  262. [InlineData ("A", KeyCode.A | KeyCode.ShiftMask)]
  263. [InlineData ("â", (KeyCode)'â')]
  264. [InlineData ("Shift+â", (KeyCode)'â' | KeyCode.ShiftMask)]
  265. [InlineData ("Shift+Â", (KeyCode)'Â' | KeyCode.ShiftMask)]
  266. [InlineData ("Ctrl+Shift+CursorUp", KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.CursorUp)]
  267. [InlineData ("Ctrl+Alt+Shift+CursorUp", KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.CursorUp)]
  268. [InlineData ("ctrl+alt+shift+cursorup", KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.CursorUp)]
  269. [InlineData ("CTRL+ALT+SHIFT+CURSORUP", KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.CursorUp)]
  270. [InlineData ("Ctrl+Alt+Shift+Delete", KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.Delete)]
  271. [InlineData ("Ctrl+Alt+Shift+Enter", KeyCode.ShiftMask | KeyCode.CtrlMask | KeyCode.AltMask | KeyCode.Enter)]
  272. [InlineData ("Tab", KeyCode.Tab)]
  273. [InlineData ("Shift+Tab", KeyCode.Tab | KeyCode.ShiftMask)]
  274. [InlineData ("Ctrl+Tab", KeyCode.Tab | KeyCode.CtrlMask)]
  275. [InlineData ("Alt+Tab", KeyCode.Tab | KeyCode.AltMask)]
  276. [InlineData ("Ctrl+Shift+Tab", KeyCode.Tab | KeyCode.ShiftMask | KeyCode.CtrlMask)]
  277. [InlineData ("Ctrl+Alt+Tab", KeyCode.Tab | KeyCode.AltMask | KeyCode.CtrlMask)]
  278. [InlineData ("", KeyCode.Null)]
  279. [InlineData (" ", KeyCode.Space)]
  280. [InlineData ("Shift+ ", KeyCode.Space | KeyCode.ShiftMask)]
  281. [InlineData ("Ctrl+ ", KeyCode.Space | KeyCode.CtrlMask)]
  282. [InlineData ("Alt+ ", KeyCode.Space | KeyCode.AltMask)]
  283. [InlineData ("F1", KeyCode.F1)]
  284. [InlineData ("0", KeyCode.D0)]
  285. [InlineData ("9", KeyCode.D9)]
  286. [InlineData ("D0", KeyCode.D0)]
  287. [InlineData ("65", KeyCode.A | KeyCode.ShiftMask)]
  288. [InlineData ("97", KeyCode.A)]
  289. [InlineData ("Shift", KeyCode.ShiftKey)]
  290. [InlineData ("Ctrl", KeyCode.CtrlKey)]
  291. [InlineData ("Ctrl-A", KeyCode.A | KeyCode.CtrlMask)]
  292. [InlineData ("Alt-A", KeyCode.A | KeyCode.AltMask)]
  293. [InlineData ("A-Ctrl", KeyCode.A | KeyCode.CtrlMask)]
  294. [InlineData ("Alt-A-Ctrl", KeyCode.A | KeyCode.CtrlMask | KeyCode.AltMask)]
  295. public void TryParse_ShouldReturnTrue_WhenValidKey (string keyString, Key expected)
  296. {
  297. Key key;
  298. Assert.True (Key.TryParse (keyString, out key));
  299. Assert.Equal (((Key)expected).ToString (), key.ToString ());
  300. }
  301. [Theory]
  302. [InlineData ("aa")]
  303. [InlineData ("-1")]
  304. [InlineData ("Crtl-A")]
  305. [InlineData ("Ctrl=A")]
  306. [InlineData ("Crtl")]
  307. [InlineData ("99a")]
  308. [InlineData ("a99")]
  309. [InlineData ("#99")]
  310. [InlineData ("x99")]
  311. [InlineData ("0x99")]
  312. [InlineData ("Ctrl-Ctrl")]
  313. public void TryParse_ShouldReturnFalse_On_InvalidKey (string keyString) => Assert.False (Key.TryParse (keyString, out var _));
  314. }