Files
reverse-engineering-anything/scripts/lib/test-discovery.mjs
T
morluto 7bcefead69 test: strengthen and prune audited test coverage (#8573)
* test: strengthen and prune audited test coverage

* test: require delivered DeepSeek skill instructions

* test: keep schema fixture types private

* test: verify Gemini receives skill instructions

* test: bind Qwen skill evidence to its tool result

* test: report NativeAOT verifier checks precisely

* fix: verify Ghidra cleanup paths reliably

* fix: verify Command Code skill activation

* test: tighten cleanup and fixture checks

* test: verify packet capture evidence is recorded

* fix: report HTTP3 capture provenance accurately

* test: preserve resource coverage through MCP

* test: prune repeated assertions and retain cancellation identity

* fix: validate client verifier fixture paths

* test: skip Copilot verifier cases on Windows

* test: keep verifier setup target relative
2026-11-02 02:13:32 +08:00

51 lines
1.8 KiB
JavaScript

import { relative, resolve } from "node:path";
import { projectForTest } from "./test-projects.mjs";
/** Compare actual Vitest discovery with repository-owned test paths. */
export const compareTestDiscovery = (expectedPaths, discovery, root) => {
if (!Array.isArray(discovery))
throw new TypeError("Vitest file discovery must be an array");
const projectsByFile = new Map();
for (const entry of discovery) {
if (
entry === null ||
typeof entry !== "object" ||
typeof entry.file !== "string" ||
entry.file.length === 0 ||
typeof entry.projectName !== "string" ||
entry.projectName.length === 0
)
throw new TypeError(
"Vitest discovery requires file and projectName strings",
);
const path = relative(root, resolve(root, entry.file)).replaceAll(
"\\",
"/",
);
const projects = projectsByFile.get(path) ?? [];
projects.push(entry.projectName);
projectsByFile.set(path, projects);
}
const expected = new Set(expectedPaths);
const sorted = (values) => [...values].sort();
return {
missing: sorted(expected).filter((path) => !projectsByFile.has(path)),
unexpected: sorted(projectsByFile.keys()).filter(
(path) => !expected.has(path),
),
duplicates: sorted(projectsByFile.keys()).flatMap((file) => {
const projects = projectsByFile.get(file);
return projects.length > 1 ? [{ file, projects: sorted(projects) }] : [];
}),
wrongProjects: sorted(expected).flatMap((file) => {
const projects = projectsByFile.get(file);
if (!projects || projects.length !== 1) return [];
const expectedProject = projectForTest(file).name;
return projects[0] === expectedProject
? []
: [{ file, expected: expectedProject, actual: projects[0] }];
}),
discovered: projectsByFile.size,
};
};