/* 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(); }); }); });