diff --git a/test/cljs-port-1.janet b/test/cljs-port-1.janet index 5ca4894..d7f9edc 100644 --- a/test/cljs-port-1.janet +++ b/test/cljs-port-1.janet @@ -1,11 +1,13 @@ (use ../src/jolt/api) (defn ct-eval [ctx s] (eval-string ctx s)) -(print "CLJS Ported 1-6") -(print "1: math...") +(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") @@ -13,7 +15,7 @@ (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 " ok") +(print " passed") (print "2: predicates...") (let [ctx (init)] (assert (= true (ct-eval ctx "(nil? nil)")) "nil?") @@ -21,26 +23,29 @@ (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 " ok") +(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 " ok") +(print " passed") (print "4: vectors...") (let [ctx (init)] (assert (= :a (ct-eval ctx "(nth [:a :b :c :d] 0)")) "nth") @@ -48,7 +53,7 @@ (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 " ok") +(print " passed") (print "5: maps...") (let [ctx (init)] (assert (= 1 (ct-eval ctx "(get {:a 1} :a)")) "get") @@ -58,14 +63,48 @@ (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")) -(print " ok") + (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 (= #{1 2 3 4} (ct-eval ctx "(conj #{1 2 3} 4)")) "conj") (assert (= #{1 2} (ct-eval ctx "(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")) -(print " ok") -(print "All CLJS-ported 1-6 passed!") + (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 3] (ct-eval ctx "(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 (= "nil" (ct-eval ctx "(str nil)")) "str nil") + (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!") diff --git a/test/cljs-port-1a.janet b/test/cljs-port-1a.janet new file mode 100644 index 0000000..655cff5 --- /dev/null +++ b/test/cljs-port-1a.janet @@ -0,0 +1,75 @@ +(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 (= #{1 2 3 4} (ct-eval ctx "(conj #{1 2 3} 4)")) "conj") + (assert (= #{1 2} (ct-eval ctx "(disj #{1 2 3} 3)")) "disj") + (assert (= 3 (ct-eval ctx "(count #{1 2 3})")) "count") +(print "\nAll CLJS Ported Part 1a tests passed!") + diff --git a/test/cljs-port-1b.janet b/test/cljs-port-1b.janet new file mode 100644 index 0000000..56b2d68 --- /dev/null +++ b/test/cljs-port-1b.janet @@ -0,0 +1,38 @@ +(use ../src/jolt/api) +(defn ct-eval [ctx s] (eval-string ctx s)) +(print "=== CLJS Ported Part 1b ===") +(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 (= [1 3] (ct-eval ctx "(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 (= "nil" (ct-eval ctx "(str nil)")) "str nil") + (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...") +(let [ctx (init)] + (assert (= true (ct-eval ctx "(= {:a 1 :b 2} {:b 2 :a 1})")) "map order")) +(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 1b tests passed!") diff --git a/test/cljs-port-2.janet b/test/cljs-port-2.janet index b6decf7..b47db2f 100644 --- a/test/cljs-port-2.janet +++ b/test/cljs-port-2.janet @@ -1,33 +1,25 @@ (use ../src/jolt/api) (defn ct-eval [ctx s] (eval-string ctx s)) -(print "CLJS Ported 7-12") -(print "7: seq ops...") -(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 (= [1 3] (ct-eval ctx "(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 (ct-eval ctx "(count (reverse [1 2 3]))")) "reverse count") - (assert (= true (ct-eval ctx "(every? even? [2 4 6])")) "every?")) -(print " ok") -(print "8: atoms...") +(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 "9: special forms...") + +(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")) + (assert (= "caught" (ct-eval ctx "(try (throw 42) (catch Exception e \"caught\"))")) "try catch")) (print " ok") -(print "10: macros...") + +(print "14: macros...") (let [ctx (init)] (ct-eval ctx "(defn add [a b] (+ a b))") (assert (= 7 (ct-eval ctx "(add 3 4)")) "defn") @@ -36,17 +28,13 @@ (assert (= 1 (ct-eval ctx "(or 1 2 3)")) "or") (assert (= 49 (ct-eval ctx "((fn [x] (* x x)) 7)")) "fn")) (print " ok") -(print "11: 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 "12: constructors...") + +(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 "All CLJS-ported tests passed!") + +(print "\nAll CLJS Ported Part 2 tests passed!") diff --git a/test/cljs-port-3.janet b/test/cljs-port-3.janet new file mode 100644 index 0000000..7323724 --- /dev/null +++ b/test/cljs-port-3.janet @@ -0,0 +1,47 @@ +(use ../src/jolt/api) +(defn ct-eval [ctx s] (eval-string ctx s)) +(print "=== CLJS Ported Part 3 ===") +(print "16: destructuring...") +(let [ctx (init)] + (assert (= 1 (ct-eval ctx "(let [[x] [1 2 3]] x)")) "seq destructure") + (assert (= 2 (ct-eval ctx "(let [[_ y] [1 2 3]] y)")) "seq destructure rest") + (assert (= 3 (ct-eval ctx "(let [[_ _ z] [1 2 3]] z)")) "seq destructure last")) +(print " passed") +(print "17: set operations...") +(let [ctx (init)] + (assert (= true (ct-eval ctx "(set? #{1 2 3})")) "set?") + (assert (= 3 (ct-eval ctx "(count #{1 2 3})")) "set count") + (assert (= true (ct-eval ctx "(contains? #{1 2} 1)")) "contains? set") + (assert (= 1 (ct-eval ctx "(get #{1 2 3} 1)")) "get set")) +(print " passed") +(print "18: reader literals...") +(let [ctx (init)] + (assert (= [1 2 3] (ct-eval ctx "[1 2 3]")) "vector literal") + (assert (= {:a 1} (ct-eval ctx "{:a 1}")) "map literal") + (assert (= true (ct-eval ctx "true")) "true literal") + (assert (= nil (ct-eval ctx "nil")) "nil literal") + (assert (= 42 (ct-eval ctx "42")) "number literal")) +(print " passed") +(print "19: syntax-quote...") +(let [ctx (init)] + (assert (= true (ct-eval ctx "(= \`(1 2 3) (quote (1 2 3)))")) "sq basic list")) +(print " passed") +(print "20: walk...") +(print " skipped (clojure.walk needs IFn protocol)") +(print "21: clojure.string...") +(let [ctx (init)] + (ct-eval ctx (slurp "src/jolt/clojure/string.clj")) + (assert (= true (ct-eval ctx "(blank? nil)")) "blank? nil") + (assert (= true (ct-eval ctx "(blank? \" \")")) "blank? spaces") + (assert (= "Abc" (ct-eval ctx "(capitalize \"abc\")")) "capitalize") + (assert (= "hello" (ct-eval ctx "(lower-case \"HELLO\")")) "lower-case") + (assert (= "hello" (ct-eval ctx "(trim \" hello \")")) "trim")) +(print " passed") +(print "22: clojure.set...") +(let [ctx (init)] + (ct-eval ctx (slurp "src/jolt/clojure/set.clj")) + (assert (= #{1 2 3} (ct-eval ctx "(union #{1 2} #{2 3})")) "union") + (assert (= #{2} (ct-eval ctx "(intersection #{1 2} #{2 3})")) "intersection") + (assert (= #{1} (ct-eval ctx "(difference #{1 2} #{2 3})")) "difference")) +(print " passed") +(print "\nAll CLJS Ported Part 3 tests passed!") diff --git a/test/cljs-port-4.janet b/test/cljs-port-4.janet new file mode 100644 index 0000000..adc9309 --- /dev/null +++ b/test/cljs-port-4.janet @@ -0,0 +1,48 @@ +(use ../src/jolt/api) +(defn ct-eval [ctx s] (eval-string ctx s)) +(print "=== CLJS Ported Part 4 ===") + +(print "23: deftype/defrecord...") +(let [ctx (init)] + (ct-eval ctx "(deftype Point [x y])") + (assert (= true (ct-eval ctx "(instance? Point (Point. 3 4))")) "instance? true") + (assert (= 3 (ct-eval ctx "(. (Point. 3 4) x)")) ".field access") + (ct-eval ctx "(defrecord Person [name age])") + (assert (= true (ct-eval ctx "(map? (Person. \"A\" 30))")) "record is map?") + (assert (= "Alice" (ct-eval ctx "(:name (Person. \"Alice\" 30))")) "record keyword access")) +(print " ok") + +(print "24: multimethods...") +(let [ctx (init)] + (ct-eval ctx "(defmulti greet (fn [x] (:lang x)))") + (ct-eval ctx "(defmethod greet :en [_] \"hello\")") + (ct-eval ctx "(defmethod greet :fr [_] \"bonjour\")") + (assert (= "hello" (ct-eval ctx "(greet {:lang :en})")) "dispatch :en") + (assert (= "bonjour" (ct-eval ctx "(greet {:lang :fr})")) "dispatch :fr")) +(print " ok") + +(print "25: protocols...") +(let [ctx (init)] + (ct-eval ctx "(defprotocol Greet (g [this]))") + (ct-eval ctx "(deftype Dog [name])") + (ct-eval ctx "(extend-type Dog Greet (g [this] (str \"woof \" (.-name this))))") + (assert (= "woof Rex" (ct-eval ctx "(g (Dog. \"Rex\"))")) "extend-type")) +(print " ok") + +(print "26: var system...") +(let [ctx (init)] + (ct-eval ctx "(def xv 42)") + (assert (= true (ct-eval ctx "(var? (var xv))")) "var?") + (assert (= 42 (ct-eval ctx "(var-get (var xv))")) "var-get") + (ct-eval ctx "(var-set (var xv) 99)") + (assert (= 99 (ct-eval ctx "(var-get (var xv))")) "var-set")) +(print " ok") + +(print "27: range/into/concat...") +(let [ctx (init)] + (assert (= 5 (ct-eval ctx "(count (range 5))")) "range count") + (assert (= [0 1 2 3 4] (ct-eval ctx "(into [] (range 5))")) "range into vec") + (assert (= 4 (ct-eval ctx "(count (concat [1 2] [3 4]))")) "concat count")) +(print " ok") + +(print "\nAll CLJS Ported Part 4 tests passed!")