Files
linuxcncWebWASM/web/worker/test_device_io.mjs

49 lines
3.5 KiB
JavaScript

import assert from "node:assert/strict";
import { DeviceIoRuntime } from "./device-io.mjs";
import { SimSession, CONTEXT_ID } from "./sim-session.mjs";
const device = new DeviceIoRuntime({ encoder_count: 2, cycle_time: 0.1 });
assert.equal(device.encoderSet(0, { speed_rps: 1, ppr: 10, scale: 4, index_enable: true }).status, "verified");
assert.equal(device.step(1).status, "verified");
assert.equal(device.state.encoders[0].count, 4);
assert.equal(device.step(10).status, "verified");
assert.equal(device.state.encoders[0].index_pulse, true);
assert.equal(device.encoderSet(0, { speed_rps: Number.NaN }).code, "device_encoder_speed");
assert.equal(device.coolantCommand({ mist: true, flood: false, lube: true }).status, "verified");
assert.equal(device.doorSet(true).code, "device_interlock");
assert.equal(device.state.coolant.mist, false);
assert.equal(device.doorSet(false).status, "verified");
assert.equal(device.interlockReset().status, "verified");
assert.equal(device.coolantCommand({ mist: true }).status, "verified");
assert.equal(device.estop(true).code, "device_interlock");
assert.equal(device.estop(false).status, "verified");
assert.equal(device.interlockReset().status, "verified");
assert.equal(device.issueAck("ack-1", 2).status, "verified");
assert.equal(device.issueAck("ack-1", 2).code, "device_ack_duplicate");
assert.equal(device.ackStep(12).status, "verified");
assert.equal(device.ack("ack-1").code, "device_ack_late");
const saved = device.export();
const restored = new DeviceIoRuntime();
assert.deepEqual(restored.restore(saved), saved);
const core = {
_sim_protocol_reset() {}, _sim_protocol_accept() { return 0; }, _sim_create() { return 0; },
_sim_load_workspace() { return 0; }, _sim_step() { return 0; }, _sim_protocol_set_tick() { return 0; },
};
const session = new SimSession(core, { sessionId: "device-io" });
const base = { schema_version: 1, context_id: CONTEXT_ID, session_id: "device-io" };
const send = (kind, seq, operation_id, payload = {}) => session.accept({ ...base, kind, seq, operation_id, payload });
send("HELLO", 1); send("SESSION_ATTACH", 2, "attach"); send("LOAD_WORKSPACE", 3, "workspace", { root_path: "/workspace" });
assert.equal(send("ENCODER_SET", 4, "encoder", { channel: 0, speed_rps: 1, ppr: 10, scale: 4, index_enable: true }).payload.device_io.encoders[0].speed_rps, 1);
assert.equal(send("COOLANT_COMMAND", 5, "coolant", { mist: true }).payload.device_io.coolant.mist, true);
assert.equal(send("DOOR_SET", 6, "door", { open: true }).kind, "ERROR");
assert.equal(send("INTERLOCK_RESET", 7, "interlock", {}).kind, "ERROR");
assert.equal(send("DOOR_SET", 8, "door-close", { open: false }).kind, "COMMAND_RESULT");
assert.equal(send("INTERLOCK_RESET", 9, "interlock-reset", {}).kind, "COMMAND_RESULT");
assert.equal(send("DEVICE_ACK_ISSUE", 10, "ack-op", { timeout_ticks: 2 }).payload.device_io.acks[0].status, "pending");
assert.equal(send("SIM_STEP", 11, "device-step", { cycles: 2 }).payload.device_io.acks[0].status, "timed_out");
assert.equal(send("DEVICE_ACK", 12, "late", { operation_id: "ack-op" }).payload.code, "device_ack_late");
const checkpoint = send("CHECKPOINT", 13, "device-checkpoint").payload.checkpoint;
assert.equal(checkpoint.state.device_io.schema, "sim_device_io.v1");
console.log(JSON.stringify({ schema: "device-io-worker-sample.v1", status: "verified", tick: device.state.tick, count: device.state.encoders[0].count, state_hash: device.hash(), worker_tick: session.tick, worker_state_hash: session.deviceIo.hash(), checkpoint_hash: checkpoint.checkpoint_hash }));