jolt/test/chez
Yogthos d0e1a11934 Checked narrow casts; fix runtime require in self-contained-built binaries
byte/short/int/long/char silently wrapped or passed out-of-range values
through; the JVM range-checks (RT.byteCast family). One checked-cast
helper now carries the ranges: a double range-checks ITSELF before
truncating ((byte 1.1) is 1, (byte 127.000001) throws), NaN casts to 0,
ratios and bigdecs truncate, a non-number is CCE, and the throw carries
the JVM message. float range-checks against Float/MAX_VALUE. The
unchecked-* casts now genuinely wrap and sign-fold ((unchecked-byte 200)
is -56 — the old bit-and lost the sign) with doubles saturating like
Java's conversions; unchecked-long/int are host natives. double/float of
a bigdec convert instead of crashing. The no-single-float residue stays
accepted (SPEC.md).

Also fixes #290: a binary built by the SELF-CONTAINED joltc died with
'variable var-deref is not bound' when a namespace loaded at runtime.
The in-process build compiled flat.ss against a clean copy-environment,
which orphans every top-level define in locations the binary's runtime
eval can't see. It now compiles against the default interaction
environment (defines land in the real symbol cells, same as the legacy
fresh-Chez path) and a generated prologue pre-binds each kernel name the
runtime redefines to its kernel value, so the earliest boot reads match
the legacy path's primitive references. requiring-resolve is implemented
(the issue's dynamic-require pattern), and the release workflow smokes a
runtime require in a built binary.

Cast namespaces byte/short/int/long/char now fully clean; cts baseline
5805 -> 5857 pass, 67 baselined namespaces. 7 JVM-certified corpus rows.
2026-07-02 09:42:06 -04:00
..
alias-leak-app Fix seven more JVM divergences (rewrite-clj full suite) 2026-07-01 14:17:03 -04:00
build-app Source locations: reader positions, error locations, native stack traces (#218) 2026-06-26 02:14:34 +00:00
cts-app Vendor clojure-test-suite as a standing gate (make cts) 2026-07-02 03:46:57 -04:00
datareader-app Compile data readers that return code forms 2026-07-01 10:57:55 -04:00
bench-chez.ss Clean up codebase: rename stdlib layer, strip porting residue, fix tooling 2026-06-22 22:18:00 -04:00
clojure-test.clj clojure.test/are substitutes via clojure.template 2026-07-02 05:57:57 -04:00
corpus.edn Checked narrow casts; fix runtime require in self-contained-built binaries 2026-07-02 09:42:06 -04:00
cts-known-failures.txt Checked narrow casts; fix runtime require in self-contained-built binaries 2026-07-02 09:42:06 -04:00
directlink-test.ss Fix direct-link crash on a non-fn var called as a function 2026-06-23 23:34:28 -04:00
ffi-binding-test.ss Group the JVM interop shims under host/chez/java/ 2026-06-25 18:35:44 -04:00
inline-test.ss Numbers-style category dispatch for binary numeric ops 2026-07-02 06:41:45 -04:00
numeric-test.ss ^long is a 64-bit long: fast-path-with-fallback ops + logical unsigned shift 2026-06-27 16:04:19 -04:00
README.md Vendor clojure-test-suite as a standing gate (make cts) 2026-07-02 03:46:57 -04:00
repl-reader-test.clj fix REPL treating a regex literal as an unbalanced form 2026-06-30 23:44:22 -04:00
transient-test.ss Clean up codebase: rename stdlib layer, strip porting residue, fix tooling 2026-06-22 22:18:00 -04:00
unit.edn Read an unknown #tag as a tagged-literal value 2026-07-01 16:17:52 -04:00
values-test.ss Clean up codebase: rename stdlib layer, strip porting residue, fix tooling 2026-06-22 22:18:00 -04:00

Chez test harness

The correctness gate for jolt. Pure Chez (+ Clojure for the JVM oracle). Correctness is judged against the JVM-sourced conformance spec; the spec itself lives in test/conformance/ (see its SPEC.md). Run the whole gate with make test from the repo root.

The spec corpus

corpus.edn is the contract: ~2920 rows {:suite :label :expected :actual}, with :expected sourced from reference JVM Clojure by test/conformance/regen-corpus.clj. It is frozen (the canonical source) — add or change cases here, then re-source the answers with regen-corpus.clj and re-certify with test/conformance/certify.clj.

The gate runners (host/chez/)

  • run-corpus.ss — runs every corpus case through the spine (read → analyze → IR → emit → eval, all on Chez), comparing each result 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.

    chez --script host/chez/run-corpus.ss
    JOLT_CORPUS_LIMIT=200 …            # every-Nth stride, fast iteration
    JOLT_CHEZ_ZJ_FLOOR=N …            # override the floor (default 2678)
    
  • run-unit.ss — host-specific unit cases (test/chez/unit.edn) that aren't in the JVM-portable corpus: dot-forms, java statics, io, reader, walk, vars/namespaces, refs. Each :expr is evaluated in-process and its printed value compared to a baked :expected (:throws asserts a raise).

  • selfcheck.sh — self-host fixpoint: bootstrap.ss rebuild byte-equals the checked-in seed (host/chez/seed/).

  • smoke.sh — real bin/joltc -e CLI smoke.

  • cts.sh — the vendored jank-lang/clojure-test-suite (vendor/clojure-test-suite, a per-core-fn clojure.test suite shared across Clojure dialects), run one namespace per joltc process (a hang or crash is contained) through the test/chez/cts-app project and cts-run runner. Per-namespace fail/error counts must exactly match the checked-in baseline test/chez/cts-known-failures.txt — a namespace doing worse fails the gate, and one doing better fails as stale until the baseline is updated in the same change. make cts; JOLT_CTS_NS=ns1,ns2 runs a subset verbosely, JOLT_CTS_WRITE_BASELINE=1 regenerates the baseline.

Other Chez tests

  • values-test.ss — the value model (nil/truthiness/collections). make values.
  • bench-chez.ss — compute bench through the pipeline (opt-in; not in the gate).

All runners assume chez on PATH.