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
66 lines
No EOL
3.5 KiB
Text
66 lines
No EOL
3.5 KiB
Text
# jolt-nfca (clojure.string half) — the clojure.string namespace on Chez via the
|
|
# alias `s` established by a runtime (require '[clojure.string :as s]). The Chez
|
|
# AOT driver pre-evals require forms against the ctx so the alias resolves at
|
|
# analyze time, and clojure.string is emitted as a prelude tier over the str-*
|
|
# primitives. Each case carries its expected value.
|
|
#
|
|
# janet test/chez/_strns.janet
|
|
(def jolt-bin (or (os/getenv "JOLT_BIN") "bin/joltc"))
|
|
|
|
(defn- with-req [body] (string "(do (require (quote [clojure.string :as s])) " body ")"))
|
|
|
|
# [label body-after-require expected]
|
|
(def cases
|
|
[["upper-case" "(s/upper-case \"abc\")" "ABC"]
|
|
["lower-case" "(s/lower-case \"ABC\")" "abc"]
|
|
["capitalize" "(s/capitalize \"hello\")" "Hello"]
|
|
["trim" "(s/trim \" x \")" "x"]
|
|
["triml" "(= \"x \" (s/triml \" x \"))" "true"]
|
|
["trimr" "(= \" x\" (s/trimr \" x \"))" "true"]
|
|
["blank? empty" "(s/blank? \"\")" "true"]
|
|
["blank? ws" "(s/blank? \" \")" "true"]
|
|
["blank? no" "(s/blank? \"x\")" "false"]
|
|
["blank? nil" "(s/blank? nil)" "true"]
|
|
["includes? y" "(s/includes? \"abcd\" \"bc\")" "true"]
|
|
["includes? n" "(s/includes? \"abcd\" \"zz\")" "false"]
|
|
["starts-with? y" "(s/starts-with? \"abc\" \"ab\")" "true"]
|
|
["starts-with? n" "(s/starts-with? \"abc\" \"bc\")" "false"]
|
|
["ends-with? y" "(s/ends-with? \"abc\" \"bc\")" "true"]
|
|
["join no sep" "(s/join [\"a\" \"b\" \"c\"])" "abc"]
|
|
["join sep" "(s/join \",\" [\"a\" \"b\" \"c\"])" "a,b,c"]
|
|
["join nums" "(s/join \"-\" [1 2 3])" "1-2-3"]
|
|
["split literal" "(s/split \"a,b,c\" \",\")" "[a b c]"]
|
|
["split regex" "(s/split \"a1b2c\" #\"[0-9]\")" "[a b c]"]
|
|
["split-lines" "(s/split-lines \"a\\nb\\nc\")" "[a b c]"]
|
|
["replace lit" "(s/replace \"a_b_c\" \"_\" \"-\")" "a-b-c"]
|
|
["replace regex" "(s/replace \"a1b2\" #\"[0-9]\" \"\")" "ab"]
|
|
["replace-first" "(s/replace-first \"a_b_c\" \"_\" \"-\")" "a-b_c"]
|
|
["reverse" "(s/reverse \"abc\")" "cba"]
|
|
["index-of hit" "(s/index-of \"abc\" \"b\")" "1"]
|
|
["index-of miss" "(nil? (s/index-of \"abc\" \"z\"))" "true"]
|
|
["trim-newline" "(s/trim-newline \"abc\\n\\n\")" "abc"]])
|
|
|
|
(defn run-capture [expr]
|
|
(def proc (os/spawn [jolt-bin "-e" expr] :p {:out :pipe :err :pipe}))
|
|
(def out (ev/read (proc :out) 0x100000))
|
|
(def err (ev/read (proc :err) 0x100000))
|
|
(def code (os/proc-wait proc))
|
|
(def lines (filter (fn [l] (not (empty? l)))
|
|
(string/split "\n" (string/trim (if out (string out) "")))))
|
|
[code (if (empty? lines) "" (last lines)) (if err (string err) "")])
|
|
|
|
(var pass 0)
|
|
(def fails @[])
|
|
(each [label body expected] cases
|
|
(def [code got err] (run-capture (with-req body)))
|
|
(cond
|
|
(not= code 0) (array/push fails [label (string "exit " code "; err: " (string/trim err))])
|
|
(= got expected) (++ pass)
|
|
(array/push fails [label (string "want `" expected "`, got `" got "`")])))
|
|
|
|
(printf "\n_strns parity [%s]: %d/%d passed" jolt-bin pass (length cases))
|
|
(when (> (length fails) 0)
|
|
(printf "%d FAIL(s):" (length fails))
|
|
(each [l m] fails (printf " FAIL [%s] %s" l m)))
|
|
(flush)
|
|
(os/exit (if (empty? fails) 0 1)) |