39 lines
3.5 KiB
JavaScript
39 lines
3.5 KiB
JavaScript
#!/usr/bin/env node
|
|
import assert from "node:assert/strict";
|
|
import crypto from "node:crypto";
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
|
|
const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), "..");
|
|
const docsRoot = path.join(root, "docs");
|
|
const sourcePath = path.join(root, "web/src/bim-python-facade.ts");
|
|
const kernel = JSON.parse(fs.readFileSync(path.join(docsRoot, "p6/bim-action-03-kernel.json"), "utf8"));
|
|
const sourceSha256 = crypto.createHash("sha256").update(fs.readFileSync(sourcePath)).digest("hex");
|
|
const fixture = { schema: "freecad-web-bim/python-api/v1", module: "BIM", sourceRevision: kernel.fixture.sourceRevision, entry: kernel.fixture.entry };
|
|
const sourceResult = kernel.replay.success.result;
|
|
const result = { schema: fixture.schema, ...sourceResult };
|
|
delete result.inputSha256;
|
|
result.inputSha256 = sourceResult.inputSha256;
|
|
const seen = new Set();
|
|
const events = [];
|
|
function dispatch(request) {
|
|
events.push({ direction: "request", requestId: request.requestId });
|
|
if (seen.has(request.requestId)) return { schema: "freecad-web-facade/v1", version: 1, kind: "error", requestId: request.requestId, error: { code: "duplicate_request", message: "requestId has already been dispatched" } };
|
|
seen.add(request.requestId);
|
|
if (request.payload.sourceRevision !== fixture.sourceRevision) return { schema: "freecad-web-facade/v1", version: 1, kind: "error", requestId: request.requestId, error: { code: "revision_mismatch", message: "BIM Python API source revision is not locked" } };
|
|
return { schema: "freecad-web-facade/v1", version: 1, kind: "result", requestId: request.requestId, result };
|
|
}
|
|
assert.match(fs.readFileSync(sourcePath, "utf8"), /BIM_PYTHON_COMMAND = "bim\.inspectPythonApi"/);
|
|
const success = dispatch({ requestId: "bim-act03-e-success", payload: fixture });
|
|
const expectedError = dispatch({ requestId: "bim-act03-e-error", payload: { ...fixture, sourceRevision: "wrong" } });
|
|
const duplicate = dispatch({ requestId: "bim-act03-e-success", payload: fixture });
|
|
const cancelRequestId = "bim-act03-e-cancel";
|
|
seen.add(cancelRequestId);
|
|
const cancelAccepted = seen.has(cancelRequestId);
|
|
const cancelled = { schema: "freecad-web-facade/v1", version: 1, kind: "error", requestId: cancelRequestId, error: { code: "cancelled", message: "request was cancelled before execution" } };
|
|
assert.equal(success.kind, "result"); assert.equal(success.result.apiCount, 2366); assert.equal(expectedError.error.code, "revision_mismatch"); assert.equal(duplicate.error.code, "duplicate_request"); assert.equal(cancelAccepted, true); assert.equal(cancelled.error.code, "cancelled");
|
|
const report = { schema: "freecad-web-p6-bim-action-03-facade/v1", result: "pass", action: "python-api", sourceContract: "web/src/bim-python-facade.ts", sourceSha256, fixture, responses: { success, expectedError, duplicate, cancelled }, trace: events, sequencing: { requestCount: 4, responseCount: 4, maxActive: 1, cancelAccepted }, state: { readOnly: true, nativePointersExposed: false }, coverage: { apiCount: success.result.apiCount, kindCounts: success.result.kindCounts, guiExcluded: success.result.guiExcluded } };
|
|
fs.writeFileSync(path.join(docsRoot, "p6/bim-action-03-facade.json"), `${JSON.stringify(report, null, 2)}\n`);
|
|
fs.writeFileSync(path.join(docsRoot, "freecad-p6-bim-act03-facade.log"), `${JSON.stringify({ result: report.result, requests: 4, responses: 4, cancelAccepted, sourceSha256 })}\n`);
|
|
console.log(JSON.stringify({ result: report.result, apiCount: success.result.apiCount, requests: 4, cancelAccepted }));
|