f793b1df24381b2a6ae4de566535e8b2d4eff4ac65d795610720a736219b20d48cb50acd15ffea4746e9e1d4dd73e016efdea08ab5fd8c767140c7c581e434 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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 EventEmitter = require('../');
  24. var listener1 = function listener1() {};
  25. var listener2 = function listener2() {};
  26. {
  27. var ee = new EventEmitter();
  28. ee.on('hello', listener1);
  29. ee.on('removeListener', common.mustCall(function(name, cb) {
  30. assert.strictEqual(name, 'hello');
  31. assert.strictEqual(cb, listener1);
  32. }));
  33. ee.removeListener('hello', listener1);
  34. var listeners = ee.listeners('hello');
  35. assert.ok(Array.isArray(listeners));
  36. assert.strictEqual(listeners.length, 0);
  37. }
  38. {
  39. var ee = new EventEmitter();
  40. ee.on('hello', listener1);
  41. ee.on('removeListener', common.mustNotCall());
  42. ee.removeListener('hello', listener2);
  43. var listeners = ee.listeners('hello');
  44. assert.ok(Array.isArray(listeners));
  45. assert.strictEqual(listeners.length, 1);
  46. assert.strictEqual(listeners[0], listener1);
  47. }
  48. {
  49. var ee = new EventEmitter();
  50. ee.on('hello', listener1);
  51. ee.on('hello', listener2);
  52. var listeners;
  53. ee.once('removeListener', common.mustCall(function(name, cb) {
  54. assert.strictEqual(name, 'hello');
  55. assert.strictEqual(cb, listener1);
  56. listeners = ee.listeners('hello');
  57. assert.ok(Array.isArray(listeners));
  58. assert.strictEqual(listeners.length, 1);
  59. assert.strictEqual(listeners[0], listener2);
  60. }));
  61. ee.removeListener('hello', listener1);
  62. listeners = ee.listeners('hello');
  63. assert.ok(Array.isArray(listeners));
  64. assert.strictEqual(listeners.length, 1);
  65. assert.strictEqual(listeners[0], listener2);
  66. ee.once('removeListener', common.mustCall(function(name, cb) {
  67. assert.strictEqual(name, 'hello');
  68. assert.strictEqual(cb, listener2);
  69. listeners = ee.listeners('hello');
  70. assert.ok(Array.isArray(listeners));
  71. assert.strictEqual(listeners.length, 0);
  72. }));
  73. ee.removeListener('hello', listener2);
  74. listeners = ee.listeners('hello');
  75. assert.ok(Array.isArray(listeners));
  76. assert.strictEqual(listeners.length, 0);
  77. }
  78. {
  79. var ee = new EventEmitter();
  80. function remove1() {
  81. assert.fail('remove1 should not have been called');
  82. }
  83. function remove2() {
  84. assert.fail('remove2 should not have been called');
  85. }
  86. ee.on('removeListener', common.mustCall(function(name, cb) {
  87. if (cb !== remove1) return;
  88. this.removeListener('quux', remove2);
  89. this.emit('quux');
  90. }, 2));
  91. ee.on('quux', remove1);
  92. ee.on('quux', remove2);
  93. ee.removeListener('quux', remove1);
  94. }
  95. {
  96. var ee = new EventEmitter();
  97. ee.on('hello', listener1);
  98. ee.on('hello', listener2);
  99. var listeners;
  100. ee.once('removeListener', common.mustCall(function(name, cb) {
  101. assert.strictEqual(name, 'hello');
  102. assert.strictEqual(cb, listener1);
  103. listeners = ee.listeners('hello');
  104. assert.ok(Array.isArray(listeners));
  105. assert.strictEqual(listeners.length, 1);
  106. assert.strictEqual(listeners[0], listener2);
  107. ee.once('removeListener', common.mustCall(function(name, cb) {
  108. assert.strictEqual(name, 'hello');
  109. assert.strictEqual(cb, listener2);
  110. listeners = ee.listeners('hello');
  111. assert.ok(Array.isArray(listeners));
  112. assert.strictEqual(listeners.length, 0);
  113. }));
  114. ee.removeListener('hello', listener2);
  115. listeners = ee.listeners('hello');
  116. assert.ok(Array.isArray(listeners));
  117. assert.strictEqual(listeners.length, 0);
  118. }));
  119. ee.removeListener('hello', listener1);
  120. listeners = ee.listeners('hello');
  121. assert.ok(Array.isArray(listeners));
  122. assert.strictEqual(listeners.length, 0);
  123. }
  124. {
  125. var ee = new EventEmitter();
  126. var listener3 = common.mustCall(function() {
  127. ee.removeListener('hello', listener4);
  128. }, 2);
  129. var listener4 = common.mustCall();
  130. ee.on('hello', listener3);
  131. ee.on('hello', listener4);
  132. // listener4 will still be called although it is removed by listener 3.
  133. ee.emit('hello');
  134. // This is so because the interal listener array at time of emit
  135. // was [listener3,listener4]
  136. // Interal listener array [listener3]
  137. ee.emit('hello');
  138. }
  139. {
  140. var ee = new EventEmitter();
  141. ee.once('hello', listener1);
  142. ee.on('removeListener', common.mustCall(function(eventName, listener) {
  143. assert.strictEqual(eventName, 'hello');
  144. assert.strictEqual(listener, listener1);
  145. }));
  146. ee.emit('hello');
  147. }
  148. {
  149. var ee = new EventEmitter();
  150. assert.strictEqual(ee, ee.removeListener('foo', function() {}));
  151. }
  152. // Verify that the removed listener must be a function
  153. assert.throws(function() {
  154. var ee = new EventEmitter();
  155. ee.removeListener('foo', null);
  156. }, /^TypeError: The "listener" argument must be of type Function\. Received type object$/);
  157. {
  158. var ee = new EventEmitter();
  159. var listener = function() {};
  160. ee._events = undefined;
  161. var e = ee.removeListener('foo', listener);
  162. assert.strictEqual(e, ee);
  163. }
  164. {
  165. var ee = new EventEmitter();
  166. ee.on('foo', listener1);
  167. ee.on('foo', listener2);
  168. var listeners = ee.listeners('foo');
  169. assert.ok(Array.isArray(listeners));
  170. assert.strictEqual(listeners.length, 2);
  171. assert.strictEqual(listeners[0], listener1);
  172. assert.strictEqual(listeners[1], listener2);
  173. ee.removeListener('foo', listener1);
  174. assert.strictEqual(ee._events.foo, listener2);
  175. ee.on('foo', listener1);
  176. listeners = ee.listeners('foo');
  177. assert.ok(Array.isArray(listeners));
  178. assert.strictEqual(listeners.length, 2);
  179. assert.strictEqual(listeners[0], listener2);
  180. assert.strictEqual(listeners[1], listener1);
  181. ee.removeListener('foo', listener1);
  182. assert.strictEqual(ee._events.foo, listener2);
  183. }