In addition to using const and let, this also upgrades our linter config and removes lint (mostly whitespace).
164 lines
5.9 KiB
JavaScript
164 lines
5.9 KiB
JavaScript
import Disposable from '../../../../src/ol/Disposable.js';
|
|
import _ol_events_ from '../../../../src/ol/events.js';
|
|
import Event from '../../../../src/ol/events/Event.js';
|
|
import EventTarget from '../../../../src/ol/events/EventTarget.js';
|
|
|
|
|
|
describe('ol.events.EventTarget', function() {
|
|
let called, events, eventTarget, spy1, spy2, spy3;
|
|
|
|
beforeEach(function() {
|
|
called = [];
|
|
events = [];
|
|
function spy(evt) {
|
|
called.push(this.id);
|
|
events.push(evt);
|
|
}
|
|
spy1 = spy.bind({id: 1});
|
|
spy2 = spy.bind({id: 2});
|
|
spy3 = spy.bind({id: 3});
|
|
eventTarget = new EventTarget();
|
|
});
|
|
|
|
describe('constructor', function() {
|
|
it('creates an instance', function() {
|
|
expect(eventTarget).to.be.a(EventTarget);
|
|
expect(eventTarget).to.be.a(Disposable);
|
|
});
|
|
it('creates an empty listeners_ object', function() {
|
|
expect(Object.keys(eventTarget.listeners_)).to.have.length(0);
|
|
});
|
|
});
|
|
|
|
describe('#hasListener', function() {
|
|
it('reports any listeners when called without argument', function() {
|
|
expect(eventTarget.hasListener()).to.be(false);
|
|
eventTarget.listeners_['foo'] = [function() {}];
|
|
expect(eventTarget.hasListener()).to.be(true);
|
|
});
|
|
it('reports listeners for the type passed as argument', function() {
|
|
eventTarget.listeners_['foo'] = [function() {}];
|
|
expect(eventTarget.hasListener('foo')).to.be(true);
|
|
expect(eventTarget.hasListener('bar')).to.be(false);
|
|
});
|
|
});
|
|
|
|
describe('#getListeners', function() {
|
|
it('returns listeners for a type or undefined if none', function() {
|
|
expect(eventTarget.getListeners('foo')).to.be(undefined);
|
|
const listeners = [function() {}];
|
|
eventTarget.listeners_['foo'] = listeners;
|
|
expect(eventTarget.getListeners('foo')).to.equal(listeners);
|
|
});
|
|
});
|
|
|
|
|
|
describe('#addEventListener()', function() {
|
|
it('has listeners for each registered type', function() {
|
|
eventTarget.addEventListener('foo', spy1);
|
|
eventTarget.addEventListener('bar', spy2);
|
|
expect(eventTarget.hasListener('foo')).to.be(true);
|
|
expect(eventTarget.hasListener('bar')).to.be(true);
|
|
});
|
|
});
|
|
|
|
describe('#removeEventListener()', function() {
|
|
it('keeps the listeners registry clean', function() {
|
|
eventTarget.addEventListener('foo', spy1);
|
|
eventTarget.removeEventListener('foo', spy1);
|
|
expect(eventTarget.hasListener('foo')).to.be(false);
|
|
});
|
|
it('removes added listeners from the listeners registry', function() {
|
|
eventTarget.addEventListener('foo', spy1);
|
|
eventTarget.addEventListener('foo', spy2);
|
|
eventTarget.removeEventListener('foo', spy1, false);
|
|
expect(eventTarget.getListeners('foo')).to.have.length(1);
|
|
});
|
|
});
|
|
|
|
describe('#dispatchEvent()', function() {
|
|
it('calls listeners in the correct order', function() {
|
|
eventTarget.addEventListener('foo', spy1);
|
|
eventTarget.addEventListener('foo', spy2);
|
|
eventTarget.dispatchEvent('foo');
|
|
expect(called).to.eql([1, 2]);
|
|
});
|
|
it('stops propagation when listeners return false', function() {
|
|
eventTarget.addEventListener('foo', spy1);
|
|
eventTarget.addEventListener('foo', function(evt) {
|
|
spy2();
|
|
return false;
|
|
}, false);
|
|
eventTarget.addEventListener('foo', spy3);
|
|
eventTarget.dispatchEvent('foo');
|
|
expect(called).to.eql([1, 2]);
|
|
});
|
|
it('stops propagation when listeners call preventDefault()', function() {
|
|
eventTarget.addEventListener('foo', function(evt) {
|
|
spy2();
|
|
evt.preventDefault();
|
|
});
|
|
eventTarget.addEventListener('foo', spy1);
|
|
eventTarget.dispatchEvent('foo');
|
|
expect(called).to.eql([2]);
|
|
});
|
|
it('passes a default ol.events.Event object to listeners', function() {
|
|
eventTarget.addEventListener('foo', spy1);
|
|
eventTarget.dispatchEvent('foo');
|
|
expect(events[0]).to.be.a(Event);
|
|
expect(events[0].type).to.be('foo');
|
|
expect(events[0].target).to.equal(eventTarget);
|
|
});
|
|
it('passes a custom event object with target to listeners', function() {
|
|
eventTarget.addEventListener('foo', spy1);
|
|
const event = {
|
|
type: 'foo'
|
|
};
|
|
eventTarget.dispatchEvent(event);
|
|
expect(events[0]).to.equal(event);
|
|
expect(events[0].target).to.equal(eventTarget);
|
|
});
|
|
it('is safe to remove listeners in listeners', function() {
|
|
eventTarget.addEventListener('foo', spy3);
|
|
eventTarget.addEventListener('foo', function() {
|
|
eventTarget.removeEventListener('foo', spy1);
|
|
eventTarget.removeEventListener('foo', spy2);
|
|
eventTarget.removeEventListener('foo', spy3);
|
|
});
|
|
eventTarget.addEventListener('foo', spy1);
|
|
eventTarget.addEventListener('foo', spy2);
|
|
expect(function() {
|
|
eventTarget.dispatchEvent('foo');
|
|
}).not.to.throwException();
|
|
expect(called).to.eql([3]);
|
|
expect(eventTarget.getListeners('foo')).to.have.length(1);
|
|
});
|
|
it('is safe to do weird things in listeners', function() {
|
|
eventTarget.addEventListener('foo', spy2);
|
|
eventTarget.addEventListener('foo', function weird(evt) {
|
|
eventTarget.removeEventListener('foo', weird);
|
|
eventTarget.removeEventListener('foo', spy1);
|
|
eventTarget.dispatchEvent('foo');
|
|
eventTarget.removeEventListener('foo', spy2);
|
|
eventTarget.dispatchEvent('foo');
|
|
evt.preventDefault();
|
|
});
|
|
eventTarget.addEventListener('foo', spy1);
|
|
expect(function() {
|
|
eventTarget.dispatchEvent('foo');
|
|
}).not.to.throwException();
|
|
expect(called).to.eql([2, 2]);
|
|
expect(eventTarget.getListeners('foo')).to.be(undefined);
|
|
});
|
|
});
|
|
|
|
describe('#dispose()', function() {
|
|
it('cleans up foreign references', function() {
|
|
_ol_events_.listen(eventTarget, 'foo', spy1, document);
|
|
expect(eventTarget.hasListener('foo')).to.be(true);
|
|
eventTarget.dispose();
|
|
expect(eventTarget.hasListener('foo')).to.be(false);
|
|
});
|
|
});
|
|
});
|