+�# tests/ — coverage map funcl has no external test framework (the old SBCL/FiveAM suite was deleted with `host-sbcl-legacy/`). Tests run via the Makefile and shell/ERT drivers. Run everything from the repo root. ## Make targets (the primary surface) | Target | Covers | ~Duration | Role | |---|---|---|---| | `make test-fast-sharded` | Full bootstrap suite fanned across 8 emacs workers; per-shard logs (`build/test-shard-N.log`) NAME failing tests with backtraces | 10–15 min | **Pre-push gate** (most informative) | | `make test-bootstrap` | The full ERT suite (`tests/bootstrap.el`), serial, one line per test | ~50 min | Gate (slower; sharded is superset) | | `make test-bootstrap-quiet` | Same, final summary only | ~50 min | Gate | | `make test-fast` | Faster subset of the bootstrap suite | minutes | Iteration | | `make test-smoke` | Sub-second GC alloc + defvar sanity | <1 s | Iteration | | `make test-gc` | funcl-native GC suite, no emacs (emitter changes need stage1 rebuilt first) | ~25 s | Iteration | | `make test-gc-soak` | GC endurance — thousands of stress collections | ~5 min | Release gate | | `make build` | Produces `build/funcl` AND validates the **self-host fixed point** (`stage2 == stage3` byte-identical) | ~3 min | **The core gate** — any emit/compile change must pass it | The single most important gate is `make build` itself: if a change alters the emitted bytes, the stage2≡stage3 fixed point fails. `make test-fast-sharded` is the recommended pre-push run on top of that. ## Shell + ERT drivers | File | Covers | Invoked by | |---|---|---| | `tests/bootstrap.el` | ERT port of the bootstrap suite (the bulk of coverage) | `make test-bootstrap*` | | `tests/ansi-run.sh` | ANSI (Paul Dietz) regression suite; `FRESH=1` loads fixtures per-file, `FUNCL=` overrides the binary. `FUNCL=build/funcl` for CLOS/is-similar tests (stage2 lacks mini-clos) | manual | | `tests/gc.sh` / `tests/smoke.sh` | GC backend correctness / sub-second sanity | `make test-gc` / `test-smoke` | | `tests/witness-gate.sh` | ADR 0012 boot-order witness gate | manual / CI | | `tests/adr0026-witness.sh` | ADR 0026 canonical-symbol-identity witnesses | manual (symbol-unification work) | | `tests/alexandria-load.sh` | Load Alexandria through funcl and smoke-test it | manual (library-compat signal) | | `tests/*-smoke.el` (ast-ir, reader) | Focused elisp-host unit smokes | manual | ## Release gates vs iteration aids - **Release gates:** `make build` (fixed point), `make test-fast-sharded` / `make test-bootstrap`, `make test-gc-soak`, `tests/witness-gate.sh`. - **Iteration aids:** `make test-smoke`, `make test-gc`, `make test-fast`, `tests/ansi-run.sh` (targeted dirs), the `*-smoke.el` drivers. ## Notes - `make elisp-bytecode` after ANY `src/cold/*.lisp` or `elisp/*` edit — a stale `.elc` is skipped (correct but 5–10× slower). See [`../CLAUDE.md`](../CLAUDE.md). - The ANSI runner understates progress (many `.lsp` files abort early on an unsupported clause); confirm a fix by probing the function directly. - `tests/fixtures/` holds `.lisp` driver fixtures loaded by `bootstrap.el` (e.g. `file-read-smoke.lisp`, `argv1-smoke.lisp`) — not standalone suites.