18 lines
3.4 KiB
JavaScript
18 lines
3.4 KiB
JavaScript
import crypto from "node:crypto";
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
import { createRequire } from "node:module";
|
|
import { pathToFileURL } from "node:url";
|
|
const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), "..");
|
|
const docs = path.join(root, "docs/p6");
|
|
const build = path.resolve(process.argv[2] ?? path.join(root, "freecad-source/build-web/configure/bin"));
|
|
globalThis.__dirname = `${build}${path.sep}`; globalThis.require = createRequire(import.meta.url);
|
|
const loader = await import(pathToFileURL(path.join(build, "FreeCADWebReverseEngineeringRuntimeProbe.js")));
|
|
const kernel = await loader.default({ wasmBinary: fs.readFileSync(path.join(build, "FreeCADWebReverseEngineeringRuntimeProbe.wasm")), print: () => {}, printErr: () => {} });
|
|
const c = (name, type = "number") => kernel.ccall(name, type);
|
|
const valid = () => ({ run: c("fc_web_reverseengineering_create_recompute"), error: c("fc_web_reverseengineering_action_error", "string"), objectType: c("fc_web_reverseengineering_action_object_type", "string"), length: c("fc_web_reverseengineering_action_length"), objectCount: c("fc_web_reverseengineering_action_object_count"), resourcesReleased: c("fc_web_reverseengineering_action_resources_released") });
|
|
const before = valid(); const invalid = { run: c("fc_web_reverseengineering_recovery_invalid"), error: c("fc_web_reverseengineering_action_error", "string") }; const repeatedInvalid = { run: c("fc_web_reverseengineering_recovery_invalid"), error: c("fc_web_reverseengineering_action_error", "string") }; const after = valid();
|
|
const hash = value => crypto.createHash("sha256").update(JSON.stringify(value)).digest("hex"); const semantic = value => ({ objectType: value.objectType, length: value.length, objectCount: value.objectCount, resourcesReleased: value.resourcesReleased }); const beforeHash = hash(semantic(before)); const afterHash = hash(semantic(after));
|
|
const report = { schema: "freecad-web-p6-reverseengineering-recovery/v2", taskId: "FW-P6-REV-D", module: "ReverseEngineering", action: "create/recompute", result: before.run === 1 && invalid.run === 0 && repeatedInvalid.run === 0 && invalid.error === repeatedInvalid.error && invalid.error.length > 0 && after.run === 1 && beforeHash === afterHash ? "pass" : "fail", before, invalid, repeatedInvalid, after, recovery: { beforeSha256: beforeHash, afterSha256: afterHash, unchangedAfterInvalid: beforeHash === afterHash, repeatedErrorStable: invalid.error === repeatedInvalid.error }, commands: ["node tools/run_p6_reverseengineering_create_recovery_v2.mjs freecad-source/build-web/configure/bin"], artifacts: { kernel: "docs/p6/reverseengineering-kernel.json", workerLog: "docs/freecad-p6-reverseengineering-d-recovery.log" }, boundaries: ["Empty point input is rejected by the official approxCurve API; the last valid native document state is recreated successfully afterward."] };
|
|
fs.writeFileSync(path.join(docs, "reverseengineering-recovery.json"), `${JSON.stringify(report, null, 2)}\n`); fs.writeFileSync(path.join(root, "docs/freecad-p6-reverseengineering-d-recovery.log"), `${JSON.stringify({ result: report.result, invalidError: invalid.error, unchangedAfterInvalid: report.recovery.unchangedAfterInvalid })}\n`); console.log(JSON.stringify({ result: report.result, invalidError: invalid.error, unchangedAfterInvalid: report.recovery.unchangedAfterInvalid })); if (report.result !== "pass") process.exitCode = 1;
|