UNPKG

openlayers

Version:

Build tools and sources for developing OpenLayers based mapping applications

166 lines (153 loc) 6.03 kB
goog.provide('ol.test.events.EventTarget'); goog.require('ol.Disposable'); goog.require('ol.events'); goog.require('ol.events.Event'); goog.require('ol.events.EventTarget'); describe('ol.events.EventTarget', function() { var 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 ol.events.EventTarget(); }); describe('constructor', function() { it('creates an instance', function() { expect(eventTarget).to.be.a(ol.events.EventTarget); expect(eventTarget).to.be.a(ol.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); var 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(ol.events.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); var 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); }); }); });