[6a3a178] | 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 | }
|
---|