232 lines
5.9 KiB
JavaScript
232 lines
5.9 KiB
JavaScript
'use strict';
|
|
|
|
var _ava = require('ava');
|
|
|
|
var _ava2 = _interopRequireDefault(_ava);
|
|
|
|
var _ = require('../');
|
|
|
|
var _sinon = require('sinon');
|
|
|
|
var _sinon2 = _interopRequireDefault(_sinon);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
(0, _ava2.default)('calls listeners with arguments passed to emit()', function (t) {
|
|
var emitter = (0, _.createChangeEmitter)();
|
|
var calledWith = void 0;
|
|
emitter.listen(function () {
|
|
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
calledWith = args;
|
|
});
|
|
emitter.emit('a', 'b', 'c');
|
|
t.deepEqual(calledWith, ['a', 'b', 'c']);
|
|
});
|
|
|
|
(0, _ava2.default)('supports multiple listeners', function (t) {
|
|
var emitter = (0, _.createChangeEmitter)();
|
|
var listenerA = _sinon2.default.spy();
|
|
var listenerB = _sinon2.default.spy();
|
|
|
|
var unlistenA = emitter.listen(listenerA);
|
|
emitter.emit();
|
|
t.is(listenerA.callCount, 1);
|
|
t.is(listenerB.callCount, 0);
|
|
|
|
emitter.emit();
|
|
t.is(listenerA.callCount, 2);
|
|
t.is(listenerB.callCount, 0);
|
|
|
|
var unlistenB = emitter.listen(listenerB);
|
|
t.is(listenerA.callCount, 2);
|
|
t.is(listenerB.callCount, 0);
|
|
|
|
emitter.emit();
|
|
t.is(listenerA.callCount, 3);
|
|
t.is(listenerB.callCount, 1);
|
|
|
|
unlistenA();
|
|
t.is(listenerA.callCount, 3);
|
|
t.is(listenerB.callCount, 1);
|
|
|
|
emitter.emit();
|
|
t.is(listenerA.callCount, 3);
|
|
t.is(listenerB.callCount, 2);
|
|
|
|
unlistenB();
|
|
t.is(listenerA.callCount, 3);
|
|
t.is(listenerB.callCount, 2);
|
|
|
|
emitter.emit();
|
|
t.is(listenerA.callCount, 3);
|
|
t.is(listenerB.callCount, 2);
|
|
|
|
unlistenA = emitter.listen(listenerA);
|
|
t.is(listenerA.callCount, 3);
|
|
t.is(listenerB.callCount, 2);
|
|
|
|
emitter.emit();
|
|
t.is(listenerA.callCount, 4);
|
|
t.is(listenerB.callCount, 2);
|
|
});
|
|
|
|
(0, _ava2.default)('only removes listener once when unlisten is called', function (t) {
|
|
var emitter = (0, _.createChangeEmitter)();
|
|
var listenerA = _sinon2.default.spy();
|
|
var listenerB = _sinon2.default.spy();
|
|
|
|
var unlistenA = emitter.listen(listenerA);
|
|
emitter.listen(listenerB);
|
|
|
|
unlistenA();
|
|
unlistenA();
|
|
|
|
emitter.emit();
|
|
t.is(listenerA.callCount, 0);
|
|
t.is(listenerB.callCount, 1);
|
|
});
|
|
|
|
(0, _ava2.default)('only removes relevant listener when unlisten is called', function (t) {
|
|
var emitter = (0, _.createChangeEmitter)();
|
|
var listener = _sinon2.default.spy();
|
|
|
|
emitter.listen(listener);
|
|
var unlisten = emitter.listen(listener);
|
|
|
|
unlisten();
|
|
unlisten();
|
|
|
|
emitter.emit();
|
|
t.is(listener.callCount, 1);
|
|
});
|
|
|
|
(0, _ava2.default)('supports unlistening within a listener', function (t) {
|
|
var emitter = (0, _.createChangeEmitter)();
|
|
var listenerA = _sinon2.default.spy();
|
|
var listenerB = _sinon2.default.spy();
|
|
var listenerC = _sinon2.default.spy();
|
|
|
|
emitter.listen(listenerA);
|
|
var unlistenB = emitter.listen(function () {
|
|
listenerB();
|
|
unlistenB();
|
|
});
|
|
emitter.listen(listenerC);
|
|
|
|
emitter.emit();
|
|
emitter.emit();
|
|
|
|
t.is(listenerA.callCount, 2);
|
|
t.is(listenerB.callCount, 1);
|
|
t.is(listenerC.callCount, 2);
|
|
});
|
|
|
|
(0, _ava2.default)('when a listener is removed from inside another listener, it is still ' + 'called for the current change', function (t) {
|
|
var emitter = (0, _.createChangeEmitter)();
|
|
|
|
var unlistens = [];
|
|
var unlistenAll = function unlistenAll() {
|
|
return unlistens.forEach(function (unlisten) {
|
|
return unlisten();
|
|
});
|
|
};
|
|
|
|
var listener1 = _sinon2.default.spy();
|
|
var listener2 = _sinon2.default.spy();
|
|
var listener3 = _sinon2.default.spy();
|
|
|
|
unlistens.push(emitter.listen(listener1));
|
|
unlistens.push(emitter.listen(function () {
|
|
listener2();
|
|
unlistenAll();
|
|
}));
|
|
unlistens.push(emitter.listen(listener3));
|
|
|
|
emitter.emit();
|
|
t.is(listener1.callCount, 1);
|
|
t.is(listener2.callCount, 1);
|
|
t.is(listener3.callCount, 1); // Still called
|
|
|
|
// Confirm all listeners were removed
|
|
emitter.emit();
|
|
t.is(listener1.callCount, 1);
|
|
t.is(listener2.callCount, 1);
|
|
t.is(listener3.callCount, 1);
|
|
});
|
|
|
|
(0, _ava2.default)('when listener is added inside another listener, the new listener is ' + 'not called for the current change', function (t) {
|
|
var emitter = (0, _.createChangeEmitter)();
|
|
|
|
var listener1 = _sinon2.default.spy();
|
|
var listener2 = _sinon2.default.spy();
|
|
var listener3 = _sinon2.default.spy();
|
|
|
|
var listener3Added = false;
|
|
var maybeAddThirdListener = function maybeAddThirdListener() {
|
|
if (!listener3Added) {
|
|
listener3Added = true;
|
|
emitter.listen(listener3);
|
|
}
|
|
};
|
|
|
|
emitter.listen(listener1);
|
|
emitter.listen(function () {
|
|
listener2();
|
|
maybeAddThirdListener();
|
|
});
|
|
|
|
emitter.emit();
|
|
t.is(listener1.callCount, 1);
|
|
t.is(listener2.callCount, 1);
|
|
t.is(listener3.callCount, 0); // Not called
|
|
|
|
emitter.emit();
|
|
t.is(listener1.callCount, 2);
|
|
t.is(listener2.callCount, 2);
|
|
t.is(listener3.callCount, 1); // Called
|
|
});
|
|
|
|
(0, _ava2.default)('uses the last snapshot of listeners during nested change events', function (t) {
|
|
var emitter = (0, _.createChangeEmitter)();
|
|
|
|
var listener1 = _sinon2.default.spy();
|
|
var listener2 = _sinon2.default.spy();
|
|
var listener3 = _sinon2.default.spy();
|
|
var listener4 = _sinon2.default.spy();
|
|
|
|
var unlisten4 = void 0;
|
|
var unlisten1 = emitter.listen(function () {
|
|
listener1();
|
|
t.is(listener1.callCount, 1);
|
|
t.is(listener2.callCount, 0);
|
|
t.is(listener3.callCount, 0);
|
|
t.is(listener4.callCount, 0);
|
|
|
|
unlisten1();
|
|
unlisten4 = emitter.listen(listener4);
|
|
emitter.emit();
|
|
|
|
t.is(listener1.callCount, 1);
|
|
t.is(listener2.callCount, 1);
|
|
t.is(listener3.callCount, 1);
|
|
t.is(listener4.callCount, 1);
|
|
});
|
|
emitter.listen(listener2);
|
|
emitter.listen(listener3);
|
|
|
|
emitter.emit();
|
|
t.is(listener1.callCount, 1);
|
|
t.is(listener2.callCount, 2);
|
|
t.is(listener3.callCount, 2);
|
|
t.is(listener4.callCount, 1);
|
|
|
|
unlisten4();
|
|
emitter.emit();
|
|
t.is(listener1.callCount, 1);
|
|
t.is(listener2.callCount, 3);
|
|
t.is(listener3.callCount, 3);
|
|
t.is(listener4.callCount, 1);
|
|
}); |