import assert from "node:assert/strict"; import { xyzacTrtProfile } from "../../app/src/profiles/xyzac-trt.js"; import { createPyvcpHalBindingSummary, xyzacTrtPyvcpPanelSchema } from "../../app/src/panel-schema/xyzac-trt-pyvcp.js"; import { createLinuxCncBoundaryAdapter, createLinuxCncBoundaryReadiness } from "../../app/src/runtime/linuxcnc-boundary-adapter.js"; import { createLinuxCncKinematicsRuntime } from "../../app/src/runtime/linuxcnc-kinematics-runtime.js"; import { createProfileSourceReferenceSummary } from "../../app/src/profiles/source-reference-map.js"; assert.equal(xyzacTrtProfile.id, "xyzac-trt"); assert.equal(xyzacTrtProfile.iniPath.endsWith("xyzac-trt.ini"), true); assert.deepEqual(xyzacTrtProfile.coordinates, ["X", "Y", "Z", "A", "C"]); assert.equal(xyzacTrtProfile.kinematics, "xyzac-trt-kins"); assert.equal(xyzacTrtProfile.machineName, "sim-xyzac-trt-kins (switchkins)"); assert.equal(xyzacTrtProfile.display.jogAxes.join(""), "XYZC"); assert.equal(xyzacTrtProfile.rs274ngc.halPinVars, true); assert.equal(xyzacTrtProfile.traj.coordinates, "XYZAC"); assert.equal(xyzacTrtProfile.axisLimits.A.max, 50); assert.equal(xyzacTrtProfile.jointConfig.length, 5); assert.equal(xyzacTrtProfile.halui.mdiCommands.join(","), "M429,M428,M430"); assert.equal(xyzacTrtProfile.hal.halcmd.switchkinsSelectNet.target, "motion.switchkins-type"); assert.equal(xyzacTrtProfile.hal.halcmd.feedbackNets.length, 5); assert.equal(xyzacTrtProfile.hal.halcmd.offsetNets.length, 4); assert.equal(xyzacTrtProfile.toolTable.toolCount, 10); assert.equal(xyzacTrtProfile.toolTable.tools[1].zOffset, 15); assert.equal(xyzacTrtProfile.kinematicsParameters.sparm, "identityfirst"); assert.equal(xyzacTrtProfile.remaps.map((remap) => remap.code).join(","), "M428,M429,M430"); assert.equal(xyzacTrtProfile.remaps.every((remap) => remap.analogOutputIndex === 3), true); assert.equal(xyzacTrtProfile.halPins.includes("motion.switchkins-type"), true); assert.equal(xyzacTrtProfile.halPins.includes("xyzac-trt-kins.tool-offset"), true); assert.equal(xyzacTrtProfile.promotionAllowed, false); assert.equal(xyzacTrtProfile.linuxCncKinematicsReady, false); const sourceSummary = createProfileSourceReferenceSummary("xyzac-trt"); assert.equal(sourceSummary.referenceCount >= 8, true); assert.equal(sourceSummary.kinds.includes("tool_table"), true); assert.equal(sourceSummary.sourceRequiredCount >= 3, true); assert.equal(sourceSummary.promotionAllowed, false); assert.equal(sourceSummary.semanticBoundary, "profile_source_map_only_not_runtime_proof"); assert.ok(sourceSummary.references.some((reference) => reference.path.endsWith("xyzac-trt.ini"))); assert.ok(sourceSummary.references.some((reference) => reference.path.endsWith("trtfuncs.c"))); const panelSummary = createPyvcpHalBindingSummary(xyzacTrtPyvcpPanelSchema); assert.equal(panelSummary.schemaId, "xyzac-trt-switchkins-pyvcp"); assert.equal(panelSummary.controlCount, 5); assert.equal(panelSummary.buttonCount, 4); assert.deepEqual(panelSummary.mdiCommands, ["M429", "M428", "M430"]); assert.ok(panelSummary.halNets.some((net) => net.target === "halui.mdi-command-01")); assert.equal(panelSummary.promotionAllowed, false); const adapter = createLinuxCncBoundaryAdapter(); assert.equal(adapter.apiName, "web-rtcp-5axis-linuxcnc-boundary-adapter"); assert.equal(adapter.profileId, "xyzac-trt"); assert.equal(adapter.runtimeReady, false); assert.equal(adapter.kinematicsRuntimeReady, false); assert.equal(adapter.interpreterRuntimeReady, false); assert.equal(adapter.linuxCncKinematicsReady, false); assert.equal(adapter.promotionAllowed, false); assert.equal(adapter.profileSummary.coordinates, "XYZAC"); assert.equal(adapter.profileSummary.jointCount, 5); assert.equal(adapter.profileSummary.mdiCommandCount, 3); assert.equal(adapter.profileSummary.toolCount, 10); assert.equal(adapter.profileSummary.feedbackNetCount, 5); assert.equal(adapter.adapterPoints.pyvcpSchemaId, "xyzac-trt-switchkins-pyvcp"); assert.equal(adapter.adapterPoints.halPins.includes("halui.mdi-command-00"), true); const readiness = createLinuxCncBoundaryReadiness(adapter); assert.equal(readiness.ready, false); assert.equal(readiness.linuxCncKinematicsReady, false); assert.equal(readiness.promotionAllowed, false); assert.ok(readiness.missing.includes("kinematics runtime")); assert.ok(readiness.missing.includes("interpreter/remap runtime")); const runtime = await createLinuxCncKinematicsRuntime({ moduleId: "xyzac-trt" }); const kinematicsAdapter = createLinuxCncBoundaryAdapter({ runtime: { kinematicsWasm: runtime.readiness(), interpreterWasm: null, }, }); const kinematicsReadiness = createLinuxCncBoundaryReadiness(kinematicsAdapter); assert.equal(kinematicsAdapter.runtimeReady, false); assert.equal(kinematicsAdapter.kinematicsRuntimeReady, true); assert.equal(kinematicsAdapter.interpreterRuntimeReady, false); assert.equal(kinematicsAdapter.linuxCncKinematicsReady, true); assert.equal(kinematicsAdapter.promotionAllowed, true); assert.equal(kinematicsAdapter.fullLinuxCncProgramExecutionReady, false); assert.equal(kinematicsAdapter.semanticBoundary, "linuxcnc_kinematics_wasm_runtime_connected"); assert.equal(kinematicsReadiness.ready, true); assert.equal(kinematicsReadiness.linuxCncKinematicsReady, true); assert.equal(kinematicsReadiness.fullLinuxCncProgramExecutionReady, false); assert.ok(kinematicsReadiness.missing.includes("interpreter/remap runtime")); console.log("profile_boundary_smoke=ok");