123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- import DragRecognizer from '../../../src/lib/drag-recognizer';
- describe('DragRecognizer', () => {
- let onDrag;
- let onDragEnd;
- let dragRecognizer;
- beforeEach(() => {
- onDrag = jest.fn();
- onDragEnd = jest.fn();
- dragRecognizer = new DragRecognizer({onDrag, onDragEnd});
- });
- afterEach(() => {
- dragRecognizer.reset();
- });
- test('start -> small drag', () => {
- dragRecognizer.start({clientX: 100, clientY: 100});
- window.dispatchEvent(new MouseEvent('mousemove', {clientX: 101, clientY: 101}));
- expect(onDrag).not.toHaveBeenCalled();
- });
- test('start -> large vertical touch move -> scroll, not drag', () => {
- dragRecognizer.start({clientX: 100, clientY: 100});
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: 106, clientY: 150}));
- expect(onDrag).not.toHaveBeenCalled();
- });
- test('start -> large vertical mouse move -> mouse moves always drag)', () => {
- dragRecognizer.start({clientX: 100, clientY: 100});
- window.dispatchEvent(new MouseEvent('mousemove', {clientX: 100, clientY: 150}));
- expect(onDrag).toHaveBeenCalled();
- });
- test('start -> large horizontal touch move -> drag', () => {
- dragRecognizer.start({clientX: 100, clientY: 100});
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
- expect(onDrag).toHaveBeenCalled();
- });
- test('after starting a scroll, it cannot become a drag', () => {
- dragRecognizer.start({clientX: 100, clientY: 100});
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: 100, clientY: 110}));
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: 100, clientY: 100}));
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: 110, clientY: 100}));
- expect(onDrag).not.toHaveBeenCalled();
- });
- test('start -> end unbinds', () => {
- dragRecognizer.start({clientX: 100, clientY: 100});
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
- expect(onDrag).toHaveBeenCalledTimes(1);
- window.dispatchEvent(new MouseEvent('touchend', {clientX: 150, clientY: 106}));
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
- expect(onDrag).toHaveBeenCalledTimes(1); // Still 1
- });
- test('start -> end calls dragEnd callback after resetting internal state', done => {
- onDragEnd = () => {
- expect(dragRecognizer.gestureInProgress()).toBe(false);
- done();
- };
- dragRecognizer = new DragRecognizer({onDrag, onDragEnd});
- dragRecognizer.start({clientX: 100, clientY: 100});
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
- window.dispatchEvent(new MouseEvent('touchend', {clientX: 150, clientY: 106}));
- });
- test('start -> reset unbinds', () => {
- dragRecognizer.start({clientX: 100, clientY: 100});
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
- expect(onDrag).toHaveBeenCalledTimes(1);
- dragRecognizer.reset();
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
- expect(onDrag).toHaveBeenCalledTimes(1); // Still 1
- });
- test('scrolls do not call prevent default', () => {
- dragRecognizer.start({clientX: 100, clientY: 100});
- const event = new MouseEvent('touchmove', {clientX: 100, clientY: 110});
- event.preventDefault = jest.fn();
- window.dispatchEvent(event);
- expect(event.preventDefault).toHaveBeenCalledTimes(0);
- });
- test('confirmed drags have preventDefault called on them', () => {
- dragRecognizer.start({clientX: 100, clientY: 100});
- const event = new MouseEvent('touchmove', {clientX: 150, clientY: 106});
- event.preventDefault = jest.fn();
- window.dispatchEvent(event);
- expect(event.preventDefault).toHaveBeenCalled();
- });
- test('multiple horizontal drag angles', () => {
- // +45 from horizontal => drag
- dragRecognizer.start({clientX: 0, clientY: 0});
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: 10, clientY: 10}));
- expect(onDrag).toHaveBeenCalledTimes(1);
- dragRecognizer.reset();
- // -45 from horizontal => drag
- dragRecognizer.start({clientX: 0, clientY: 0});
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: 10, clientY: -10}));
- expect(onDrag).toHaveBeenCalledTimes(2);
- dragRecognizer.reset();
- // +135 from horizontal => drag
- dragRecognizer.start({clientX: 0, clientY: 0});
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: -10, clientY: 10}));
- expect(onDrag).toHaveBeenCalledTimes(3);
- dragRecognizer.reset();
- // -135 from horizontal => drag
- dragRecognizer.start({clientX: 0, clientY: 0});
- window.dispatchEvent(new MouseEvent('touchmove', {clientX: -10, clientY: -10}));
- expect(onDrag).toHaveBeenCalledTimes(4);
- dragRecognizer.reset();
- });
- });
|