Files
openclaw/test/scripts/test-runner-manifest.test.ts
2026-03-20 17:11:23 +00:00

137 lines
3.9 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
dedupeFilesPreserveOrder,
packFilesByDuration,
selectMemoryHeavyFiles,
selectTimedHeavyFiles,
selectUnitHeavyFileGroups,
} from "../../scripts/test-runner-manifest.mjs";
describe("scripts/test-runner-manifest timed selection", () => {
it("only selects known timed heavy files above the minimum", () => {
expect(
selectTimedHeavyFiles({
candidates: ["a.test.ts", "b.test.ts", "c.test.ts"],
limit: 3,
minDurationMs: 1000,
exclude: new Set(["c.test.ts"]),
timings: {
defaultDurationMs: 250,
files: {
"a.test.ts": { durationMs: 2500 },
"b.test.ts": { durationMs: 900 },
"c.test.ts": { durationMs: 5000 },
},
},
}),
).toEqual(["a.test.ts"]);
});
});
describe("scripts/test-runner-manifest memory selection", () => {
it("selects known memory hotspots above the minimum", () => {
expect(
selectMemoryHeavyFiles({
candidates: ["a.test.ts", "b.test.ts", "c.test.ts", "d.test.ts"],
limit: 3,
minDeltaKb: 256 * 1024,
exclude: new Set(["c.test.ts"]),
hotspots: {
files: {
"a.test.ts": { deltaKb: 600 * 1024 },
"b.test.ts": { deltaKb: 120 * 1024 },
"c.test.ts": { deltaKb: 900 * 1024 },
},
},
}),
).toEqual(["a.test.ts"]);
});
it("orders selected memory hotspots by descending retained heap", () => {
expect(
selectMemoryHeavyFiles({
candidates: ["a.test.ts", "b.test.ts", "c.test.ts"],
limit: 2,
minDeltaKb: 1,
hotspots: {
files: {
"a.test.ts": { deltaKb: 300 },
"b.test.ts": { deltaKb: 700 },
"c.test.ts": { deltaKb: 500 },
},
},
}),
).toEqual(["b.test.ts", "c.test.ts"]);
});
it("gives memory-heavy isolation precedence over timed-heavy buckets", () => {
expect(
selectUnitHeavyFileGroups({
candidates: ["overlap.test.ts", "memory-only.test.ts", "timed-only.test.ts"],
behaviorOverrides: new Set(),
timedLimit: 3,
timedMinDurationMs: 1000,
memoryLimit: 3,
memoryMinDeltaKb: 256 * 1024,
timings: {
defaultDurationMs: 250,
files: {
"overlap.test.ts": { durationMs: 5000 },
"timed-only.test.ts": { durationMs: 4200 },
},
},
hotspots: {
files: {
"overlap.test.ts": { deltaKb: 900 * 1024 },
"memory-only.test.ts": { deltaKb: 700 * 1024 },
},
},
}),
).toEqual({
memoryHeavyFiles: ["overlap.test.ts", "memory-only.test.ts"],
timedHeavyFiles: ["timed-only.test.ts"],
});
});
});
describe("dedupeFilesPreserveOrder", () => {
it("removes duplicates while keeping the first-seen order", () => {
expect(
dedupeFilesPreserveOrder([
"src/b.test.ts",
"src/a.test.ts",
"src/b.test.ts",
"src/c.test.ts",
"src/a.test.ts",
]),
).toEqual(["src/b.test.ts", "src/a.test.ts", "src/c.test.ts"]);
});
it("filters excluded files before deduping", () => {
expect(
dedupeFilesPreserveOrder(
["src/a.test.ts", "src/b.test.ts", "src/c.test.ts", "src/b.test.ts"],
new Set(["src/b.test.ts"]),
),
).toEqual(["src/a.test.ts", "src/c.test.ts"]);
});
});
describe("packFilesByDuration", () => {
it("packs heavier files into the lightest remaining bucket", () => {
const durationByFile = {
"src/a.test.ts": 100,
"src/b.test.ts": 90,
"src/c.test.ts": 20,
"src/d.test.ts": 10,
} satisfies Record<string, number>;
expect(
packFilesByDuration(Object.keys(durationByFile), 2, (file) => durationByFile[file] ?? 0),
).toEqual([
["src/a.test.ts", "src/d.test.ts"],
["src/b.test.ts", "src/c.test.ts"],
]);
});
});