polyfill-service
Version:
A polyfill combinator
150 lines (131 loc) • 3.85 kB
JavaScript
/* global expect,it */
// Safari fails this test. However, no-one would ever do this
// as it would just create an event that can never be dispatched/listened for
// it doesn't cause any problem
it.skip('should throw exception when instantiated with no parameters', function() {
expect(function() {
new Event();
}).to.throwException();
});
it('should have correct default properties', function() {
var testEvent = new Event('click');
expect(testEvent.type).to.be('click');
expect(testEvent.bubbles).to.be(false);
expect(testEvent.cancelable).to.be(false);
});
it('should modify default properties if optional EventInit parameter is passed', function() {
var testEvent = new Event('test', {
bubbles: true,
cancelable: true
});
expect(testEvent.type).to.be('test');
expect(testEvent.bubbles).to.be(true);
expect(testEvent.cancelable).to.be(true);
});
it('should be able to fire an event that can be listened to', function(done) {
var testEvent = new Event('test', {
bubbles: true,
cancelable: true
});
var testEl = document.createElement('div');
testEl.addEventListener('test', function(ev) {
expect(ev.type).to.be('test');
expect(ev.bubbles).to.be(true);
expect(ev.cancelable).to.be(true);
done();
});
testEl.dispatchEvent(testEvent);
});
it('should bubble the event', function(done) {
var testEvent = new Event('test', {
bubbles: true,
cancelable: true
});
var testEl = document.createElement('div');
document.body.appendChild(testEl);
document.body.addEventListener('test', function(ev) {
expect(ev.type).to.be('test');
expect(ev.bubbles).to.be(true);
expect(ev.cancelable).to.be(true);
done();
});
testEl.dispatchEvent(testEvent);
});
it('should not trigger an event handler once removed', function() {
var testEvent = new Event('test', {
bubbles: true,
cancelable: true
});
var listener = function() {
throw new Error('listener was fired, but should have been removed');
};
var testEl = document.createElement('div');
testEl.addEventListener('test', listener);
testEl.removeEventListener('test', listener);
testEl.dispatchEvent(testEvent);
});
it('should trigger an event handler once added, removed, and added again', function () {
// NOTE: The event must be a real DOM event or the
// dispatchEvent polyfill will catch the fireEvent
// error, simulate firing the event by running the
// event listeners.
var fired = false;
var listener = function() {
fired = true;
document.removeEventListener('click', listener);
};
document.addEventListener('click', listener);
document.removeEventListener('click', listener);
document.addEventListener('click', listener);
// click the document
document.dispatchEvent(new Event('click'));
expect(fired).to.be(true);
});
it('should have the correct target when using delegation', function () {
var fired = false;
var el = document.body.firstChild;
var listener = function(e) {
if (e.target === el) fired = true;
document.removeEventListener('click', listener);
};
document.addEventListener('click', listener);
el.dispatchEvent(new Event('click', {
bubbles: true
}));
expect(fired).to.be(true);
});
it('should successfully call window.addEventListener or throw exception', function() {
var eventsToTest = [
'click',
'dblclick',
'keyup',
'keypress',
'keydown',
'mousedown',
'mouseup',
'mousemove',
'mouseover',
'mouseenter',
'mouseleave',
'mouseout',
'storage',
'storagecommit',
'textinput'
];
var threwLast;
var threw;
var listener = function() {};
for(var i = 0; i < eventsToTest.length; i++) {
var eventType = eventsToTest[i];
try {
window.addEventListener(eventType, listener);
threw = false;
} catch(ignore) {
threw = true;
}
if (typeof (threwLast) != 'undefined') {
expect(threw).to.be(threwLast);
}
threwLast = threw;
}
});