test.helper.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. var assert = chai.assert;
  2. var expect = chai.expect;
  3. describe('Helpers', function() {
  4. "use strict";
  5. describe('keysymFromKeyCode', function() {
  6. it('should map known keycodes to keysyms', function() {
  7. expect(kbdUtil.keysymFromKeyCode(0x41, false), 'a').to.be.equal(0x61);
  8. expect(kbdUtil.keysymFromKeyCode(0x41, true), 'A').to.be.equal(0x41);
  9. expect(kbdUtil.keysymFromKeyCode(0xd, false), 'enter').to.be.equal(0xFF0D);
  10. expect(kbdUtil.keysymFromKeyCode(0x11, false), 'ctrl').to.be.equal(0xFFE3);
  11. expect(kbdUtil.keysymFromKeyCode(0x12, false), 'alt').to.be.equal(0xFFE9);
  12. expect(kbdUtil.keysymFromKeyCode(0xe1, false), 'altgr').to.be.equal(0xFE03);
  13. expect(kbdUtil.keysymFromKeyCode(0x1b, false), 'esc').to.be.equal(0xFF1B);
  14. expect(kbdUtil.keysymFromKeyCode(0x26, false), 'up').to.be.equal(0xFF52);
  15. });
  16. it('should return null for unknown keycodes', function() {
  17. expect(kbdUtil.keysymFromKeyCode(0xc0, false), 'DK æ').to.be.null;
  18. expect(kbdUtil.keysymFromKeyCode(0xde, false), 'DK ø').to.be.null;
  19. });
  20. });
  21. describe('keysyms.fromUnicode', function() {
  22. it('should map ASCII characters to keysyms', function() {
  23. expect(keysyms.fromUnicode('a'.charCodeAt())).to.have.property('keysym', 0x61);
  24. expect(keysyms.fromUnicode('A'.charCodeAt())).to.have.property('keysym', 0x41);
  25. });
  26. it('should map Latin-1 characters to keysyms', function() {
  27. expect(keysyms.fromUnicode('ø'.charCodeAt())).to.have.property('keysym', 0xf8);
  28. expect(keysyms.fromUnicode('é'.charCodeAt())).to.have.property('keysym', 0xe9);
  29. });
  30. it('should map characters that are in Windows-1252 but not in Latin-1 to keysyms', function() {
  31. expect(keysyms.fromUnicode('Š'.charCodeAt())).to.have.property('keysym', 0x01a9);
  32. });
  33. it('should map characters which aren\'t in Latin1 *or* Windows-1252 to keysyms', function() {
  34. expect(keysyms.fromUnicode('ŵ'.charCodeAt())).to.have.property('keysym', 0x1000175);
  35. });
  36. it('should return undefined for unknown codepoints', function() {
  37. expect(keysyms.fromUnicode('\n'.charCodeAt())).to.be.undefined;
  38. expect(keysyms.fromUnicode('\u1F686'.charCodeAt())).to.be.undefined;
  39. });
  40. });
  41. describe('nonCharacterKey', function() {
  42. it('should recognize the right keys', function() {
  43. expect(kbdUtil.nonCharacterKey({keyCode: 0xd}), 'enter').to.be.defined;
  44. expect(kbdUtil.nonCharacterKey({keyCode: 0x08}), 'backspace').to.be.defined;
  45. expect(kbdUtil.nonCharacterKey({keyCode: 0x09}), 'tab').to.be.defined;
  46. expect(kbdUtil.nonCharacterKey({keyCode: 0x10}), 'shift').to.be.defined;
  47. expect(kbdUtil.nonCharacterKey({keyCode: 0x11}), 'ctrl').to.be.defined;
  48. expect(kbdUtil.nonCharacterKey({keyCode: 0x12}), 'alt').to.be.defined;
  49. expect(kbdUtil.nonCharacterKey({keyCode: 0xe0}), 'meta').to.be.defined;
  50. });
  51. it('should not recognize character keys', function() {
  52. expect(kbdUtil.nonCharacterKey({keyCode: 'A'}), 'A').to.be.null;
  53. expect(kbdUtil.nonCharacterKey({keyCode: '1'}), '1').to.be.null;
  54. expect(kbdUtil.nonCharacterKey({keyCode: '.'}), '.').to.be.null;
  55. expect(kbdUtil.nonCharacterKey({keyCode: ' '}), 'space').to.be.null;
  56. });
  57. });
  58. describe('getKeysym', function() {
  59. it('should prefer char', function() {
  60. expect(kbdUtil.getKeysym({char : 'a', charCode: 'Š'.charCodeAt(), keyCode: 0x42, which: 0x43})).to.have.property('keysym', 0x61);
  61. });
  62. it('should use charCode if no char', function() {
  63. expect(kbdUtil.getKeysym({char : '', charCode: 'Š'.charCodeAt(), keyCode: 0x42, which: 0x43})).to.have.property('keysym', 0x01a9);
  64. expect(kbdUtil.getKeysym({charCode: 'Š'.charCodeAt(), keyCode: 0x42, which: 0x43})).to.have.property('keysym', 0x01a9);
  65. expect(kbdUtil.getKeysym({char : 'hello', charCode: 'Š'.charCodeAt(), keyCode: 0x42, which: 0x43})).to.have.property('keysym', 0x01a9);
  66. });
  67. it('should use keyCode if no charCode', function() {
  68. expect(kbdUtil.getKeysym({keyCode: 0x42, which: 0x43, shiftKey: false})).to.have.property('keysym', 0x62);
  69. expect(kbdUtil.getKeysym({keyCode: 0x42, which: 0x43, shiftKey: true})).to.have.property('keysym', 0x42);
  70. });
  71. it('should use which if no keyCode', function() {
  72. expect(kbdUtil.getKeysym({which: 0x43, shiftKey: false})).to.have.property('keysym', 0x63);
  73. expect(kbdUtil.getKeysym({which: 0x43, shiftKey: true})).to.have.property('keysym', 0x43);
  74. });
  75. });
  76. describe('Modifier Sync', function() { // return a list of fake events necessary to fix modifier state
  77. describe('Toggle all modifiers', function() {
  78. var sync = kbdUtil.ModifierSync();
  79. it ('should do nothing if all modifiers are up as expected', function() {
  80. expect(sync.keydown({
  81. keyCode: 0x41,
  82. ctrlKey: false,
  83. altKey: false,
  84. altGraphKey: false,
  85. shiftKey: false,
  86. metaKey: false})
  87. ).to.have.lengthOf(0);
  88. });
  89. it ('should synthesize events if all keys are unexpectedly down', function() {
  90. var result = sync.keydown({
  91. keyCode: 0x41,
  92. ctrlKey: true,
  93. altKey: true,
  94. altGraphKey: true,
  95. shiftKey: true,
  96. metaKey: true
  97. });
  98. expect(result).to.have.lengthOf(5);
  99. var keysyms = {};
  100. for (var i = 0; i < result.length; ++i) {
  101. keysyms[result[i].keysym] = (result[i].type == 'keydown');
  102. }
  103. expect(keysyms[0xffe3]);
  104. expect(keysyms[0xffe9]);
  105. expect(keysyms[0xfe03]);
  106. expect(keysyms[0xffe1]);
  107. expect(keysyms[0xffe7]);
  108. });
  109. it ('should do nothing if all modifiers are down as expected', function() {
  110. expect(sync.keydown({
  111. keyCode: 0x41,
  112. ctrlKey: true,
  113. altKey: true,
  114. altGraphKey: true,
  115. shiftKey: true,
  116. metaKey: true
  117. })).to.have.lengthOf(0);
  118. });
  119. });
  120. describe('Toggle Ctrl', function() {
  121. var sync = kbdUtil.ModifierSync();
  122. it('should sync if modifier is suddenly down', function() {
  123. expect(sync.keydown({
  124. keyCode: 0x41,
  125. ctrlKey: true,
  126. })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe3), type: 'keydown'}]);
  127. });
  128. it('should sync if modifier is suddenly up', function() {
  129. expect(sync.keydown({
  130. keyCode: 0x41,
  131. ctrlKey: false
  132. })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe3), type: 'keyup'}]);
  133. });
  134. });
  135. describe('Toggle Alt', function() {
  136. var sync = kbdUtil.ModifierSync();
  137. it('should sync if modifier is suddenly down', function() {
  138. expect(sync.keydown({
  139. keyCode: 0x41,
  140. altKey: true,
  141. })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe9), type: 'keydown'}]);
  142. });
  143. it('should sync if modifier is suddenly up', function() {
  144. expect(sync.keydown({
  145. keyCode: 0x41,
  146. altKey: false
  147. })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe9), type: 'keyup'}]);
  148. });
  149. });
  150. describe('Toggle AltGr', function() {
  151. var sync = kbdUtil.ModifierSync();
  152. it('should sync if modifier is suddenly down', function() {
  153. expect(sync.keydown({
  154. keyCode: 0x41,
  155. altGraphKey: true,
  156. })).to.be.deep.equal([{keysym: keysyms.lookup(0xfe03), type: 'keydown'}]);
  157. });
  158. it('should sync if modifier is suddenly up', function() {
  159. expect(sync.keydown({
  160. keyCode: 0x41,
  161. altGraphKey: false
  162. })).to.be.deep.equal([{keysym: keysyms.lookup(0xfe03), type: 'keyup'}]);
  163. });
  164. });
  165. describe('Toggle Shift', function() {
  166. var sync = kbdUtil.ModifierSync();
  167. it('should sync if modifier is suddenly down', function() {
  168. expect(sync.keydown({
  169. keyCode: 0x41,
  170. shiftKey: true,
  171. })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe1), type: 'keydown'}]);
  172. });
  173. it('should sync if modifier is suddenly up', function() {
  174. expect(sync.keydown({
  175. keyCode: 0x41,
  176. shiftKey: false
  177. })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe1), type: 'keyup'}]);
  178. });
  179. });
  180. describe('Toggle Meta', function() {
  181. var sync = kbdUtil.ModifierSync();
  182. it('should sync if modifier is suddenly down', function() {
  183. expect(sync.keydown({
  184. keyCode: 0x41,
  185. metaKey: true,
  186. })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe7), type: 'keydown'}]);
  187. });
  188. it('should sync if modifier is suddenly up', function() {
  189. expect(sync.keydown({
  190. keyCode: 0x41,
  191. metaKey: false
  192. })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe7), type: 'keyup'}]);
  193. });
  194. });
  195. describe('Modifier keyevents', function() {
  196. it('should not sync a modifier on its own events', function() {
  197. expect(kbdUtil.ModifierSync().keydown({
  198. keyCode: 0x11,
  199. ctrlKey: false
  200. })).to.be.deep.equal([]);
  201. expect(kbdUtil.ModifierSync().keydown({
  202. keyCode: 0x11,
  203. ctrlKey: true
  204. }), 'B').to.be.deep.equal([]);
  205. })
  206. it('should update state on modifier keyevents', function() {
  207. var sync = kbdUtil.ModifierSync();
  208. sync.keydown({
  209. keyCode: 0x11,
  210. });
  211. expect(sync.keydown({
  212. keyCode: 0x41,
  213. ctrlKey: true,
  214. })).to.be.deep.equal([]);
  215. });
  216. it('should sync other modifiers on ctrl events', function() {
  217. expect(kbdUtil.ModifierSync().keydown({
  218. keyCode: 0x11,
  219. altKey: true
  220. })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe9), type: 'keydown'}]);
  221. })
  222. });
  223. describe('sync modifiers on non-key events', function() {
  224. it('should generate sync events when receiving non-keyboard events', function() {
  225. expect(kbdUtil.ModifierSync().syncAny({
  226. altKey: true
  227. })).to.be.deep.equal([{keysym: keysyms.lookup(0xffe9), type: 'keydown'}]);
  228. });
  229. });
  230. });
  231. });