NanoEmitter.spec.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { describe, expect, it } from "vitest";
  2. import { NanoEmitter } from "./NanoEmitter.js";
  3. describe("NanoEmitter", () => {
  4. it("Functional", async () => {
  5. const evts = new NanoEmitter<{
  6. val: (v1: number, v2: number) => void;
  7. }>({
  8. publicEmit: true,
  9. });
  10. setTimeout(() => evts.emit("val", 5, 5), 1);
  11. const [v1, v2] = await evts.once("val");
  12. expect(v1 + v2).toBe(10);
  13. let v3 = 0, v4 = 0;
  14. const unsub = evts.on("val", (v1, v2) => {
  15. v3 = v1;
  16. v4 = v2;
  17. });
  18. evts.emit("val", 10, 10);
  19. expect(v3 + v4).toBe(20);
  20. unsub();
  21. evts.emit("val", 20, 20);
  22. expect(v3 + v4).toBe(20);
  23. evts.on("val", (v1, v2) => {
  24. v3 = v1;
  25. v4 = v2;
  26. });
  27. evts.emit("val", 30, 30);
  28. expect(v3 + v4).toBe(60);
  29. evts.unsubscribeAll();
  30. evts.emit("val", 40, 40);
  31. expect(v3 + v4).toBe(60);
  32. });
  33. it("Object oriented", async () => {
  34. class MyEmitter extends NanoEmitter<{
  35. val: (v1: number, v2: number) => void;
  36. }> {
  37. constructor() {
  38. super({ publicEmit: false });
  39. }
  40. run() {
  41. this.events.emit("val", 5, 5);
  42. }
  43. }
  44. const evts = new MyEmitter();
  45. setTimeout(() => evts.run(), 1);
  46. const [v1, v2] = await evts.once("val");
  47. expect(v1 + v2).toBe(10);
  48. expect(evts.emit("val", 0, 0)).toBe(false);
  49. });
  50. });