(use ../src/jolt/api) (defn ct-eval [ctx s] (eval-string ctx s)) (print "=== CLJS Ported Part 1 ===") (print "1: core math...") (let [ctx (init)] (assert (= 3 (ct-eval ctx "(+ 1 2)")) "+") (assert (= 0 (ct-eval ctx "(+)")) "+ zero") (assert (= 1 (ct-eval ctx "(- 3 2)")) "-") (assert (= 6 (ct-eval ctx "(* 2 3)")) "*") (assert (= 2 (ct-eval ctx "(/ 4 2)")) "/") (assert (= 3 (ct-eval ctx "(inc 2)")) "inc") (assert (= 1 (ct-eval ctx "(dec 2)")) "dec") (assert (= 1 (ct-eval ctx "(quot 5 3)")) "quot") (assert (= 2 (ct-eval ctx "(rem 5 3)")) "rem") (assert (= 2 (ct-eval ctx "(mod 5 3)")) "mod") (assert (= 3 (ct-eval ctx "(max 1 2 3)")) "max") (assert (= 1 (ct-eval ctx "(min 1 2 3)")) "min")) (print " passed") (print "2: predicates...") (let [ctx (init)] (assert (= true (ct-eval ctx "(nil? nil)")) "nil?") (assert (= false (ct-eval ctx "(nil? 1)")) "nil? false") (assert (= false (ct-eval ctx "(not true)")) "not") (assert (= true (ct-eval ctx "(not false)")) "not false") (assert (= true (ct-eval ctx "(some? 1)")) "some?") (assert (= true (ct-eval ctx "(string? \"hello\")")) "string?") (assert (= true (ct-eval ctx "(number? 42)")) "number?") (assert (= true (ct-eval ctx "(fn? inc)")) "fn?") (assert (= true (ct-eval ctx "(keyword? :foo)")) "keyword?") (assert (= true (ct-eval ctx "(map? {:a 1})")) "map?") (assert (= true (ct-eval ctx "(zero? 0)")) "zero?") (assert (= true (ct-eval ctx "(pos? 5)")) "pos?") (assert (= true (ct-eval ctx "(neg? -1)")) "neg?") (assert (= true (ct-eval ctx "(even? 4)")) "even?") (assert (= true (ct-eval ctx "(odd? 3)")) "odd?")) (print " passed") (print "3: comparison...") (let [ctx (init)] (assert (= true (ct-eval ctx "(= 1 1)")) "=") (assert (= false (ct-eval ctx "(= 1 2)")) "= false") (assert (= true (ct-eval ctx "(= 1 1 1)")) "= three") (assert (= false (ct-eval ctx "(not= 1 1)")) "not= false") (assert (= true (ct-eval ctx "(not= 1 2)")) "not= true") (assert (= true (ct-eval ctx "(< 1 2)")) "<") (assert (= true (ct-eval ctx "(> 2 1)")) ">") (assert (= true (ct-eval ctx "(<= 1 1)")) "<=") (assert (= true (ct-eval ctx "(>= 2 2)")) ">=")) (print " passed") (print "4: vectors...") (let [ctx (init)] (assert (= :a (ct-eval ctx "(nth [:a :b :c :d] 0)")) "nth") (assert (= [1 2 3 4] (ct-eval ctx "(conj [1 2 3] 4)")) "conj") (assert (= 1 (ct-eval ctx "(first [1 2 3])")) "first") (assert (= [2 3] (ct-eval ctx "(rest [1 2 3])")) "rest") (assert (= 3 (ct-eval ctx "(count [1 2 3])")) "count")) (print " passed") (print "5: maps...") (let [ctx (init)] (assert (= 1 (ct-eval ctx "(get {:a 1} :a)")) "get") (assert (= nil (ct-eval ctx "(get {:a 1} :z)")) "get missing") (assert (= :d (ct-eval ctx "(get {:a 1} :z :d)")) "get default") (assert (= {:a 1 :b 2} (ct-eval ctx "(assoc {:a 1} :b 2)")) "assoc") (assert (= {:b 2} (ct-eval ctx "(dissoc {:a 1 :b 2} :a)")) "dissoc") (assert (= true (ct-eval ctx "(contains? {:a 1} :a)")) "contains?") (assert (= 3 (ct-eval ctx "(count {:a 1 :b 2 :c 3})")) "count") (assert (= 2 (ct-eval ctx "(count (keys {:a 1 :b 2}))")) "keys count")) (print " passed") (print "6: sets...") (let [ctx (init)] (assert (= true (ct-eval ctx "(set? #{1 2 3})")) "set?") (assert (= 4 (ct-eval ctx "(count (conj #{1 2 3} 4))")) "conj") (assert (= 2 (ct-eval ctx "(count (disj #{1 2 3} 3))")) "disj") (assert (= 3 (ct-eval ctx "(count #{1 2 3})")) "count") (assert (= true (ct-eval ctx "(= #{1 2 3} #{3 2 1})")) "= order-independent")) (print " passed") (print "7: seq operations...") (let [ctx (init)] (assert (= nil (ct-eval ctx "(seq [])")) "seq empty") (assert (= [2 3 4] (ct-eval ctx "(map inc [1 2 3])")) "map") (assert (= 2 (ct-eval ctx "(count (filter odd? [1 2 3 4]))")) "filter") (assert (= 6 (ct-eval ctx "(reduce + [1 2 3])")) "reduce") (assert (= [1 2 3] (ct-eval ctx "(take 3 [1 2 3 4 5])")) "take") (assert (= [4 5] (ct-eval ctx "(drop 3 [1 2 3 4 5])")) "drop") (assert (= [3 2 1] (ct-eval ctx "(reverse [1 2 3])")) "reverse") (assert (= true (ct-eval ctx "(every? even? [2 4 6])")) "every?")) (print " passed") (print "8: printing...") (let [ctx (init)] (assert (= "hello" (ct-eval ctx "(str \"hello\")")) "str") (assert (= "ab" (ct-eval ctx "(str \"a\" \"b\")")) "str two") (assert (= "42" (ct-eval ctx "(str 42)")) "str number") (assert (= "" (ct-eval ctx "(str nil)")) "str nil -> empty string (Clojure semantics)") (assert (= "a" (ct-eval ctx "(name :a)")) "name")) (print " passed") (print "9: 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 " passed") (print "10: equality across types...") (let [ctx (init)] (assert (= true (ct-eval ctx "(= {:a 1 :b 2} {:b 2 :a 1})")) "map order-independent")) (print " passed") (print "11: higher-order fns...") (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 " passed") (print "\nAll CLJS Ported Part 1 tests passed!")