/VimCoreTest/KeyInputUtilTest.cs

https://github.com/insaneisnotfree/VsVim · C# · 275 lines · 238 code · 28 blank · 9 comment · 11 complexity · 0ea87ac702cf102b308119ae45903d6d MD5 · raw file

  1. using System;
  2. using System.Linq;
  3. using NUnit.Framework;
  4. using Vim;
  5. using Vim.Extensions;
  6. namespace VimCore.UnitTest
  7. {
  8. /// <summary>
  9. /// Summary description for InputUtilTest
  10. /// </summary>
  11. [TestFixture]
  12. public class KeyInputUtilTest
  13. {
  14. public const string CharsLettersLower = "abcdefghijklmnopqrstuvwxyz";
  15. public const string CharsLettersUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  16. public const string CharsRest = " !@#$%^&*()[]{}-_=+\\|'\",<>./?:;`~1234567890";
  17. public const string CharsAll =
  18. CharsLettersLower +
  19. CharsLettersUpper +
  20. CharsRest;
  21. [Test]
  22. public void CoreCharList1()
  23. {
  24. foreach (var cur in CharsAll)
  25. {
  26. CollectionAssert.Contains(KeyInputUtil.VimKeyCharList, cur);
  27. }
  28. }
  29. [Test]
  30. public void CharToKeyInput_LowerLetters()
  31. {
  32. foreach (var cur in CharsLettersLower)
  33. {
  34. var ki = KeyInputUtil.CharToKeyInput(cur);
  35. Assert.AreEqual(cur, ki.Char);
  36. Assert.AreEqual(KeyModifiers.None, ki.KeyModifiers);
  37. var offset = ((int)cur) - ((int)'a');
  38. var key = (VimKey)((int)VimKey.LowerA + offset);
  39. Assert.AreEqual(key, ki.Key);
  40. }
  41. }
  42. [Test]
  43. public void CharToKeyInput_UpperLetters()
  44. {
  45. foreach (var cur in CharsLettersUpper)
  46. {
  47. var ki = KeyInputUtil.CharToKeyInput(cur);
  48. Assert.AreEqual(cur, ki.Char);
  49. Assert.AreEqual(KeyModifiers.None, ki.KeyModifiers);
  50. var offset = ((int)cur) - ((int)'A');
  51. var key = (VimKey)((int)VimKey.UpperA + offset);
  52. Assert.AreEqual(key, ki.Key);
  53. }
  54. }
  55. [Test]
  56. public void CharToKeyInput_AllCoreCharsMapToThemselves()
  57. {
  58. foreach (var cur in KeyInputUtil.VimKeyCharList)
  59. {
  60. var ki = KeyInputUtil.CharToKeyInput(cur);
  61. Assert.IsTrue(ki.RawChar.IsSome());
  62. Assert.AreEqual(KeyModifiers.None, ki.KeyModifiers);
  63. Assert.AreEqual(cur, ki.Char);
  64. }
  65. }
  66. [Test]
  67. public void CharToKeyInput_AllOurCharsMapToThemselves()
  68. {
  69. foreach (var cur in CharsAll)
  70. {
  71. var ki = KeyInputUtil.CharToKeyInput(cur);
  72. Assert.IsTrue(ki.RawChar.IsSome());
  73. Assert.AreEqual(cur, ki.Char);
  74. }
  75. }
  76. [Test]
  77. public void CoreKeyInputList_ContainsSpecialKeys()
  78. {
  79. var array = new[]
  80. {
  81. KeyInputUtil.EnterKey,
  82. KeyInputUtil.EscapeKey,
  83. KeyInputUtil.TabKey,
  84. KeyInputUtil.LineFeedKey,
  85. };
  86. foreach (var cur in array)
  87. {
  88. Assert.IsTrue(KeyInputUtil.VimKeyInputList.Contains(cur));
  89. }
  90. }
  91. [Test]
  92. public void MinusKey1()
  93. {
  94. var ki = KeyInputUtil.CharToKeyInput('_');
  95. Assert.AreEqual('_', ki.Char);
  96. Assert.AreEqual(KeyModifiers.None, ki.KeyModifiers);
  97. }
  98. [Test]
  99. public void MinusKey2()
  100. {
  101. var ki = KeyInputUtil.CharToKeyInput('-');
  102. Assert.AreEqual('-', ki.Char);
  103. Assert.AreEqual(KeyModifiers.None, ki.KeyModifiers);
  104. }
  105. [Test]
  106. public void Percent1()
  107. {
  108. var ki = KeyInputUtil.CharToKeyInput('%');
  109. Assert.AreEqual('%', ki.Char);
  110. Assert.AreEqual(KeyModifiers.None, ki.KeyModifiers);
  111. }
  112. [Test]
  113. public void Tilde1()
  114. {
  115. var ki = KeyInputUtil.CharToKeyInput('~');
  116. Assert.AreEqual('~', ki.Char);
  117. }
  118. [Test]
  119. [ExpectedException(typeof(ArgumentException))]
  120. public void VimKeyToKeyInput1()
  121. {
  122. KeyInputUtil.VimKeyToKeyInput(VimKey.None);
  123. }
  124. [Test]
  125. public void VimKeyToKeyInput3()
  126. {
  127. foreach (var cur in Enum.GetValues(typeof(VimKey)).Cast<VimKey>())
  128. {
  129. if (cur == VimKey.None || cur == VimKey.RawCharacter)
  130. {
  131. continue;
  132. }
  133. var ki = KeyInputUtil.VimKeyToKeyInput(cur);
  134. Assert.AreEqual(cur, ki.Key);
  135. }
  136. }
  137. [Test]
  138. public void VimKeyAndModifiersToKeyInput1()
  139. {
  140. foreach (var cur in Enum.GetValues(typeof(VimKey)).Cast<VimKey>())
  141. {
  142. if (cur == VimKey.None || cur == VimKey.RawCharacter)
  143. {
  144. continue;
  145. }
  146. var ki = KeyInputUtil.VimKeyAndModifiersToKeyInput(cur, KeyModifiers.Control);
  147. Assert.AreEqual(cur, ki.Key);
  148. Assert.AreEqual(KeyModifiers.Control, ki.KeyModifiers & KeyModifiers.Control);
  149. }
  150. }
  151. [Test]
  152. public void Keypad1()
  153. {
  154. var left = KeyInputUtil.CharToKeyInput('+');
  155. var right = KeyInputUtil.VimKeyToKeyInput(VimKey.KeypadPlus);
  156. Assert.AreNotEqual(left, right);
  157. }
  158. [Test]
  159. public void Keypad2()
  160. {
  161. var left = KeyInputUtil.CharToKeyInput('-');
  162. var right = KeyInputUtil.VimKeyToKeyInput(VimKey.KeypadMinus);
  163. Assert.AreNotEqual(left, right);
  164. }
  165. [Test]
  166. public void ChangeKeyModifiers_ShiftWontChangeAlpha()
  167. {
  168. foreach (var letter in CharsLettersLower)
  169. {
  170. var lower = KeyInputUtil.CharToKeyInput(letter);
  171. var upper = KeyInputUtil.CharToKeyInput(Char.ToUpper(letter));
  172. var lowerWithShift = KeyInputUtil.ChangeKeyModifiers(lower, KeyModifiers.Shift);
  173. Assert.AreNotEqual(lowerWithShift, upper);
  174. }
  175. }
  176. [Test]
  177. public void ChangeKeyModifiers_RemoveShiftWontLowerAlpha()
  178. {
  179. foreach (var letter in CharsLettersLower)
  180. {
  181. var lower = KeyInputUtil.CharToKeyInput(letter);
  182. var upper = KeyInputUtil.CharToKeyInput(Char.ToUpper(letter));
  183. var upperNoShift = KeyInputUtil.ChangeKeyModifiers(upper, KeyModifiers.None);
  184. Assert.AreNotEqual(lower, upperNoShift);
  185. }
  186. }
  187. [Test]
  188. public void ChangeKeyModifiers_WontChangeChar()
  189. {
  190. var ki = KeyInputUtil.VimKeyToKeyInput(VimKey.OpenBracket);
  191. var ki2 = KeyInputUtil.ChangeKeyModifiers(ki, KeyModifiers.Shift);
  192. Assert.AreEqual(ki.Char, ki2.Char);
  193. }
  194. [Test]
  195. public void GetAlternateTarget_ShouldWorkWithAllValues()
  196. {
  197. foreach (var cur in KeyInputUtil.AlternateKeyInputList)
  198. {
  199. Assert.IsTrue(KeyInputUtil.GetAlternateTarget(cur).IsSome());
  200. }
  201. }
  202. [Test]
  203. public void AllAlternatesShouldEqualTheirTarget()
  204. {
  205. foreach (var cur in KeyInputUtil.AlternateKeyInputList)
  206. {
  207. var target = KeyInputUtil.GetAlternateTarget(cur).Value;
  208. Assert.AreEqual(target, cur);
  209. Assert.AreEqual(target.GetHashCode(), cur.GetHashCode());
  210. }
  211. }
  212. [Test]
  213. public void VerifyAlternateKeyInputPairListIsComplete()
  214. {
  215. foreach (var cur in KeyInputUtil.AlternateKeyInputPairList)
  216. {
  217. var target = cur.Item1;
  218. var alternate = cur.Item2;
  219. Assert.AreEqual(alternate, target.GetAlternate().Value);
  220. Assert.AreEqual(alternate, KeyInputUtil.GetAlternate(target).Value);
  221. Assert.AreEqual(target, KeyInputUtil.GetAlternateTarget(alternate).Value);
  222. }
  223. Assert.AreEqual(KeyInputUtil.AlternateKeyInputPairList.Count(), KeyInputUtil.AlternateKeyInputList.Count());
  224. }
  225. /// <summary>
  226. /// Too many APIs are simply not setup to handle alternate keys and hence we keep them out of the core
  227. /// list. APIs which want to include them should use the AlternateKeyInputList property directly
  228. /// </summary>
  229. [Test]
  230. public void AllKeyInputsShouldNotIncludeAlternateKeys()
  231. {
  232. foreach (var current in KeyInputUtil.AlternateKeyInputList)
  233. {
  234. foreach (var core in KeyInputUtil.VimKeyInputList)
  235. {
  236. // Can't use Equals since the core version of an alternate will be equal. Just
  237. // check the values manually
  238. var bruteEqual =
  239. core.Key == current.Key &&
  240. core.KeyModifiers == current.KeyModifiers &&
  241. core.Char == current.Char;
  242. Assert.IsFalse(bruteEqual);
  243. }
  244. }
  245. }
  246. }
  247. }