drag-recognizer.test.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import DragRecognizer from '../../../src/lib/drag-recognizer';
  2. describe('DragRecognizer', () => {
  3. let onDrag;
  4. let onDragEnd;
  5. let dragRecognizer;
  6. beforeEach(() => {
  7. onDrag = jest.fn();
  8. onDragEnd = jest.fn();
  9. dragRecognizer = new DragRecognizer({onDrag, onDragEnd});
  10. });
  11. afterEach(() => {
  12. dragRecognizer.reset();
  13. });
  14. test('start -> small drag', () => {
  15. dragRecognizer.start({clientX: 100, clientY: 100});
  16. window.dispatchEvent(new MouseEvent('mousemove', {clientX: 101, clientY: 101}));
  17. expect(onDrag).not.toHaveBeenCalled();
  18. });
  19. test('start -> large vertical touch move -> scroll, not drag', () => {
  20. dragRecognizer.start({clientX: 100, clientY: 100});
  21. window.dispatchEvent(new MouseEvent('touchmove', {clientX: 106, clientY: 150}));
  22. expect(onDrag).not.toHaveBeenCalled();
  23. });
  24. test('start -> large vertical mouse move -> mouse moves always drag)', () => {
  25. dragRecognizer.start({clientX: 100, clientY: 100});
  26. window.dispatchEvent(new MouseEvent('mousemove', {clientX: 100, clientY: 150}));
  27. expect(onDrag).toHaveBeenCalled();
  28. });
  29. test('start -> large horizontal touch move -> drag', () => {
  30. dragRecognizer.start({clientX: 100, clientY: 100});
  31. window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
  32. expect(onDrag).toHaveBeenCalled();
  33. });
  34. test('after starting a scroll, it cannot become a drag', () => {
  35. dragRecognizer.start({clientX: 100, clientY: 100});
  36. window.dispatchEvent(new MouseEvent('touchmove', {clientX: 100, clientY: 110}));
  37. window.dispatchEvent(new MouseEvent('touchmove', {clientX: 100, clientY: 100}));
  38. window.dispatchEvent(new MouseEvent('touchmove', {clientX: 110, clientY: 100}));
  39. expect(onDrag).not.toHaveBeenCalled();
  40. });
  41. test('start -> end unbinds', () => {
  42. dragRecognizer.start({clientX: 100, clientY: 100});
  43. window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
  44. expect(onDrag).toHaveBeenCalledTimes(1);
  45. window.dispatchEvent(new MouseEvent('touchend', {clientX: 150, clientY: 106}));
  46. window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
  47. expect(onDrag).toHaveBeenCalledTimes(1); // Still 1
  48. });
  49. test('start -> end calls dragEnd callback after resetting internal state', done => {
  50. onDragEnd = () => {
  51. expect(dragRecognizer.gestureInProgress()).toBe(false);
  52. done();
  53. };
  54. dragRecognizer = new DragRecognizer({onDrag, onDragEnd});
  55. dragRecognizer.start({clientX: 100, clientY: 100});
  56. window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
  57. window.dispatchEvent(new MouseEvent('touchend', {clientX: 150, clientY: 106}));
  58. });
  59. test('start -> reset unbinds', () => {
  60. dragRecognizer.start({clientX: 100, clientY: 100});
  61. window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
  62. expect(onDrag).toHaveBeenCalledTimes(1);
  63. dragRecognizer.reset();
  64. window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
  65. expect(onDrag).toHaveBeenCalledTimes(1); // Still 1
  66. });
  67. test('scrolls do not call prevent default', () => {
  68. dragRecognizer.start({clientX: 100, clientY: 100});
  69. const event = new MouseEvent('touchmove', {clientX: 100, clientY: 110});
  70. event.preventDefault = jest.fn();
  71. window.dispatchEvent(event);
  72. expect(event.preventDefault).toHaveBeenCalledTimes(0);
  73. });
  74. test('confirmed drags have preventDefault called on them', () => {
  75. dragRecognizer.start({clientX: 100, clientY: 100});
  76. const event = new MouseEvent('touchmove', {clientX: 150, clientY: 106});
  77. event.preventDefault = jest.fn();
  78. window.dispatchEvent(event);
  79. expect(event.preventDefault).toHaveBeenCalled();
  80. });
  81. test('multiple horizontal drag angles', () => {
  82. // +45 from horizontal => drag
  83. dragRecognizer.start({clientX: 0, clientY: 0});
  84. window.dispatchEvent(new MouseEvent('touchmove', {clientX: 10, clientY: 10}));
  85. expect(onDrag).toHaveBeenCalledTimes(1);
  86. dragRecognizer.reset();
  87. // -45 from horizontal => drag
  88. dragRecognizer.start({clientX: 0, clientY: 0});
  89. window.dispatchEvent(new MouseEvent('touchmove', {clientX: 10, clientY: -10}));
  90. expect(onDrag).toHaveBeenCalledTimes(2);
  91. dragRecognizer.reset();
  92. // +135 from horizontal => drag
  93. dragRecognizer.start({clientX: 0, clientY: 0});
  94. window.dispatchEvent(new MouseEvent('touchmove', {clientX: -10, clientY: 10}));
  95. expect(onDrag).toHaveBeenCalledTimes(3);
  96. dragRecognizer.reset();
  97. // -135 from horizontal => drag
  98. dragRecognizer.start({clientX: 0, clientY: 0});
  99. window.dispatchEvent(new MouseEvent('touchmove', {clientX: -10, clientY: -10}));
  100. expect(onDrag).toHaveBeenCalledTimes(4);
  101. dragRecognizer.reset();
  102. });
  103. });