jolt/test/chez
Yogthos f80f9aab4b One IRef seam: watches/validators/meta over atom, var, and agent
add-watch/remove-watch/set-validator!/get-validator were atom-only; the
atom ctor ignored :meta and :validator; watching a var crashed. Now the
ARef contract is one seam: atoms keep their record slots (hot path
unchanged), every other reference type registers a predicate and stores
watches/validators in identity-keyed side tables, and notifies at its
mutation points. Vars notify on root changes (def on a watched var,
var-set outside a thread binding, alter-var-root — thread-binding sets
don't notify, like the JVM); agents notify per action. The def-var! wrap
costs two weak-table probes per def and does IRef work only on a watched
var.

Ctor options follow ARef: the validator gates the initial value
(IllegalStateException 'Invalid reference state' — also the class for
rejected swap!/reset!), :meta must be a map (else ClassCastException),
nil allowed. meta reads any reference through the identity side-table
(the type-gated fall-through is gone); alter-meta!/reset-meta! work on
non-var references.

Runtime-only (no re-mint). 9 JVM-certified corpus rows; spec entry; cts
baseline 5781 -> 5805 pass, 73 baselined namespaces (the residual error
in the watch namespaces is their STM ref section — refs stay out of
scope).
2026-07-02 09:07:00 -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 One IRef seam: watches/validators/meta over atom, var, and agent 2026-07-02 09:07:00 -04:00
cts-known-failures.txt One IRef seam: watches/validators/meta over atom, var, and agent 2026-07-02 09:07:00 -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.