Files
FreeCADWasmDev/tools/test-assembly-response-state.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

48 lines
2.4 KiB
JavaScript

import assert from "node:assert/strict";
import { execFileSync } from "node:child_process";
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { fileURLToPath, pathToFileURL } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const output = fs.mkdtempSync(path.join(os.tmpdir(), "assembly-response-state-"));
try {
execFileSync(path.join(root, "web/node_modules/.bin/tsc"), [
"-p", path.join(root, "web/tsconfig.json"), "--noEmit", "false", "--outDir", output,
], { stdio: "inherit" });
const { applyAssemblyResponse, prepareAssemblyCommand } = await import(
pathToFileURL(path.join(output, "assembly-desktop-adapter.js")));
const documentId = "CurrentDocument";
for (const command of ["Assembly_CreateAssembly", "Assembly_ActivateAssembly"]) {
const record = { command, id: `Assembly:desktop:${command}`, module: "Assembly" };
const active = new Map([[documentId, "OriginalAssembly"]]);
let selections = 0;
const response = selection => ({ kind: "result", result: { records: [{
apiId: record.id, status: "exposed", result: {
documentId, assembly: "NextAssembly", object: "NextAssembly",
activeAssembly: "NextAssembly", selection,
},
}] } });
const rejected = applyAssemblyResponse(record, response([{ documentId, object: "" }]),
record.id, documentId, active, () => selections++);
assert.notEqual(rejected.kind, "result");
assert.equal(active.get(documentId), "OriginalAssembly");
assert.equal(selections, 0);
const joint = prepareAssemblyCommand({ command: "Assembly_CreateJointFixed",
id: "Assembly:desktop:Assembly_CreateJointFixed", module: "Assembly" },
{ references: [{ object: "First", subelements: [""] },
{ object: "Second", subelements: [""] }] }, documentId, active);
assert.equal(joint.args.assembly, "OriginalAssembly");
const accepted = applyAssemblyResponse(record,
response([{ documentId, object: "NextAssembly" }]), record.id, documentId,
active, () => selections++);
assert.equal(accepted.kind, "result");
assert.equal(active.get(documentId), "NextAssembly");
assert.equal(selections, 1);
}
console.log("Assembly response state: rejected activation preserves joint target; valid activation commits (2 routes passed)");
} finally {
fs.rmSync(output, { recursive: true, force: true });
}