8d4c22d5d0ed374be58690a96ff77069b620dea6ec33fb88b45fa33e11c39ee085d245859f0615a2e446ef0dd9691fc2c6a979eab4f9bc2d467723e4d95227 4.6 KB

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