keys.test.ts 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. import { KEYS, matchKey } from "../src/keys";
  2. describe("key matcher", async () => {
  3. it("should not match unexpected key", async () => {
  4. expect(
  5. matchKey(new KeyboardEvent("keydown", { key: "N" }), KEYS.Y),
  6. ).toBeFalsy();
  7. expect(
  8. matchKey(new KeyboardEvent("keydown", { key: "Unidentified" }), KEYS.Z),
  9. ).toBeFalsy();
  10. expect(
  11. matchKey(new KeyboardEvent("keydown", { key: "z" }), KEYS.Y),
  12. ).toBeFalsy();
  13. expect(
  14. matchKey(new KeyboardEvent("keydown", { key: "y" }), KEYS.Z),
  15. ).toBeFalsy();
  16. expect(
  17. matchKey(new KeyboardEvent("keydown", { key: "Z" }), KEYS.Y),
  18. ).toBeFalsy();
  19. expect(
  20. matchKey(new KeyboardEvent("keydown", { key: "Y" }), KEYS.Z),
  21. ).toBeFalsy();
  22. });
  23. it("should match key (case insensitive) when key is latin", async () => {
  24. expect(
  25. matchKey(new KeyboardEvent("keydown", { key: "z" }), KEYS.Z),
  26. ).toBeTruthy();
  27. expect(
  28. matchKey(new KeyboardEvent("keydown", { key: "y" }), KEYS.Y),
  29. ).toBeTruthy();
  30. expect(
  31. matchKey(new KeyboardEvent("keydown", { key: "Z" }), KEYS.Z),
  32. ).toBeTruthy();
  33. expect(
  34. matchKey(new KeyboardEvent("keydown", { key: "Y" }), KEYS.Y),
  35. ).toBeTruthy();
  36. });
  37. it("should match key on QWERTY, QWERTZ, AZERTY", async () => {
  38. // QWERTY
  39. expect(
  40. matchKey(
  41. new KeyboardEvent("keydown", { key: "z", code: "KeyZ" }),
  42. KEYS.Z,
  43. ),
  44. ).toBeTruthy();
  45. expect(
  46. matchKey(
  47. new KeyboardEvent("keydown", { key: "y", code: "KeyY" }),
  48. KEYS.Y,
  49. ),
  50. ).toBeTruthy();
  51. // QWERTZ
  52. expect(
  53. matchKey(
  54. new KeyboardEvent("keydown", { key: "z", code: "KeyY" }),
  55. KEYS.Z,
  56. ),
  57. ).toBeTruthy();
  58. expect(
  59. matchKey(
  60. new KeyboardEvent("keydown", { key: "y", code: "KeyZ" }),
  61. KEYS.Y,
  62. ),
  63. ).toBeTruthy();
  64. // AZERTY
  65. expect(
  66. matchKey(
  67. new KeyboardEvent("keydown", { key: "z", code: "KeyW" }),
  68. KEYS.Z,
  69. ),
  70. ).toBeTruthy();
  71. expect(
  72. matchKey(
  73. new KeyboardEvent("keydown", { key: "y", code: "KeyY" }),
  74. KEYS.Y,
  75. ),
  76. ).toBeTruthy();
  77. });
  78. it("should match key on DVORAK, COLEMAK", async () => {
  79. // DVORAK
  80. expect(
  81. matchKey(
  82. new KeyboardEvent("keydown", { key: "z", code: "KeySemicolon" }),
  83. KEYS.Z,
  84. ),
  85. ).toBeTruthy();
  86. expect(
  87. matchKey(
  88. new KeyboardEvent("keydown", { key: "y", code: "KeyF" }),
  89. KEYS.Y,
  90. ),
  91. ).toBeTruthy();
  92. // COLEMAK
  93. expect(
  94. matchKey(
  95. new KeyboardEvent("keydown", { key: "z", code: "KeyZ" }),
  96. KEYS.Z,
  97. ),
  98. ).toBeTruthy();
  99. expect(
  100. matchKey(
  101. new KeyboardEvent("keydown", { key: "y", code: "KeyJ" }),
  102. KEYS.Y,
  103. ),
  104. ).toBeTruthy();
  105. });
  106. it("should match key on Turkish-Q", async () => {
  107. // Turkish-Q
  108. expect(
  109. matchKey(
  110. new KeyboardEvent("keydown", { key: "z", code: "KeyN" }),
  111. KEYS.Z,
  112. ),
  113. ).toBeTruthy();
  114. expect(
  115. matchKey(
  116. new KeyboardEvent("keydown", { key: "Y", code: "KeyY" }),
  117. KEYS.Y,
  118. ),
  119. ).toBeTruthy();
  120. });
  121. it("should not fallback when code is not defined", async () => {
  122. expect(
  123. matchKey(new KeyboardEvent("keydown", { key: "я" }), KEYS.Z),
  124. ).toBeFalsy();
  125. expect(
  126. matchKey(new KeyboardEvent("keydown", { key: "卜" }), KEYS.Y),
  127. ).toBeFalsy();
  128. });
  129. it("should not fallback when code is incorrect", async () => {
  130. expect(
  131. matchKey(
  132. new KeyboardEvent("keydown", { key: "z", code: "KeyY" }),
  133. KEYS.Y,
  134. ),
  135. ).toBeFalsy();
  136. expect(
  137. matchKey(
  138. new KeyboardEvent("keydown", { key: "Y", code: "KeyZ" }),
  139. KEYS.Z,
  140. ),
  141. ).toBeFalsy();
  142. });
  143. it("should fallback to code when key is non-latin", async () => {
  144. // Macedonian
  145. expect(
  146. matchKey(
  147. new KeyboardEvent("keydown", { key: "з", code: "KeyZ" }),
  148. KEYS.Z,
  149. ),
  150. ).toBeTruthy();
  151. expect(
  152. matchKey(
  153. new KeyboardEvent("keydown", { key: "ѕ", code: "KeyY" }),
  154. KEYS.Y,
  155. ),
  156. ).toBeTruthy();
  157. // Russian
  158. expect(
  159. matchKey(
  160. new KeyboardEvent("keydown", { key: "я", code: "KeyZ" }),
  161. KEYS.Z,
  162. ),
  163. ).toBeTruthy();
  164. expect(
  165. matchKey(
  166. new KeyboardEvent("keydown", { key: "н", code: "KeyY" }),
  167. KEYS.Y,
  168. ),
  169. ).toBeTruthy();
  170. // Serbian
  171. expect(
  172. matchKey(
  173. new KeyboardEvent("keydown", { key: "ѕ", code: "KeyZ" }),
  174. KEYS.Z,
  175. ),
  176. ).toBeTruthy();
  177. expect(
  178. matchKey(
  179. new KeyboardEvent("keydown", { key: "з", code: "KeyY" }),
  180. KEYS.Y,
  181. ),
  182. ).toBeTruthy();
  183. // Greek
  184. expect(
  185. matchKey(
  186. new KeyboardEvent("keydown", { key: "ζ", code: "KeyZ" }),
  187. KEYS.Z,
  188. ),
  189. ).toBeTruthy();
  190. expect(
  191. matchKey(
  192. new KeyboardEvent("keydown", { key: "υ", code: "KeyY" }),
  193. KEYS.Y,
  194. ),
  195. ).toBeTruthy();
  196. // Hebrew
  197. expect(
  198. matchKey(
  199. new KeyboardEvent("keydown", { key: "ז", code: "KeyZ" }),
  200. KEYS.Z,
  201. ),
  202. ).toBeTruthy();
  203. expect(
  204. matchKey(
  205. new KeyboardEvent("keydown", { key: "ט", code: "KeyY" }),
  206. KEYS.Y,
  207. ),
  208. ).toBeTruthy();
  209. // Cangjie - Traditional
  210. expect(
  211. matchKey(
  212. new KeyboardEvent("keydown", { key: "重", code: "KeyZ" }),
  213. KEYS.Z,
  214. ),
  215. ).toBeTruthy();
  216. expect(
  217. matchKey(
  218. new KeyboardEvent("keydown", { key: "卜", code: "KeyY" }),
  219. KEYS.Y,
  220. ),
  221. ).toBeTruthy();
  222. // Japanese
  223. expect(
  224. matchKey(
  225. new KeyboardEvent("keydown", { key: "つ", code: "KeyZ" }),
  226. KEYS.Z,
  227. ),
  228. ).toBeTruthy();
  229. expect(
  230. matchKey(
  231. new KeyboardEvent("keydown", { key: "ん", code: "KeyY" }),
  232. KEYS.Y,
  233. ),
  234. ).toBeTruthy();
  235. // 2-Set Korean
  236. expect(
  237. matchKey(
  238. new KeyboardEvent("keydown", { key: "ㅋ", code: "KeyZ" }),
  239. KEYS.Z,
  240. ),
  241. ).toBeTruthy();
  242. expect(
  243. matchKey(
  244. new KeyboardEvent("keydown", { key: "ㅛ", code: "KeyY" }),
  245. KEYS.Y,
  246. ),
  247. ).toBeTruthy();
  248. });
  249. });