Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Test harnesses

cargo xtask ci runs everything a pull request must pass: fmt, clippy with -D warnings, the tests in release mode, xtask layers, xtask assets and the wasm build check.

HarnessWhereWhat it catches
Unit and engine testsnext to the code, *_tests.rsmeasured results: volume, area, topology counts against derived values
Hostile inputhostile_params_never_panic, crates/engine/src/tests.rsevery command × every documented parameter × junk values: errors, never panics
Sketch fuzzcrates/engine/src/cmd/sketch_fuzz_tests.rsrandom sketches through the solver and profile finder
UI scenarioscrates/ui-egui/tests/scenarios/*.jsonthe real app, headless: clicks, keys, drags, assertions
Layout testscrates/ui-egui/tests/ui_layout.rs, window_widths.rspanels and dialogs at every window width
Design-file corpusapps/solvecraft-cli/tests/corpusevery saved file version still opens and evaluates the same
Kill mid-saveapps/solvecraft-cli/tests/kill_mid_save.rsa save killed at any moment leaves a readable file
Fusion oraclecargo xtask oracle → docs/oracle.mdparts rebuilt from recipes, compared with Fusion’s measurements
STEP corpuscargo xtask step-corpus → docs/step-import.mdSTEP files from Fusion opened and measured

UI scenarios

A scenario is a JSON list of steps run against the real app with a headless egui context:

[
  {"start": "sketch.create"},
  {"click": {"plane": "XY"}},
  {"start": "sketch.rectangle.two_point"},
  {"click": {"sketch": [0, 0]}},
  {"click": {"sketch": [40, 30]}},
  {"expect": {"errors": 0}}
]

A new file in crates/ui-egui/tests/scenarios/ is picked up automatically. To record a bug before it’s fixed, add a {"pending": "why"} step; its test is then ignored with that reason, and the fix removes the step.

Release mode

CI runs the tests with --release, because some truck assertions only exist in debug builds and fail on valid geometry. If a test fails only in debug, say so in the PR.