mirror of
https://github.com/morluto/rea.git
synced 2026-11-03 13:26:10 +00:00
* 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
51 lines
1.8 KiB
JavaScript
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,
|
|
};
|
|
};
|