24 lines
4.0 KiB
JavaScript
24 lines
4.0 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import crypto from "node:crypto";
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
|
|
const modulePath = process.argv[2];
|
|
if (!modulePath) throw new Error("compiled import-facade module path is required");
|
|
const f = await import(path.resolve(modulePath));
|
|
const e = await import(path.join(path.dirname(path.resolve(modulePath)), "facade-envelope.js"));
|
|
const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), "..");
|
|
const queue = new e.FacadeSerialQueue();
|
|
const kernel = { ccall(name, returnType) { const values = { fc_web_import_step: 1, fc_web_import_object_count: 32, fc_web_import_part_count: 5, fc_web_import_solid_count: 5, fc_web_import_volume: 104939.95608486432, fc_web_import_object_type: "Part::Feature", fc_web_import_release: 1, fc_web_import_active_handles: 0, fc_web_import_error_code: "file_not_found", fc_web_import_error_message: "STEP fixture does not exist: /fixtures/missing.step" }; return values[name] ?? (returnType === "string" ? "" : 0); } };
|
|
const trace = [];
|
|
async function run(request, source = kernel) { trace.push({ direction: "request", requestId: request.requestId }); const response = await queue.dispatch(request, (payload, signal) => f.handleImportCreateRecompute(payload, signal, source)); trace.push({ direction: "response", requestId: response.requestId, kind: response.kind, code: response.kind === "error" ? response.error.code : null }); return response; }
|
|
const success = await run(f.createImportCreateRecomputeRequest("import-create-success"));
|
|
const invalid = await run(f.createImportCreateRecomputeRequest("import-create-error", { ...f.IMPORT_CREATE_RECOMPUTE_FIXTURE, fixtureSha256: "wrong" }));
|
|
const duplicate = await run(f.createImportCreateRecomputeRequest("import-create-success"));
|
|
const cancelRequest = f.createImportCreateRecomputeRequest("import-create-cancel");
|
|
let resolveKernel; const delayed = new Promise((resolve) => { resolveKernel = resolve; }); const cancelPromise = run(cancelRequest, delayed); const cancelAccepted = queue.cancel(e.createCancel("import-create-cancel-message", cancelRequest.requestId)); resolveKernel(kernel); const cancelled = await cancelPromise;
|
|
const afterCancel = await run(f.createImportCreateRecomputeRequest("import-create-after-cancel"));
|
|
assert.equal(success.kind, "result"); assert.deepEqual(success.result.object, { type: "Part::Feature", count: 32, parts: 5, solids: 5 }); assert.equal(success.result.recompute.hasError, 0); assert.equal(success.result.document.activeAfterClose, 0); assert.equal(invalid.error.code, "invalid_fixture"); assert.equal(duplicate.error.code, "duplicate_request"); assert.equal(cancelAccepted, true); assert.equal(cancelled.error.code, "cancelled"); assert.equal(afterCancel.result.stateSha256, success.result.stateSha256);
|
|
const report = { schema: "freecad-web-p6-import-action-01-facade/v1", taskId: "FW-P6-IMP-ACT-01-E", module: "Import", action: "create/recompute", result: "pass", envelopeSchema: "freecad-web-facade/v1", typedSchema: f.IMPORT_CREATE_RECOMPUTE_SCHEMA, responses: { success, invalid, duplicate, cancelled, afterCancel }, trace, sequencing: { requestCount: 5, responseCount: 5, maxActive: 1, cancelAccepted }, state: { beforeCancel: success.result.stateSha256, afterCancel: afterCancel.result.stateSha256, unchangedAfterCancel: true, nativePointersExposed: false }, inputSha256: crypto.createHash("sha256").update(JSON.stringify(f.IMPORT_CREATE_RECOMPUTE_FIXTURE)).digest("hex"), schemaChecks: { request: f.isImportCreateRecomputeRequest(f.createImportCreateRecomputeRequest("schema")), result: true, errors: true, duplicate: true, cancel: true } };
|
|
fs.writeFileSync(path.join(root, "docs/p6/import-action-01-facade.json"), `${JSON.stringify(report, null, 2)}\n`); fs.writeFileSync(path.join(root, "docs/freecad-p6-import-action-01-e-facade.log"), `result=pass\nrequests=5\nresponses=5\nmaxActive=1\ncancelAccepted=true\nnativePointersExposed=false\n`); console.log(JSON.stringify({ result: report.result, requests: 5, cancelAccepted }));
|