328 lines
8.4 KiB
JavaScript
328 lines
8.4 KiB
JavaScript
|
/* istanbul ignore next */
|
||
|
describe('Ultron', function () {
|
||
|
'use strict';
|
||
|
|
||
|
var EventEmitter = require('eventemitter3')
|
||
|
, EE = require('events').EventEmitter
|
||
|
, assume = require('assume')
|
||
|
, Ultron = require('./')
|
||
|
, ultron
|
||
|
, ee;
|
||
|
|
||
|
beforeEach(function () {
|
||
|
ee = new EventEmitter();
|
||
|
ultron = new Ultron(ee);
|
||
|
});
|
||
|
|
||
|
afterEach(function () {
|
||
|
ultron.destroy();
|
||
|
ee.removeAllListeners();
|
||
|
});
|
||
|
|
||
|
it('is exposed as a function', function () {
|
||
|
assume(Ultron).is.a('function');
|
||
|
});
|
||
|
|
||
|
it('can be initialized without the new keyword', function () {
|
||
|
assume(Ultron(ee)).is.instanceOf(Ultron);
|
||
|
});
|
||
|
|
||
|
it('assigns a unique id to every instance', function () {
|
||
|
for (var i = 0; i < 100; i++) {
|
||
|
assume(ultron.id).does.not.equal((new Ultron()).id);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
it('allows removal through the event emitter', function () {
|
||
|
function foo() {}
|
||
|
function bar() {}
|
||
|
|
||
|
ultron.on('foo', foo);
|
||
|
ultron.once('foo', bar);
|
||
|
|
||
|
assume(foo.__ultron).equals(ultron.id);
|
||
|
assume(bar.__ultron).equals(ultron.id);
|
||
|
assume(ee.listeners('foo').length).equals(2);
|
||
|
|
||
|
ee.removeListener('foo', foo);
|
||
|
assume(ee.listeners('foo').length).equals(1);
|
||
|
|
||
|
ee.removeListener('foo', bar);
|
||
|
assume(ee.listeners('foo').length).equals(0);
|
||
|
});
|
||
|
|
||
|
describe('#on', function () {
|
||
|
it('assigns a listener', function () {
|
||
|
assume(ee.listeners('foo').length).equals(0);
|
||
|
|
||
|
function foo() {}
|
||
|
|
||
|
ultron.on('foo', foo);
|
||
|
assume(ee.listeners('foo').length).equals(1);
|
||
|
assume(ee.listeners('foo')[0]).equals(foo);
|
||
|
});
|
||
|
|
||
|
it('tags the assigned function', function () {
|
||
|
assume(ee.listeners('foo').length).equals(0);
|
||
|
|
||
|
ultron.on('foo', function () {});
|
||
|
assume(ee.listeners('foo')[0].__ultron).equals(ultron.id);
|
||
|
});
|
||
|
|
||
|
it('also passes in the context', function (next) {
|
||
|
var context = 1313;
|
||
|
|
||
|
ultron.on('foo', function (a, b, c) {
|
||
|
assume(a).equals('a');
|
||
|
assume(b).equals('b');
|
||
|
assume(c).equals('c');
|
||
|
|
||
|
assume(this).equals(context);
|
||
|
|
||
|
next();
|
||
|
}, context);
|
||
|
|
||
|
ee.emit('foo', 'a', 'b', 'c');
|
||
|
});
|
||
|
|
||
|
it('works with regular eventemitters as well', function (next) {
|
||
|
var ee = new EE()
|
||
|
, ultron = new Ultron(ee);
|
||
|
|
||
|
ultron.on('foo', function (a, b, c) {
|
||
|
assume(a).equals('a');
|
||
|
assume(b).equals('b');
|
||
|
assume(c).equals('c');
|
||
|
|
||
|
next();
|
||
|
});
|
||
|
|
||
|
ee.emit('foo', 'a', 'b', 'c');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('#once', function () {
|
||
|
it('assigns a listener', function () {
|
||
|
assume(ee.listeners('foo').length).equals(0);
|
||
|
|
||
|
function foo() {}
|
||
|
ultron.once('foo', foo);
|
||
|
assume(ee.listeners('foo').length).equals(1);
|
||
|
assume(ee.listeners('foo')[0]).equals(foo);
|
||
|
});
|
||
|
|
||
|
it('tags the assigned function', function () {
|
||
|
assume(ee.listeners('foo').length).equals(0);
|
||
|
|
||
|
ultron.once('foo', function () {});
|
||
|
assume(ee.listeners('foo')[0].__ultron).equals(ultron.id);
|
||
|
});
|
||
|
|
||
|
it('also passes in the context', function (next) {
|
||
|
var context = 1313;
|
||
|
|
||
|
ultron.once('foo', function (a, b, c) {
|
||
|
assume(a).equals('a');
|
||
|
assume(b).equals('b');
|
||
|
assume(c).equals('c');
|
||
|
|
||
|
assume(this).equals(context);
|
||
|
|
||
|
next();
|
||
|
}, context);
|
||
|
|
||
|
ee.emit('foo', 'a', 'b', 'c');
|
||
|
ee.emit('foo', 'a', 'b', 'c'); // Ensure that we don't double execute
|
||
|
});
|
||
|
|
||
|
it('works with regular eventemitters as well', function (next) {
|
||
|
var ee = new EE()
|
||
|
, ultron = new Ultron(ee);
|
||
|
|
||
|
ultron.once('foo', function (a, b, c) {
|
||
|
assume(a).equals('a');
|
||
|
assume(b).equals('b');
|
||
|
assume(c).equals('c');
|
||
|
|
||
|
next();
|
||
|
});
|
||
|
|
||
|
ee.emit('foo', 'a', 'b', 'c');
|
||
|
ee.emit('foo', 'a', 'b', 'c'); // Ensure that we don't double execute
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('#remove', function () {
|
||
|
it('removes only our assigned `on` listeners', function () {
|
||
|
function foo() {}
|
||
|
function bar() {}
|
||
|
|
||
|
ee.on('foo', foo);
|
||
|
ultron.on('foo', bar);
|
||
|
assume(ee.listeners('foo').length).equals(2);
|
||
|
|
||
|
ultron.remove('foo');
|
||
|
assume(ee.listeners('foo').length).equals(1);
|
||
|
assume(ee.listeners('foo')[0]).equals(foo);
|
||
|
});
|
||
|
|
||
|
it('removes our private __ultron references', function () {
|
||
|
function once() {}
|
||
|
function on() {}
|
||
|
|
||
|
assume('__ultron' in once).is.false();
|
||
|
assume('__ultron' in on).is.false();
|
||
|
|
||
|
ultron.on('foo', on);
|
||
|
ultron.once('bar', once);
|
||
|
|
||
|
assume('__ultron' in once).is.true();
|
||
|
assume('__ultron' in on).is.true();
|
||
|
|
||
|
ultron.remove('foo, bar');
|
||
|
|
||
|
assume('__ultron' in once).is.false();
|
||
|
assume('__ultron' in on).is.false();
|
||
|
|
||
|
ultron.destroy();
|
||
|
|
||
|
ee = new EE();
|
||
|
ultron = new Ultron(ee);
|
||
|
|
||
|
assume('__ultron' in once).is.false();
|
||
|
assume('__ultron' in on).is.false();
|
||
|
|
||
|
ultron.on('foo', on);
|
||
|
ultron.once('bar', once);
|
||
|
|
||
|
assume('__ultron' in once).is.true();
|
||
|
assume('__ultron' in on).is.true();
|
||
|
|
||
|
ultron.remove('foo, bar');
|
||
|
|
||
|
assume('__ultron' in once).is.false();
|
||
|
assume('__ultron' in on).is.false();
|
||
|
});
|
||
|
|
||
|
it('removes only our assigned `once` listeners', function () {
|
||
|
function foo() {}
|
||
|
function bar() {}
|
||
|
|
||
|
ee.once('foo', foo);
|
||
|
ultron.once('foo', bar);
|
||
|
assume(ee.listeners('foo').length).equals(2);
|
||
|
|
||
|
ultron.remove('foo');
|
||
|
assume(ee.listeners('foo').length).equals(1);
|
||
|
assume(ee.listeners('foo')[0]).equals(foo);
|
||
|
});
|
||
|
|
||
|
it('removes only our assigned `once` listeners from regular EE', function () {
|
||
|
var ee = new EE()
|
||
|
, ultron = new Ultron(ee);
|
||
|
|
||
|
function foo() {}
|
||
|
function bar() {}
|
||
|
|
||
|
ee.once('foo', foo);
|
||
|
ultron.once('foo', bar);
|
||
|
assume(ee.listeners('foo').length).equals(2);
|
||
|
|
||
|
ultron.remove('foo');
|
||
|
assume(ee.listeners('foo').length).equals(1);
|
||
|
assume(ee.listeners('foo')[0].listener).equals(foo);
|
||
|
});
|
||
|
|
||
|
it('removes all assigned events if called without args', function () {
|
||
|
function foo() {}
|
||
|
function bar() {}
|
||
|
|
||
|
ultron.on('foo', foo);
|
||
|
ultron.on('bar', bar);
|
||
|
|
||
|
assume(ee.listeners('foo').length).equals(1);
|
||
|
assume(ee.listeners('bar').length).equals(1);
|
||
|
|
||
|
ultron.remove();
|
||
|
|
||
|
assume(ee.listeners('foo').length).equals(0);
|
||
|
assume(ee.listeners('bar').length).equals(0);
|
||
|
});
|
||
|
|
||
|
it('removes multiple listeners based on args', function () {
|
||
|
function foo() {}
|
||
|
function bar() {}
|
||
|
function baz() {}
|
||
|
|
||
|
ultron.on('foo', foo);
|
||
|
ultron.on('bar', bar);
|
||
|
ultron.on('baz', baz);
|
||
|
|
||
|
assume(ee.listeners('foo').length).equals(1);
|
||
|
assume(ee.listeners('bar').length).equals(1);
|
||
|
assume(ee.listeners('baz').length).equals(1);
|
||
|
|
||
|
ultron.remove('foo', 'bar');
|
||
|
|
||
|
assume(ee.listeners('foo').length).equals(0);
|
||
|
assume(ee.listeners('bar').length).equals(0);
|
||
|
assume(ee.listeners('baz').length).equals(1);
|
||
|
});
|
||
|
|
||
|
it('removes multiple listeners if first arg is seperated string', function () {
|
||
|
function foo() {}
|
||
|
function bar() {}
|
||
|
function baz() {}
|
||
|
|
||
|
ultron.on('foo', foo);
|
||
|
ultron.on('bar', bar);
|
||
|
ultron.on('baz', baz);
|
||
|
|
||
|
assume(ee.listeners('foo').length).equals(1);
|
||
|
assume(ee.listeners('bar').length).equals(1);
|
||
|
assume(ee.listeners('baz').length).equals(1);
|
||
|
|
||
|
ultron.remove('foo, bar');
|
||
|
|
||
|
assume(ee.listeners('foo').length).equals(0);
|
||
|
assume(ee.listeners('bar').length).equals(0);
|
||
|
assume(ee.listeners('baz').length).equals(1);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('#destroy', function () {
|
||
|
it('removes all listeners', function () {
|
||
|
function foo() {}
|
||
|
function bar() {}
|
||
|
function baz() {}
|
||
|
|
||
|
ultron.on('foo', foo);
|
||
|
ultron.on('bar', bar);
|
||
|
ultron.on('baz', baz);
|
||
|
|
||
|
assume(ee.listeners('foo').length).equals(1);
|
||
|
assume(ee.listeners('bar').length).equals(1);
|
||
|
assume(ee.listeners('baz').length).equals(1);
|
||
|
|
||
|
ultron.destroy();
|
||
|
|
||
|
assume(ee.listeners('foo').length).equals(0);
|
||
|
assume(ee.listeners('bar').length).equals(0);
|
||
|
assume(ee.listeners('baz').length).equals(0);
|
||
|
});
|
||
|
|
||
|
it('removes the .ee reference', function () {
|
||
|
assume(ultron.ee).equals(ee);
|
||
|
ultron.destroy();
|
||
|
assume(ultron.ee).equals(null);
|
||
|
});
|
||
|
|
||
|
it('returns booleans for state indication', function () {
|
||
|
assume(ultron.destroy()).is.true();
|
||
|
assume(ultron.destroy()).is.false();
|
||
|
assume(ultron.destroy()).is.false();
|
||
|
assume(ultron.destroy()).is.false();
|
||
|
});
|
||
|
});
|
||
|
});
|