Debouncer.spec.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { describe, expect, it } from "vitest";
  2. import { Debouncer } from "./Debouncer.js";
  3. import { pauseFor } from "./misc.js";
  4. describe("Debouncer", () => {
  5. //#region deltaT
  6. it("deltaT test with type \"immediate\"", async () => {
  7. const deb = new Debouncer(200, "immediate");
  8. deb.addListener(debCalled);
  9. const deltaTs: number[] = [];
  10. let lastCall: number | undefined;
  11. function debCalled() {
  12. const n = Date.now(),
  13. deltaT = lastCall ? n - lastCall : undefined;
  14. typeof deltaT === "number" && deltaT > 0 && deltaTs.push(deltaT);
  15. lastCall = n;
  16. }
  17. for(let i = 0; i < 2; i++) {
  18. for(let j = 0; j < 6; j++) {
  19. deb.call(i, j);
  20. await pauseFor(50);
  21. }
  22. await pauseFor(300);
  23. }
  24. const avg = deltaTs
  25. .reduce((a, b) => a + b, 0) / deltaTs.length;
  26. expect(avg + 10).toBeLessThanOrEqual(deb.getTimeout() + 50);
  27. });
  28. //#region idle
  29. it("deltaT test with type \"idle\"", async () => {
  30. const deb = new Debouncer(200, "idle");
  31. deb.addListener(debCalled);
  32. const deltaTs: number[] = [];
  33. let callCount = 0;
  34. let lastCall: number | undefined;
  35. function debCalled() {
  36. callCount++;
  37. const n = Date.now(),
  38. deltaT = lastCall ? n - lastCall : undefined;
  39. typeof deltaT === "number" && deltaT > 0 && deltaTs.push(deltaT);
  40. lastCall = n;
  41. }
  42. const jAmt = 6,
  43. iTime = 400,
  44. jTime = 30;
  45. for(let i = 0; i < 2; i++) {
  46. for(let j = 0; j < jAmt; j++) {
  47. deb.call(i, j);
  48. await pauseFor(jTime);
  49. }
  50. await pauseFor(iTime);
  51. }
  52. expect(callCount).toBeLessThanOrEqual(5); // expected 2~3 calls
  53. /** Minimum possible deltaT between calls */
  54. const minDeltaT = jAmt * jTime + iTime;
  55. const avg = deltaTs
  56. .reduce((a, b) => a + b, 0) / deltaTs.length;
  57. expect(avg + 10).toBeGreaterThanOrEqual(minDeltaT);
  58. });
  59. //#region all methods
  60. // TODO:FIXME:
  61. it.skip("All methods", async () => {
  62. const deb = new Debouncer<(v?: number) => void>(200);
  63. let callAmt = 0, evtCallAmt = 0;
  64. const debCalled = (): number => ++callAmt;
  65. const debCalledEvt = (): number => ++evtCallAmt;
  66. // hook debCalled first, then call, then hook debCalledEvt:
  67. deb.addListener(debCalled);
  68. deb.call();
  69. deb.on("call", debCalledEvt);
  70. expect(callAmt).toBe(1);
  71. expect(evtCallAmt).toBe(0);
  72. expect(deb.getTimeout()).toBe(200);
  73. deb.setTimeout(10);
  74. expect(deb.getTimeout()).toBe(10);
  75. expect(deb.getType()).toBe("immediate");
  76. deb.setType("idle");
  77. expect(deb.getType()).toBe("idle");
  78. deb.setType("immediate");
  79. const callPaused = (v?: number): Promise<void> => {
  80. deb.call(v);
  81. return pauseFor(50);
  82. };
  83. let onceAmt = 0;
  84. deb.once("call", () => ++onceAmt);
  85. await callPaused();
  86. await callPaused();
  87. await callPaused();
  88. expect(onceAmt).toBe(1);
  89. let args = 0;
  90. const setArgs = (v?: number) => args = v ?? args;
  91. deb.addListener(setArgs);
  92. await callPaused(1);
  93. expect(args).toBe(1);
  94. deb.removeListener(setArgs);
  95. await callPaused(2);
  96. expect(args).toBe(1);
  97. deb.removeAllListeners();
  98. await callPaused();
  99. expect(callAmt).toEqual(evtCallAmt + 1); // evtCallAmt is always behind by 1
  100. });
  101. });