aboutsummaryrefslogtreecommitdiff
path: root/test/cdp/record-store-test.ts
blob: c259f8733bd79ccb16f8eadf469bb8cc5b2cdf23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import { test, describe } from "node:test";
import assert from "node:assert/strict";
import { createRecordStore } from "../../src/cdp/record-store";

const fill = (store: ReturnType<typeof createRecordStore<number, string>>, n: number): void => {
  for (let i = 1; i <= n; i++) store.set(i, `r${i}`);
};

describe("record store capacity", () => {
  test("holds up to capacity without reporting a loss", () => {
    const store = createRecordStore<number, string>(3);
    fill(store, 3);
    assert.equal([...store.values()].length, 3);
    assert.equal(store.page([...store.values()], undefined).bufferOverflowed, false);
  });

  test("evicts the oldest past capacity and reports the loss", () => {
    const store = createRecordStore<number, string>(3);
    fill(store, 5);
    assert.deepEqual([...store.values()], ["r3", "r4", "r5"]);
    assert.equal(store.page([...store.values()], undefined).bufferOverflowed, true);
  });

  test("the overflow flag is taken, so a second drain reports no new loss", () => {
    const store = createRecordStore<number, string>(2);
    fill(store, 4);
    assert.equal(store.page([], undefined).bufferOverflowed, true);
    assert.equal(store.page([], undefined).bufferOverflowed, false);
  });

  test("clear resets both the records and the overflow flag", () => {
    const store = createRecordStore<number, string>(2);
    fill(store, 4);
    store.clear();
    assert.equal([...store.values()].length, 0);
    assert.equal(store.page([], undefined).bufferOverflowed, false);
  });

  test("get returns the stored object by reference so callers can mutate in place", () => {
    const store = createRecordStore<string, { status?: number }>(4);
    store.set("a", {});
    const held = store.get("a");
    assert.ok(held);
    held.status = 200;
    assert.equal(store.get("a")?.status, 200);
  });

  test("delete removes a record without flagging an overflow", () => {
    const store = createRecordStore<number, string>(4);
    fill(store, 2);
    store.delete(1);
    assert.deepEqual([...store.values()], ["r2"]);
    assert.equal(store.page([], undefined).bufferOverflowed, false);
  });

  test("re-setting an existing key does not grow the store", () => {
    const store = createRecordStore<number, string>(4);
    store.set(1, "first");
    store.set(1, "second");
    assert.deepEqual([...store.values()], ["second"]);
  });
});

describe("record store paging", () => {
  test("total counts every match while records carry only the page", () => {
    const store = createRecordStore<number, string>(100);
    const matched = Array.from({ length: 120 }, (_, i) => `r${i}`);
    const page = store.page(matched, 10);
    assert.equal(page.total, 120);
    assert.equal(page.records.length, 10);
  });

  test("the page is the newest records, not the oldest", () => {
    const store = createRecordStore<number, string>(10);
    const page = store.page(["a", "b", "c"], 2);
    assert.deepEqual(page.records, ["b", "c"]);
  });

  test("an absent limit defaults to 50", () => {
    const store = createRecordStore<number, string>(600);
    const matched = Array.from({ length: 80 }, (_, i) => `r${i}`);
    assert.equal(store.page(matched, undefined).records.length, 50);
  });

  test("a limit above the 500 ceiling is capped", () => {
    const store = createRecordStore<number, string>(1000);
    const matched = Array.from({ length: 700 }, (_, i) => `r${i}`);
    assert.equal(store.page(matched, 9_000).records.length, 500);
  });

  test("a limit larger than the match count returns every match", () => {
    const store = createRecordStore<number, string>(10);
    assert.equal(store.page(["a", "b"], 50).records.length, 2);
  });
});