-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathevent-emmiter.test.js
79 lines (66 loc) · 2.1 KB
/
event-emmiter.test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
const { doesNotMatch } = require("assert");
// const { EventEmitter } = require('events');
const { emit } = require("process");
class MyEventEmitter {
constructor() {
this.events = {};
}
on(eventName, listener) {
if (!(eventName in this.events)) this.events[eventName] = [];
this.events[eventName].push(listener);
}
emit(eventName, ...args) {
if (!(eventName in this.events)) return;
const listenersToBeNotified = this.events[eventName];
listenersToBeNotified.forEach((listener) => {
listener(...args);
});
}
removeListener(eventName, listener) {
if (!(eventName in this.events)) return;
this.events[eventName] = this.events[eventName].filter(
(l) => l !== listener
);
}
}
describe("Event emitter unit tests", () => {
let emitter;
beforeEach(() => {
emitter = new MyEventEmitter();
});
it("Emit event", () => {
const eventName = "testEvent";
const eventPayload = "testPayload";
emitter.on(eventName, (payload) => {
expect(payload).toEqual(eventPayload);
// done();
});
emitter.emit(eventName, eventPayload);
});
it("Emit multiple events", () => {
const expectedEvents = ["testEvent1", "testEvent2"];
const expectedPayloads = ["testPayload1", "testPayload2"];
expectedEvents.forEach((eventName, index) => {
emitter.on(eventName, (payload) => {
expect(payload).toEqual(expectedPayloads[index]);
});
});
expectedEvents.forEach((eventName, index) => {
emitter.emit(eventName, expectedPayloads[index]);
});
});
it("Should remove listener & removed should not be notified again", () => {
const listener1 = jest.fn();
const listener2 = jest.fn();
const eventName = "testEvent";
emitter.on(eventName, listener1);
emitter.on(eventName, listener2);
emitter.emit(eventName);
expect(listener1).toHaveBeenCalledTimes(1);
expect(listener2).toHaveBeenCalledTimes(1);
emitter.removeListener(eventName, listener1);
emitter.emit(eventName);
expect(listener1).toHaveBeenCalledTimes(1);
expect(listener2).toHaveBeenCalledTimes(2);
});
});