extjs-gpl
Version:
GPL licensed version of Sencha Ext JS
264 lines (240 loc) • 9.05 kB
JavaScript
// describe("Ext.event.gesture.DoubleTap", function () {});
// The above appeases Cmd's parser to associate spec run results with files.
// Double Tap doesn't currently work in IE8 because 2 clicks in rapid succession will
// fire a single mousedown, and 2 mouseups.
// These specs also fail in FF, although double tap seems to work fine when triggered manually
((Ext.isIE9m || Ext.isFirefox) ? xdescribe : describe)("Ext.event.gesture.DoubleTap", function() {
var helper = Ext.testHelper,
recognizer = Ext.event.gesture.DoubleTap.instance,
moveDistance = recognizer.getMoveDistance(),
tapDistance = recognizer.getTapDistance(),
maxDuration = 130,
offset = 60,
originalMaxDuration, targetEl, singleTapHandler, doubleTapHandler, e;
function start(cfg) {
helper.touchStart(targetEl, cfg);
}
function move(cfg) {
helper.touchMove(targetEl, cfg);
}
function end(cfg) {
helper.touchEnd(targetEl, cfg);
}
function cancel(cfg) {
helper.touchCancel(targetEl, cfg);
}
beforeEach(function() {
originalMaxDuration = recognizer.getMaxDuration();
recognizer.setMaxDuration(maxDuration);
targetEl = Ext.getBody().createChild({});
singleTapHandler = jasmine.createSpy();
doubleTapHandler = jasmine.createSpy();
singleTapHandler.andCallFake(function(event) {
e = event;
});
doubleTapHandler.andCallFake(function(event) {
e = event;
});
targetEl.on('doubletap', doubleTapHandler);
targetEl.on('singletap', singleTapHandler);
});
afterEach(function() {
recognizer.setMaxDuration(originalMaxDuration);
targetEl.destroy();
});
it("should fire doubletap and not singletap when a second tap occurs within maxDuration", function() {
runs(function() {
start({ id: 1, x: 10, y: 10 });
end({ id: 1, x: 10, y: 10 });
});
waits(maxDuration - offset);
runs(function() {
start({ id: 1, x: 10, y: 10 });
end({ id: 1, x: 10, y: 10 });
});
waitsForAnimation();
runs(function() {
expect(doubleTapHandler).toHaveBeenCalled();
expect(singleTapHandler).not.toHaveBeenCalled();
expect(e && e.type).toBe('doubletap');
});
});
it("should fire singletap and not doubletap when a second tap does not occur within maxDuration", function() {
runs(function() {
start({ id: 1, x: 10, y: 10 });
end({ id: 1, x: 10, y: 10 });
});
waits(maxDuration + 30);
runs(function() {
start({ id: 1, x: 10, y: 10 });
end({ id: 1, x: 10, y: 10 });
});
waitsForAnimation();
runs(function() {
expect(doubleTapHandler).not.toHaveBeenCalled();
expect(singleTapHandler).toHaveBeenCalled();
expect(e && e.type).toBe('singletap');
});
});
it("should not fire singletap if movement of the first pointer exceeds moveDistance", function() {
runs(function() {
start({ id: 1, x: 10, y: 10 });
move({ id: 1, x: 10, y: 10 + moveDistance });
end({ id: 1, x: 10, y: 10 + moveDistance });
});
waits(maxDuration + 30);
runs(function() {
expect(singleTapHandler).not.toHaveBeenCalled();
});
});
it("should not fire doubletap if movement of the first pointer exceeds moveDistance", function() {
runs(function() {
start({ id: 1, x: 10, y: 10 });
move({ id: 1, x: 10, y: 10 + moveDistance });
end({ id: 1, x: 10, y: 10 + moveDistance });
});
waits(maxDuration - offset);
runs(function() {
start({ id: 1, x: 10, y: 10 });
end({ id: 1, x: 10, y: 10 });
});
waitsForAnimation();
runs(function() {
expect(doubleTapHandler).not.toHaveBeenCalled();
});
waits(maxDuration + 30);
runs(function() {
// The second tap should actually trigger the single tap event
expect(singleTapHandler).toHaveBeenCalled();
})
});
it("should fire singletap if movement of the first pointer is within moveDistance", function() {
runs(function() {
start({ id: 1, x: 10, y: 10 });
move({ id: 1, x: 10, y: 9 + moveDistance });
end({ id: 1, x: 10, y: 9 + moveDistance });
});
waits(maxDuration + 30);
runs(function() {
expect(singleTapHandler).toHaveBeenCalled();
});
});
it("should fire doubletap if movement of the first pointer is within moveDistance", function() {
runs(function() {
start({ id: 1, x: 10, y: 10 });
move({ id: 1, x: 9 + moveDistance, y: 10 });
end({ id: 1, x: 9 + moveDistance, y: 10 });
});
waits(maxDuration - offset);
runs(function() {
start({ id: 1, x: 10, y: 10 });
end({ id: 1, x: 11, y: 11 });
});
waitsForAnimation();
runs(function() {
expect(doubleTapHandler).toHaveBeenCalled();
});
});
it("should fire a doubletap if done after a touchend is vetoed", function() {
targetEl.on('touchend', function(e) {
e.stopEvent();
}, null, {single: true});
runs(function() {
start({ id: 1, x: 400, y: 10 });
end({ id: 1, x: 400, y: 10 });
});
waits(maxDuration + 100);
runs(function() {
expect(doubleTapHandler).not.toHaveBeenCalled();
start({ id: 2, x: 10, y: 10 });
end({ id: 2, x: 10, y: 10 });
});
waits(maxDuration - 60);
runs(function() {
expect(doubleTapHandler).not.toHaveBeenCalled();
start({ id: 3, x: 10, y: 10 });
end({ id: 3, x: 10, y: 10 });
});
waitsForAnimation();
runs(function() {
expect(doubleTapHandler).toHaveBeenCalled();
});
});
it("should fire double tap if the second tap is within tapDistance from the first tap", function() {
runs(function() {
start({ id: 1, x: 10, y: 10 });
end({ id: 1, x: 10, y: 10 });
});
waits(maxDuration - offset);
runs(function() {
start({ id: 1, x: 10 + tapDistance, y: 10 });
end({ id: 1, x: 10 + tapDistance, y: 10 });
});
waitsForAnimation();
runs(function() {
expect(doubleTapHandler).toHaveBeenCalled();
});
});
it("should not fire double tap if the second tap exceeds tapDistance from the first tap", function() {
runs(function() {
start({ id: 1, x: 10, y: 10 });
end({ id: 1, x: 10, y: 10 });
});
waits(maxDuration - offset);
runs(function() {
start({ id: 1, x: 11 + tapDistance, y: 10 });
end({ id: 1, x: 11 + tapDistance, y: 10 });
});
waitsForAnimation();
runs(function() {
expect(doubleTapHandler).not.toHaveBeenCalled();
});
});
if (Ext.supports.Touch) {
it("should not fire single tap if the first touch is canceled", function() {
runs(function() {
start({ id: 1, x: 10, y: 10 });
cancel({ id: 1, x: 10, y: 10 });
});
waits(maxDuration + 30);
runs(function() {
start({ id: 1, x: 10, y: 10 });
end({ id: 1, x: 10, y: 10 });
});
waitsForAnimation();
runs(function() {
expect(singleTapHandler).not.toHaveBeenCalled();
});
});
it("should not fire double tap if the first touch is canceled", function() {
runs(function() {
start({ id: 1, x: 10, y: 10 });
cancel({ id: 1, x: 10, y: 10 });
});
waits(maxDuration - offset);
runs(function() {
start({ id: 1, x: 10, y: 10 });
end({ id: 1, x: 10, y: 10 });
});
waitsForAnimation();
runs(function() {
expect(doubleTapHandler).not.toHaveBeenCalled();
});
});
it("should not fire double tap if the second touch is canceled", function() {
runs(function() {
start({ id: 1, x: 10, y: 10 });
end({ id: 1, x: 10, y: 10 });
});
waits(maxDuration - offset);
runs(function() {
start({ id: 1, x: 10, y: 10 });
cancel({ id: 1, x: 10, y: 10 });
});
waitsForAnimation();
runs(function() {
expect(doubleTapHandler).not.toHaveBeenCalled();
});
});
}
});