From b4493f5052dd45fc46b3150832d7a591a41cd8a0 Mon Sep 17 00:00:00 2001 From: ScottW514 Date: Sat, 17 Oct 2026 19:08:02 -0400 Subject: [PATCH] forgetest: motion.jog-roundtrip's covers name the forgectrl route its homed-mask judge reads The soft-reset check's reference verdict is the homed mask, read before and after the reset through forgectrl's GET /motion/state (cb_motion_state in src/main.c, through motion_port to the controller port's state record), because $# prints the mask only with $22 on, which the driver leaves off. A test that depends on a forgectrl route names ("forgectrl", "src/main.c") in its covers, as microstep_modes and deadman do, so that a change to the route invalidates the test's inherited PASS. motion.jog-roundtrip's covers are now _MOTION_COVERS plus that entry. Proof: a compile and pyflakes 4.0.3 give no message on forgetest/suite/motion.py, with no undefined name in forgetest or tests. forgetest unit tests, python3 -B -m unittest discover -s tests -p test_.py, in a private PID namespace: test_manifest.py 39 OK, test_queue.py 15 OK, test_campaign.py 13 OK. Coverage lint on the tree manifest from scripts/manifest-from-tree.py (python3 -B -m forgetest.coverage --manifest ../tree-manifest.json --enforce): 0 uncovered, 0 empty, 0 host-tested row problems, 43 tests; the catalog loads motion.jog-roundtrip with the five covers entries. A host dry run of the whole test against the null-sink build of the grblHAL-glowforge default branch head ("serial_test: the scan's exempt arguments each match once in the sources"), with the machine side stood in for as before and a model kernel that ramps from the controller's cnc/stop write, passes: MPos X 3534.93 steps against 3535, tail 23% of the tick, mask 4 kept, drift 0.000 mm. Acceptance: the covers are part of the test's own text, so the fingerprint of motion.jog-roundtrip moves, and no other test's: of the implementation hashes of the 43 catalog tests, before and after, only that one differs. From here a change under forgectrl's src/main.c invalidates motion.jog-roundtrip's inherited PASS as well. --- forgetest/forgetest/suite/motion.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forgetest/forgetest/suite/motion.py b/forgetest/forgetest/suite/motion.py index 1f57776..adccd77 100644 --- a/forgetest/forgetest/suite/motion.py +++ b/forgetest/forgetest/suite/motion.py @@ -194,7 +194,8 @@ def pacing(ctx): @test("motion.jog-roundtrip", title="Motion quality: bounded jogs, max rate, diagonal, hold/resume, " "a soft reset during a move", subsystem="motion", kind="auto", mode="grbl", est_min=3, - covers=_MOTION_COVERS, requires=["kernel.latch-locked-idle", "kernel.k1-k2"], + covers=_MOTION_COVERS + [("forgectrl", "src/main.c")], + requires=["kernel.latch-locked-idle", "kernel.k1-k2"], steps=["Setup: the head parked with at least 60 mm of free +X and 40 mm of free +Y travel; " "bed clear, lid closed."], description="Sanity jogs (X, Y 40 mm out/back at F2400), max-rate X out/back (60 mm at "