1// Copyright Joyent, Inc. and other Node contributors. 2// 3// Permission is hereby granted, free of charge, to any person obtaining a 4// copy of this software and associated documentation files (the 5// "Software"), to deal in the Software without restriction, including 6// without limitation the rights to use, copy, modify, merge, publish, 7// distribute, sublicense, and/or sell copies of the Software, and to permit 8// persons to whom the Software is furnished to do so, subject to the 9// following conditions: 10// 11// The above copyright notice and this permission notice shall be included 12// in all copies or substantial portions of the Software. 13// 14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 17// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 18// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 19// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 20// USE OR OTHER DEALINGS IN THE SOFTWARE. 21 22'use strict'; 23const common = require('../common'); 24const assert = require('assert'); 25const EventEmitter = require('events'); 26 27{ 28 const ee = new EventEmitter(); 29 const events_new_listener_emitted = []; 30 const listeners_new_listener_emitted = []; 31 32 // Sanity check 33 assert.strictEqual(ee.addListener, ee.on); 34 35 ee.on('newListener', function(event, listener) { 36 // Don't track newListener listeners. 37 if (event === 'newListener') 38 return; 39 40 events_new_listener_emitted.push(event); 41 listeners_new_listener_emitted.push(listener); 42 }); 43 44 const hello = common.mustCall(function(a, b) { 45 assert.strictEqual(a, 'a'); 46 assert.strictEqual(b, 'b'); 47 }); 48 49 ee.once('newListener', function(name, listener) { 50 assert.strictEqual(name, 'hello'); 51 assert.strictEqual(listener, hello); 52 assert.deepStrictEqual(this.listeners('hello'), []); 53 }); 54 55 ee.on('hello', hello); 56 ee.once('foo', assert.fail); 57 assert.deepStrictEqual(['hello', 'foo'], events_new_listener_emitted); 58 assert.deepStrictEqual([hello, assert.fail], listeners_new_listener_emitted); 59 60 ee.emit('hello', 'a', 'b'); 61} 62 63// Just make sure that this doesn't throw: 64{ 65 const f = new EventEmitter(); 66 67 f.setMaxListeners(0); 68} 69 70{ 71 const listen1 = () => {}; 72 const listen2 = () => {}; 73 const ee = new EventEmitter(); 74 75 ee.once('newListener', function() { 76 assert.deepStrictEqual(ee.listeners('hello'), []); 77 ee.once('newListener', function() { 78 assert.deepStrictEqual(ee.listeners('hello'), []); 79 }); 80 ee.on('hello', listen2); 81 }); 82 ee.on('hello', listen1); 83 // The order of listeners on an event is not always the order in which the 84 // listeners were added. 85 assert.deepStrictEqual(ee.listeners('hello'), [listen2, listen1]); 86} 87