test.govlab/patterns/core/aggregators/representation.graph.aggregator.test.ts

test.govlab/patterns/core/aggregators/representation.graph.aggregator.test.ts is a file in Codebase Testing. 39 lines of code and 0 definitions.

import { describe, expect, it } from "vitest";
import { GraphAccumulator } from "@govlab/patterns/core/aggregators/representation.graph.aggregator.ts";
import { createRng } from "@govlab/patterns/core/factories/seed.factory.ts";

const RECORDS = 10_000;
const STATE_BOUND = 200;
const THREE = 3;
const SEED = 3;

const sizeOf = function sizeOf(value: unknown): number {
    if (value instanceof Map || value instanceof Set) {
        return value.size;
    }
    return Array.isArray(value) ? value.length : 0;
};

describe("GraphAccumulator", () => {
    it("summarizes members, pairs and repeats over list fields", () => {
        const accumulator = new GraphAccumulator("tags");
        accumulator.update([{ tags: ["a", "b"] }, { tags: ["a", "c"] }, { tags: ["a", "b"] }]);
        const summary = accumulator.result();
        expect(summary.distinctTargets).toBe(THREE);
        expect(summary.distinctSets).toBe(2);
        expect(summary.topMembers[0]).toStrictEqual(["a", THREE]);
        expect(summary.composition).toBeNull();
    });

    it("keeps retained state proportional to distinct structures, not records", () => {
        const accumulator = new GraphAccumulator("f");
        for (let i = 0; i < RECORDS; i += 1) {
            accumulator.update([{ f: ["a", "b", "c"] }]);
        }
        expect(accumulator.result().distinctSets).toBe(1);
        expect(Object.values(accumulator).reduce((total: number, value) => total + sizeOf(value), 0)).toBeLessThan(
            STATE_BOUND,
        );
    });

    it("samples members of a typical list size", () => {
        const accumulator = new GraphAccumulator("tags");
        accumulator.update([{ tags: ["a", "b"] }]);
        expect(accumulator.sample(createRng(SEED))).toHaveLength(2);
    });
});