jolt/test/chez/bootstrap-test.janet
Yogthos 2c74476aed Chez Phase 3 inc9a: self-contained Chez bootstrap (no Janet in the loop)
Makes the inc8 fixpoint the actual build. host/chez/bootstrap.ss loads a seed
(prelude, image) pair and rebuilds the clojure.core prelude + compiler image from
source via the on-Chez compiler — read/analyze/emit all on Chez, zero Janet.

The seed (host/chez/seed/{prelude,image}.ss) is the checked-in bootstrap
compiler, minted once via the fixpoint (driver/mint-chez-seed* iterates
bootstrap.ss from the Janet-emitted pair to a joint byte-fixpoint). It's a joint
fixpoint: rebuilding from an up-to-date seed reproduces it exactly. So a fresh
checkout + Chez (no Janet) yields a working jolt.

test/chez/bootstrap-test.janet spawns only chez, asserts the rebuilt artifacts
match the seed byte-for-byte and compile+run real cases. Drift (seed sources
changed) fails the test with a re-mint pointer; host/chez/seed/README documents
re-minting.
2026-06-20 06:46:05 -04:00

72 lines
3.6 KiB
Text

# Chez Phase 3 inc9a (jolt-9phg) — the pure-Chez self-build (no Janet in the loop).
#
# inc8 proved the on-Chez compiler reproduces itself. inc9a makes that the actual
# build: host/chez/bootstrap.ss loads the CHECKED-IN seed (host/chez/seed/{prelude,
# image}.ss — the bootstrap compiler, minted once via the fixpoint) and rebuilds the
# clojure.core prelude + compiler image FROM SOURCE on Chez. No Janet is invoked in
# the compile path — this test only spawns `chez`; the read->analyze->emit is 100%
# Chez. So a fresh checkout + Chez (no Janet) yields a working jolt.
#
# The seed is a JOINT byte-fixpoint, so rebuilding from an up-to-date seed
# reproduces it exactly. If the seed SOURCES change (core tiers, the compiler, the
# host contract, the reader, emit-image.ss) the rebuilt artifacts will differ and
# this test fails — re-mint the seed with driver/mint-chez-seed* (see the failure
# message) and commit the refreshed seed.
#
# janet test/chez/bootstrap-test.janet
(import ../../host/chez/driver :as d)
(var total 0) (var fails 0)
(defn ok [name pred &opt extra]
(++ total)
(if pred (printf "ok: %s" name)
(do (++ fails) (printf "FAIL: %s %s" name (or extra "")))))
(unless (d/chez-available?)
(print "chez not on PATH — skipping bootstrap-test")
(os/exit 0))
(def seed-prelude "host/chez/seed/prelude.ss")
(def seed-image "host/chez/seed/image.ss")
(ok "checked-in seed prelude exists" (os/stat seed-prelude))
(ok "checked-in seed image exists" (os/stat seed-image))
(when (and (os/stat seed-prelude) (os/stat seed-image))
(def tmp (or (os/getenv "TMPDIR") "/tmp"))
(def out-prelude (string tmp "/jolt-bootstrap-pre-" (os/getpid) ".ss"))
(def out-image (string tmp "/jolt-bootstrap-img-" (os/getpid) ".ss"))
(def t0 (os/clock))
# PURE CHEZ: spawn `chez --script bootstrap.ss` — no Janet in the compile path.
(def [code out err] (d/run-bootstrap seed-prelude seed-image out-prelude out-image))
(printf "pure-Chez bootstrap pass: %.1fs" (- (os/clock) t0))
(ok "bootstrap.ss runs cleanly on Chez (no Janet)" (= code 0)
(string "exit " code " " (string/slice err 0 (min 300 (length err)))))
(defn- bytes= [a b] (and (os/stat a) (os/stat b)
(= (string (slurp a)) (string (slurp b)))))
(def remint "re-mint with driver/mint-chez-seed* and commit host/chez/seed/")
(when (= code 0)
(ok "rebuilt prelude == checked-in seed (joint fixpoint)" (bytes= out-prelude seed-prelude)
(string "seed is stale — " remint))
(ok "rebuilt image == checked-in seed (joint fixpoint)" (bytes= out-image seed-image)
(string "seed is stale — " remint))
# The rebuilt artifacts must be a WORKING compiler.
(def cases
[["(let [x 1 y 2] (+ x y))" "3"]
["(defn fib [n] (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) (fib 10)" "55"]
["(->> (range 10) (filter even?) (map #(* % %)) (reduce +))" "120"]
["(let [{:keys [a b] :or {b 9}} {:a 1}] [a b])" "[1 9]"]
["(require '[clojure.string :as s]) (s/join \",\" [1 2 3])" "1,2,3"]
["(loop [i 0 acc 0] (if (< i 5) (recur (inc i) (+ acc i)) acc))" "10"]])
(var pass 0)
(each [src want] cases
(def [c o _] (d/eval-zero-janet out-prelude out-image (string "(do " src ")")))
(when (and (= c 0) (= o want)) (++ pass)))
(ok "Chez-built artifacts compile+run real cases" (= pass (length cases))
(string pass "/" (length cases) " cases passed")))
(each p [out-prelude out-image] (when (os/stat p) (os/rm p))))
(printf "\nbootstrap-test: %d/%d checks passed" (- total fails) total)
(os/exit (if (zero? fails) 0 1))