'use strict';
describe('ngClick (touch)', function() {
var element, time, orig_now;
// TODO(braden): Once we have other touch-friendly browsers on CI, allow them here.
// Currently Firefox and IE refuse to fire touch events.
var chrome = /chrome/.test(navigator.userAgent.toLowerCase());
if (!chrome) {
return;
}
function mockTime() {
return time;
}
beforeEach(function() {
module('ngTouch');
orig_now = Date.now;
time = 0;
Date.now = mockTime;
});
afterEach(function() {
dealoc(element);
Date.now = orig_now;
});
it('should get called on a tap', inject(function($rootScope, $compile) {
element = $compile('
')($rootScope);
$rootScope.$digest();
expect($rootScope.tapped).toBeUndefined();
browserTrigger(element, 'touchstart');
browserTrigger(element, 'touchend');
expect($rootScope.tapped).toEqual(true);
}));
it('should pass event object', inject(function($rootScope, $compile) {
element = $compile('')($rootScope);
$rootScope.$digest();
browserTrigger(element, 'touchstart');
browserTrigger(element, 'touchend');
expect($rootScope.event).toBeDefined();
}));
it('should not click if the touch is held too long', inject(function($rootScope, $compile, $rootElement) {
element = $compile('')($rootScope);
$rootElement.append(element);
$rootScope.count = 0;
$rootScope.$digest();
expect($rootScope.count).toBe(0);
time = 10;
browserTrigger(element, 'touchstart',{
keys: [],
x: 10,
y: 10
});
time = 900;
browserTrigger(element, 'touchend',{
keys: [],
x: 10,
y: 10
});
expect($rootScope.count).toBe(0);
}));
it('should not click if the touchend is too far away', inject(function($rootScope, $compile, $rootElement) {
element = $compile('')($rootScope);
$rootElement.append(element);
$rootScope.$digest();
expect($rootScope.tapped).toBeUndefined();
browserTrigger(element, 'touchstart',{
keys: [],
x: 10,
y: 10
});
browserTrigger(element, 'touchend',{
keys: [],
x: 400,
y: 400
});
expect($rootScope.tapped).toBeUndefined();
}));
it('should not click if a touchmove comes before touchend', inject(function($rootScope, $compile, $rootElement) {
element = $compile('')($rootScope);
$rootElement.append(element);
$rootScope.$digest();
expect($rootScope.tapped).toBeUndefined();
browserTrigger(element, 'touchstart',{
keys: [],
x: 10,
y: 10
});
browserTrigger(element, 'touchmove');
browserTrigger(element, 'touchend',{
keys: [],
x: 400,
y: 400
});
expect($rootScope.tapped).toBeUndefined();
}));
it('should add the CSS class while the element is held down, and then remove it', inject(function($rootScope, $compile, $rootElement) {
element = $compile('')($rootScope);
$rootElement.append(element);
$rootScope.$digest();
expect($rootScope.tapped).toBeUndefined();
var CSS_CLASS = 'ng-click-active';
expect(element.hasClass(CSS_CLASS)).toBe(false);
browserTrigger(element, 'touchstart',{
keys: [],
x: 10,
y: 10
});
expect(element.hasClass(CSS_CLASS)).toBe(true);
browserTrigger(element, 'touchend',{
keys: [],
x: 10,
y: 10
});
expect(element.hasClass(CSS_CLASS)).toBe(false);
expect($rootScope.tapped).toBe(true);
}));
describe('the clickbuster', function() {
var element1, element2;
beforeEach(inject(function($rootElement, $document) {
$document.find('body').append($rootElement);
}));
afterEach(inject(function($document) {
$document.find('body').empty();
}));
it('should cancel the following click event', inject(function($rootScope, $compile, $rootElement, $document) {
element = $compile('')($rootScope);
$rootElement.append(element);
$rootScope.count = 0;
$rootScope.$digest();
expect($rootScope.count).toBe(0);
// Fire touchstart at 10ms, touchend at 50ms, the click at 300ms.
time = 10;
browserTrigger(element, 'touchstart',{
keys: [],
x: 10,
y: 10
});
time = 50;
browserTrigger(element, 'touchend',{
keys: [],
x: 10,
y: 10
});
expect($rootScope.count).toBe(1);
time = 100;
browserTrigger(element, 'click',{
keys: [],
x: 10,
y: 10
});
expect($rootScope.count).toBe(1);
}));
it('should cancel the following click event even when the element has changed', inject(
function($rootScope, $compile, $rootElement) {
$rootElement.append(
'