| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026 |
- const expect = chai.expect;
- import EventTargetMixin from '../core/util/eventtarget.js';
- import GestureHandler from '../core/input/gesturehandler.js';
- class DummyTarget extends EventTargetMixin {
- }
- describe('Gesture handler', function () {
- let target, handler;
- let gestures;
- let clock;
- let touches;
- before(function () {
- clock = sinon.useFakeTimers();
- });
- after(function () {
- clock.restore();
- });
- beforeEach(function () {
- target = new DummyTarget();
- gestures = sinon.spy();
- target.addEventListener('gesturestart', gestures);
- target.addEventListener('gesturemove', gestures);
- target.addEventListener('gestureend', gestures);
- touches = [];
- handler = new GestureHandler();
- handler.attach(target);
- });
- afterEach(function () {
- if (handler) {
- handler.detach();
- }
- target = null;
- gestures = null;
- });
- function touchStart(id, x, y) {
- let touch = { identifier: id,
- clientX: x, clientY: y };
- touches.push(touch);
- let ev = { type: 'touchstart',
- touches: touches,
- targetTouches: touches,
- changedTouches: [ touch ],
- stopPropagation: sinon.spy(),
- preventDefault: sinon.spy() };
- target.dispatchEvent(ev);
- }
- function touchMove(id, x, y) {
- let touch = touches.find(t => t.identifier === id);
- touch.clientX = x;
- touch.clientY = y;
- let ev = { type: 'touchmove',
- touches: touches,
- targetTouches: touches,
- changedTouches: [ touch ],
- stopPropagation: sinon.spy(),
- preventDefault: sinon.spy() };
- target.dispatchEvent(ev);
- }
- function touchEnd(id) {
- let idx = touches.findIndex(t => t.identifier === id);
- let touch = touches.splice(idx, 1)[0];
- let ev = { type: 'touchend',
- touches: touches,
- targetTouches: touches,
- changedTouches: [ touch ],
- stopPropagation: sinon.spy(),
- preventDefault: sinon.spy() };
- target.dispatchEvent(ev);
- }
- describe('Single finger tap', function () {
- it('should handle single finger tap', function () {
- touchStart(1, 20.0, 30.0);
- expect(gestures).to.not.have.been.called;
- touchEnd(1);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'onetap',
- clientX: 20.0,
- clientY: 30.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'onetap',
- clientX: 20.0,
- clientY: 30.0 } }));
- });
- });
- describe('Two finger tap', function () {
- it('should handle two finger tap', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 30.0, 50.0);
- expect(gestures).to.not.have.been.called;
- touchEnd(1);
- expect(gestures).to.not.have.been.called;
- touchEnd(2);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'twotap',
- clientX: 25.0,
- clientY: 40.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'twotap',
- clientX: 25.0,
- clientY: 40.0 } }));
- });
- it('should ignore slow starting two finger tap', function () {
- touchStart(1, 20.0, 30.0);
- clock.tick(500);
- touchStart(2, 30.0, 50.0);
- touchEnd(1);
- touchEnd(2);
- expect(gestures).to.not.have.been.called;
- });
- it('should ignore slow ending two finger tap', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 30.0, 50.0);
- touchEnd(1);
- clock.tick(500);
- touchEnd(2);
- expect(gestures).to.not.have.been.called;
- });
- it('should ignore slow two finger tap', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 30.0, 50.0);
- clock.tick(1500);
- touchEnd(1);
- touchEnd(2);
- expect(gestures).to.not.have.been.called;
- });
- });
- describe('Three finger tap', function () {
- it('should handle three finger tap', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 30.0, 50.0);
- touchStart(3, 40.0, 40.0);
- expect(gestures).to.not.have.been.called;
- touchEnd(1);
- expect(gestures).to.not.have.been.called;
- touchEnd(2);
- expect(gestures).to.not.have.been.called;
- touchEnd(3);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'threetap',
- clientX: 30.0,
- clientY: 40.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'threetap',
- clientX: 30.0,
- clientY: 40.0 } }));
- });
- it('should ignore slow starting three finger tap', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 30.0, 50.0);
- clock.tick(500);
- touchStart(3, 40.0, 40.0);
- touchEnd(1);
- touchEnd(2);
- touchEnd(3);
- expect(gestures).to.not.have.been.called;
- });
- it('should ignore slow ending three finger tap', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 30.0, 50.0);
- touchStart(3, 40.0, 40.0);
- touchEnd(1);
- touchEnd(2);
- clock.tick(500);
- touchEnd(3);
- expect(gestures).to.not.have.been.called;
- });
- it('should ignore three finger drag', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 30.0, 50.0);
- touchStart(3, 40.0, 40.0);
- touchMove(1, 120.0, 130.0);
- touchMove(2, 130.0, 150.0);
- touchMove(3, 140.0, 140.0);
- touchEnd(1);
- touchEnd(2);
- touchEnd(3);
- expect(gestures).to.not.have.been.called;
- });
- it('should ignore slow three finger tap', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 30.0, 50.0);
- touchStart(3, 40.0, 40.0);
- clock.tick(1500);
- touchEnd(1);
- touchEnd(2);
- touchEnd(3);
- expect(gestures).to.not.have.been.called;
- });
- });
- describe('Single finger drag', function () {
- it('should handle horizontal single finger drag', function () {
- touchStart(1, 20.0, 30.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 40.0, 30.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 80.0, 30.0);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'drag',
- clientX: 20.0,
- clientY: 30.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'drag',
- clientX: 80.0,
- clientY: 30.0 } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'drag',
- clientX: 80.0,
- clientY: 30.0 } }));
- });
- it('should handle vertical single finger drag', function () {
- touchStart(1, 20.0, 30.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 20.0, 50.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 20.0, 90.0);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'drag',
- clientX: 20.0,
- clientY: 30.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'drag',
- clientX: 20.0,
- clientY: 90.0 } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'drag',
- clientX: 20.0,
- clientY: 90.0 } }));
- });
- it('should handle diagonal single finger drag', function () {
- touchStart(1, 120.0, 130.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 90.0, 100.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 60.0, 70.0);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'drag',
- clientX: 120.0,
- clientY: 130.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'drag',
- clientX: 60.0,
- clientY: 70.0 } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'drag',
- clientX: 60.0,
- clientY: 70.0 } }));
- });
- });
- describe('Long press', function () {
- it('should handle long press', function () {
- touchStart(1, 20.0, 30.0);
- expect(gestures).to.not.have.been.called;
- clock.tick(1500);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'longpress',
- clientX: 20.0,
- clientY: 30.0 } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'longpress',
- clientX: 20.0,
- clientY: 30.0 } }));
- });
- it('should handle long press drag', function () {
- touchStart(1, 20.0, 30.0);
- expect(gestures).to.not.have.been.called;
- clock.tick(1500);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'longpress',
- clientX: 20.0,
- clientY: 30.0 } }));
- gestures.resetHistory();
- touchMove(1, 120.0, 50.0);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'longpress',
- clientX: 120.0,
- clientY: 50.0 } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'longpress',
- clientX: 120.0,
- clientY: 50.0 } }));
- });
- });
- describe('Two finger drag', function () {
- it('should handle fast and distinct horizontal two finger drag', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 30.0, 30.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 40.0, 30.0);
- touchMove(2, 50.0, 30.0);
- expect(gestures).to.not.have.been.called;
- touchMove(2, 90.0, 30.0);
- touchMove(1, 80.0, 30.0);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'twodrag',
- clientX: 25.0,
- clientY: 30.0,
- magnitudeX: 0.0,
- magnitudeY: 0.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'twodrag',
- clientX: 25.0,
- clientY: 30.0,
- magnitudeX: 60.0,
- magnitudeY: 0.0 } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'twodrag',
- clientX: 25.0,
- clientY: 30.0,
- magnitudeX: 60.0,
- magnitudeY: 0.0 } }));
- });
- it('should handle fast and distinct vertical two finger drag', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 30.0, 30.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 20.0, 100.0);
- touchMove(2, 30.0, 40.0);
- expect(gestures).to.not.have.been.called;
- touchMove(2, 30.0, 90.0);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'twodrag',
- clientX: 25.0,
- clientY: 30.0,
- magnitudeX: 0.0,
- magnitudeY: 0.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'twodrag',
- clientX: 25.0,
- clientY: 30.0,
- magnitudeX: 0.0,
- magnitudeY: 65.0 } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'twodrag',
- clientX: 25.0,
- clientY: 30.0,
- magnitudeX: 0.0,
- magnitudeY: 65.0 } }));
- });
- it('should handle fast and distinct diagonal two finger drag', function () {
- touchStart(1, 120.0, 130.0);
- touchStart(2, 130.0, 130.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 80.0, 90.0);
- touchMove(2, 100.0, 130.0);
- expect(gestures).to.not.have.been.called;
- touchMove(2, 60.0, 70.0);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'twodrag',
- clientX: 125.0,
- clientY: 130.0,
- magnitudeX: 0.0,
- magnitudeY: 0.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'twodrag',
- clientX: 125.0,
- clientY: 130.0,
- magnitudeX: -55.0,
- magnitudeY: -50.0 } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'twodrag',
- clientX: 125.0,
- clientY: 130.0,
- magnitudeX: -55.0,
- magnitudeY: -50.0 } }));
- });
- it('should ignore fast almost two finger dragging', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 30.0, 30.0);
- touchMove(1, 80.0, 30.0);
- touchMove(2, 70.0, 30.0);
- touchEnd(1);
- touchEnd(2);
- expect(gestures).to.not.have.been.called;
- clock.tick(1500);
- expect(gestures).to.not.have.been.called;
- });
- it('should handle slow horizontal two finger drag', function () {
- touchStart(1, 50.0, 40.0);
- touchStart(2, 60.0, 40.0);
- touchMove(1, 80.0, 40.0);
- touchMove(2, 110.0, 40.0);
- expect(gestures).to.not.have.been.called;
- clock.tick(60);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'twodrag',
- clientX: 55.0,
- clientY: 40.0,
- magnitudeX: 0.0,
- magnitudeY: 0.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'twodrag',
- clientX: 55.0,
- clientY: 40.0,
- magnitudeX: 40.0,
- magnitudeY: 0.0 } }));
- });
- it('should handle slow vertical two finger drag', function () {
- touchStart(1, 40.0, 40.0);
- touchStart(2, 40.0, 60.0);
- touchMove(2, 40.0, 80.0);
- touchMove(1, 40.0, 100.0);
- expect(gestures).to.not.have.been.called;
- clock.tick(60);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'twodrag',
- clientX: 40.0,
- clientY: 50.0,
- magnitudeX: 0.0,
- magnitudeY: 0.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'twodrag',
- clientX: 40.0,
- clientY: 50.0,
- magnitudeX: 0.0,
- magnitudeY: 40.0 } }));
- });
- it('should handle slow diagonal two finger drag', function () {
- touchStart(1, 50.0, 40.0);
- touchStart(2, 40.0, 60.0);
- touchMove(1, 70.0, 60.0);
- touchMove(2, 90.0, 110.0);
- expect(gestures).to.not.have.been.called;
- clock.tick(60);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'twodrag',
- clientX: 45.0,
- clientY: 50.0,
- magnitudeX: 0.0,
- magnitudeY: 0.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'twodrag',
- clientX: 45.0,
- clientY: 50.0,
- magnitudeX: 35.0,
- magnitudeY: 35.0 } }));
- });
- it('should ignore too slow two finger drag', function () {
- touchStart(1, 20.0, 30.0);
- clock.tick(500);
- touchStart(2, 30.0, 30.0);
- touchMove(1, 40.0, 30.0);
- touchMove(2, 50.0, 30.0);
- touchMove(1, 80.0, 30.0);
- expect(gestures).to.not.have.been.called;
- });
- });
- describe('Pinch', function () {
- it('should handle pinching distinctly and fast inwards', function () {
- touchStart(1, 0.0, 0.0);
- touchStart(2, 130.0, 130.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 50.0, 40.0);
- touchMove(2, 100.0, 130.0);
- expect(gestures).to.not.have.been.called;
- touchMove(2, 60.0, 70.0);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'pinch',
- clientX: 65.0,
- clientY: 65.0,
- magnitudeX: 130.0,
- magnitudeY: 130.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'pinch',
- clientX: 65.0,
- clientY: 65.0,
- magnitudeX: 10.0,
- magnitudeY: 30.0 } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'pinch',
- clientX: 65.0,
- clientY: 65.0,
- magnitudeX: 10.0,
- magnitudeY: 30.0 } }));
- });
- it('should handle pinching fast and distinctly outwards', function () {
- touchStart(1, 100.0, 100.0);
- touchStart(2, 110.0, 100.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 130.0, 70.0);
- touchMove(2, 0.0, 200.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 180.0, 20.0);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'pinch',
- clientX: 105.0,
- clientY: 100.0,
- magnitudeX: 10.0,
- magnitudeY: 0.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'pinch',
- clientX: 105.0,
- clientY: 100.0,
- magnitudeX: 180.0,
- magnitudeY: 180.0 } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'pinch',
- clientX: 105.0,
- clientY: 100.0,
- magnitudeX: 180.0,
- magnitudeY: 180.0 } }));
- });
- it('should ignore fast almost pinching', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 130.0, 130.0);
- touchMove(1, 80.0, 70.0);
- touchEnd(1);
- touchEnd(2);
- expect(gestures).to.not.have.been.called;
- clock.tick(1500);
- expect(gestures).to.not.have.been.called;
- });
- it('should handle pinching inwards slowly', function () {
- touchStart(1, 0.0, 0.0);
- touchStart(2, 130.0, 130.0);
- touchMove(1, 50.0, 40.0);
- touchMove(2, 100.0, 130.0);
- expect(gestures).to.not.have.been.called;
- clock.tick(60);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'pinch',
- clientX: 65.0,
- clientY: 65.0,
- magnitudeX: 130.0,
- magnitudeY: 130.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'pinch',
- clientX: 65.0,
- clientY: 65.0,
- magnitudeX: 50.0,
- magnitudeY: 90.0 } }));
- });
- it('should handle pinching outwards slowly', function () {
- touchStart(1, 100.0, 130.0);
- touchStart(2, 110.0, 130.0);
- touchMove(2, 200.0, 130.0);
- expect(gestures).to.not.have.been.called;
- clock.tick(60);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'pinch',
- clientX: 105.0,
- clientY: 130.0,
- magnitudeX: 10.0,
- magnitudeY: 0.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'pinch',
- clientX: 105.0,
- clientY: 130.0,
- magnitudeX: 100.0,
- magnitudeY: 0.0 } }));
- });
- it('should ignore pinching too slowly', function () {
- touchStart(1, 0.0, 0.0);
- clock.tick(500);
- touchStart(2, 130.0, 130.0);
- touchMove(2, 100.0, 130.0);
- touchMove(1, 50.0, 40.0);
- expect(gestures).to.not.have.been.called;
- });
- });
- describe('Ignoring', function () {
- it('should ignore extra touches during gesture', function () {
- touchStart(1, 20.0, 30.0);
- touchMove(1, 40.0, 30.0);
- touchMove(1, 80.0, 30.0);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'drag' } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'drag' } }));
- gestures.resetHistory();
- touchStart(2, 10.0, 10.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 100.0, 50.0);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'drag',
- clientX: 100.0,
- clientY: 50.0 } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'drag',
- clientX: 100.0,
- clientY: 50.0 } }));
- });
- it('should ignore extra touches when waiting for gesture to end', function () {
- touchStart(1, 20.0, 30.0);
- touchStart(2, 30.0, 30.0);
- touchMove(1, 40.0, 30.0);
- touchMove(2, 90.0, 30.0);
- touchMove(1, 80.0, 30.0);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'twodrag' } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'twodrag' } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'twodrag' } }));
- gestures.resetHistory();
- touchStart(3, 10.0, 10.0);
- touchEnd(3);
- expect(gestures).to.not.have.been.called;
- });
- it('should ignore extra touches after gesture', function () {
- touchStart(1, 20.0, 30.0);
- touchMove(1, 40.0, 30.0);
- touchMove(1, 80.0, 30.0);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'drag' } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'drag' } }));
- gestures.resetHistory();
- touchStart(2, 10.0, 10.0);
- expect(gestures).to.not.have.been.called;
- touchMove(1, 100.0, 50.0);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gesturemove',
- detail: { type: 'drag' } }));
- gestures.resetHistory();
- touchEnd(1);
- expect(gestures).to.have.been.calledOnceWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'drag' } }));
- gestures.resetHistory();
- touchEnd(2);
- expect(gestures).to.not.have.been.called;
- // Check that everything is reseted after trailing ignores are released
- touchStart(3, 20.0, 30.0);
- touchEnd(3);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'onetap' } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'onetap' } }));
- });
- it('should properly reset after a gesture', function () {
- touchStart(1, 20.0, 30.0);
- expect(gestures).to.not.have.been.called;
- touchEnd(1);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'onetap',
- clientX: 20.0,
- clientY: 30.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'onetap',
- clientX: 20.0,
- clientY: 30.0 } }));
- gestures.resetHistory();
- touchStart(2, 70.0, 80.0);
- expect(gestures).to.not.have.been.called;
- touchEnd(2);
- expect(gestures).to.have.been.calledTwice;
- expect(gestures.firstCall).to.have.been.calledWith(
- sinon.match({ type: 'gesturestart',
- detail: { type: 'onetap',
- clientX: 70.0,
- clientY: 80.0 } }));
- expect(gestures.secondCall).to.have.been.calledWith(
- sinon.match({ type: 'gestureend',
- detail: { type: 'onetap',
- clientX: 70.0,
- clientY: 80.0 } }));
- });
- });
- });
|