Guest User

Untitled

a guest
Nov 2nd, 2023
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { describe, expect, test } from "@jest/globals";
  2. // import { EventEmitter } from "write_your_lib.ts";
  3.  
  4.  
  5. class EventEmitter {
  6.   private callbacks: Record<string, Function[]> = {};
  7.  
  8.   promise(eventName: string): Promise<any> {
  9.     return new Promise((resolve) => {
  10.       this.once(eventName, resolve);
  11.     });;
  12.   }
  13.  
  14.   once(eventName: string, callback: Function) {
  15.     const cb = function (this: EventEmitter) {
  16.       this.removeEventListener(eventName, cb);
  17.       callback.apply(this, arguments);
  18.     };
  19.     this.addEventListener(eventName, cb);
  20.   }
  21.  
  22.   addEventListener(eventName: string, callback: Function) {
  23.     let cbs = this.callbacks[eventName];
  24.     if (!cbs) {
  25.       cbs = this.callbacks[eventName] = [];
  26.     }
  27.     if (!cbs.includes(callback)) {
  28.       cbs.push(callback);
  29.     }
  30.   }
  31.  
  32.   trigger(eventName: string, payload?: any) {
  33.     const cbs = this.callbacks[eventName];
  34.     if (!cbs) {
  35.       return;
  36.     }
  37.     cbs.forEach(cb => {
  38.       cb.call(this, payload);
  39.     })
  40.   }
  41.  
  42.   removeEventListener(eventName: string, callback: Function) {
  43.     const cbs = this.callbacks[eventName];
  44.     if (!cbs) {
  45.       return;
  46.     }
  47.     const index = cbs.indexOf(callback);
  48.     if (index != -1) {
  49.       cbs.splice(index, 1);
  50.     }
  51.   }
  52. }
  53.  
  54. describe("Event emitter", () => {
  55.   const emitter = new EventEmitter();
  56.   const callback = jest.fn();
  57.  
  58.   test("adds a listener", () => {
  59.     emitter.addEventListener("click", callback);
  60.     expect(callback.mock.calls.length).toBe(0);
  61.   });
  62.  
  63.   test("emits an event", () => {
  64.     let sentEvent = {
  65.       x: 123,
  66.       y: 42
  67.     };
  68.  
  69.     emitter.trigger("click", sentEvent);
  70.  
  71.     expect(callback.mock.calls.length).toBe(1);
  72.  
  73.     expect(callback.mock.calls[0][0]).toBe(sentEvent);
  74.  
  75.     emitter.trigger("mousemove");
  76.     expect(callback.mock.calls.length).toBe(1);
  77.  
  78.   });
  79.  
  80.   test("removes the listener", () => {
  81.     emitter.trigger("click");
  82.     expect(callback.mock.calls.length).toBe(2);
  83.  
  84.     emitter.removeEventListener("click", callback);
  85.     emitter.trigger("click");
  86.     expect(callback.mock.calls.length).toBe(2);
  87.   });
  88.  
  89.   test("handles handlers", () => {
  90.     let cb = jest.fn();
  91.     emitter.addEventListener("handler", cb);
  92.     emitter.addEventListener("handler", cb);
  93.  
  94.     emitter.trigger("handler");
  95.     expect(cb.mock.calls.length).toBe(1);
  96.  
  97.     emitter.removeEventListener("handler", cb);//no need to remove the handler twice
  98.  
  99.     emitter.trigger("handler");
  100.     expect(cb.mock.calls.length).toBe(1);
  101.   });
  102.  
  103.   test("supports once", () => {
  104.     let cb = jest.fn();
  105.     emitter.once("onlyOnce", cb);
  106.  
  107.     emitter.trigger("onlyOnce");
  108.     emitter.trigger("onlyOnce");
  109.  
  110.     expect(cb.mock.calls.length).toBe(1);
  111.   });
  112.  
  113.   test("promises", async () => {
  114.     let cb = jest.fn();
  115.     let p = emitter.promise("promise").then(cb);
  116.     emitter.trigger("promise", "call");
  117.  
  118.     await p;
  119.     expect(cb.mock.calls.length).toBe(1);
  120.     expect(cb.mock.calls[0][0]).toBe("call");
  121.   });
  122.  
  123.   test("removes only the needed handler", async () => {
  124.     let cb1 = jest.fn();
  125.     let cb2 = jest.fn();
  126.     emitter.addEventListener("click", cb1);
  127.     emitter.addEventListener("click", cb2);
  128.  
  129.     emitter.trigger("click");
  130.     expect(cb1.mock.calls.length).toBe(1);
  131.     expect(cb2.mock.calls.length).toBe(1);
  132.  
  133.     emitter.removeEventListener("click", cb2);
  134.  
  135.     emitter.trigger("click");
  136.     expect(cb1.mock.calls.length).toBe(2);
  137.     expect(cb2.mock.calls.length).toBe(1);
  138.   });
  139. });
  140.  
  141.  
Add Comment
Please, Sign In to add comment