Bugs fixed: - core-pr-str: now proper fn with keyword-aware rendering (was aliased to core-str which loses the : prefix) - core-seq nil: return nil instead of empty array - core-rest nil: return nil instead of @[] - core-every-pred: new function (stub returning false for now) Tests re-added: - section 16: pr-str for keywords (:hello → ":hello") - section 20: first nil → nil, seq nil → nil - section 23: var-dynamic? test (function exists since Phase 3) - section 21: @ deref reader macro (already works) - section 18: with-meta map equality test Stubs/deferred: - every-pred: stub returning false (Phase 15 IFn protocol needed) - & rest destructuring: Phase 15 (destructuring completion) 316 ok, 1 fail (pre-existing, unchanged)
72 lines
3 KiB
Text
72 lines
3 KiB
Text
(use ../src/jolt/api)
|
|
(defn ct-eval [ctx s] (eval-string ctx s))
|
|
(print "=== CLJS Ported Part 2 ===")
|
|
(print "12: atoms...")
|
|
(let [ctx (init)]
|
|
(assert (= 0 (ct-eval ctx "(deref (atom 0))")) "deref")
|
|
(assert (= 1 (ct-eval ctx "(let [a (atom 0)] (swap! a inc) (deref a))")) "swap!")
|
|
(assert (= true (ct-eval ctx "(atom? (atom 0))")) "atom?"))
|
|
(print " ok")
|
|
(print "13: special forms...")
|
|
(let [ctx (init)]
|
|
(assert (= 30 (ct-eval ctx "(let [x 10 y 20] (+ x y))")) "let")
|
|
(assert (= :a (ct-eval ctx "(if true :a :b)")) "if true")
|
|
(assert (= :b (ct-eval ctx "(if false :a :b)")) "if false")
|
|
(assert (= 2 (ct-eval ctx "(do 1 2)")) "do")
|
|
(assert (= 3 (ct-eval ctx "(loop [x 0] (if (< x 3) (recur (inc x)) x))")) "loop")
|
|
(assert (= "caught" (ct-eval ctx "(try (throw 42) (catch Exception e \"caught\"))")) "try catch"))
|
|
(print " ok")
|
|
(print "14: macros...")
|
|
(let [ctx (init)]
|
|
(ct-eval ctx "(defn add [a b] (+ a b))")
|
|
(assert (= 7 (ct-eval ctx "(add 3 4)")) "defn")
|
|
(assert (= 42 (ct-eval ctx "(when true 42)")) "when")
|
|
(assert (= 3 (ct-eval ctx "(and 1 2 3)")) "and")
|
|
(assert (= 1 (ct-eval ctx "(or 1 2 3)")) "or")
|
|
(assert (= 49 (ct-eval ctx "((fn [x] (* x x)) 7)")) "fn"))
|
|
(print " ok")
|
|
(print "15: constructors...")
|
|
(let [ctx (init)]
|
|
(assert (= 3 (ct-eval ctx "(count (vector 1 2 3))")) "vector count")
|
|
(assert (= 2 (ct-eval ctx "(count (hash-map :a 1 :b 2))")) "hash-map count")
|
|
(assert (= 3 (ct-eval ctx "(count (hash-set 1 2 3))")) "hash-set count")
|
|
(assert (= 3 (ct-eval ctx "(count (zipmap [:a :b :c] [1 2 3]))")) "zipmap count"))
|
|
(print " ok")
|
|
(print "16: printing...")
|
|
(let [ctx (init)]
|
|
(assert (= "hello" (ct-eval ctx "(str \"hello\")")) "str")
|
|
(assert (= "42" (ct-eval ctx "(str 42)")) "str number")
|
|
(assert (= "a" (ct-eval ctx "(name :a)")) "name"))
|
|
(print " ok")
|
|
(print "17: apply...")
|
|
(let [ctx (init)]
|
|
(assert (= 3 (ct-eval ctx "(apply + [1 2])")) "apply +")
|
|
(assert (= 3 (ct-eval ctx "(apply max [1 3 2])")) "apply max"))
|
|
(print " ok")
|
|
(print "18: equality...")
|
|
(let [ctx (init)]
|
|
(assert (= true (ct-eval ctx "(= {:a 1 :b 2} {:b 2 :a 1})")) "map order-independent")
|
|
(assert (= false (ct-eval ctx "(= {:a 1} {:a 2})")) "map different values")
|
|
(assert (= 3 (ct-eval ctx "(count (quote (1 2 3)))")) "quote list count"))
|
|
(print " ok")
|
|
(print "19: higher-order...")
|
|
(let [ctx (init)]
|
|
(assert (= 3 (ct-eval ctx "((comp inc inc) 1)")) "comp")
|
|
(assert (function? (ct-eval ctx "(partial + 1 2)")) "partial returns fn")
|
|
(assert (= 3 (ct-eval ctx "(identity 3)")) "identity"))
|
|
(print " ok")
|
|
(print "20: seq edge cases...")
|
|
(let [ctx (init)]
|
|
(assert (= nil (ct-eval ctx "(seq [])")) "seq empty")
|
|
(assert (= 1 (ct-eval ctx "(first [1 2 3])")) "first vector"))
|
|
(print " ok")
|
|
(print "21: atoms extended...")
|
|
(let [ctx (init)]
|
|
(ct-eval ctx "(def a (atom 10))")
|
|
(assert (= 10 (ct-eval ctx "(deref a)")) "deref")
|
|
(ct-eval ctx "(reset! a 42)")
|
|
(assert (= 42 (ct-eval ctx "(deref a)")) "reset!")
|
|
(ct-eval ctx "(swap! a inc)")
|
|
(assert (= 43 (ct-eval ctx "(deref a)")) "swap! inc"))
|
|
(print " ok")
|
|
(print "\nAll CLJS Ported Part 2 tests passed!")
|