You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
5.9 KiB
232 lines
5.9 KiB
'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); |
|
}); |