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 | var common = require('./common');
|
---|
23 | var assert = require('assert');
|
---|
24 | var events = require('../');
|
---|
25 | var test = require('tape');
|
---|
26 |
|
---|
27 | function expect(expected) {
|
---|
28 | var actual = [];
|
---|
29 | test.onFinish(function() {
|
---|
30 | var sortedActual = actual.sort();
|
---|
31 | var sortedExpected = expected.sort();
|
---|
32 | assert.strictEqual(sortedActual.length, sortedExpected.length);
|
---|
33 | for (var index = 0; index < sortedActual.length; index++) {
|
---|
34 | var value = sortedActual[index];
|
---|
35 | assert.strictEqual(value, sortedExpected[index]);
|
---|
36 | }
|
---|
37 | });
|
---|
38 | function listener(name) {
|
---|
39 | actual.push(name);
|
---|
40 | }
|
---|
41 | return common.mustCall(listener, expected.length);
|
---|
42 | }
|
---|
43 |
|
---|
44 | {
|
---|
45 | var ee = new events.EventEmitter();
|
---|
46 | var noop = common.mustNotCall();
|
---|
47 | ee.on('foo', noop);
|
---|
48 | ee.on('bar', noop);
|
---|
49 | ee.on('baz', noop);
|
---|
50 | ee.on('baz', noop);
|
---|
51 | var fooListeners = ee.listeners('foo');
|
---|
52 | var barListeners = ee.listeners('bar');
|
---|
53 | var bazListeners = ee.listeners('baz');
|
---|
54 | ee.on('removeListener', expect(['bar', 'baz', 'baz']));
|
---|
55 | ee.removeAllListeners('bar');
|
---|
56 | ee.removeAllListeners('baz');
|
---|
57 |
|
---|
58 | var listeners = ee.listeners('foo');
|
---|
59 | assert.ok(Array.isArray(listeners));
|
---|
60 | assert.strictEqual(listeners.length, 1);
|
---|
61 | assert.strictEqual(listeners[0], noop);
|
---|
62 |
|
---|
63 | listeners = ee.listeners('bar');
|
---|
64 | assert.ok(Array.isArray(listeners));
|
---|
65 | assert.strictEqual(listeners.length, 0);
|
---|
66 | listeners = ee.listeners('baz');
|
---|
67 | assert.ok(Array.isArray(listeners));
|
---|
68 | assert.strictEqual(listeners.length, 0);
|
---|
69 | // After calling removeAllListeners(),
|
---|
70 | // the old listeners array should stay unchanged.
|
---|
71 | assert.strictEqual(fooListeners.length, 1);
|
---|
72 | assert.strictEqual(fooListeners[0], noop);
|
---|
73 | assert.strictEqual(barListeners.length, 1);
|
---|
74 | assert.strictEqual(barListeners[0], noop);
|
---|
75 | assert.strictEqual(bazListeners.length, 2);
|
---|
76 | assert.strictEqual(bazListeners[0], noop);
|
---|
77 | assert.strictEqual(bazListeners[1], noop);
|
---|
78 | // After calling removeAllListeners(),
|
---|
79 | // new listeners arrays is different from the old.
|
---|
80 | assert.notStrictEqual(ee.listeners('bar'), barListeners);
|
---|
81 | assert.notStrictEqual(ee.listeners('baz'), bazListeners);
|
---|
82 | }
|
---|
83 |
|
---|
84 | {
|
---|
85 | var ee = new events.EventEmitter();
|
---|
86 | ee.on('foo', common.mustNotCall());
|
---|
87 | ee.on('bar', common.mustNotCall());
|
---|
88 | // Expect LIFO order
|
---|
89 | ee.on('removeListener', expect(['foo', 'bar', 'removeListener']));
|
---|
90 | ee.on('removeListener', expect(['foo', 'bar']));
|
---|
91 | ee.removeAllListeners();
|
---|
92 |
|
---|
93 | var listeners = ee.listeners('foo');
|
---|
94 | assert.ok(Array.isArray(listeners));
|
---|
95 | assert.strictEqual(listeners.length, 0);
|
---|
96 | listeners = ee.listeners('bar');
|
---|
97 | assert.ok(Array.isArray(listeners));
|
---|
98 | assert.strictEqual(listeners.length, 0);
|
---|
99 | }
|
---|
100 |
|
---|
101 | {
|
---|
102 | var ee = new events.EventEmitter();
|
---|
103 | ee.on('removeListener', common.mustNotCall());
|
---|
104 | // Check for regression where removeAllListeners() throws when
|
---|
105 | // there exists a 'removeListener' listener, but there exists
|
---|
106 | // no listeners for the provided event type.
|
---|
107 | assert.doesNotThrow(function () { ee.removeAllListeners(ee, 'foo') });
|
---|
108 | }
|
---|
109 |
|
---|
110 | {
|
---|
111 | var ee = new events.EventEmitter();
|
---|
112 | var expectLength = 2;
|
---|
113 | ee.on('removeListener', function() {
|
---|
114 | assert.strictEqual(expectLength--, this.listeners('baz').length);
|
---|
115 | });
|
---|
116 | ee.on('baz', common.mustNotCall());
|
---|
117 | ee.on('baz', common.mustNotCall());
|
---|
118 | ee.on('baz', common.mustNotCall());
|
---|
119 | assert.strictEqual(ee.listeners('baz').length, expectLength + 1);
|
---|
120 | ee.removeAllListeners('baz');
|
---|
121 | assert.strictEqual(ee.listeners('baz').length, 0);
|
---|
122 | }
|
---|
123 |
|
---|
124 | {
|
---|
125 | var ee = new events.EventEmitter();
|
---|
126 | assert.strictEqual(ee, ee.removeAllListeners());
|
---|
127 | }
|
---|
128 |
|
---|
129 | {
|
---|
130 | var ee = new events.EventEmitter();
|
---|
131 | ee._events = undefined;
|
---|
132 | assert.strictEqual(ee, ee.removeAllListeners());
|
---|
133 | }
|
---|