jolt/test/chez/README.md
Yogthos 9a273e71cd Move the Chez test oracle off Janet
The unit tests in test/chez/_*.janet now drive bin/joltc (the zero-Janet
spine) and judge against baked expected values instead of a live build/jolt
run. Ten of them captured the oracle from build/jolt per case; their values
are now literals (one env-dependent javastatic case became a predicate so it
stays portable). The rest already had literal expecteds with a redundant
build/jolt sanity check, now dropped.

Retire emit-test/emit-parity/reader-parity: they compared the Chez/Clojure
path against a live Janet evaluation, emitter, or reader. That migration check
is done, and run-corpus-zero-janet (Chez analyzer vs the JVM corpus) plus
certify.clj cover correctness now.

Rewrite the README for the current zero-Janet gate.

jolt-5oci
2026-06-21 09:48:49 -04:00

60 lines
2.9 KiB
Markdown

# Chez test harness
The correctness gate for jolt on Chez (epic jolt-cf1q). Correctness is judged
against the JVM-sourced conformance spec — no Janet decides pass/fail. The spec
itself lives in `test/conformance/` (see its `SPEC.md`); this directory holds the
Chez runners and unit tests.
## The spec corpus
- `corpus.edn` — the contract: ~2920 rows `{:suite :label :expected :actual}`,
with `:expected` sourced from reference JVM Clojure. Valid as both EDN and Janet
data. Generated by `test/conformance/regen-corpus.clj` (the answers) over the
case list from `extract-corpus.janet` (the `:actual` strings, pulled from
`test/spec/*.janet` and `conformance-test.janet`).
- `extract-corpus.janet` — re-derives the case list when spec rows change. Writes
only when `JOLT_EXTRACT_CORPUS_OUT` is set, so a gate run never clobbers the
JVM-sourced `corpus.edn`. After re-deriving, re-source the answers with
`regen-corpus.clj`.
## The standing gate
`run-corpus-zero-janet.janet` runs every corpus case through the zero-Janet
spine: read → analyze → IR → emit → eval, all on Chez (the analyzer is
`jolt.analyzer` cross-compiled to Scheme over `host-contract.ss`). Each result is
compared by value-equality against the JVM `:expected`. A `known-fail` allowlist
covers cases jolt can't match because Chez has no JVM host (Java classes, arrays,
`BigDecimal`, opaque host-object printers, …); the gate fails only on a NEW
divergence or if the pass count drops below the floor.
JOLT_CHEZ_ZEROJANET_CORPUS=1 janet test/chez/run-corpus-zero-janet.janet
JOLT_CORPUS_LIMIT=200 … # every-Nth stride, fast iteration
Floor: 2678 (`JOLT_CHEZ_ZJ_FLOOR` overrides). Raise it as host gaps close.
## Unit tests
`_*.janet` drive `bin/joltc` (the pure-Chez CLI; `JOLT_BIN` overrides) one
subprocess per case and compare the last stdout line against a baked expected
value. `:throws` asserts a non-zero exit. Each file targets one area —
`_type`/`_class`/`_seqpred` (taxonomy + predicates), `_str`/`_strns`/`_reader`
(strings + reader), `_io`/`_ioreader`/`_insttime`/`_javastatic` (host interop),
`_dynbind`/`_var_meta`/`_ns` (vars + namespaces), `_atomwatch`/`_walk`/`_dotform`
/`_stdlib` (refs, walk, dot-forms, stdlib). Run one with
`janet test/chez/_type.janet`.
## Self-host gates
- `spine-test.janet` — the zero-Janet compile/eval spine end to end.
- `cli-test.janet``bin/joltc -e` behavior.
- `bootstrap-test.janet``host/chez/bootstrap.ss` rebuilds the prelude + image
from source on Chez and matches the checked-in seed (`host/chez/seed/`).
- `fixpoint-test.janet` — the on-Chez compiler reproduces itself (stage2 == stage3,
prelude pstage3 == pstage4).
## Bench
`bench-pipeline.janet` (opt-in via `JOLT_CHEZ_BENCH=1`) times fib + mandelbrot
through the real pipeline against the spike ceiling. Skipped in the gate.
All Chez runners skip cleanly when `chez` is not on PATH.