49 lines
3.5 KiB
JavaScript
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 }));
|