import { test } from 'node:test'; import assert from 'node:assert/strict'; import { createPttHoldWatchdog } from './pttHoldWatchdog'; const fake = () => { let now = 0; const timers = new Map void }>(); let seq = 0; return { timers: { setTimeout: (fn: () => void, ms: number) => { seq += 1; timers.set(seq, { at: now + ms, fn }); return seq; }, clearTimeout: (h: unknown) => { timers.delete(h as number); }, }, advance(ms: number) { now += ms; [...timers.entries()] .filter(([, t]) => t.at <= now) .forEach(([id, t]) => { timers.delete(id); t.fn(); }); }, }; }; test('a hold past the limit expires once; a release before it never does', () => { const clock = fake(); let expired = 0; const w = createPttHoldWatchdog( () => { expired += 1; }, 1000, clock.timers, ); w.arm(); clock.advance(999); assert.equal(expired, 0); clock.advance(1); assert.equal(expired, 1); assert.equal(w.armed(), false); w.arm(); clock.advance(500); w.disarm(); clock.advance(2000); assert.equal(expired, 1); }); test('re-pressing restarts the clock', () => { const clock = fake(); let expired = 0; const w = createPttHoldWatchdog( () => { expired += 1; }, 1000, clock.timers, ); w.arm(); clock.advance(800); w.disarm(); w.arm(); clock.advance(800); assert.equal(expired, 0); clock.advance(200); assert.equal(expired, 1); });