Files
cinny/src/app/utils/pttHoldWatchdog.test.ts
T

75 lines
1.5 KiB
TypeScript
Raw Normal View History

import { test } from 'node:test';
import assert from 'node:assert/strict';
import { createPttHoldWatchdog } from './pttHoldWatchdog';
const fake = () => {
let now = 0;
const timers = new Map<number, { at: number; fn: () => 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);
});