create-expo-cljs-app
Version:
Create a react native application with Expo and Shadow-CLJS!
239 lines (183 loc) • 7.59 kB
JavaScript
// jscs:disable requireArrowFunctions,disallowVar,requireEnhancedObjectLiterals
/* globals QUnit,Hammer,utils*/
var el;
var hammer;
QUnit.module('Simultaenous recognition', {
beforeEach: function() {
el = utils.createHitArea();
},
afterEach: function() {
hammer && hammer.destroy();
}
});
QUnit.test('should pinch and pan simultaneously be recognized when enabled', function(assert) {
var done = assert.async();
assert.expect(4);
var panCount = 0;
var pinchCount = 0;
hammer = new Hammer.Manager(el, {
touchAction: 'none'
});
hammer.add(new Hammer.Pan({ threshold: 5, pointers: 2 }));
var pinch = new Hammer.Pinch({ threshold: 0, pointers: 2 });
hammer.add(pinch);
pinch.recognizeWith(hammer.get('pan'));
hammer.on('panend', function() {
panCount++;
});
hammer.on('pinchend', function() {
pinchCount++;
});
var executeGesture = function(cb) {
var event, touches;
touches = [
{ clientX: 0, clientY: 10, identifier: 0, target: el },
{ clientX: 10, clientY: 10, identifier: 1, target: el }
];
event = document.createEvent('Event');
event.initEvent('touchstart', true, true);
event.touches = touches;
event.targetTouches = touches;
event.changedTouches = touches;
el.dispatchEvent(event);
setTimeout(function() {
touches = [
{ clientX: 10, clientY: 20, identifier: 0, target: el },
{ clientX: 20, clientY: 20, identifier: 1, target: el }
];
event = document.createEvent('Event');
event.initEvent('touchmove', true, true);
event.touches = touches;
event.targetTouches = touches;
event.changedTouches = touches;
el.dispatchEvent(event);
}, 100);
setTimeout(function() {
touches = [
{ clientX: 20, clientY: 30, identifier: 0, target: el },
{ clientX: 40, clientY: 30, identifier: 1, target: el }
];
event = document.createEvent('Event');
event.initEvent('touchmove', true, true);
event.touches = touches;
event.targetTouches = touches;
event.changedTouches = touches;
el.dispatchEvent(event);
event = document.createEvent('Event');
event.initEvent('touchend', true, true);
event.touches = touches;
event.targetTouches = touches;
event.changedTouches = touches;
el.dispatchEvent(event);
cb();
}, 200);
};
// 2 gesture will be recognized
executeGesture(function() {
assert.equal(panCount, 1, '1 pan event recognized');
assert.equal(pinchCount, 1, '1 pinch event recognized');
pinch.dropRecognizeWith(hammer.get('pan'));
// Only the pan gesture will be recognized
executeGesture(function() {
assert.equal(panCount, 2, '2 pan events recognized');
assert.equal(pinchCount, 1, 'One pinch event recognized');
done();
});
});
});
QUnit.test('the first gesture should block the following gestures (Tap & DoubleTap)', function(assert) {
assert.expect(4);
var tapCount = 0;
var doubleTapCount = 0;
hammer = new Hammer.Manager(el, {
touchAction: 'none'
});
var tap = new Hammer.Tap();
var doubleTap = new Hammer.Tap({ event: 'doubletap', taps: 2 });
hammer.add(tap);
hammer.add(doubleTap);
hammer.on('tap', function() {
tapCount++;
});
hammer.on('doubletap', function() {
doubleTapCount++;
});
utils.dispatchTouchEvent(el, 'start', 0, 10);
utils.dispatchTouchEvent(el, 'end', 0, 10);
utils.dispatchTouchEvent(el, 'start', 0, 10);
utils.dispatchTouchEvent(el, 'end', 0, 10);
assert.equal(tapCount, 2, 'on a double tap gesture, the tap gesture is recognized twice');
assert.equal(doubleTapCount, 0, 'double tap gesture is not recognized because the prior tap gesture does not recognize it simultaneously');
doubleTap.recognizeWith(hammer.get('tap'));
utils.dispatchTouchEvent(el, 'start', 0, 10);
utils.dispatchTouchEvent(el, 'end', 0, 10);
utils.dispatchTouchEvent(el, 'start', 0, 10);
utils.dispatchTouchEvent(el, 'end', 0, 10);
assert.equal(tapCount, 4, '4 tap events recognized');
assert.equal(doubleTapCount, 1, 'when the tap gesture is configured to work simultaneously, tap & doubleTap can be recognized simultaneously');
});
QUnit.test('when disabled, the first gesture should not block gestures (Tap & DoubleTap )', function(assert) {
assert.expect(4);
var tapCount = 0;
var doubleTapCount = 0;
hammer = new Hammer.Manager(el, {
touchAction: 'none'
});
var tap = new Hammer.Tap();
var doubleTap = new Hammer.Tap({ event: 'doubletap', taps: 2 });
hammer.add(tap);
hammer.add(doubleTap);
hammer.on('tap', function() {
tapCount++;
});
hammer.on('doubletap', function() {
doubleTapCount++;
});
utils.dispatchTouchEvent(el, 'start', 0, 10);
utils.dispatchTouchEvent(el, 'end', 0, 10);
utils.dispatchTouchEvent(el, 'start', 0, 10);
utils.dispatchTouchEvent(el, 'end', 0, 10);
assert.equal(tapCount, 2, 'on a double tap gesture, the tap gesture is recognized twice');
assert.equal(doubleTapCount, 0, 'double tap gesture is not recognized because the prior tap gesture does not recognize it simultaneously');
hammer.get('tap').set({ enable: false });
utils.dispatchTouchEvent(el, 'start', 0, 10);
utils.dispatchTouchEvent(el, 'end', 0, 10);
utils.dispatchTouchEvent(el, 'start', 0, 10);
utils.dispatchTouchEvent(el, 'end', 0, 10);
assert.equal(tapCount, 2, 'tap gesture should not be recognized when the recognizer is disabled');
assert.equal(doubleTapCount, 1, 'when the tap gesture is disabled, doubleTap can be recognized');
});
QUnit.test('the first gesture should block the following gestures (DoubleTap & Tap)', function(assert) {
assert.expect(4);
var tapCount = 0;
var doubleTapCount = 0;
hammer = new Hammer.Manager(el, {
touchAction: 'none'
});
var tap = new Hammer.Tap();
var doubleTap = new Hammer.Tap({ event: 'doubletap', taps: 2 });
hammer.add(doubleTap);
hammer.add(tap);
hammer.on('tap', function() {
tapCount++;
});
hammer.on('doubletap', function() {
doubleTapCount++;
});
utils.dispatchTouchEvent(el, 'start', 0, 10);
utils.dispatchTouchEvent(el, 'end', 0, 10);
utils.dispatchTouchEvent(el, 'start', 0, 10);
utils.dispatchTouchEvent(el, 'end', 0, 10);
assert.equal(doubleTapCount, 1, 'double tap is recognized');
assert.equal(tapCount, 1, 'tap is detected, the doubletap is only catched by the doubletap recognizer');
// Doubletap and tap together
doubleTap.recognizeWith(hammer.get('tap'));
doubleTapCount = 0;
tapCount = 0;
utils.dispatchTouchEvent(el, 'start', 0, 10);
utils.dispatchTouchEvent(el, 'end', 0, 10);
utils.dispatchTouchEvent(el, 'start', 0, 10);
utils.dispatchTouchEvent(el, 'end', 0, 10);
assert.equal(doubleTapCount, 1, '1 double tap recognized');
assert.equal(tapCount, 2, 'when the tap gesture is configured to work simultaneously, tap & doubleTap can be recognized simultaneously');
});