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
60 lines
2.9 KiB
Markdown
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.
|