jolt/test/chez
Yogthos e66a91750e Numbers-style category dispatch for binary numeric ops
Arithmetic and comparisons lowered to raw Chez ops, so an operand outside
Chez's tower (BigDecimal) crashed with a raw condition, and Chez contagion
leaked: (* 1.0 0) gave exact 0 where the JVM gives 0.0, (* ##Inf 0) gave 0
instead of ##NaN, (/ 1 0) raised an untyped error.

One seam now (host/chez/seq.ss): call position emits jolt-n* macros with the
both-Chez-numbers fast path open-coded; value position folds through the same
binary ops. Anything outside the tower falls to per-op slow hooks that
java/bigdec.ss extends, so bigdec arithmetic works in every position (the old
static-only :bigdec typing limitation is gone). JVM rules patched into the
fast path: a double operand wins, an exact zero divisor throws
ArithmeticException while a double zero divisor yields Inf/NaN, quot/rem/mod
cover ratios and doubles, min/max return the original operand with NaN
winning, a nil operand is NPE and a non-number CCE, zero-arg -// throw
ArityException at runtime instead of failing expansion.

Also: with-precision now binds *math-context* and bigdec results round with
real RoundingMode semantics (UNNECESSARY throws; division rounds to precision
instead of throwing); rationalize goes through the shortest decimal print
like BigDecimal.valueOf (the identity stub is gone); ratios coerce to bigdec
like Numbers.toBigDecimal; min/max int-literal operands no longer coerce to
flonum in the numeric pass.

Perf neutral: fib and seq benches unchanged (the fast path is two type checks
the optimizer folds); hinted fl/fx paths untouched. 19 JVM-certified corpus
rows; cts baseline 5614->5730 pass, 192->88 errors, 84->79 baselined
namespaces.
2026-07-02 06:41:45 -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 Numbers-style category dispatch for binary numeric ops 2026-07-02 06:41:45 -04:00
cts-known-failures.txt Numbers-style category dispatch for binary numeric ops 2026-07-02 06:41:45 -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.