Validation ========== ``at-py`` uses three layers of validation: * fast unit tests for parser, formatter, MAT, and client wiring behavior; * executable documentation examples for user-facing snippets; * runner-backed integration tests for end-to-end workflows through ``at-runner``. Runner-Backed Corpus -------------------- The integration corpus intentionally starts small and reproducible. It should grow by adding complete AT cases with checked parser outputs rather than broad fixture dumps. Current runner-backed cases: .. list-table:: :header-rows: 1 :widths: 25 35 40 * - Case - Runner check - Parser check * - KRAKEN Pekeris - ``ATClient.kraken`` exits successfully through ``at-runner``. - The generated mode file is parsed with ``read_modes_bin`` and checked for non-empty mode count, positive wavenumbers, and receiver/source grid dimensions. Adding Cases ------------ When adding a validation case: * keep the input text small enough to review; * check at least one parsed output rather than only process exit status; * prefer stable shape, count, and monotonicity assertions over fragile exact floating-point snapshots; * mark runner-backed tests with ``@pytest.mark.integration`` so local unit runs remain fast.