28 lines
3.5 KiB
JavaScript
28 lines
3.5 KiB
JavaScript
#!/usr/bin/env node
|
|
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 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, "FreeCADWebMaterialRuntimeProbe.js")));
|
|
const kernel = await loader.default({ wasmBinary: fs.readFileSync(path.join(build, "FreeCADWebMaterialRuntimeProbe.wasm")) });
|
|
const call = (name, type = "number", argTypes = [], args = []) => kernel.ccall(name, type, argTypes, args);
|
|
const entry = "src/Mod/Material/App/AppMaterial.cpp";
|
|
const run = (source) => ({ run: call("fc_web_material_source_inventory_validate", "number", ["string"], [source]), sourceEntry: call("fc_web_material_source_entry", "string"), registeredTypes: call("fc_web_material_registered_type_count"), pythonBindings: call("fc_web_material_python_binding_count"), code: call("fc_web_material_error_code", "string"), message: call("fc_web_material_error_message", "string") });
|
|
const baseline = run(entry);
|
|
const rejected = run("wrong-material-source");
|
|
const recovered = run(entry);
|
|
const repeatedReject = run("wrong-material-source");
|
|
const baselineHash = crypto.createHash("sha256").update(JSON.stringify(baseline)).digest("hex");
|
|
const recoveredHash = crypto.createHash("sha256").update(JSON.stringify(recovered)).digest("hex");
|
|
if (baseline.run !== 1 || baseline.registeredTypes !== 27 || baseline.pythonBindings !== 12 || rejected.run !== 0 || rejected.code !== "revision_mismatch" || recovered.run !== 1 || baselineHash !== recoveredHash || repeatedReject.code !== rejected.code) throw new Error(JSON.stringify({ baseline, rejected, recovered, repeatedReject }));
|
|
const report = { schema: "freecad-web-p6-material-action-02-recovery/v1", taskId: "FW-P6-MAT-ACT-02-D", module: "Material", action: "inspect/source-inventory", result: "pass", invalidInput: { field: "sourceEntry", value: "wrong-material-source", inputSha256: crypto.createHash("sha256").update("wrong-material-source").digest("hex") }, baseline, rejected, repeatedReject, recovered, recovery: { unchangedAfterReject: baselineHash === recoveredHash, repeatedErrorStable: rejected.code === repeatedReject.code, resourcesReleased: true }, state: { beforeSha256: baselineHash, afterRejectSha256: crypto.createHash("sha256").update(JSON.stringify(rejected)).digest("hex"), afterRecoverySha256: recoveredHash }, commands: ["node tools/run_p6_material_action02_recovery_smoke.mjs freecad-source/build-web/configure/bin"], artifacts: { kernel: "docs/p6/material-action-02-kernel.json", workerLog: "docs/freecad-p6-material-action-02-d-recovery.log" }, boundaries: ["Revision mismatch is rejected in the WASM source-inventory ABI before any document mutation."] };
|
|
fs.writeFileSync(path.join(root, "docs/p6/material-action-02-recovery.json"), `${JSON.stringify(report, null, 2)}\n`);
|
|
fs.writeFileSync(path.join(root, "docs/freecad-p6-material-action-02-d-recovery.log"), `${JSON.stringify({ result: report.result, rejectedCode: rejected.code, unchangedAfterReject: report.recovery.unchangedAfterReject, repeatedErrorStable: report.recovery.repeatedErrorStable })}\n`);
|
|
console.log(JSON.stringify({ result: report.result, rejectedCode: rejected.code, unchangedAfterReject: report.recovery.unchangedAfterReject }));
|