• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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