jolt/test/core-test.janet
Yogthos cdcf569506 Initial commit: Jolt — Clojure interpreter on Janet
- PEG-based Clojure reader (symbols, keywords, numbers, strings, lists,
  vectors, maps, sets, quote forms, reader macros, metadata)
- Tree-walking evaluator (quote, do, if, def, fn*, let*, loop*/recur,
  syntax-quote/unquote/unquote-splicing, macro system, ns/require/in-ns)
- 95+ clojure.core functions (predicates, math, collections, seq ops,
  higher-order, atoms, I/O)
- Public API (init, eval-string, eval-string*)
- REPL (jolt/main.janet)
- 7 test suites, all green
- MIT license
2026-06-01 16:48:56 -04:00

110 lines
4.6 KiB
Text

(use ../src/jolt/types)
(use ../src/jolt/reader)
(use ../src/jolt/evaluator)
(use ../src/jolt/core)
# Helper: create a fresh bootstrapped context
(defn make-boot-ctx []
(let [ctx (make-ctx)]
(init-core! ctx)
ctx))
# Helper: parse + eval
(defn eval-str [ctx s]
(let [form (parse-string s)]
(eval-form ctx @{} form)))
(print "1: predicates...")
(let [ctx (make-boot-ctx)]
(assert (= true (eval-str ctx "(nil? nil)")) "nil?")
(assert (= false (eval-str ctx "(nil? 1)")) "nil? false")
(assert (= true (eval-str ctx "(string? \"hello\")")) "string?")
(assert (= true (eval-str ctx "(number? 42)")) "number?")
(assert (= true (eval-str ctx "(fn? inc)")) "fn?")
(assert (= true (eval-str ctx "(keyword? :foo)")) "keyword?")
(assert (= false (eval-str ctx "(keyword? 1)")) "keyword? false")
(assert (= true (eval-str ctx "(zero? 0)")) "zero?")
(assert (= true (eval-str ctx "(pos? 1)")) "pos?")
(assert (= true (eval-str ctx "(neg? -1)")) "neg?")
(assert (= true (eval-str ctx "(even? 2)")) "even?")
(assert (= true (eval-str ctx "(odd? 1)")) "odd?")
(assert (= true (eval-str ctx "(empty? [])")) "empty? vector")
(assert (= false (eval-str ctx "(empty? [1])")) "empty? non-empty"))
(print " passed")
(print "2: math...")
(let [ctx (make-boot-ctx)]
(assert (= 0 (eval-str ctx "(+)")) "+ 0 args")
(assert (= 5 (eval-str ctx "(+ 2 3)")) "+ 2 args")
(assert (= 10 (eval-str ctx "(+ 1 2 3 4)")) "+ varargs")
(assert (= -5 (eval-str ctx "(- 5)")) "- unary")
(assert (= 2 (eval-str ctx "(- 5 3)")) "- binary")
(assert (= 6 (eval-str ctx "(* 2 3)")) "*")
(assert (= 1 (eval-str ctx "(*)")) "* 0 args")
(assert (= 42 (eval-str ctx "(inc 41)")) "inc")
(assert (= 40 (eval-str ctx "(dec 41)")) "dec")
(assert (= 4 (eval-str ctx "(max 1 4 2)")) "max"))
(print " passed")
(print "3: comparison...")
(let [ctx (make-boot-ctx)]
(assert (= true (eval-str ctx "(= 1 1)")) "= same")
(assert (= false (eval-str ctx "(= 1 2)")) "= diff")
(assert (= true (eval-str ctx "(= 1 1 1)")) "= multi same")
(assert (= false (eval-str ctx "(= 1 2 1)")) "= multi diff")
(assert (= true (eval-str ctx "(not= 1 2)")) "not="))
(print " passed")
(print "4: collections...")
(let [ctx (make-boot-ctx)]
(assert (= 3 (eval-str ctx "(count [1 2 3])")) "count vector")
(assert (= 1 (eval-str ctx "(first [1 2 3])")) "first")
(assert (deep= [2 3] (eval-str ctx "(rest [1 2 3])")) "rest")
(assert (= nil (eval-str ctx "(next [1])")) "next singleton")
(assert (deep= [1 2 3] (eval-str ctx "(conj [1 2] 3)")) "conj vector")
(assert (= 1 (eval-str ctx "(get {:a 1} :a)")) "get map")
(assert (= 2 (eval-str ctx "(get [1 2 3] 1)")) "get vector")
(assert (= :default (eval-str ctx "(get {:a 1} :b :default)")) "get default")
(assert (deep= {:a 1 :c 3} (eval-str ctx "(assoc {:a 1} :c 3)")) "assoc")
(assert (deep= {:a 1} (eval-str ctx "(dissoc {:a 1 :b 2} :b)")) "dissoc"))
(print " passed")
(print "5: seq ops...")
(let [ctx (make-boot-ctx)]
(assert (deep= [2 3 4] (eval-str ctx "(map inc [1 2 3])")) "map")
(assert (deep= [2 4] (eval-str ctx "(filter even? [1 2 3 4])")) "filter")
(assert (= 6 (eval-str ctx "(reduce + [1 2 3])")) "reduce")
(assert (= 10 (eval-str ctx "(reduce + 4 [1 2 3])")) "reduce with val")
(assert (deep= [1 2] (eval-str ctx "(take 2 [1 2 3 4])")) "take")
(assert (deep= [3 4] (eval-str ctx "(drop 2 [1 2 3 4])")) "drop")
(assert (deep= [1 2] (eval-str ctx "(take-while (fn* [x] (<= x 2)) [1 2 3 4])")) "take-while"))
(print " passed")
(print "6: range...")
(let [ctx (make-boot-ctx)]
(assert (deep= [0 1 2 3 4] (eval-str ctx "(range 5)")) "range end")
(assert (deep= [2 3 4] (eval-str ctx "(range 2 5)")) "range start end"))
(print " passed")
(print "7: higher-order...")
(let [ctx (make-boot-ctx)]
(assert (= 42 (eval-str ctx "(identity 42)")) "identity")
(assert (= 42 (eval-str ctx "(let* [f (constantly 42)] (f))")) "constantly")
(assert (= 3 (eval-str ctx "(let* [f (comp inc inc)] (f 1))")) "comp")
(assert (deep= [2 0] (eval-str ctx "(let* [f (juxt inc dec)] (f 1))")) "juxt"))
(print " passed")
(print "8: str...")
(let [ctx (make-boot-ctx)]
(assert (= "hello" (eval-str ctx "(str \"hello\")")) "str")
(assert (= "hello42" (eval-str ctx "(str \"hello\" 42)")) "str concat"))
(print " passed")
(print "9: atom...")
(let [ctx (make-boot-ctx)]
(assert (= 1 (eval-str ctx "(let* [a (atom 1)] (deref a))")) "atom + deref")
(assert (= 42 (eval-str ctx "(let* [a (atom 1)] (reset! a 42) (deref a))")) "reset!")
(assert (= 2 (eval-str ctx "(let* [a (atom 1)] (swap! a inc) (deref a))")) "swap!"))
(print " passed")
(print "\nAll core tests passed!")