224 lines
6.8 KiB
JavaScript
224 lines
6.8 KiB
JavaScript
|
|
defineSuite([
|
||
|
|
'Core/Event'
|
||
|
|
], function(
|
||
|
|
Event) {
|
||
|
|
'use strict';
|
||
|
|
|
||
|
|
var event;
|
||
|
|
var spyListener;
|
||
|
|
beforeEach(function() {
|
||
|
|
event = new Event();
|
||
|
|
spyListener = jasmine.createSpy('listener');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('works with no scope', function() {
|
||
|
|
var someValue = 123;
|
||
|
|
|
||
|
|
event.addEventListener(spyListener);
|
||
|
|
event.raiseEvent(someValue);
|
||
|
|
|
||
|
|
expect(spyListener).toHaveBeenCalledWith(someValue);
|
||
|
|
|
||
|
|
spyListener.calls.reset();
|
||
|
|
|
||
|
|
event.removeEventListener(spyListener);
|
||
|
|
event.raiseEvent(someValue);
|
||
|
|
|
||
|
|
expect(spyListener).not.toHaveBeenCalled();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('works with scope', function() {
|
||
|
|
var someValue = 123;
|
||
|
|
var scope = {};
|
||
|
|
|
||
|
|
event.addEventListener(spyListener, scope);
|
||
|
|
event.raiseEvent(someValue);
|
||
|
|
|
||
|
|
expect(spyListener).toHaveBeenCalledWith(someValue);
|
||
|
|
expect(spyListener.calls.first().object).toBe(scope);
|
||
|
|
|
||
|
|
spyListener.calls.reset();
|
||
|
|
|
||
|
|
event.removeEventListener(spyListener, scope);
|
||
|
|
event.raiseEvent(someValue);
|
||
|
|
|
||
|
|
expect(spyListener).not.toHaveBeenCalled();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('can remove from within a callback', function() {
|
||
|
|
var doNothing = function(evt) {
|
||
|
|
};
|
||
|
|
|
||
|
|
var removeEventCb = function(evt) {
|
||
|
|
event.removeEventListener(removeEventCb);
|
||
|
|
};
|
||
|
|
|
||
|
|
var doNothing2 = function(evt) {
|
||
|
|
};
|
||
|
|
|
||
|
|
event.addEventListener(doNothing);
|
||
|
|
event.addEventListener(removeEventCb);
|
||
|
|
event.addEventListener(doNothing2);
|
||
|
|
event.raiseEvent();
|
||
|
|
expect(event.numberOfListeners).toEqual(2);
|
||
|
|
|
||
|
|
event.removeEventListener(doNothing);
|
||
|
|
event.removeEventListener(doNothing2);
|
||
|
|
expect(event.numberOfListeners).toEqual(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('can remove multiple listeners within a callback', function() {
|
||
|
|
var removeEvent0 = event.addEventListener(function() { removeEvent0(); });
|
||
|
|
event.addEventListener(function() {});
|
||
|
|
var removeEvent2 = event.addEventListener(function() { removeEvent2(); });
|
||
|
|
event.addEventListener(function() {});
|
||
|
|
var removeEvent4 = event.addEventListener(function() { removeEvent4(); });
|
||
|
|
event.addEventListener(function() {});
|
||
|
|
var removeEvent6 = event.addEventListener(function() { removeEvent6(); });
|
||
|
|
event.addEventListener(function() {});
|
||
|
|
var removeEvent8 = event.addEventListener(function() { removeEvent8(); });
|
||
|
|
event.addEventListener(function() {});
|
||
|
|
|
||
|
|
expect(event.numberOfListeners).toEqual(10);
|
||
|
|
event.raiseEvent();
|
||
|
|
expect(event.numberOfListeners).toEqual(5);
|
||
|
|
event.raiseEvent();
|
||
|
|
expect(event.numberOfListeners).toEqual(5);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('addEventListener and removeEventListener works with same function of different scopes', function() {
|
||
|
|
var Scope = function() {
|
||
|
|
this.timesCalled = 0;
|
||
|
|
};
|
||
|
|
|
||
|
|
Scope.prototype.myCallback = function() {
|
||
|
|
this.timesCalled++;
|
||
|
|
};
|
||
|
|
|
||
|
|
var scope1 = new Scope();
|
||
|
|
var scope2 = new Scope();
|
||
|
|
|
||
|
|
event.addEventListener(Scope.prototype.myCallback, scope1);
|
||
|
|
event.addEventListener(Scope.prototype.myCallback, scope2);
|
||
|
|
event.raiseEvent();
|
||
|
|
|
||
|
|
expect(scope1.timesCalled).toEqual(1);
|
||
|
|
expect(scope2.timesCalled).toEqual(1);
|
||
|
|
|
||
|
|
event.removeEventListener(Scope.prototype.myCallback, scope1);
|
||
|
|
expect(event.numberOfListeners).toEqual(1);
|
||
|
|
event.raiseEvent();
|
||
|
|
|
||
|
|
expect(scope1.timesCalled).toEqual(1);
|
||
|
|
expect(scope2.timesCalled).toEqual(2);
|
||
|
|
|
||
|
|
event.removeEventListener(Scope.prototype.myCallback, scope2);
|
||
|
|
expect(event.numberOfListeners).toEqual(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('numberOfListeners returns the correct number', function() {
|
||
|
|
var callback1 = function() {
|
||
|
|
};
|
||
|
|
|
||
|
|
var callback2 = function() {
|
||
|
|
};
|
||
|
|
|
||
|
|
expect(event.numberOfListeners).toEqual(0);
|
||
|
|
|
||
|
|
event.addEventListener(callback1);
|
||
|
|
expect(event.numberOfListeners).toEqual(1);
|
||
|
|
|
||
|
|
event.addEventListener(callback2);
|
||
|
|
expect(event.numberOfListeners).toEqual(2);
|
||
|
|
|
||
|
|
event.removeEventListener(callback2);
|
||
|
|
expect(event.numberOfListeners).toEqual(1);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('removeEventListener indicates if the listener is registered with the event', function() {
|
||
|
|
var callback = function() {
|
||
|
|
};
|
||
|
|
|
||
|
|
event.addEventListener(callback);
|
||
|
|
expect(event.numberOfListeners).toEqual(1);
|
||
|
|
|
||
|
|
expect(event.removeEventListener(callback)).toEqual(true);
|
||
|
|
expect(event.numberOfListeners).toEqual(0);
|
||
|
|
|
||
|
|
expect(event.removeEventListener(callback)).toEqual(false);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('removeEventListener does not remove a registered listener of a different scope', function() {
|
||
|
|
var myFunc = function() {
|
||
|
|
};
|
||
|
|
var scope = {};
|
||
|
|
event.addEventListener(myFunc, scope);
|
||
|
|
expect(event.removeEventListener(myFunc)).toEqual(false);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('works with no listeners', function() {
|
||
|
|
event.raiseEvent(123);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('addEventListener returns a function allowing removal', function() {
|
||
|
|
var someValue = 123;
|
||
|
|
|
||
|
|
var remove = event.addEventListener(spyListener);
|
||
|
|
event.raiseEvent(someValue);
|
||
|
|
|
||
|
|
expect(spyListener).toHaveBeenCalledWith(someValue);
|
||
|
|
spyListener.calls.reset();
|
||
|
|
|
||
|
|
remove();
|
||
|
|
event.raiseEvent(someValue);
|
||
|
|
|
||
|
|
expect(spyListener).not.toHaveBeenCalled();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('addEventListener with scope returns a function allowing removal', function() {
|
||
|
|
var someValue = 123;
|
||
|
|
var scope = {};
|
||
|
|
|
||
|
|
var remove = event.addEventListener(spyListener, scope);
|
||
|
|
event.raiseEvent(someValue);
|
||
|
|
|
||
|
|
expect(spyListener).toHaveBeenCalledWith(someValue);
|
||
|
|
spyListener.calls.reset();
|
||
|
|
|
||
|
|
remove();
|
||
|
|
event.raiseEvent(someValue);
|
||
|
|
|
||
|
|
expect(spyListener).not.toHaveBeenCalled();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('addEventListener throws with undefined listener', function() {
|
||
|
|
expect(function() {
|
||
|
|
event.addEventListener(undefined);
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('addEventListener throws with null listener', function() {
|
||
|
|
expect(function() {
|
||
|
|
event.addEventListener(null);
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('addEventListener throws with non-function listener', function() {
|
||
|
|
expect(function() {
|
||
|
|
event.addEventListener({});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('removeEventListener throws with undefined listener', function() {
|
||
|
|
expect(function() {
|
||
|
|
event.removeEventListener(undefined);
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('removeEventListener throws with null listener', function() {
|
||
|
|
expect(function() {
|
||
|
|
event.removeEventListener(null);
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
});
|