keyStateObserver.spec.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. import {
  2. _getRefCount,
  3. _resetState,
  4. isPressed,
  5. isPressedCtrlKey,
  6. startObserving,
  7. stopObserving,
  8. } from 'handsontable/utils/keyStateObserver';
  9. describe('keyStateObserver', () => {
  10. afterEach(() => {
  11. _resetState();
  12. });
  13. describe('.startObserving', () => {
  14. it('should internally keep calls count to make the dom listener removable', () => {
  15. startObserving();
  16. startObserving();
  17. startObserving();
  18. startObserving();
  19. expect(_getRefCount()).toBe(4);
  20. });
  21. });
  22. describe('.stopObserving', () => {
  23. it('should internally keep calls count to make the dom listener removable', () => {
  24. startObserving();
  25. startObserving();
  26. startObserving();
  27. startObserving();
  28. expect(_getRefCount()).toBe(4);
  29. stopObserving();
  30. stopObserving();
  31. stopObserving();
  32. stopObserving();
  33. stopObserving();
  34. stopObserving();
  35. expect(_getRefCount()).toBe(0);
  36. });
  37. it('should reset all key states after the last stopObserving function is called', () => {
  38. startObserving();
  39. expect(isPressed('ENTER')).toBe(false);
  40. expect(isPressed('BACKSPACE')).toBe(false);
  41. expect(isPressedCtrlKey()).toBe(false);
  42. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 13 }));
  43. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 8 }));
  44. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 91 }));
  45. expect(isPressed('ENTER')).toBe(true);
  46. expect(isPressed('BACKSPACE')).toBe(true);
  47. expect(isPressedCtrlKey()).toBe(true);
  48. stopObserving();
  49. expect(isPressed('ENTER')).toBe(false);
  50. expect(isPressed('BACKSPACE')).toBe(false);
  51. expect(isPressedCtrlKey()).toBe(false);
  52. });
  53. });
  54. describe('.isPressedCtrlKey', () => {
  55. it('should return `true` when CTRL key is pressed', () => {
  56. startObserving();
  57. expect(isPressedCtrlKey()).toBe(false);
  58. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 17 }));
  59. expect(isPressedCtrlKey()).toBe(true);
  60. document.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 17 }));
  61. expect(isPressedCtrlKey()).toBe(false);
  62. });
  63. it('should return `true` when left CMD key is pressed', () => {
  64. startObserving();
  65. expect(isPressedCtrlKey()).toBe(false);
  66. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 91 }));
  67. expect(isPressedCtrlKey()).toBe(true);
  68. document.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 91 }));
  69. expect(isPressedCtrlKey()).toBe(false);
  70. });
  71. it('should return `true` when right CMD key is pressed', () => {
  72. startObserving();
  73. expect(isPressedCtrlKey()).toBe(false);
  74. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 93 }));
  75. expect(isPressedCtrlKey()).toBe(true);
  76. document.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 93 }));
  77. expect(isPressedCtrlKey()).toBe(false);
  78. });
  79. it('should return `true` when CMD key is pressed (macOS on FF)', () => {
  80. startObserving();
  81. expect(isPressedCtrlKey()).toBe(false);
  82. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 224 }));
  83. expect(isPressedCtrlKey()).toBe(true);
  84. document.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 224 }));
  85. expect(isPressedCtrlKey()).toBe(false);
  86. });
  87. it('should return `false` when left CMD key AND F is pressed', () => {
  88. startObserving();
  89. expect(isPressedCtrlKey()).toBe(false);
  90. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 91 }));
  91. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 70 }));
  92. window.dispatchEvent(new FocusEvent('blur'));
  93. expect(isPressedCtrlKey()).toBe(false);
  94. });
  95. it('should return `false` when right CMD key AND F is pressed', () => {
  96. startObserving();
  97. expect(isPressedCtrlKey()).toBe(false);
  98. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 93 }));
  99. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 70 }));
  100. window.dispatchEvent(new FocusEvent('blur'));
  101. expect(isPressedCtrlKey()).toBe(false);
  102. });
  103. it('should return `false` when CMD key AND F is pressed (macOS on FF)', () => {
  104. startObserving();
  105. expect(isPressedCtrlKey()).toBe(false);
  106. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 224 }));
  107. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 70 }));
  108. window.dispatchEvent(new FocusEvent('blur'));
  109. expect(isPressedCtrlKey()).toBe(false);
  110. });
  111. it('should return `false` when CTRL key AND F is pressed', () => {
  112. startObserving();
  113. expect(isPressedCtrlKey()).toBe(false);
  114. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 17 }));
  115. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 70 }));
  116. window.dispatchEvent(new FocusEvent('blur'));
  117. expect(isPressedCtrlKey()).toBe(false);
  118. });
  119. it('should return `false` when left CMD key AND D is pressed', () => {
  120. startObserving();
  121. expect(isPressedCtrlKey()).toBe(false);
  122. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 91 }));
  123. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 68 }));
  124. window.dispatchEvent(new FocusEvent('blur'));
  125. expect(isPressedCtrlKey()).toBe(false);
  126. });
  127. it('should return `false` when right CMD key AND D is pressed', () => {
  128. startObserving();
  129. expect(isPressedCtrlKey()).toBe(false);
  130. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 93 }));
  131. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 68 }));
  132. window.dispatchEvent(new FocusEvent('blur'));
  133. expect(isPressedCtrlKey()).toBe(false);
  134. });
  135. it('should return `false` when CMD key AND D is pressed (macOS on FF)', () => {
  136. startObserving();
  137. expect(isPressedCtrlKey()).toBe(false);
  138. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 224 }));
  139. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 68 }));
  140. window.dispatchEvent(new FocusEvent('blur'));
  141. expect(isPressedCtrlKey()).toBe(false);
  142. });
  143. it('should return `false` when CTRL key AND D is pressed', () => {
  144. startObserving();
  145. expect(isPressedCtrlKey()).toBe(false);
  146. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 17 }));
  147. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 68 }));
  148. window.dispatchEvent(new FocusEvent('blur'));
  149. expect(isPressedCtrlKey()).toBe(false);
  150. });
  151. });
  152. describe('.isPressed', () => {
  153. it('should return `true` when ENTER key is pressed', () => {
  154. startObserving();
  155. expect(isPressed('ENTER')).toBe(false);
  156. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 13 }));
  157. expect(isPressed('ENTER')).toBe(true);
  158. document.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 13 }));
  159. expect(isPressed('ENTER')).toBe(false);
  160. });
  161. it('should return `true` when multiple expected keys are pressed', () => {
  162. startObserving();
  163. expect(isPressed('ENTER|BACKSPACE')).toBe(false);
  164. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 13 }));
  165. expect(isPressed('ENTER|BACKSPACE')).toBe(true);
  166. document.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 13 }));
  167. document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 8 }));
  168. expect(isPressed('ENTER|BACKSPACE')).toBe(true);
  169. document.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 8 }));
  170. });
  171. });
  172. });