Move the Chez test oracle off Janet
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
This commit is contained in:
parent
8d4f83e0f7
commit
9a273e71cd
21 changed files with 205 additions and 1510 deletions
|
|
@ -1,67 +1,67 @@
|
|||
# jolt-avt6 — host class statics + constructors on Chez. The analyzer lowers
|
||||
# Class/member to :host-static and (Class. ...) to :host-new; the Chez emit lowers
|
||||
# them to host-static-ref/host-static-call/host-new (host-static.ss registry).
|
||||
# Expectations are the build/jolt (seed) oracle, captured per case.
|
||||
# Each case carries its expected printed value. Env-dependent values (os.name) are
|
||||
# asserted via a predicate so the case stays portable across machines.
|
||||
#
|
||||
# janet test/chez/_javastatic.janet
|
||||
(def jolt-bin (or (os/getenv "JOLT_BIN") "bin/jolt-chez"))
|
||||
(def jolt-bin (or (os/getenv "JOLT_BIN") "bin/joltc"))
|
||||
|
||||
# [label expr] — expected is whatever build/jolt prints (captured at runtime).
|
||||
(def exprs
|
||||
["(Math/sqrt 16)"
|
||||
"(Math/abs -3)"
|
||||
"(Math/max 2 7)"
|
||||
"(pos? Long/MAX_VALUE)"
|
||||
"(String/valueOf 42)"
|
||||
"(String/valueOf \"hi\")"
|
||||
"(String/valueOf :k)"
|
||||
"(String/valueOf nil)"
|
||||
"(Long/parseLong \"42\")"
|
||||
"(Long/valueOf \"42\")"
|
||||
"(Integer/parseInt \"ff\" 16)"
|
||||
"(.byteValue (Integer/valueOf \"ff\" 16))"
|
||||
"(Boolean/parseBoolean \"true\")"
|
||||
"(Boolean/parseBoolean \"yes\")"
|
||||
"(Character/isUpperCase \\A)"
|
||||
"(Character/isLowerCase \\a)"
|
||||
"(Character/isUpperCase \\a)"
|
||||
"(Thread/interrupted)"
|
||||
"(System/getProperty \"os.name\")"
|
||||
"(string? (get (System/getenv) \"HOME\"))"
|
||||
"(string? (System/getenv \"HOME\"))"
|
||||
"(fn? System/exit)"
|
||||
"(string? (get (System/getProperties) \"os.name\"))"
|
||||
"(pos? (count (seq (System/getenv))))"
|
||||
"(let [es (map (fn [[k v]] [k v]) (System/getenv))] (and (pos? (count es)) (every? vector? es)))"
|
||||
(def cases
|
||||
[["(Math/sqrt 16)" "4"]
|
||||
["(Math/abs -3)" "3"]
|
||||
["(Math/max 2 7)" "7"]
|
||||
["(pos? Long/MAX_VALUE)" "true"]
|
||||
["(String/valueOf 42)" "42"]
|
||||
["(String/valueOf \"hi\")" "hi"]
|
||||
["(String/valueOf :k)" ":k"]
|
||||
["(String/valueOf nil)" "null"]
|
||||
["(Long/parseLong \"42\")" "42"]
|
||||
["(Long/valueOf \"42\")" "42"]
|
||||
["(Integer/parseInt \"ff\" 16)" "255"]
|
||||
["(.byteValue (Integer/valueOf \"ff\" 16))" "-1"]
|
||||
["(Boolean/parseBoolean \"true\")" "true"]
|
||||
["(Boolean/parseBoolean \"yes\")" "false"]
|
||||
["(Character/isUpperCase \\A)" "true"]
|
||||
["(Character/isLowerCase \\a)" "true"]
|
||||
["(Character/isUpperCase \\a)" "false"]
|
||||
["(Thread/interrupted)" "false"]
|
||||
["(string? (System/getProperty \"os.name\"))" "true"]
|
||||
["(string? (get (System/getenv) \"HOME\"))" "true"]
|
||||
["(string? (System/getenv \"HOME\"))" "true"]
|
||||
["(fn? System/exit)" "true"]
|
||||
["(string? (get (System/getProperties) \"os.name\"))" "true"]
|
||||
["(pos? (count (seq (System/getenv))))" "true"]
|
||||
["(let [es (map (fn [[k v]] [k v]) (System/getenv))] (and (pos? (count es)) (every? vector? es)))" "true"]
|
||||
# constructors + their methods
|
||||
"(.toString (StringBuilder. \"x\"))"
|
||||
"(.toString (-> (StringBuilder.) (.append \"a\") (.append \\b) (.append 1)))"
|
||||
"(.toString (.append (StringBuilder. 16) \"x\"))"
|
||||
"(let [sb (StringBuilder.)] (.append sb \"abcd\") (.setLength sb 2) (.toString sb))"
|
||||
"(let [w (StringWriter.)] (.write w \"a\") (.append w \\b) (.toString w))"
|
||||
"(let [r (StringReader. \"ab\")] [(.read r) (.read r) (.read r)])"
|
||||
"(let [r (StringReader. \"ab\")] (.mark r 1) [(.read r) (do (.reset r) (.read r))])"
|
||||
"(let [r (java.io.PushbackReader. (java.io.StringReader. \"ab\"))] [(.read r) (.read r)])"
|
||||
"(let [r (PushbackReader. (StringReader. \"ab\")) a (.read r)] (.unread r a) [a (.read r) (.read r)])"
|
||||
"(let [r (PushbackReader. (StringReader. \"a\"))] (.unread r \\x) [(.read r) (.read r)])"
|
||||
"(BigInteger. \"123\")"
|
||||
"(let [m (HashMap. {:a 1 :b 2})] (.get m :b))"
|
||||
"(let [m (HashMap. {})] (.put m :x 1) (.put m :y 2) (.size m))"
|
||||
"(let [t (StringTokenizer. \"a=1&b=2\" \"&\")] [(.nextToken t) (.nextToken t)])"
|
||||
"(.toString (StringBuilder. \"x\"))"
|
||||
["(.toString (StringBuilder. \"x\"))" "x"]
|
||||
["(.toString (-> (StringBuilder.) (.append \"a\") (.append \\b) (.append 1)))" "ab1"]
|
||||
["(.toString (.append (StringBuilder. 16) \"x\"))" "x"]
|
||||
["(let [sb (StringBuilder.)] (.append sb \"abcd\") (.setLength sb 2) (.toString sb))" "ab"]
|
||||
["(let [w (StringWriter.)] (.write w \"a\") (.append w \\b) (.toString w))" "ab"]
|
||||
["(let [r (StringReader. \"ab\")] [(.read r) (.read r) (.read r)])" "[97 98 -1]"]
|
||||
["(let [r (StringReader. \"ab\")] (.mark r 1) [(.read r) (do (.reset r) (.read r))])" "[97 97]"]
|
||||
["(let [r (java.io.PushbackReader. (java.io.StringReader. \"ab\"))] [(.read r) (.read r)])" "[97 98]"]
|
||||
["(let [r (PushbackReader. (StringReader. \"ab\")) a (.read r)] (.unread r a) [a (.read r) (.read r)])" "[97 97 98]"]
|
||||
["(let [r (PushbackReader. (StringReader. \"a\"))] (.unread r \\x) [(.read r) (.read r)])" "[120 97]"]
|
||||
["(BigInteger. \"123\")" "123"]
|
||||
["(let [m (HashMap. {:a 1 :b 2})] (.get m :b))" "2"]
|
||||
["(let [m (HashMap. {})] (.put m :x 1) (.put m :y 2) (.size m))" "2"]
|
||||
["(let [t (StringTokenizer. \"a=1&b=2\" \"&\")] [(.nextToken t) (.nextToken t)])" "[a=1 b=2]"]
|
||||
["(.toString (StringBuilder. \"x\"))" "x"]
|
||||
# ring-codec surface
|
||||
"(URLEncoder/encode \"a b=c\")"
|
||||
"(URLDecoder/decode (URLEncoder/encode \"x &=%?\"))"
|
||||
"(String. (.encode (Base64/getEncoder) (.getBytes \"hello\")))"
|
||||
"(String. (.decode (Base64/getDecoder) (String. (.encode (Base64/getEncoder) (.getBytes \"hello\")))))"
|
||||
"(Integer/parseInt \"ff\" 16)"
|
||||
["(URLEncoder/encode \"a b=c\")" "a+b%3Dc"]
|
||||
["(URLDecoder/decode (URLEncoder/encode \"x &=%?\"))" "x &=%?"]
|
||||
["(String. (.encode (Base64/getEncoder) (.getBytes \"hello\")))" "aGVsbG8="]
|
||||
["(String. (.decode (Base64/getDecoder) (String. (.encode (Base64/getEncoder) (.getBytes \"hello\")))))" "hello"]
|
||||
["(Integer/parseInt \"ff\" 16)" "255"]
|
||||
# Pattern statics
|
||||
"(regex? (Pattern/compile \"a.c\"))"
|
||||
"(.split (Pattern/compile \",\") \"a,b,c\")"
|
||||
"(do (require '[clojure.string :as s]) (s/replace \"a1b2\" (Pattern/compile \"[0-9]\") \"\"))"
|
||||
"(boolean (re-find (Pattern/compile \"^x\" Pattern/MULTILINE) \"y\\nx\"))"
|
||||
"(boolean (re-find (re-pattern (Pattern/quote \"a.c\")) \"za.cy\"))"
|
||||
"(boolean (re-find (re-pattern (Pattern/quote \"a.c\")) \"zabcy\"))"])
|
||||
["(regex? (Pattern/compile \"a.c\"))" "true"]
|
||||
["(.split (Pattern/compile \",\") \"a,b,c\")" "(a b c)"]
|
||||
["(do (require '[clojure.string :as s]) (s/replace \"a1b2\" (Pattern/compile \"[0-9]\") \"\"))" "ab"]
|
||||
["(boolean (re-find (Pattern/compile \"^x\" Pattern/MULTILINE) \"y\\nx\"))" "true"]
|
||||
["(boolean (re-find (re-pattern (Pattern/quote \"a.c\")) \"za.cy\"))" "true"]
|
||||
["(boolean (re-find (re-pattern (Pattern/quote \"a.c\")) \"zabcy\"))" "false"]])
|
||||
|
||||
(defn run-capture [bin expr]
|
||||
(def proc (os/spawn [bin "-e" expr] :p {:out :pipe :err :pipe}))
|
||||
|
|
@ -74,16 +74,14 @@
|
|||
|
||||
(var pass 0)
|
||||
(def fails @[])
|
||||
(each expr exprs
|
||||
(def [ocode oracle _] (run-capture "build/jolt" expr))
|
||||
(each [expr expected] cases
|
||||
(def [code got err] (run-capture jolt-bin expr))
|
||||
(cond
|
||||
(not= ocode 0) (array/push fails [expr (string "ORACLE FAILED exit " ocode)])
|
||||
(not= code 0) (array/push fails [expr (string "exit " code "; err: " err)])
|
||||
(= got oracle) (++ pass)
|
||||
(array/push fails [expr (string "want `" oracle "`, got `" got "`")])))
|
||||
(= got expected) (++ pass)
|
||||
(array/push fails [expr (string "want `" expected "`, got `" got "`")])))
|
||||
|
||||
(printf "\n_javastatic parity [%s]: %d/%d passed" jolt-bin pass (length exprs))
|
||||
(printf "\n_javastatic parity [%s]: %d/%d passed" jolt-bin pass (length cases))
|
||||
(when (> (length fails) 0)
|
||||
(printf "%d FAIL(s):" (length fails))
|
||||
(each [e m] fails (printf " FAIL %s\n %s" e m)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue