'use strict'; require('../common'); var assert = require('assert'); var events = require('events'); var e = new events.EventEmitter(); var events_new_listener_emited = []; var listeners_new_listener_emited = []; var times_hello_emited = 0; // sanity check assert.equal(e.addListener, e.on); e.on('newListener', function(event, listener) { if (event === 'newListener') return; // Don't track our adding of newListener listeners. console.log('newListener: ' + event); events_new_listener_emited.push(event); listeners_new_listener_emited.push(listener); }); function hello(a, b) { console.log('hello'); times_hello_emited += 1; assert.equal('a', a); assert.equal('b', b); } e.once('newListener', function(name, listener) { assert.equal(name, 'hello'); assert.equal(listener, hello); assert.deepEqual(this.listeners('hello'), []); }); e.on('hello', hello); var foo = function() {}; e.once('foo', foo); console.log('start'); e.emit('hello', 'a', 'b'); // just make sure that this doesn't throw: var f = new events.EventEmitter(); f.setMaxListeners(0); process.on('exit', function() { assert.deepEqual(['hello', 'foo'], events_new_listener_emited); assert.deepEqual([hello, foo], listeners_new_listener_emited); assert.equal(1, times_hello_emited); }); var listen1 = function listen1() {}; var listen2 = function listen2() {}; var e1 = new events.EventEmitter(); e1.once('newListener', function() { assert.deepEqual(e1.listeners('hello'), []); e1.once('newListener', function() { assert.deepEqual(e1.listeners('hello'), []); }); e1.on('hello', listen2); }); e1.on('hello', listen1); // The order of listeners on an event is not always the order in which the // listeners were added. assert.deepEqual(e1.listeners('hello'), [listen2, listen1]);