The grblHAL harnesses keep what only a running controller shows; the
cases a host unit test in grblHAL-glowforge proves, and the log and
reply wording, leave.
- laser_lifecycle_test: test_arm_waits_for_the_fans goes. laser_arm_test
case A4 (grblHAL-glowforge) proves the fan grace stretching the arm's
acknowledgment budget, on the same arm path. The docstring names it.
- xy_mode_test: case_x32, case_invalid and the log checks go; the
default, x16 and the low tick stay. xy_scale_test holds each mode's
tick and the not-a-mode parse.
- planner_blocks_test: one restart, at $398 1000; the 400 pass and the
fresh-store probe go.
- ctlport_test: test_poll_lf and test_crlf go (the CR LF poll stays); in
test_sender_out the network turn-away goes (serial_test holds it), and
the busy gating, the grant and the outlives-client part stay.
test_port_dark is whole.
- mcode_test: the timeout case runs on the host build's 5 s
GFMCODE_WAIT_S (grblHAL-glowforge's CI configures it; the image keeps
30 s) and still shows the hold, at 5.1 s; 5 s outlasts the 3 s
test_dark watches the wait; test_table refuses one form per
parser branch. test_timeout_holds and test_dark stay.
- envelope_test: test_unset and test_bounds go (lens_home_test holds the
clamp); test_armed and the open, apply and close cases stay.
- manual_home_test: the out-of-range offset block goes, a repeat of
gfhome_clamp_home_mm (lens_home_test); the modal-M3 FIRE check and
every release and energize case stay.
- cool_report_test: one non-hex secret and one CR LF injection stay;
runner-malformed and the exact header-set checks go. A bad secret is
never sent and a good one is.
- tray_test: test_offset keeps 20 mm; test_errors keeps a bad P and a
bad axis; the frame shift, envelope, barrier, persistence, port op,
unreferenced lens and camera home stay.
Proof: with grblHAL-glowforge's matching commit, the eleven harnesses
its CI runs pass under Linux against the null-sink build: nine on a
build with a 1 s M-code wait, and mcode_test and tray_test, the two
that wait at an M-code, on the 5 s build CI configures
(-DGFMCODE_WAIT_S=5.0). pyflakes reports nothing in the nine changed
files.
Push this before grblHAL-glowforge's commit.
Acceptance: none; host harnesses only.
- scripts/bench/tray_test.py, run by the driver's CI: M103 P1 and P0
move Z and its envelope by tray_offset_mm on the lens step grid, tell
the sender, write and remove the marker beside the shared config, and
ship no step; a missing P, P2, P0.5, P-1, and an axis word are errors
that change nothing; the switch behind a move waits for the move; the
port's tray op with a sender connected, its count exact, refused out of
form, during a program, and at a package's M-code; the mode across a
soft reset and a killed controller, a start over the marker taking the
lens reference in the tray-out frame; the offset's range; an
unreferenced lens; a camera home in both modes handing the runner the
same park. The kernel-idle half of the barrier needs the pulse device:
a null sink is always idle.
- scripts/bench/ctlport_test.py: the dark case carries tray out and in
under an open armed window.
- forgetest: motion.tray in its own module, suite/tray.py, so no other
test's fingerprint moves. It switches the mode both ways through the
panel's route and through M103 from a Grbl client and judges each
switch: /status's mode, Z, and reach moved by the offset's grid, the
port's state, the marker, the reference and its source unchanged, the
client told, the kernel's counters unmoved. A jog to the Z the lens
read before a switch is refused in the other mode and taken back in
the mode found; a setup card started with the tray out is refused in
the operator's words; the panel page carries the switch. The mode goes
back as found in a finally. It does not restart the controller, which
would drop the X and Y reference: persistence is tray_test.py's.
- The bench registry and README list tray_test.py.
Proof: tray_test.py ALL PASS against the driver with the mode, and six
driver copies each missing one part of it fail. The driver's whole CI
harness list passes. The forgetest unit suite: 500 tests OK. The
coverage lint over the working trees: nothing uncovered, 126 tests. On
the bench reference, with the binaries hot-deployed on the fx18 image:
motion.tray PASS, and FAIL against the driver whose anchor lost its
source word on the second switch.
Acceptance. motion.tray is new; the suite and bench files are in no
other test's fingerprint.