| 1 | import assert from "node:assert/strict"; |
| 2 | import { test } from "node:test"; |
| 3 | |
| 4 | import { MARK_TTL_MS, type Marks, takeMark } from "./one-tab.ts"; |
| 5 | |
| 6 | function memory(): Marks & { data: Map<string, string> } { |
| 7 | const data = new Map<string, string>(); |
| 8 | return { data, get: (k) => data.get(k) ?? null, set: (k, v) => void data.set(k, v), keys: () => [...data.keys()], remove: (k) => void data.delete(k) }; |
| 9 | } |
| 10 | |
| 11 | test("the first tab to claim an arrival pings, and every other tab stays quiet", () => { |
| 12 | const shared = memory(); |
| 13 | assert.equal(takeMark(shared, "msg:1", 1_000), true); |
| 14 | assert.equal(takeMark(shared, "msg:1", 1_200), false); |
| 15 | assert.equal(takeMark(shared, "msg:2", 1_300), true); |
| 16 | }); |
| 17 | |
| 18 | test("old marks are cleared as tabs claim, and other keys are left alone", () => { |
| 19 | const shared = memory(); |
| 20 | shared.set("g1t:pinged:msg:old", "0"); |
| 21 | shared.set("g1t:pinged:msg:bad", "nope"); |
| 22 | shared.set("g1t_theme", "dark"); |
| 23 | takeMark(shared, "msg:new", MARK_TTL_MS + 1); |
| 24 | assert.deepEqual([...shared.data.keys()].sort(), ["g1t:pinged:msg:new", "g1t_theme"]); |
| 25 | }); |