Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80522 views
1
/* istanbul ignore next */
2
describe('EventEmitter', function tests() {
3
'use strict';
4
5
var EventEmitter = require('./').EventEmitter
6
, assume = require('assume');
7
8
it('inherits when used with require(util).inherits', function () {
9
function Beast() {
10
/* rawr, i'm a beast */
11
}
12
13
require('util').inherits(Beast, EventEmitter);
14
15
var moop = new Beast()
16
, meap = new Beast();
17
18
assume(moop).is.instanceOf(Beast);
19
assume(moop).is.instanceof(EventEmitter);
20
21
moop.listeners();
22
meap.listeners();
23
24
moop.on('data', function () {
25
throw new Error('I should not emit');
26
});
27
28
meap.emit('data', 'rawr');
29
meap.removeListener('foo');
30
meap.removeAllListeners();
31
});
32
33
describe('EventEmitter#emit', function () {
34
it('should return false when there are not events to emit', function () {
35
var e = new EventEmitter();
36
37
assume(e.emit('foo')).equals(false);
38
assume(e.emit('bar')).equals(false);
39
});
40
41
it('emits with context', function (done) {
42
var e = new EventEmitter()
43
, context = 'bar';
44
45
e.on('foo', function (bar) {
46
assume(bar).equals('bar');
47
assume(this).equals(context);
48
49
done();
50
}, context).emit('foo', 'bar');
51
});
52
53
it('emits with context, multiple arguments (force apply)', function (done) {
54
var e = new EventEmitter()
55
, context = 'bar';
56
57
e.on('foo', function (bar) {
58
assume(bar).equals('bar');
59
assume(this).equals(context);
60
61
done();
62
}, context).emit('foo', 'bar', 1,2,3,4,5,6,7,8,9,0);
63
});
64
65
it('can emit the function with multiple arguments', function () {
66
var e = new EventEmitter();
67
68
for(var i = 0; i < 100; i++) {
69
(function (j) {
70
for (var i = 0, args = []; i < j; i++) {
71
args.push(j);
72
}
73
74
e.once('args', function () {
75
assume(arguments.length).equals(args.length);
76
});
77
78
e.emit.apply(e, ['args'].concat(args));
79
})(i);
80
}
81
});
82
83
it('can emit the function with multiple arguments, multiple listeners', function () {
84
var e = new EventEmitter();
85
86
for(var i = 0; i < 100; i++) {
87
(function (j) {
88
for (var i = 0, args = []; i < j; i++) {
89
args.push(j);
90
}
91
92
e.once('args', function () {
93
assume(arguments.length).equals(args.length);
94
});
95
96
e.once('args', function () {
97
assume(arguments.length).equals(args.length);
98
});
99
100
e.once('args', function () {
101
assume(arguments.length).equals(args.length);
102
});
103
104
e.once('args', function () {
105
assume(arguments.length).equals(args.length);
106
});
107
108
e.emit.apply(e, ['args'].concat(args));
109
})(i);
110
}
111
});
112
113
it('emits with context, multiple listeners (force loop)', function () {
114
var e = new EventEmitter();
115
116
e.on('foo', function (bar) {
117
assume(bar).equals('bar');
118
assume(this).equals('bar');
119
}, 'bar');
120
121
e.on('foo', function (bar) {
122
assume(bar).equals('bar');
123
assume(this).equals('foo');
124
}, 'foo');
125
126
e.emit('foo', 'bar');
127
});
128
129
it('emits with different contexts', function () {
130
var e = new EventEmitter()
131
, pattern = '';
132
133
function writer() {
134
pattern += this;
135
}
136
137
e.on('write', writer, 'foo');
138
e.on('write', writer, 'baz');
139
e.once('write', writer, 'bar');
140
e.once('write', writer, 'banana');
141
142
e.emit('write');
143
assume(pattern).equals('foobazbarbanana');
144
});
145
146
it('should return true when there are events to emit', function (done) {
147
var e = new EventEmitter();
148
149
e.on('foo', function () {
150
process.nextTick(done);
151
});
152
153
assume(e.emit('foo')).equals(true);
154
assume(e.emit('foob')).equals(false);
155
});
156
157
it('receives the emitted events', function (done) {
158
var e = new EventEmitter();
159
160
e.on('data', function (a, b, c, d, undef) {
161
assume(a).equals('foo');
162
assume(b).equals(e);
163
assume(c).is.instanceOf(Date);
164
assume(undef).equals(undefined);
165
assume(arguments.length).equals(3);
166
167
done();
168
});
169
170
e.emit('data', 'foo', e, new Date());
171
});
172
173
it('emits to all event listeners', function () {
174
var e = new EventEmitter()
175
, pattern = [];
176
177
e.on('foo', function () {
178
pattern.push('foo1');
179
});
180
181
e.on('foo', function () {
182
pattern.push('foo2');
183
});
184
185
e.emit('foo');
186
187
assume(pattern.join(';')).equals('foo1;foo2');
188
});
189
});
190
191
describe('EventEmitter#listeners', function () {
192
it('returns an empty array if no listeners are specified', function () {
193
var e = new EventEmitter();
194
195
assume(e.listeners('foo')).is.a('array');
196
assume(e.listeners('foo').length).equals(0);
197
});
198
199
it('returns an array of function', function () {
200
var e = new EventEmitter();
201
202
function foo() {}
203
204
e.on('foo', foo);
205
assume(e.listeners('foo')).is.a('array');
206
assume(e.listeners('foo').length).equals(1);
207
assume(e.listeners('foo')).deep.equals([foo]);
208
});
209
210
it('is not vulnerable to modifications', function () {
211
var e = new EventEmitter();
212
213
function foo() {}
214
215
e.on('foo', foo);
216
217
assume(e.listeners('foo')).deep.equals([foo]);
218
219
e.listeners('foo').length = 0;
220
assume(e.listeners('foo')).deep.equals([foo]);
221
});
222
});
223
224
describe('EventEmitter#once', function () {
225
it('only emits it once', function () {
226
var e = new EventEmitter()
227
, calls = 0;
228
229
e.once('foo', function () {
230
calls++;
231
});
232
233
e.emit('foo');
234
e.emit('foo');
235
e.emit('foo');
236
e.emit('foo');
237
e.emit('foo');
238
239
assume(e.listeners('foo').length).equals(0);
240
assume(calls).equals(1);
241
});
242
243
it('only emits once if emits are nested inside the listener', function () {
244
var e = new EventEmitter()
245
, calls = 0;
246
247
e.once('foo', function () {
248
calls++;
249
e.emit('foo');
250
});
251
252
e.emit('foo');
253
assume(e.listeners('foo').length).equals(0);
254
assume(calls).equals(1);
255
});
256
257
it('only emits once for multiple events', function () {
258
var e = new EventEmitter()
259
, multi = 0
260
, foo = 0
261
, bar = 0;
262
263
e.once('foo', function () {
264
foo++;
265
});
266
267
e.once('foo', function () {
268
bar++;
269
});
270
271
e.on('foo', function () {
272
multi++;
273
});
274
275
e.emit('foo');
276
e.emit('foo');
277
e.emit('foo');
278
e.emit('foo');
279
e.emit('foo');
280
281
assume(e.listeners('foo').length).equals(1);
282
assume(multi).equals(5);
283
assume(foo).equals(1);
284
assume(bar).equals(1);
285
});
286
287
it('only emits once with context', function (done) {
288
var e = new EventEmitter()
289
, context = 'foo';
290
291
e.once('foo', function (bar) {
292
assume(this).equals(context);
293
assume(bar).equals('bar');
294
295
done();
296
}, context).emit('foo', 'bar');
297
});
298
});
299
300
describe('EventEmitter#removeListener', function () {
301
it('should only remove the event with the specified function', function () {
302
var e = new EventEmitter();
303
304
function bar() {}
305
e.on('foo', function () {});
306
e.on('bar', function () {});
307
e.on('bar', bar);
308
309
assume(e.removeListener('foo', bar)).equals(e);
310
assume(e.listeners('foo').length).equals(1);
311
assume(e.listeners('bar').length).equals(2);
312
313
assume(e.removeListener('foo')).equals(e);
314
assume(e.listeners('foo').length).equals(0);
315
assume(e.listeners('bar').length).equals(2);
316
317
assume(e.removeListener('bar', bar)).equals(e);
318
assume(e.listeners('bar').length).equals(1);
319
assume(e.removeListener('bar')).equals(e);
320
assume(e.listeners('bar').length).equals(0);
321
});
322
323
it('should only remove once events when using the once flag', function () {
324
var e = new EventEmitter();
325
326
function foo() {}
327
e.on('foo', foo);
328
329
assume(e.removeListener('foo', function () {}, true)).equals(e);
330
assume(e.listeners('foo').length).equals(1);
331
assume(e.removeListener('foo', foo, true)).equals(e);
332
assume(e.listeners('foo').length).equals(1);
333
assume(e.removeListener('foo', foo)).equals(e);
334
assume(e.listeners('foo').length).equals(0);
335
336
e.on('foo', foo);
337
e.once('foo', foo);
338
339
assume(e.removeListener('foo', function () {}, true)).equals(e);
340
assume(e.listeners('foo').length).equals(2);
341
assume(e.removeListener('foo', foo, true)).equals(e);
342
assume(e.listeners('foo').length).equals(1);
343
344
e.once('foo', foo);
345
346
assume(e.removeListener('foo', foo)).equals(e);
347
assume(e.listeners('foo').length).equals(0);
348
});
349
});
350
351
describe('EventEmitter#removeAllListeners', function () {
352
it('removes all events for the specified events', function () {
353
var e = new EventEmitter();
354
355
e.on('foo', function () { throw new Error('oops'); });
356
e.on('foo', function () { throw new Error('oops'); });
357
e.on('bar', function () { throw new Error('oops'); });
358
e.on('aaa', function () { throw new Error('oops'); });
359
360
assume(e.removeAllListeners('foo')).equals(e);
361
assume(e.listeners('foo').length).equals(0);
362
assume(e.listeners('bar').length).equals(1);
363
assume(e.listeners('aaa').length).equals(1);
364
365
assume(e.removeAllListeners('bar')).equals(e);
366
assume(e.removeAllListeners('aaa')).equals(e);
367
368
assume(e.emit('foo')).equals(false);
369
assume(e.emit('bar')).equals(false);
370
assume(e.emit('aaa')).equals(false);
371
});
372
373
it('just nukes the fuck out of everything', function () {
374
var e = new EventEmitter();
375
376
e.on('foo', function () { throw new Error('oops'); });
377
e.on('foo', function () { throw new Error('oops'); });
378
e.on('bar', function () { throw new Error('oops'); });
379
e.on('aaa', function () { throw new Error('oops'); });
380
381
assume(e.removeAllListeners()).equals(e);
382
assume(e.listeners('foo').length).equals(0);
383
assume(e.listeners('bar').length).equals(0);
384
assume(e.listeners('aaa').length).equals(0);
385
386
assume(e.emit('foo')).equals(false);
387
assume(e.emit('bar')).equals(false);
388
assume(e.emit('aaa')).equals(false);
389
});
390
});
391
392
describe('#setMaxListeners', function () {
393
it('is a function', function () {
394
var e = new EventEmitter();
395
396
assume(e.setMaxListeners).is.a('function');
397
});
398
399
it('returns self when called', function () {
400
var e = new EventEmitter();
401
402
assume(e.setMaxListeners()).to.equal(e);
403
});
404
});
405
});
406
407