Files
2026-07-13 13:39:12 +08:00

40 lines
1.6 KiB
TypeScript

import { describe, it } from "node:test";
import assert from "node:assert/strict";
import { loadCorpus, hashCorpus } from "../../../open-sse/services/compression/eval/corpus.ts";
import type { EvalCase } from "../../../open-sse/services/compression/eval/types.ts";
const cases: EvalCase[] = [
{ id: "a", kind: "prose", context: "hello world", question: "what is it?" },
{ id: "b", kind: "code", context: "function f(){return 1}", question: "what does f return?", gold: "1" },
];
describe("eval corpus loader", () => {
it("loads valid cases unchanged", () => {
const loaded = loadCorpus(cases);
assert.equal(loaded.length, 2);
assert.equal(loaded[1].gold, "1");
});
it("rejects a case missing required fields", () => {
assert.throws(() => loadCorpus([{ id: "x", kind: "prose", context: "", question: "q" } as EvalCase]));
});
it("rejects a captured case with an obvious PII marker (email)", () => {
assert.throws(() =>
loadCorpus([{ id: "p", kind: "logs", context: "user alice@example.com failed", question: "who?", captured: true }])
);
});
it("allows a curated seed case even if it contains an email-like token (curated is vetted)", () => {
const loaded = loadCorpus([{ id: "s", kind: "logs", context: "noreply@x.test sent", question: "who?", captured: false }]);
assert.equal(loaded.length, 1);
});
it("hashCorpus is stable and order-independent over case ids", () => {
const h1 = hashCorpus(cases);
const h2 = hashCorpus([cases[1], cases[0]]);
assert.equal(h1, h2);
assert.match(h1, /^[0-9a-f]{64}$/);
});
});