Files
FreeCADWasmDev/tools/run_p6_reverseengineering_create_recovery.mjs
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

3 lines
3.5 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 beforeSemantic = { objectType: before.objectType, length: before.length, objectCount: before.objectCount, resourcesReleased: before.resourcesReleased }; const afterSemantic = { objectType: after.objectType, length: after.length, objectCount: after.objectCount, resourcesReleased: after.resourcesReleased }; const report = { schema: "freecad-web-p6-reverseengineering-recovery/v1", taskId: "FW-P6-REV-D", module: "ReverseEngineering", action: "create/recompute", result: before.run === 1 && invalid.run === 1 && repeatedInvalid.run === 1 && invalid.error === repeatedInvalid.error && invalid.error.includes("ValueError") && after.run === 1 && hash(beforeSemantic) === hash(afterSemantic) ? "pass" : "fail", before, invalid, repeatedInvalid, after, recovery: { beforeSha256: hash(beforeSemantic), afterSha256: hash(afterSemantic), unchangedAfterInvalid: hash(beforeSemantic) === hash(afterSemantic), repeatedErrorStable: invalid.error === repeatedInvalid.error }, commands: ["node tools/run_p6_reverseengineering_create_recovery.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;