summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAndrey Listopadov <andreyorst@gmail.com>2022-08-21 18:03:25 +0000
committerAndrey Listopadov <andreyorst@gmail.com>2022-08-21 18:03:25 +0000
commit9bbe5ddf93c7c8b17a73318bc89dd1330f4f3f59 (patch)
tree7d358804b1bcb5ab4f1368d2d60eb2993f4de926 /tests
parent58f91092e2831421aa88be36e9dfa6dd153fd212 (diff)
release v1.0.0
Almost complete rewrite of the library, complete with lazy sequences, immutable tables, transients, transducers, better equality semantics, and more correct code generation in macros.
Diffstat (limited to 'tests')
l---------tests/.dir-locals.el1
-rw-r--r--tests/core.fnl1415
-rw-r--r--tests/fn.fnl139
-rw-r--r--tests/macros.fnl165
4 files changed, 830 insertions, 890 deletions
diff --git a/tests/.dir-locals.el b/tests/.dir-locals.el
new file mode 120000
index 0000000..0b353b0
--- /dev/null
+++ b/tests/.dir-locals.el
@@ -0,0 +1 @@
+../fennel-test/.dir-locals.el \ No newline at end of file
diff --git a/tests/core.fnl b/tests/core.fnl
index bdb2ede..e550b4b 100644
--- a/tests/core.fnl
+++ b/tests/core.fnl
@@ -1,364 +1,288 @@
-(require-macros :init-macros)
+(import-macros clj :init-macros)
(require-macros :fennel-test)
-(local {: add
- : apply
- : assoc
- : boolean?
- : butlast
- : comp
- : complement
- : concat
- : conj
- : cons
- : constantly
- : dec
- : disj
- : dissoc
- : div
- : double?
- : empty?
- : eq
- : even?
- : every?
- : false?
- : filter
- : find
- : first
- : ge
- : get
- : get-in
- : get-method
- : gt
- : hash-map
- : hash-set
- : identity
- : inc
- : int?
- : keys
- : kvseq
- : last
- : le
- : lt
- : map?
- : mapv
- : memoize
- : methods
- : mul
- : multifn?
- : neg-int?
- : neg?
- : nil?
- : not-any?
- : not-empty
- : nthrest
- : odd?
- : ordered-set
- : partition
- : pos-int?
- : pos?
- : range
- : reduce
- : reduce-kv
- : reduced
- : remove-all-methods
- : remove-method
- : rest
- : reverse
- : seq
- : set?
- : some
- : string?
- : sub
- : take
- : true?
- : vals
- : vector
- : vector?
- : zero?} (require :init))
+(local core (require :init))
(deftest test-equality
(testing "comparing base-types"
- (assert-not (pcall eq))
- (assert-eq 1 1)
- (assert-ne 1 2)
- (assert-is (eq 1 1 1 1 1))
- (assert-eq 1.0 1.0)
- (assert-is (eq 1.0 1.0 1.0))
- (assert-is (eq 1.0 1.0 1.0))
- (assert-is (eq "1" "1" "1" "1" "1")))
+ (assert-is (core.eq))
+ (assert-is (core.eq 1 1))
+ (assert-not (core.eq 1 2))
+ (assert-is (core.eq 1 1 1 1 1))
+ (assert-is (core.eq 1.0 1.0))
+ (assert-is (core.eq 1.0 1.0 1.0))
+ (assert-is (core.eq 1.0 1.0 1.0))
+ (assert-is (core.eq "1" "1" "1" "1" "1")))
(testing "deep comparison"
- (assert-is (eq []))
- (assert-eq [] [])
- (assert-eq [] {})
- (assert-eq [1 2] [1 2])
- (assert-eq [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]
- [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]])
- (assert-is (eq [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]
- [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]))
- (assert-is (eq [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]
- [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]
- [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]))
- (assert-not (eq [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]
- [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]
- [[1 [2 [3]] {[6] {:a [1 [1 [1 [1]]]]}}]]))
- (assert-ne [1] [1 2])
- (assert-ne [1 2] [1])
- (assert-is (eq [1 [2]] [1 [2]] [1 [2]]))
- (assert-is (eq [1 [2]] [1 [2]] [1 [2]]))
- (assert-not (eq [1 [2]] [1 [2]] [1 [2 [3]]]))
- (assert-not (eq {:a {:b 2}} {:a {:b 2}} {:a {:b 3}}))
+ (assert-is (core.eq []))
+ (assert-is (core.eq [] []))
+ (assert-is (core.eq [] {}))
+ (assert-is (core.eq [1 2] [1 2]))
+ (assert-is (core.eq [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]
+ [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]))
+ (assert-is (core.eq [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]
+ [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]))
+ (assert-is (core.eq [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]
+ [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]
+ [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]))
+ (assert-not (core.eq [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]
+ [[1 [2 [3]] {[5] {:a [1 [1 [1 [1]]]]}}]]
+ [[1 [2 [3]] {[6] {:a [1 [1 [1 [1]]]]}}]]))
+ (assert-not (core.eq [1] [1 2]))
+ (assert-not (core.eq [1 2] [1]))
+ (assert-is (core.eq [1 [2]] [1 [2]] [1 [2]]))
+ (assert-is (core.eq [1 [2]] [1 [2]] [1 [2]]))
+ (assert-not (core.eq [1 [2]] [1 [2]] [1 [2 [3]]]))
+ (assert-not (core.eq {:a {:b 2}} {:a {:b 2}} {:a {:b 3}}))
(let [a {:a 1 :b 2}
b {:a 1 :b 2}]
(table.insert b 10)
- (assert-ne a b))
+ (assert-not (core.eq a b)))
(let [a [1 2 3]
b [1 2 3]]
(tset b :a 10)
- (assert-ne a b))
+ (assert-not (core.eq a b)))
- (assert-eq [1 2 3] {1 1 2 2 3 3})
- (assert-eq {4 1} [nil nil nil 1])))
+ (assert-is (core.eq [1 2 3] {1 1 2 2 3 3}))
+ (assert-is (core.eq {4 1} [nil nil nil 1]))))
(deftest test-range
(testing "range"
- (assert-not (pcall range))
- (assert-eq (range 10) [0 1 2 3 4 5 6 7 8 9])
- (assert-eq (range -5 5) [-5 -4 -3 -2 -1 0 1 2 3 4])
- (assert-eq [0 0.2 0.4 0.6 0.8] [0 0.2 0.4 0.6 0.8])
- (assert-eq (range 0 1 0.2) (range 0 1 0.2))))
+ (assert-is (core.range))
+ (assert-eq (core.range 10) (core.list 0 1 2 3 4 5 6 7 8 9))
+ (assert-eq (core.range -5 5) (core.list -5 -4 -3 -2 -1 0 1 2 3 4))
+ (assert-eq (core.range 0 1 0.2) (core.range 0 1 0.2))))
+
+(deftest test-empty
+ (testing "empty map"
+ (assert-not (pcall core.empty))
+ (assert-eq (core.empty {}) {})
+ (assert-eq (core.empty "") "")
+ (assert-eq (core.hash-set) (core.empty (core.hash-set :a :b :c)))
+ (assert-eq (core.hash-map) (core.empty (core.hash-map :a :b :c :d)))
+ (assert-eq (core.vector) (core.empty (core.vector :a :b :c :d)))
+ (assert-eq (core.list) (core.empty (core.list :a :b :c :d)))
+ (let [a {:a 1 :b 2}]
+ (assert-eq (core.empty a) {}))
+ (let [a {}]
+ (assert-eq (core.empty a) []))))
(deftest test-predicates
(testing "zero?"
- (assert-is (zero? 0))
- (assert-is (zero? -0))
- (assert-not (zero? 1))
- (assert-not (pcall zero?))
- (assert-not (pcall zero? 1 2)))
+ (assert-is (core.zero? 0))
+ (assert-is (core.zero? -0))
+ (assert-not (core.zero? 1))
+ (assert-not (pcall core.zero?))
+ (assert-not (pcall core.zero? 1 2)))
(testing "int?"
- (assert-is (int? 1))
- (assert-not (int? 1.1))
- (assert-not (pcall int?))
- (assert-not (pcall int? 1 2)))
+ (assert-is (core.int? 1))
+ (assert-not (core.int? 1.1))
+ (assert-not (pcall core.int?))
+ (assert-not (pcall core.int? 1 2)))
(testing "pos?"
- (assert-is (pos? 1))
- (assert-is (and (not (pos? 0)) (not (pos? -1))))
- (assert-not (pcall pos?))
- (assert-not (pcall pos? 1 2)))
+ (assert-is (core.pos? 1))
+ (assert-is (and (not (core.pos? 0)) (not (core.pos? -1))))
+ (assert-not (pcall core.pos?))
+ (assert-not (pcall core.pos? 1 2)))
(testing "neg?"
- (assert-is (neg? -1))
- (assert-is (and (not (neg? 0)) (not (neg? 1))))
- (assert-not (pcall neg?))
- (assert-not (pcall neg? 1 2)))
+ (assert-is (core.neg? -1))
+ (assert-is (and (not (core.neg? 0)) (not (core.neg? 1))))
+ (assert-not (pcall core.neg?))
+ (assert-not (pcall core.neg? 1 2)))
(testing "pos-int?"
- (assert-is (pos-int? 42))
- (assert-not (pos-int? 4.2))
- (assert-not (pcall pos-int?))
- (assert-not (pcall pos-int? 1 2)))
+ (assert-is (core.pos-int? 42))
+ (assert-not (core.pos-int? 4.2))
+ (assert-not (pcall core.pos-int?))
+ (assert-not (pcall core.pos-int? 1 2)))
(testing "neg-int?"
- (assert-is (neg-int? -42))
- ;; (assert-not (neg-int? -4.2))
- (assert-not (pcall neg-int?))
- (assert-not (pcall neg-int? 1 2)))
+ (assert-is (core.neg-int? -42))
+ (assert-not (core.neg-int? -4.2))
+ (assert-not (pcall core.neg-int?))
+ (assert-not (pcall core.neg-int? 1 2)))
(testing "string?"
- (assert-is (string? :s))
- (assert-not (pcall string?))
- (assert-not (pcall string? 1 2)))
+ (assert-is (core.string? :s))
+ (assert-not (pcall core.string?))
+ (assert-not (pcall core.string? 1 2)))
(testing "double?"
- (assert-is (double? 3.3))
- (assert-not (double? 3.0))
- (assert-not (pcall double?))
- (assert-not (pcall double? 1 2)))
+ (assert-is (core.double? 3.3))
+ (assert-not (core.double? 3.0))
+ (assert-not (pcall core.double?))
+ (assert-not (pcall core.double? 1 2)))
(testing "map?"
- (assert-is (map? {:a 1}))
- (assert-not (map? {}))
- (assert-is (map? (empty {})))
- (assert-not (map? (empty [])))
- (assert-not (pcall map?))
- (assert-not (pcall map? 1 2)))
+ (assert-is (core.map? {:a 1}))
+ (assert-not (core.map? {}))
+ (assert-is (core.map? (core.empty (core.hash-map))))
+ (assert-not (core.map? (core.empty [])))
+ (assert-not (pcall core.map?))
+ (assert-not (pcall core.map? 1 2)))
(testing "vector?"
- (assert-not (vector? []))
- (assert-is (vector? [{:a 1}]))
- (assert-not (vector? {}))
- (assert-not (vector? {:a 1}))
- (assert-is (vector? (empty [])))
- (assert-not (vector? (empty {})))
- (assert-not (pcall vector?))
- (assert-not (pcall vector? 1 2)))
+ (assert-not (core.vector? []))
+ (assert-is (core.vector? [{:a 1}]))
+ (assert-not (core.vector? {}))
+ (assert-not (core.vector? {:a 1}))
+ (assert-is (core.vector? (core.empty (core.vector))))
+ (assert-not (core.vector? (core.empty {})))
+ (assert-not (pcall core.vector?))
+ (assert-not (pcall core.vector? 1 2)))
(testing "multifn?"
- (assert-not (multifn? []))
- (assert-is (multifn? (do (defmulti f identity) f)))
- (assert-not (pcall multifn?))
- (assert-not (pcall multifn? 1 2)))
+ (assert-not (core.multifn? []))
+ (assert-is (core.multifn? (do (clj.defmulti f core.identity) f)))
+ (assert-not (pcall core.multifn?))
+ (assert-not (pcall core.multifn? 1 2)))
(testing "set?"
- (assert-is (set? (ordered-set)))
- (assert-is (set? (hash-set)))
- (assert-eq (set? (hash-set)) :cljlib/hash-set)
- (assert-eq (set? (ordered-set)) :cljlib/ordered-set)
- (assert-not (pcall set?))
- (assert-not (pcall set? 1 2)))
+ (assert-is (core.set? (core.hash-set)))
+ (assert-not (core.set? {}))
+ (assert-not (core.set? (core.hash-map)))
+ (assert-not (pcall core.set?))
+ (assert-not (pcall core.set? 1 2)))
+
+ (testing "seq?"
+ (assert-is (core.seq? (core.list)))
+ (assert-not (core.seq? {}))
+ (assert-not (core.seq? (core.hash-map)))
+ (assert-not (pcall core.seq?))
+ (assert-not (pcall core.seq? 1 2)))
(testing "nil?"
- (assert-is (nil?))
- (assert-is (nil? nil))
- (assert-not (nil? 1))
- (assert-not (pcall nil? 1 2)))
+ (assert-is (core.nil?))
+ (assert-is (core.nil? nil))
+ (assert-not (core.nil? 1))
+ (assert-not (pcall core.nil? 1 2)))
(testing "odd?"
- (assert-is (odd? 3))
- (assert-is (odd? -3))
- (assert-not (odd? 2))
- (assert-not (odd? -2))
- (assert-not (pcall odd?))
- (assert-not (pcall odd? 1 2)))
+ (assert-is (core.odd? 3))
+ (assert-is (core.odd? -3))
+ (assert-not (core.odd? 2))
+ (assert-not (core.odd? -2))
+ (assert-not (pcall core.odd?))
+ (assert-not (pcall core.odd? 1 2)))
(testing "even?"
- (assert-is (even? 2))
- (assert-is (even? -2))
- (assert-not (even? 23))
- (assert-not (even? -23))
- (assert-not (pcall even?))
- (assert-not (pcall even? 1 2)))
+ (assert-is (core.even? 2))
+ (assert-is (core.even? -2))
+ (assert-not (core.even? 23))
+ (assert-not (core.even? -23))
+ (assert-not (pcall core.even?))
+ (assert-not (pcall core.even? 1 2)))
(testing "true?"
- (assert-is (true? true))
- (assert-not (true? false))
- (assert-not (true? 10))
- (assert-not (true? :true))
- (assert-not (pcall true?))
- (assert-not (pcall true? 1 2)))
+ (assert-is (core.true? true))
+ (assert-not (core.true? false))
+ (assert-not (core.true? 10))
+ (assert-not (core.true? :true))
+ (assert-not (pcall core.true?))
+ (assert-not (pcall core.true? 1 2)))
(testing "false?"
- (assert-is (false? false))
- (assert-not (false? true))
- (assert-not (false? 10))
- (assert-not (false? :true))
- (assert-not (pcall false?))
- (assert-not (pcall false? 1 2)))
+ (assert-is (core.false? false))
+ (assert-not (core.false? true))
+ (assert-not (core.false? 10))
+ (assert-not (core.false? :true))
+ (assert-not (pcall core.false?))
+ (assert-not (pcall core.false? 1 2)))
(testing "boolean?"
- (assert-is (boolean? true))
- (assert-is (boolean? false))
- (assert-not (boolean? :false))
- (assert-not (boolean? (fn [] true)))
- (assert-not (pcall boolean?))
- (assert-not (pcall boolean? 1 2))))
+ (assert-is (core.boolean? true))
+ (assert-is (core.boolean? false))
+ (assert-not (core.boolean? :false))
+ (assert-not (core.boolean? (fn [] true)))
+ (assert-not (pcall core.boolean?))
+ (assert-not (pcall core.boolean? 1 2))))
(deftest test-sequence-functions
(testing "seq"
- (assert-not (pcall seq))
- (assert-not (pcall seq [] []))
- (assert-eq (seq []) nil)
- (assert-eq (seq {}) nil)
- (assert-eq (seq [1]) [1])
- (assert-eq (seq [1 2 3]) [1 2 3])
- (assert-eq (seq {:a 1}) [["a" 1]])
- (assert-eq (seq "abc") ["a" "b" "c"])
- (when _G.utf8 (assert-eq (seq "абв") ["а" "б" "в"]))
- (assert-eq (seq {12345 123}) [[12345 123]])
- (assert-eq (seq (ordered-set 1 2 3)) [1 2 3])
- (assert-eq (length (seq (ordered-set 1 2 3))) 3)
- (assert-eq (seq (hash-set 1)) [1])
- (assert-eq (length (seq (hash-set 1 2 3))) 3))
-
- (testing "kvseq"
- (assert-not (pcall kvseq))
- (assert-not (pcall kvseq [] []))
- (assert-eq (kvseq nil) nil)
- (assert-eq (kvseq []) nil)
- (assert-eq (kvseq {123 456}) [[123 456]])
- (assert-eq (kvseq {:a 1}) [[:a 1]])
- (assert-eq (kvseq [0 0 0 10]) [[1 0] [2 0] [3 0] [4 10]])
- (assert-eq (kvseq (ordered-set :a :b :c)) [[:a :a] [:b :b] [:c :c]])
- (assert-eq (kvseq (hash-set :a)) [[:a :a]])
- (assert-eq (kvseq "abc") [[1 "a"] [2 "b"] [3 "c"]]))
+ (assert-not (pcall core.seq))
+ (assert-not (pcall core.seq [] []))
+ (assert-eq (core.seq []) nil)
+ (assert-eq (core.seq {}) nil)
+ (assert-eq (core.seq [1]) (core.list 1))
+ (assert-eq (core.seq [1 2 3]) (core.list 1 2 3))
+ (assert-eq (core.seq {:a 1}) (core.list (core.vec ["a" 1])))
+ (assert-eq (core.seq "abc") (core.list "a" "b" "c"))
+ (when _G.utf8 (assert-eq (core.seq "абв") (core.list "а" "б" "в")))
+ (assert-eq (core.seq {12345 123}) (core.list (core.vec [12345 123])))
+ (assert-eq (core.seq (core.hash-set 1)) (core.list 1))
+ (assert-eq (length (core.seq (core.hash-set 1 2 3))) 3))
(testing "mapv"
- (assert-not (pcall mapv))
- (assert-not (pcall mapv #(do nil)))
- (assert-eq (mapv #(* $ $) [1 2 3 4]) [1 4 9 16])
-
- (assert-eq (into {} (mapv (fn [[k v]] [k (* v v)]) {:a 1 :b 2 :c 3}))
- (into {} [[:a 1] [:b 4] [:c 9]]))
-
- (assert-eq (into {} (mapv (fn [[k1 v1] [k2 v2]] [k1 (* v1 v2)])
- {:a 1 :b 2 :c 3}
- {:a -1 :b 0 :c 2}))
+ (assert-not (pcall core.mapv))
+ (assert-not (pcall core.mapv #(do nil)))
+ (assert-eq (core.mapv #(* $ $) [1 2 3 4]) [1 4 9 16])
+
+ (assert-eq (core.into (core.hash-map)
+ (core.mapv (fn [[k v]] [k (* v v)]) {:a 1 :b 2 :c 3}))
+ (core.into (core.hash-map)
+ [[:a 1] [:b 4] [:c 9]]))
+
+ (assert-eq (core.into (core.hash-map)
+ (core.mapv (fn [[k1 v1] [k2 v2]] [k1 (* v1 v2)])
+ {:a 1 :b 2 :c 3}
+ {:a -1 :b 0 :c 2}))
{:a -1 :b 0 :c 6})
- (assert-eq (mapv #(* $1 $2 $3) [1] [2] [-1]) [-2])
- (assert-eq (mapv string.upper ["a" "b" "c"]) ["A" "B" "C"])
- (assert-eq (mapv #(+ $1 $2 $3 $4) [1 -1] [2 -2] [3 -3] [4 -4]) [(+ 1 2 3 4) (+ -1 -2 -3 -4)])
- (assert-eq (mapv (fn [f-name s-name company position]
- (.. f-name " " s-name " works as " position " at " company))
- ["Bob" "Alice"]
- ["Smith" "Watson"]
- ["Happy Days co." "Coffee With You"]
- ["secretary" "chief officer"])
+ (assert-eq (core.mapv #(* $1 $2 $3) [1] [2] [-1]) [-2])
+ (assert-eq (core.mapv string.upper ["a" "b" "c"]) ["A" "B" "C"])
+ (assert-eq (core.mapv #(+ $1 $2 $3 $4) [1 -1] [2 -2] [3 -3] [4 -4]) [(+ 1 2 3 4) (+ -1 -2 -3 -4)])
+ (assert-eq (core.mapv (fn [f-name s-name company position]
+ (.. f-name " " s-name " works as " position " at " company))
+ ["Bob" "Alice"]
+ ["Smith" "Watson"]
+ ["Happy Days co." "Coffee With You"]
+ ["secretary" "chief officer"])
["Bob Smith works as secretary at Happy Days co."
"Alice Watson works as chief officer at Coffee With You"])
- (assert-eq (table.concat (mapv string.upper "vaiv")) "VAIV"))
+ (assert-eq (table.concat (icollect [_ v (ipairs (core.mapv string.upper "vaiv"))] v)) "VAIV"))
(testing "partition"
- (assert-not (pcall partition))
- (assert-not (pcall partition 1))
- (assert-eq (partition 1 [1 2 3 4]) [[1] [2] [3] [4]])
- (assert-eq (partition 1 2 [1 2 3 4]) [[1] [3]])
- (assert-eq (partition 3 2 [1 2 3 4 5]) [[1 2 3] [3 4 5]])
- (assert-eq (partition 3 3 [0 -1 -2 -3] [1 2 3 4]) [[1 2 3] [4 0 -1]]))
+ (assert-not (pcall core.partition))
+ (assert-not (pcall core.partition 1))
+ (assert-eq (core.partition 1 [1 2 3 4]) (core.list (core.list 1) (core.list 2) (core.list 3) (core.list 4)))
+ (assert-eq (core.partition 1 2 [1 2 3 4]) (core.list (core.list 1) (core.list 3)))
+ (assert-eq (core.partition 3 2 [1 2 3 4 5]) (core.list (core.list 1 2 3) (core.list 3 4 5)))
+ (assert-eq (core.partition 3 3 [0 -1 -2 -3] [1 2 3 4]) (core.list (core.list 1 2 3) (core.list 4 0 -1))))
(testing "nthrest"
- (assert-not (pcall nthrest))
- (assert-not (pcall nthrest []))
- (assert-eq (nthrest [1 2 3] 0) [1 2 3])
- (assert-eq (nthrest [1 2 3] 1) [2 3])
- (assert-eq (nthrest [1 2 3] 2) [3])
- (assert-eq (nthrest [1 2 3] 3) []))
+ (assert-not (pcall core.nthrest))
+ (assert-not (pcall core.nthrest []))
+ (assert-eq (core.nthrest [1 2 3] 0) [1 2 3])
+ (assert-eq (core.nthrest [1 2 3] 1) (core.list 2 3))
+ (assert-eq (core.nthrest [1 2 3] 2) (core.list 3))
+ (assert-eq (core.nthrest [1 2 3] 3) (core.list)))
(testing "take"
- (assert-not (pcall take))
- (assert-not (pcall take []))
- (assert-not (pcall take :a []))
- (assert-not (pcall take -1 []))
- (assert-eq (take 0 [1 2 3]) [])
- (assert-eq (take 1 {:a 1}) [[:a 1]])
- (assert-eq (take 10 [1 2 3]) [1 2 3])
- (assert-eq (take 1 [1 2 3]) [1]))
+ (assert-not (pcall core.take))
+ (assert-is (core.take []))
+ (assert-not (pcall core.dorun (core.take :a [])))
+ (assert-is (core.take -1 []))
+ (assert-eq (core.take 0 [1 2 3]) [])
+ (assert-eq (core.take 1 {:a 1}) (core.list [:a 1]))
+ (assert-eq (core.take 10 [1 2 3]) (core.list 1 2 3))
+ (assert-eq (core.take 1 [1 2 3]) (core.list 1)))
(testing "reduce"
- (fn* add
- ([] 0)
- ([a] a)
- ([a b] (+ a b))
- ([a b & c]
- (var res (+ a b))
- (each [_ v (ipairs c)]
- (set res (+ res v)))
- res))
-
- (assert-eq (reduce add []) 0)
- (assert-eq (reduce add [1]) 1)
- (assert-eq (reduce add [1 2]) 3)
- (assert-eq (reduce add (range 10)) 45)
- (assert-eq (reduce add -3 (range 10)) 42)
- (assert-eq (reduce add 10 []) 10)
- (assert-eq (reduce add 10 [1]) 11)
- (assert-eq (reduce add 10 nil) 10)
- (assert-not (pcall reduce))
- (assert-not (pcall reduce add)))
+ (assert-eq (core.reduce core.add []) 0)
+ (assert-eq (core.reduce core.add [1]) 1)
+ (assert-eq (core.reduce core.add [1 2]) 3)
+ (assert-eq (core.reduce core.add (core.range 10)) 45)
+ (assert-eq (core.reduce core.add -3 (core.range 10)) 42)
+ (assert-eq (core.reduce core.add 10 []) 10)
+ (assert-eq (core.reduce core.add 10 [1]) 11)
+ (assert-eq (core.reduce core.add 10 nil) 10)
+ (assert-not (pcall core.reduce))
+ (assert-not (pcall core.reduce core.add)))
(testing "reduce reference implementation"
(fn mapping [f]
@@ -369,462 +293,609 @@
(fn -reduce [f init [x & tbl]]
(if x (-reduce f (f init x) tbl) init))
- (assert-eq (reduce add (range 10)) (-reduce add 0 (range 10)))
- (assert-eq (reduce ((mapping inc) add) 0 (range 10))
- (-reduce ((mapping inc) add) 0 (range 10))))
+ (assert-eq (core.reduce core.add (core.range 10)) (-reduce core.add 0 (core.range 10)))
+ (assert-eq (core.reduce ((mapping core.inc) core.add) 0 (core.range 10))
+ (-reduce ((mapping core.inc) core.add) 0 (core.range 10))))
(testing "filter"
- (assert-not (pcall filter))
- (assert-not (pcall filter even?))
- (assert-eq (filter even? (range 10)) [0 2 4 6 8])
- (assert-eq (filter odd? (range 10)) [1 3 5 7 9])
- (assert-eq (filter map? [{:a 1} {5 1} [1 2] [] {}]) [{:a 1} {5 1}])
- (assert-eq (filter vector? [{:a 1} {5 1} [1 2] [] {}]) [[1 2]]))
+ (assert-not (pcall core.filter))
+ (assert-is (core.filter core.even?))
+ (assert-eq (core.filter core.even? (core.range 10)) (core.list 0 2 4 6 8))
+ (assert-eq (core.filter core.odd? (core.range 10)) (core.list 1 3 5 7 9))
+ (assert-eq (core.filter core.map? [{:a 1} {5 1} [1 2] [] {}]) (core.list {:a 1} {5 1}))
+ (assert-eq (core.filter core.vector? [{:a 1} {5 1} [1 2] [] {}]) (core.list [1 2])))
(testing "concat"
- (assert-eq (concat) nil)
- (assert-eq (concat []) [])
- (assert-eq (concat [1 2 3]) [1 2 3])
- (assert-eq (concat [1 2 3] [4 5 6]) [1 2 3 4 5 6])
- (assert-eq (concat [1 2] [3 4] [5 6]) [1 2 3 4 5 6])
- (assert-eq (concat {:a 1} {:b 2}) [[:a 1] [:b 2]])
- (assert-eq (concat [[:a 1]] {:b 2}) [[:a 1] [:b 2]])
- (assert-eq (concat {:a 1} [[:b 2]]) [[:a 1] [:b 2]])
- (assert-eq (concat [] [[:b 2]]) [[:b 2]])
- (assert-eq (concat [] []) [])
- (assert-not (pcall concat 1))
- (assert-not (pcall concat 1 2))
- (assert-not (pcall concat 1 []))
- (assert-not (pcall concat [] 2))
- (assert-not (pcall concat [1] 2)))
+ (assert-eq (core.concat) (core.list))
+ (assert-eq (core.concat []) (core.list))
+ (assert-eq (core.concat [1 2 3]) (core.list 1 2 3))
+ (assert-eq (core.concat [1 2 3] [4 5 6]) (core.list 1 2 3 4 5 6))
+ (assert-eq (core.concat [1 2] [3 4] [5 6]) (core.list 1 2 3 4 5 6))
+ (assert-eq (core.concat {:a 1} {:b 2}) (core.list [:a 1] [:b 2]))
+ (assert-eq (core.concat [[:a 1]] {:b 2}) (core.list [:a 1] [:b 2]))
+ (assert-eq (core.concat {:a 1} [[:b 2]]) (core.list [:a 1] [:b 2]))
+ (assert-eq (core.concat [] [[:b 2]]) (core.list [:b 2]))
+ (assert-eq (core.concat [] []) (core.list))
+ (assert-not (pcall core.dorun (core.concat 1)))
+ (assert-not (pcall core.dorun (core.concat 1 2)))
+ (assert-not (pcall core.dorun (core.concat 1 [])))
+ (assert-not (pcall core.dorun (core.concat [] 2)))
+ (assert-not (pcall core.dorun (core.concat [1] 2))))
(testing "reverse"
- (assert-not (pcall reverse))
- (assert-not (pcall reverse [] []))
- (assert-eq (reverse []) nil)
- (assert-eq (reverse [1 2 3]) [3 2 1])
- (assert-eq (reverse {:a 1}) [[:a 1]]))
+ (assert-not (pcall core.reverse))
+ (assert-not (pcall core.reverse [] []))
+ (assert-eq (core.reverse []) (core.list))
+ (assert-eq (core.reverse [1 2 3]) (core.list 3 2 1))
+ (assert-eq (core.reverse {:a 1}) (core.list [:a 1])))
(testing "conj"
- (assert-eq (conj) [])
- (assert-eq (conj [1]) [1])
- (assert-eq (conj [] 1 2 3) [1 2 3])
- (assert-eq (conj [0] 1 2 3) [0 1 2 3])
- (assert-eq (conj {:a 1} [:b 2]) {:a 1 :b 2})
- (assert-eq (conj {:a 1}) {:a 1})
- (assert-eq (conj [1] 2 3 4 5 6 7) [1 2 3 4 5 6 7]))
+ (assert-eq (core.conj) [])
+ (assert-eq (core.conj [1]) [1])
+ (assert-eq (core.conj (core.vector) 1 2 3) [1 2 3])
+ (assert-eq (core.conj [0] 1 2 3) [0 1 2 3])
+ (assert-eq (core.conj {:a 1} [:b 2]) {:a 1 :b 2})
+ (assert-eq (core.conj {:a 1}) {:a 1})
+ (assert-eq (core.conj [1] 2 3 4 5 6 7) [1 2 3 4 5 6 7]))
(testing "disj"
- (assert-not (pcall disj))
- (assert-not (pcall disj [1]))
- (assert-not (pcall disj [1] 1))
- (assert-eq (disj (ordered-set)) (ordered-set))
- (assert-eq (disj (ordered-set 1 3 2 5) 3) (ordered-set 1 2 5))
- (assert-eq (disj (ordered-set 1 3 2 5) 3 1 5) (ordered-set 2)))
+ (assert-not (pcall core.disj))
+ (assert-is (core.disj [1]))
+ (assert-not (pcall core.disj [1] 1))
+ (assert-eq (core.disj (core.hash-set)) (core.hash-set))
+ (assert-eq (core.disj (core.hash-set 1 3 2 5) 3) (core.hash-set 1 2 5))
+ (assert-eq (core.disj (core.hash-set 1 3 2 5) 3 1 5) (core.hash-set 2)))
(testing "cons"
- (assert-not (pcall cons))
- (assert-not (pcall cons [] [] []))
- (assert-eq (cons nil [1]) [1])
- (assert-eq (cons 1 []) [1])
- (assert-eq (cons 1 [0]) [1 0]))
+ (assert-not (pcall core.cons))
+ (assert-not (pcall core.cons [] [] []))
+ (assert-eq (core.cons nil [1]) (core.list nil 1))
+ (assert-eq (core.cons 1 []) (core.list 1))
+ (assert-eq (core.cons 1 [0]) (core.list 1 0)))
(testing "first"
- (assert-not (pcall first))
- (assert-not (pcall first [] []))
- (assert-eq (first [1 2 3]) 1)
- (assert-eq (first {:a 1}) [:a 1])
- (assert-eq (first []) nil))
+ (assert-not (pcall core.first))
+ (assert-not (pcall core.first [] []))
+ (assert-eq (core.first [1 2 3]) 1)
+ (assert-eq (core.first {:a 1}) [:a 1])
+ (assert-eq (core.first []) nil))
(testing "last"
- (assert-not (pcall last))
- (assert-not (pcall last [] []))
- (assert-eq (last [1 2 3]) 3)
- (assert-eq (last []) nil)
- (assert-eq (last nil) nil)
- (assert-eq (last {:a 1}) [:a 1]))
+ (assert-not (pcall core.last))
+ (assert-not (pcall core.last [] []))
+ (assert-eq (core.last [1 2 3]) 3)
+ (assert-eq (core.last []) nil)
+ (assert-eq (core.last nil) nil)
+ (assert-eq (core.last {:a 1}) [:a 1]))
(testing "rest"
- (assert-not (pcall rest))
- (assert-not (pcall rest [] []))
- (assert-eq (rest [1 2 3]) [2 3])
- (assert-eq (rest {:a 1}) [])
- (assert-eq (rest []) [])
- (assert-eq (rest nil) []))
+ (assert-not (pcall core.rest))
+ (assert-not (pcall core.rest [] []))
+ (assert-eq (core.rest [1 2 3]) (core.list 2 3))
+ (assert-eq (core.rest {:a 1}) (core.list))
+ (assert-eq (core.rest []) (core.list))
+ (assert-eq (core.rest nil) (core.list)))
(testing "butlast"
- (assert-not (pcall butlast))
- (assert-not (pcall butlast [] []))
- (assert-eq (butlast [1 2 3]) [1 2])
- (assert-eq (butlast {:a 1}) nil)
- (assert-eq (butlast []) nil)
- (assert-eq (butlast nil) nil))
+ (assert-not (pcall core.butlast))
+ (assert-not (pcall core.butlast [] []))
+ (assert-eq (core.butlast [1 2 3]) (core.list 1 2))
+ (assert-eq (core.butlast {:a 1}) nil)
+ (assert-eq (core.butlast []) nil)
+ (assert-eq (core.butlast nil) nil))
(testing "reduce-kv"
- (assert-eq (reduce-kv #(+ $1 $3) 0 {:a 1 :b 2 :c 3}) 6)
- (assert-eq (reduce-kv #(+ $1 $3) 0 [1 2 3]) 6)
- (assert-not (pcall reduce-kv #(+ $1 $3) 0))
- (assert-not (pcall reduce-kv #(+ $1 $3)))
- (assert-not (pcall reduce-kv)))
+ (assert-eq (core.reduce-kv #(+ $1 $3) 0 {:a 1 :b 2 :c 3}) 6)
+ (assert-eq (core.reduce-kv #(+ $1 $3) 0 [1 2 3]) 6)
+ (assert-not (pcall core.reduce-kv #(+ $1 $3) 0))
+ (assert-not (pcall core.reduce-kv #(+ $1 $3)))
+ (assert-not (pcall core.reduce-kv)))
(testing "reduced"
- (assert-not (pcall reduced))
- (assert-not (pcall reduced 1 2 3))
- (assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) [1]) 1)
- (assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) [1 2]) 3)
- (assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) [1 2 3 4]) 10)
- (assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) [1 2 3 4 5]) 15)
- (assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) [1 2 3 4 5 6]) -1)
- (assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) 10 [1]) 11)
- (assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) 10 [1 2]) -1)
- (assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) 0 [10 5]) 15)
- (assert-eq (reduce #(if (> $1 10) (reduced -1) (+ $1 $2)) 1 [10 7]) -1)
-
- (assert-eq (reduce #(if (> $1 10) (reduced false) (+ $1 $2)) 1 [10 7]) false)
- (assert-eq (reduce #(if (> $1 10) (reduced nil) (+ $1 $2)) 1 [10 7]) nil)
-
- (assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced -1) (+ res v))) 0 {:a 1 :b 2}) 3)
- (assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced -1) (+ res v))) 0 {:a 10 :b 2}) 12)
- (assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced -1) (+ res v))) 1 {:a 3 :b 3 :c 3 :d 3}) 13)
- (assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced -1) (+ res v))) 2 {:a 3 :b 3 :c 3 :d 3}) -1)
- (assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced -1) (+ res v))) 1 [10 12]) -1)
-
- (assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced false) (+ res v))) 1 [10 12]) false)
- (assert-eq (reduce-kv (fn [res _ v] (if (> res 10) (reduced nil) (+ res v))) 1 [10 12]) nil))
+ (assert-not (pcall core.reduced))
+ (assert-not (pcall core.reduced 1 2 3))
+ (assert-eq (core.reduce #(if (> $1 10) (core.reduced -1) (+ $1 $2)) [1]) 1)
+ (assert-eq (core.reduce #(if (> $1 10) (core.reduced -1) (+ $1 $2)) [1 2]) 3)
+ (assert-eq (core.reduce #(if (> $1 10) (core.reduced -1) (+ $1 $2)) [1 2 3 4]) 10)
+ (assert-eq (core.reduce #(if (> $1 10) (core.reduced -1) (+ $1 $2)) [1 2 3 4 5]) 15)
+ (assert-eq (core.reduce #(if (> $1 10) (core.reduced -1) (+ $1 $2)) [1 2 3 4 5 6]) -1)
+ (assert-eq (core.reduce #(if (> $1 10) (core.reduced -1) (+ $1 $2)) 10 [1]) 11)
+ (assert-eq (core.reduce #(if (> $1 10) (core.reduced -1) (+ $1 $2)) 10 [1 2]) -1)
+ (assert-eq (core.reduce #(if (> $1 10) (core.reduced -1) (+ $1 $2)) 0 [10 5]) 15)
+ (assert-eq (core.reduce #(if (> $1 10) (core.reduced -1) (+ $1 $2)) 1 [10 7]) -1)
+
+ (assert-eq (core.reduce #(if (> $1 10) (core.reduced false) (+ $1 $2)) 1 [10 7]) false)
+ (assert-eq (core.reduce #(if (> $1 10) (core.reduced nil) (+ $1 $2)) 1 [10 7]) nil)
+
+ (assert-eq (core.reduce-kv (fn [res _ v] (if (> res 10) (core.reduced -1) (+ res v))) 0 {:a 1 :b 2}) 3)
+ (assert-eq (core.reduce-kv (fn [res _ v] (if (> res 10) (core.reduced -1) (+ res v))) 0 {:a 10 :b 2}) 12)
+ (assert-eq (core.reduce-kv (fn [res _ v] (if (> res 10) (core.reduced -1) (+ res v))) 1 {:a 3 :b 3 :c 3 :d 3}) 13)
+ (assert-eq (core.reduce-kv (fn [res _ v] (if (> res 10) (core.reduced -1) (+ res v))) 2 {:a 3 :b 3 :c 3 :d 3}) -1)
+ (assert-eq (core.reduce-kv (fn [res _ v] (if (> res 10) (core.reduced -1) (+ res v))) 1 [10 12]) -1)
+
+ (assert-eq (core.reduce-kv (fn [res _ v] (if (> res 10) (core.reduced false) (+ res v))) 1 [10 12]) false)
+ (assert-eq (core.reduce-kv (fn [res _ v] (if (> res 10) (core.reduced nil) (+ res v))) 1 [10 12]) nil))
(testing "assoc"
- (assert-not (pcall assoc))
- (assert-not (pcall assoc {}))
- (assert-eq (assoc {} :a 1) {:a 1})
- (assert-eq (assoc {} :a 1 :b 2 :c 3 :d 4) {:a 1 :b 2 :c 3 :d 4}))
+ (assert-not (pcall core.assoc))
+ (assert-is (core.assoc {}))
+ (assert-eq (core.assoc {} :a 1) {:a 1})
+ (assert-eq (core.assoc {} :a 1 :b 2 :c 3 :d 4) {:a 1 :b 2 :c 3 :d 4}))
(testing "dissoc"
- (assert-not (pcall dissoc))
- (assert-eq (dissoc {}) {})
- (assert-eq (dissoc {:a 1 :b 2} :b) {:a 1})
- (assert-eq (dissoc {:a 1 :b 2 :c 3} :a :c) {:b 2}))
+ (assert-not (pcall core.dissoc))
+ (assert-eq (core.dissoc {}) {})
+ (assert-eq (core.dissoc {:a 1 :b 2} :b) {:a 1})
+ (assert-eq (core.dissoc {:a 1 :b 2 :c 3} :a :c) {:b 2}))
(testing "find, keys and vals"
- (assert-not (pcall keys))
- (assert-not (pcall keys {} {} {}))
- (assert-not (pcall vals))
- (assert-not (pcall vals {} {} {}))
- (assert-not (pcall find))
- (assert-not (pcall find {} {} {}))
- (assert-eq (keys {:a 1}) [:a])
- (assert-eq (vals {:a 1}) [1])
- (match (pcall #(assert-eq (keys {:a 1 :b 2 :c 3}) (hash-set :a :b :c)))
- (false msg) (io.stderr:write "WARNING: " msg))
- (match (pcall #(assert-eq (vals {:a 1 :b 2 :c 3}) (hash-set 1 2 3)))
- (false msg) (io.stderr:write "WARNING: " msg))
- (assert-eq (find {:a 1 :b 2 :c 3} :c) [:c 3])
- (assert-eq (find {:a 1 :b 2 :c 3} :d) nil)))
-
-
-(deftest test-function-manipulation
+ (assert-not (pcall core.keys))
+ (assert-not (pcall core.keys {} {} {}))
+ (assert-not (pcall core.vals))
+ (assert-not (pcall core.vals {} {} {}))
+ (assert-not (pcall core.find))
+ (assert-not (pcall core.find {} {} {}))
+ (assert-eq (core.keys {:a 1}) (core.list :a))
+ (assert-eq (core.vals {:a 1}) (core.list 1))
+ (assert-eq (core.keys {:a 1}) (core.list :a))
+ (assert-eq (core.vals {:a 1}) (core.list 1))
+ (assert-eq (core.find {:a 1 :b 2 :c 3} :c) [:c 3])
+ (assert-eq (core.find {:a 1 :b 2 :c 3} :d) nil)))
+
+(deftest transients
+ (testing "transient from collections"
+ (assert-is (core.transient (core.vector)))
+ (assert-is (core.transient (core.hash-map)))
+ (assert-is (core.transient (core.hash-set)))
+ (assert-not (pcall core.transient []))
+ (assert-not (pcall core.transient (core.list))))
+
+ (testing "transient conj!"
+ (assert-eq (core.conj!) (core.transient (core.vector)))
+ (assert-eq (core.conj! (core.transient (core.vec [1]))) [])
+ (assert-eq (core.conj! (core.transient (core.vector)) 1) [1])
+ (assert-eq (core.conj! (core.transient (core.vec [0])) 1) [nil 1])
+ (assert-eq (core.conj! (core.transient (core.hash-map :a 1)) [:b 2]) {:b 2})
+ (assert-eq (. (core.conj! (core.transient (core.hash-map :a 1)) [:a 2]) :a) 2)
+ (assert-eq (core.conj! (core.transient (core.hash-map :a 1))) {})
+ (assert-eq (. (core.conj! (core.transient (core.hash-map :a 1))) :a) 1))
+
+ (testing "transient disj!"
+ (assert-not (pcall core.disj!))
+ (assert-is (core.disj! [1]))
+ (assert-not (pcall core.disj! [1] 1))
+ (assert-eq (core.disj! (core.transient (core.hash-set))) (core.hash-set))
+ (assert-eq (core.disj! (core.transient (core.hash-set 1 3 2 5)) 3) {})
+ (assert-eq (. (core.disj! (core.transient (core.hash-set 1 3 2 5)) 3) 2) 2)
+ (assert-eq (. (core.disj! (core.transient (core.hash-set 1 3 2 5)) 3) 3) nil))
+
+ (testing "transient pop!"
+ (assert-not (pcall core.pop!))
+ (assert-is (core.pop! (core.transient (core.vec [1]))))
+ (assert-not (pcall core.pop! [1] 1))
+ (assert-not (pcall core.pop! (core.transient (core.vector))))
+ (assert-eq (core.pop! (-> (core.transient (core.vector))
+ (core.conj! 1)
+ (core.conj! 2)
+ (core.conj! 3)))
+ [1 2]))
+
+ (testing "transient can't be modified after persisted"
+ (let [t (core.transient (core.vector))]
+ (core.persistent! t)
+ (assert-not (pcall core.conj! t 10))
+ (assert-not (pcall #(tset $1 (length $1) $2) t 10)))
+ (let [t (core.transient (core.hash-map))]
+ (core.persistent! t)
+ (assert-not (pcall core.conj! t 10))
+ (assert-not (pcall #(tset $1 (length $1) $2) t 10)))
+ (let [t (core.transient (core.hash-set))]
+ (core.persistent! t)
+ (assert-not (pcall core.conj! t 10))
+ (assert-not (pcall #(tset $1 (length $1) $2) t 10)))))
+
+(deftest test-into
+ (testing "into"
+ (assert-eq (core.into [] nil) [])
+ (assert-eq (core.into nil nil) nil)
+ (assert-eq (core.into nil [1 2 3]) (core.list 3 2 1))
+
+ (assert-eq (core.into [] []) [])
+ (assert-eq (core.into [1 2 3] []) [1 2 3])
+ (assert-eq (core.into [1 2 3] [4 5 6]) [1 2 3 4 5 6])
+
+ (assert-eq (core.into {} {}) {})
+ (assert-eq (core.into {:a 1} {}) {:a 1})
+ (assert-eq (core.into {:a 1} {:b 2}) {:a 1 :b 2})
+
+ ;; different bodies are being used at compile time so worth testing
+ (assert-eq (core.into [] {}) [])
+ (assert-eq (core.into {} []) [])
+ (assert-eq (. (getmetatable (core.into (core.vector) {})) :cljlib/type) :vector)
+ (assert-eq (. (getmetatable (core.into (core.hash-map) [])) :cljlib/type) :hash-map)
+ (let [a (core.vector)]
+ (assert-eq (. (getmetatable (core.into a a)) :cljlib/type) :vector))
+
+ ;; can't transform table with more than one key-value pair, as order
+ ;; is undeterminitive
+ (assert-eq (core.into [] {:a 1}) [[:a 1]])
+ (assert-eq (core.into [[:b 2]] {:a 1}) [[:b 2] [:a 1]])
+ (assert-eq (core.into [[:c 3]] {}) [[:c 3]])
+
+ (assert-eq (core.into (core.hash-map) [[:c 3] [:a 1] [:b 2]]) {:a 1 :b 2 :c 3})
+ (assert-eq (core.into {:d 4} [[:c 3] [:a 1] [:b 2]]) {:a 1 :b 2 :c 3 :d 4})
+ (assert-eq (core.into {:a 0 :b 0 :c 0} [[:c 3] [:a 1] [:b 2]]) {:a 1 :b 2 :c 3})
+
+ (let [a (fn [] {:a 1})
+ b (fn [] [[:b 2]])]
+ (assert-eq (core.into (a) (b)) {:a 1 :b 2})
+ (assert-eq (core.into (b) (a)) [[:b 2] [:a 1]])
+ (let [c []]
+ (assert-eq (core.into c (b)) [[:b 2]]))
+ (let [c []]
+ (assert-eq (core.into c (a)) [[:a 1]]))
+ (let [c []]
+ (assert-eq (core.into (b) c) (b))
+ (assert-eq (core.into (a) c) (a))))
+
+ (let [a {}
+ b []]
+ (assert-eq (core.into a [1 2 3]) [1 2 3])
+ (assert-eq (core.into b [1 2 3]) [1 2 3]))
+ (let [a {}
+ b []]
+ (assert-eq (core.into b {:a 1}) [[:a 1]]))
+
+ (let [a {}
+ b []]
+ (assert-eq (core.into a "vaiv") ["v" "a" "i" "v"])
+ (when _G.utf8 (assert-eq (core.into b "ваыв") ["в" "а" "ы" "в"])))
+ (assert-eq (core.into [] "vaiv") ["v" "a" "i" "v"])
+ (when _G.utf8 (assert-eq (core.into [] "ваыв") ["в" "а" "ы" "в"]))))
+
+(deftest transducers-test
+ (testing "transduce"
+ (assert-eq (core.transduce (core.map core.inc)
+ core.conj
+ (core.vector)
+ (core.vector 1 2 3))
+ [2 3 4])
+ (assert-eq (core.transduce (core.comp (core.map core.inc)
+ (core.filter core.odd?))
+ core.conj
+ (core.vector)
+ (core.vector 1 2 3))
+ [3]))
+ (testing "sequence"
+ (assert-eq (core.sequence (core.map core.inc)
+ (core.vector 1 2 3))
+ (core.list 2 3 4))
+ (assert-eq (core.sequence (core.comp (core.map core.inc)
+ (core.filter core.odd?))
+ (core.vector 1 2 3))
+ (core.list 3)))
+ (testing "into"
+ (assert-eq (core.into (core.vector)
+ (core.map core.inc)
+ (core.vector 1 2 3))
+ [2 3 4])
+ (assert-eq (core.into (core.vector)
+ (core.comp (core.map core.inc)
+ (core.filter core.odd?))
+ (core.vector 1 2 3))
+ [3])))
+
+(deftest class-test
+ (testing "class"
+ (assert-eq (core.class (core.hash-set)) "hash-set")
+ (assert-eq (core.class (core.hash-map)) "hash-map")
+ (assert-eq (core.class (core.vector)) "vector")
+ (assert-eq (core.class [1 2 3]) "table")))
+
+(deftest deref-test
+ (assert-not (pcall core.deref []))
+ (assert-eq 10 (core.deref (core.reduced 10))))
+
+(deftest function-manipulation-test
(testing "constantly"
- (assert-not (pcall constantly))
- (assert-not (pcall constantly nil nil))
- (let [always-nil (constantly nil)]
+ (assert-not (pcall core.constantly))
+ (assert-not (pcall core.constantly nil nil))
+ (let [always-nil (core.constantly nil)]
(assert-eq (always-nil) nil)
(assert-eq (always-nil 1) nil)
(assert-eq (always-nil 1 2 3 4 "5") nil))
- (let [always-true (constantly true)]
+ (let [always-true (core.constantly true)]
(assert-is (always-true))
(assert-is (always-true false))))
(testing "complement"
- (assert-not (pcall complement))
- (assert-not (pcall complement #nil #nil))
- (assert-is ((complement #(do false))))
- (assert-is ((complement nil?) 10))
- (assert-is ((complement every?) double? [1 2 3 4]))
- (assert-is ((complement #(= $1 $2 $3)) 1 1 2 1))
- (assert-is ((complement #(= $1 $2)) 1 2)))
+ (assert-not (pcall core.complement))
+ (assert-not (pcall core.complement #nil #nil))
+ (assert-is ((core.complement #(do false))))
+ (assert-is ((core.complement core.nil?) 10))
+ (assert-is ((core.complement core.every?) core.double? [1 2 3 4]))
+ (assert-is ((core.complement #(= $1 $2 $3)) 1 1 2 1))
+ (assert-is ((core.complement #(= $1 $2)) 1 2)))
(testing "apply"
- (fn* add
- ([x] x)
- ([x y] (+ x y))
- ([x y & zs]
- (add (+ x y) ((or _G.unpack table.unpack) zs))))
- (assert-eq (apply add [1 2 3 4]) 10)
- (assert-eq (apply add -1 [1 2 3 4]) 9)
- (assert-eq (apply add -2 -1 [1 2 3 4]) 7)
- (assert-eq (apply add -3 -2 -1 [1 2 3 4]) 4)
- (assert-eq (apply add -4 -3 -2 -1 [1 2 3 4]) 0)
- (assert-eq (apply add -5 -4 -3 -2 -1 [1 2 3 4]) -5)
- (assert-not (pcall apply))
- (assert-not (pcall apply add)))
+ (assert-eq (core.apply core.add [1 2 3 4]) 10)
+ (assert-eq (core.apply core.add -1 [1 2 3 4]) 9)
+ (assert-eq (core.apply core.add -2 -1 [1 2 3 4]) 7)
+ (assert-eq (core.apply core.add -3 -2 -1 [1 2 3 4]) 4)
+ (assert-eq (core.apply core.add -4 -3 -2 -1 [1 2 3 4]) 0)
+ (assert-eq (core.apply core.add -5 -4 -3 -2 -1 [1 2 3 4]) -5)
+ (assert-eq (core.apply core.add -7 -6 -5 -4 -3 -2 -1 [1 2 3 4]) -18)
+ (assert-not (pcall core.apply))
+ (assert-not (pcall core.apply core.add)))
(testing "comp"
- (assert-eq ((comp) 10) 10)
- (assert-eq ((comp #10)) 10)
+ (assert-eq ((core.comp) 10) 10)
+ (assert-eq ((core.comp #10)) 10)
(fn square [x] (* x x))
- (assert-eq (comp square) square)
- (assert-eq ((comp square inc) 6) 49)
- (assert-eq ((comp #(- $ 7) square inc inc inc inc inc inc inc) 0) 42)
+ (assert-eq (core.comp square) square)
+ (assert-eq ((core.comp square core.inc) 6) 49)
+ (assert-eq ((core.comp #(- $ 7) square core.inc core.inc core.inc core.inc core.inc core.inc core.inc) 0) 42)
(fn sum-squares [x y] (+ (* x x) (* y y)))
- (assert-eq ((comp square inc sum-squares) 2 3) 196)
+ (assert-eq ((core.comp square core.inc sum-squares) 2 3) 196)
(fn f [a b c] (+ a b c))
- (assert-eq ((comp inc f) 1 2 3) 7)
+ (assert-eq ((core.comp core.inc f) 1 2 3) 7)
(fn g [a b c d] (+ a b c d))
- (assert-eq ((comp inc g) 1 2 3 4) 11)
+ (assert-eq ((core.comp core.inc g) 1 2 3 4) 11)
(fn h [a b c d e f] (+ a b c d e f))
- (assert-eq ((comp inc h) 1 2 3 4 5 6) 22))
+ (assert-eq ((core.comp core.inc h) 1 2 3 4 5 6) 22))
(testing "identity"
(fn f [] nil)
(local a {})
- (assert-not (pcall identity))
- (assert-not (pcall identity 1 2))
- (assert-eq (identity 1) 1)
- (assert-eq (identity {:a 1 :b 2}) {:a 1 :b 2})
- (assert-eq (identity [1 2 3]) [1 2 3])
- (assert-eq (identity "abc") "abc")
- (assert-eq (identity f) f)
- (assert-eq (identity a) a)))
+ (assert-not (pcall core.identity))
+ (assert-not (pcall core.identity 1 2))
+ (assert-eq (core.identity 1) 1)
+ (assert-eq (core.identity {:a 1 :b 2}) {:a 1 :b 2})
+ (assert-eq (core.identity [1 2 3]) [1 2 3])
+ (assert-eq (core.identity "abc") "abc")
+ (assert-eq (core.identity f) f)
+ (assert-eq (core.identity a) a)))
(deftest test-sequence-predicates
(testing "some"
- (assert-not (pcall some))
- (assert-not (pcall some pos-int?))
- (assert-is (some pos-int? [-1 1.1 2.3 -55 42 10 -27]))
- (assert-not (some pos-int? {:a 1}))
- (assert-is (some pos-int? [{:a 1} "1" -1 1])))
+ (assert-not (pcall core.some))
+ (assert-not (pcall core.some core.pos-int?))
+ (assert-is (core.some core.pos-int? [-1 1.1 2.3 -55 42 10 -27]))
+ (assert-not (core.some core.pos-int? {:a 1}))
+ (assert-is (core.some core.pos-int? [{:a 1} "1" -1 1])))
(testing "not-any?"
- (assert-not (pcall not-any?))
- (assert-not (pcall not-any? pos-int?))
- (assert-is (not-any? pos-int? [-1 1.1 2.3 -55 -42 -10 -27]))
- (assert-is (not-any? pos-int? {:a 1}))
- (assert-not (not-any? pos-int? [1 2 3 4 5])))
+ (assert-not (pcall core.not-any?))
+ (assert-not (pcall core.not-any? core.pos-int?))
+ (assert-is (core.not-any? core.pos-int? [-1 1.1 2.3 -55 -42 -10 -27]))
+ (assert-is (core.not-any? core.pos-int? {:a 1}))
+ (assert-not (core.not-any? core.pos-int? [1 2 3 4 5])))
(testing "every?"
- (assert-not (pcall every?))
- (assert-not (pcall every? pos-int?))
- (assert-not (every? pos-int? [-1 1.1 2.3 -55 42 10 -27]))
- (assert-not (every? pos-int? {:a 1}))
- (assert-is (every? pos-int? [1 2 3 4 5])))
+ (assert-not (pcall core.every?))
+ (assert-not (pcall core.every? core.pos-int?))
+ (assert-not (core.every? core.pos-int? [-1 1.1 2.3 -55 42 10 -27]))
+ (assert-not (core.every? core.pos-int? {:a 1}))
+ (assert-is (core.every? core.pos-int? [1 2 3 4 5])))
(testing "empty?"
- (assert-not (pcall empty?))
- (assert-is (empty? []))
- (assert-is (empty? {}))
- (assert-is (empty? ""))
- (assert-not (empty? "1"))
- (assert-not (empty? [1]))
- (assert-not (empty? {:a 1}))
- (assert-not (pcall empty? 10)))
+ (assert-not (pcall core.empty?))
+ (assert-is (core.empty? []))
+ (assert-is (core.empty? {}))
+ (assert-is (core.empty? ""))
+ (assert-not (core.empty? "1"))
+ (assert-not (core.empty? [1]))
+ (assert-not (core.empty? {:a 1}))
+ (assert-not (pcall core.empty? 10)))
(testing "not-empty"
- (assert-not (pcall not-empty))
- (assert-eq (not-empty []) nil)
- (assert-eq (not-empty {}) nil)
- (assert-eq (not-empty "") nil)
- (assert-eq (not-empty "1") "1")
- (assert-eq (not-empty [1]) [1])
- (assert-eq (not-empty {:a 1}) {:a 1})))
+ (assert-not (pcall core.not-empty))
+ (assert-eq (core.not-empty []) nil)
+ (assert-eq (core.not-empty {}) nil)
+ (assert-eq (core.not-empty "") nil)
+ (assert-eq (core.not-empty "1") "1")
+ (assert-eq (core.not-empty [1]) [1])
+ (assert-eq (core.not-empty {:a 1}) {:a 1})))
(deftest test-math-functions
(testing "inc"
- (assert-eq (inc 1) 2)
- (assert-eq (inc -1) 0)
- (assert-not (pcall inc))
- (assert-not (pcall inc nil)))
+ (assert-eq (core.inc 1) 2)
+ (assert-eq (core.inc -1) 0)
+ (assert-not (pcall core.inc))
+ (assert-not (pcall core.inc nil)))
(testing "dec"
- (assert-eq (dec 1) 0)
- (assert-eq (dec -1) -2)
- (assert-not (pcall dec))
- (assert-not (pcall dec nil))))
+ (assert-eq (core.dec 1) 0)
+ (assert-eq (core.dec -1) -2)
+ (assert-not (pcall core.dec))
+ (assert-not (pcall core.dec nil))))
(deftest test-table-access
(testing "get"
- (assert-eq (get {:key1 10 :key2 20} :key1) 10)
- (assert-eq (get {:key1 10 :key2 20} :key1 false) 10)
- (assert-eq (get {:key1 10 :key2 20} :key3 false) false)
- (assert-eq (get {:key1 10 :key2 20} :key3) nil)
- (assert-not (pcall get))
- (assert-not (pcall get {})))
+ (assert-eq (core.get {:key1 10 :key2 20} :key1) 10)
+ (assert-eq (core.get {:key1 10 :key2 20} :key1 false) 10)
+ (assert-eq (core.get {:key1 10 :key2 20} :key3 false) false)
+ (assert-eq (core.get {:key1 10 :key2 20} :key3) nil)
+ (assert-not (pcall core.get))
+ (assert-not (pcall core.get {})))
(testing "get-in"
(local t {:a {:b {:c 10}}})
- (assert-eq (get-in t [:a]) {:b {:c 10}})
- (assert-eq (get-in t [:a :b]) {:c 10})
- (assert-eq (get-in t [:a :b :c]) 10)
- (assert-eq (get-in t [:a :b :c] false) 10)
- (assert-eq (get-in t [:a :b :d] false) false)
- (assert-eq (get-in t [:a :b :d]) nil)
- (assert-eq (get-in t []) t)
- (assert-not (pcall get-in))
- (assert-not (pcall get-in {}))))
+ (assert-eq (core.get-in t [:a]) {:b {:c 10}})
+ (assert-eq (core.get-in t [:a :b]) {:c 10})
+ (assert-eq (core.get-in t [:a :b :c]) 10)
+ (assert-eq (core.get-in t [:a :b :c] false) 10)
+ (assert-eq (core.get-in t [:a :b :d] false) false)
+ (assert-eq (core.get-in t [:a :b :d]) nil)
+ (assert-eq (core.get-in t []) t)
+ (assert-not (pcall core.get-in))
+ (assert-not (pcall core.get-in {}))))
(deftest test-methods
(testing "methods"
- (defmulti f identity)
- (defmethod f :a [_] :a)
- (defmethod f :b [_] :b)
- (defmethod f :c [x] (* x x))
- (assert-eq (methods f) f)
- (assert-not (pcall methods))
- (assert-not (pcall methods []))
- (assert-not (pcall methods f f)))
+ (clj.defmulti f core.identity)
+ (clj.defmethod f :a [_] :a)
+ (clj.defmethod f :b [_] :b)
+ (clj.defmethod f :c [x] (* x x))
+ (assert-eq (core.methods f) f)
+ (assert-not (pcall core.methods))
+ (assert-not (pcall core.methods []))
+ (assert-not (pcall core.methods f f)))
(testing "get-method"
- (defmulti f identity)
- (defmethod f :a [_] :a)
- (defmethod f :b [_] :b)
- (defmethod f :c [x] (* x x))
- (assert-eq ((get-method f :a) 10) :a)
- (assert-eq ((get-method f :b) 20) :b)
- (assert-eq ((get-method f :c) 4) 16)
- (assert-not (pcall get-method))
- (assert-not (pcall get-method []))
- (assert-not (pcall get-method [] :a))
- (assert-not (pcall get-method f))
- (assert-not (pcall get-method f :a :b)))
+ (clj.defmulti f core.identity)
+ (clj.defmethod f :a [_] :a)
+ (clj.defmethod f :b [_] :b)
+ (clj.defmethod f :c [x] (* x x))
+ (assert-eq ((core.get-method f :a) 10) :a)
+ (assert-eq ((core.get-method f :b) 20) :b)
+ (assert-eq ((core.get-method f :c) 4) 16)
+ (assert-not (pcall core.get-method))
+ (assert-not (pcall core.get-method []))
+ (assert-not (pcall core.get-method [] :a))
+ (assert-not (pcall core.get-method f))
+ (assert-not (pcall core.get-method f :a :b)))
(testing "remove-method"
- (defmulti f identity)
- (defmethod f :a [_] :a)
- (defmethod f :b [_] :b)
- (remove-method f :a)
- (assert-eq (get-method f :a) nil)
- (defmethod f :default [_] :default)
- (assert-eq (get-method f :a) (get-method f :default))
- (assert-not (pcall remove-method))
- (assert-not (pcall remove-method []))
- (assert-not (pcall remove-method [] :a))
- (assert-not (pcall remove-method f))
- (assert-not (pcall remove-method f :a :b)))
+ (clj.defmulti f core.identity)
+ (clj.defmethod f :a [_] :a)
+ (clj.defmethod f :b [_] :b)
+ (core.remove-method f :a)
+ (assert-eq (core.get-method f :a) nil)
+ (clj.defmethod f :default [_] :default)
+ (assert-eq (core.get-method f :a) (core.get-method f :default))
+ (assert-not (pcall core.remove-method))
+ (assert-not (pcall core.remove-method []))
+ (assert-not (pcall core.remove-method [] :a))
+ (assert-not (pcall core.remove-method f))
+ (assert-not (pcall core.remove-method f :a :b)))
(testing "remove-all-methods"
- (defmulti f identity)
- (defmethod f :a [_] :a)
- (defmethod f :b [_] :b)
- (defmethod f :default [_] :default)
- (remove-all-methods f)
- (assert-eq (methods f) {})
- (assert-not (pcall remove-all-methods))
- (assert-not (pcall remove-all-methods []))
- (assert-not (pcall remove-all-methods f f))))
+ (clj.defmulti f core.identity)
+ (clj.defmethod f :a [_] :a)
+ (clj.defmethod f :b [_] :b)
+ (clj.defmethod f :default [_] :default)
+ (core.remove-all-methods f)
+ (assert-eq (core.methods f) {})
+ (assert-not (pcall core.remove-all-methods))
+ (assert-not (pcall core.remove-all-methods []))
+ (assert-not (pcall core.remove-all-methods f f))))
(deftest test-math-functions
(testing "add"
- (assert-eq (add) 0)
- (assert-eq (add 1) 1)
- (assert-eq (add -1) -1)
- (assert-eq (add 1 2) 3)
- (assert-eq (add 1 2 3) 6)
- (assert-eq (add 1 2 3 4) 10)
- (assert-eq (add 1 2 3 4 5) 15))
+ (assert-eq (core.add) 0)
+ (assert-eq (core.add 1) 1)
+ (assert-eq (core.add -1) -1)
+ (assert-eq (core.add 1 2) 3)
+ (assert-eq (core.add 1 2 3) 6)
+ (assert-eq (core.add 1 2 3 4) 10)
+ (assert-eq (core.add 1 2 3 4 5) 15))
(testing "sub"
- (assert-eq (sub) 0)
- (assert-eq (sub 1) -1)
- (assert-eq (sub -1) 1)
- (assert-eq (sub 1 2) -1)
- (assert-eq (sub 1 2 3) -4)
- (assert-eq (sub 1 2 3 4) -8)
- (assert-eq (sub 1 2 3 4 5) -13))
+ (assert-eq (core.sub) 0)
+ (assert-eq (core.sub 1) -1)
+ (assert-eq (core.sub -1) 1)
+ (assert-eq (core.sub 1 2) -1)
+ (assert-eq (core.sub 1 2 3) -4)
+ (assert-eq (core.sub 1 2 3 4) -8)
+ (assert-eq (core.sub 1 2 3 4 5) -13))
(testing "mul"
- (assert-eq (mul) 1)
- (assert-eq (mul 1) 1)
- (assert-eq (mul -1) -1)
- (assert-eq (mul 1 2) 2)
- (assert-eq (mul 1 2 3) 6)
- (assert-eq (mul 1 2 3 4) 24)
- (assert-eq (mul 1 2 3 4 5) 120))
+ (assert-eq (core.mul) 1)
+ (assert-eq (core.mul 1) 1)
+ (assert-eq (core.mul -1) -1)
+ (assert-eq (core.mul 1 2) 2)
+ (assert-eq (core.mul 1 2 3) 6)
+ (assert-eq (core.mul 1 2 3 4) 24)
+ (assert-eq (core.mul 1 2 3 4 5) 120))
(testing "div"
- (assert-not (pcall div))
- (assert-eq (div 1) 1)
- (assert-eq (div -1) -1)
- (assert-eq (div 1 2) (/ 1 2))
- (assert-eq (div 1 2 3) (/ 1 2 3))
- (assert-eq (div 1 2 3 4) (/ 1 2 3 4))
- (assert-eq (div 1 2 3 4 5) (/ 1 2 3 4 5))))
+ (assert-not (pcall core.div))
+ (assert-eq (core.div 1) 1)
+ (assert-eq (core.div -1) -1)
+ (assert-eq (core.div 1 2) (/ 1 2))
+ (assert-eq (core.div 1 2 3) (/ 1 2 3))
+ (assert-eq (core.div 1 2 3 4) (/ 1 2 3 4))
+ (assert-eq (core.div 1 2 3 4 5) (/ 1 2 3 4 5))))
(deftest test-comparison-functions
(testing "le"
- (assert-not (pcall le))
- (assert-is (le 1))
- (assert-is (le 1 2))
- (assert-is (le 1 2 2))
- (assert-is (le 1 2 3 4))
- (assert-not (le 2 1))
- (assert-not (le 2 2 1))
- (assert-not (le 2 1 3))
- (assert-not (le 1 2 4 3)))
+ (assert-not (pcall core.le))
+ (assert-is (core.le 1))
+ (assert-is (core.le 1 2))
+ (assert-is (core.le 1 2 2))
+ (assert-is (core.le 1 2 3 4))
+ (assert-not (core.le 2 1))
+ (assert-not (core.le 2 2 1))
+ (assert-not (core.le 2 1 3))
+ (assert-not (core.le 1 2 4 3)))
(testing "lt"
- (assert-not (pcall lt))
- (assert-is (lt 1))
- (assert-is (lt 1 2))
- (assert-is (lt 1 2 3))
- (assert-is (lt 1 2 3 4))
- (assert-not (lt 2 1))
- (assert-not (lt 2 2 1))
- (assert-not (lt 2 1 3))
- (assert-not (lt 1 2 4 4)))
+ (assert-not (pcall core.lt))
+ (assert-is (core.lt 1))
+ (assert-is (core.lt 1 2))
+ (assert-is (core.lt 1 2 3))
+ (assert-is (core.lt 1 2 3 4))
+ (assert-not (core.lt 2 1))
+ (assert-not (core.lt 2 2 1))
+ (assert-not (core.lt 2 1 3))
+ (assert-not (core.lt 1 2 4 4)))
(testing "ge"
- (assert-not (pcall ge))
- (assert-is (ge 2))
- (assert-is (ge 2 1))
- (assert-is (ge 3 3 2))
- (assert-is (ge 4 3 2 -1))
- (assert-not (ge 1 2))
- (assert-not (ge 1 1 2))
- (assert-not (ge 2 1 3))
- (assert-not (ge 1 2 4 4)))
+ (assert-not (pcall core.ge))
+ (assert-is (core.ge 2))
+ (assert-is (core.ge 2 1))
+ (assert-is (core.ge 3 3 2))
+ (assert-is (core.ge 4 3 2 -1))
+ (assert-not (core.ge 1 2))
+ (assert-not (core.ge 1 1 2))
+ (assert-not (core.ge 2 1 3))
+ (assert-not (core.ge 1 2 4 4)))
(testing "gt"
- (assert-not (pcall gt))
- (assert-is (gt 2))
- (assert-is (gt 2 1))
- (assert-is (gt 3 2 1))
- (assert-is (gt 4 3 2 -1))
- (assert-not (gt 1 2))
- (assert-not (gt 1 1 2))
- (assert-not (gt 2 1 3))
- (assert-not (gt 1 2 4 4))))
+ (assert-not (pcall core.gt))
+ (assert-is (core.gt 2))
+ (assert-is (core.gt 2 1))
+ (assert-is (core.gt 3 2 1))
+ (assert-is (core.gt 4 3 2 -1))
+ (assert-not (core.gt 1 2))
+ (assert-not (core.gt 1 1 2))
+ (assert-not (core.gt 2 1 3))
+ (assert-not (core.gt 1 2 4 4))))
(deftest test-vector
(testing "vector"
- (assert-eq (vector) [])
- (assert-eq (vector 1) [1])
- (assert-eq (vector 1 2 3) [1 2 3])
- (assert-eq (getmetatable (vector 1 2 3)) {:cljlib/type :seq})))
+ (assert-eq (core.vector) [])
+ (assert-eq (core.vector 1) [1])
+ (assert-eq (core.vector 1 2 3) [1 2 3])
+ (assert-eq (. (getmetatable (core.vector 1 2 3)) :cljlib/type) :vector)))
(deftest test-hash-map
(testing "hash-map"
- (assert-not (pcall hash-map :a))
- (assert-eq (hash-map) {})
- (assert-eq (hash-map :a 1) {:a 1})
- (assert-eq (hash-map :a 1 :b 2 :c 3) {:a 1 :b 2 :c 3})
- (assert-eq (getmetatable (hash-map)) {:cljlib/type :table})
- (assert-not (pcall hash-map nil 1))))
+ (assert-not (pcall core.hash-map :a))
+ (assert-eq (core.hash-map) {})
+ (assert-eq (core.hash-map :a 1) {:a 1})
+ (assert-eq (core.hash-map :a 1 :b 2 :c 3) {:a 1 :b 2 :c 3})
+ (assert-eq (. (getmetatable (core.hash-map)) :cljlib/type) :hash-map)
+ (assert-not (pcall core.hash-map nil 1))))
(deftest test-sets
(testing "hash-set"
- (let [h1 (hash-set [1] [1] [2] [3] [:a])
- h2 (hash-set [1] [2] [3] [:a])]
- (assert-is (eq h1 h2)))
+ (let [h1 (core.hash-set [1] [1] [2] [3] [:a])
+ h2 (core.hash-set [1] [2] [3] [:a])]
+ (assert-is (core.eq h1 h2)))
- (let [h3 (hash-set [1] [1] [2] [3] [:a])
- h4 (hash-set [1] [1] [3] [:a])]
- (assert-not (eq h3 h4)))
+ (let [h3 (core.hash-set [1] [1] [2] [3] [:a])
+ h4 (core.hash-set [1] [1] [3] [:a])]
+ (assert-not (core.eq h3 h4)))
- (assert-eq (. (hash-set [1]) [1]) [1])
- (assert-eq (. (hash-set [1]) [2]) nil)
- (assert-eq ((hash-set [1]) [1]) [1])
- (assert-eq ((hash-set [1]) [2]) nil))
+ (assert-eq (. (core.hash-set [1]) [1]) [1])
+ (assert-eq (. (core.hash-set [1]) [2]) nil)
+ (assert-eq ((core.hash-set [1]) [1]) [1])
+ (assert-eq ((core.hash-set [1]) [2]) nil))
- (testing "ordered-set"
+ (comment testing "ordered-set"
(let [o1 (ordered-set [1] [1] [2] [3] [:a])
o2 (ordered-set [1] [2] [3] [:a])]
(assert-eq o1 o2))
@@ -839,53 +910,53 @@
(assert-eq ((ordered-set [1]) [2]) nil))
(testing "set equality"
- (let [o1 (ordered-set [1] [[-1 0] 1] [2] [3] [:a] :a 2)
- h1 (hash-set [1] [[-1 0] 1] [2] [3] [:a] :a 2)]
- (assert-eq o1 h1))
+ (let [o1 (core.hash-set [1] [[-1 0] 1] [2] [3] [:a] :a 2)
+ h1 (core.hash-set [1] [[-1 0] 1] [2] [3] [:a] :a 2)]
+ (assert-is (core.eq o1 h1)))
- (let [o2 (ordered-set [1] [[-1 0] 1] [2] [3] [:a] :a 2)
- h2 (hash-set [1] [[-1 1] 1] [2] [3] [:a] :a 2)]
- (assert-ne o2 h2))
+ (let [o2 (core.hash-set [1] [[-1 0] 1] [2] [3] [:a] :a 2)
+ h2 (core.hash-set [1] [[-1 1] 1] [2] [3] [:a] :a 2)]
+ (assert-not (core.eq o2 h2)))
- (let [o3 (ordered-set [1] [[-1 0] 1] [2] [3] [:a] :a 2)
- h3 (hash-set [1] [[-1 0] 1] [2] [3] [:a] :a 2)]
- (assert-eq (disj o3 [2]) (disj h3 [2]))
- (assert-ne (disj o3 :a) h3)
- (assert-eq (disj h3 :a) o3))
+ (let [o3 (core.hash-set [1] [[-1 0] 1] [2] [3] [:a] :a 2)
+ h3 (core.hash-set [1] [[-1 0] 1] [2] [3] [:a] :a 2)]
+ (assert-is (core.eq (core.disj o3 [2]) (core.disj h3 [2])))
+ (assert-not (core.eq (core.disj o3 :a) h3)))
- (let [o4 (ordered-set [1] [[-1 5] 1] [3] [:a] :a 2)
- h4 (hash-set [1] [[-1 5] 1] [2] [3] [:a] :a 2)]
- (assert-eq (conj o4 [2]) (conj (disj h4 [2]) [2]))))
+ (let [o4 (core.hash-set [1] [[-1 5] 1] [3] [:a] :a 2)
+ h4 (core.hash-set [1] [[-1 5] 1] [2] [3] [:a] :a 2)]
+ (assert-is (core.eq (core.conj o4 [2]) (core.conj (core.disj h4 [2]) [2])))))
(testing "empty sets"
- (assert-eq (empty (ordered-set)) (ordered-set))
- (assert-eq (empty (ordered-set 1 2 3)) (ordered-set))
- (assert-eq (. (getmetatable (empty (ordered-set))) :cljlib/type ) :cljlib/ordered-set)
+ (assert-eq (core.empty (core.hash-set)) (core.hash-set))
+ (assert-eq (core.empty (core.hash-set 1 2 3)) (core.hash-set))
+ (assert-eq (. (getmetatable (core.empty (core.hash-set))) :cljlib/type) :hash-set)
- (assert-eq (empty (hash-set)) (hash-set))
- (assert-eq (empty (hash-set 1 2 3)) (hash-set))
- (assert-eq (. (getmetatable (empty (hash-set))) :cljlib/type ) :cljlib/hash-set))
+ (assert-eq (core.empty (core.hash-set)) (core.hash-set))
+ (assert-eq (core.empty (core.hash-set 1 2 3)) (core.hash-set))
+ (assert-eq (. (getmetatable (core.empty (core.hash-set))) :cljlib/type) :hash-set))
(testing "into sets"
- (assert-eq (into (ordered-set) [1 2 3]) (ordered-set 1 2 3))
- (assert-eq (into (ordered-set) {:a 1 :b 2}) (ordered-set [:a 1] [:b 2]))
- (assert-eq (into (ordered-set) "vaiv") (ordered-set "v" "a" "i" "v"))
- (assert-eq (into (hash-set) [1 2 3]) (hash-set 1 2 3))
- (assert-eq (into (hash-set) {:a 1 :b 2}) (hash-set [:a 1] [:b 2]))
- (assert-eq (into (hash-set) "vaiv") (hash-set "v" "a" "i" "v")))
+ (assert-eq (core.into (core.hash-set) [1 2 3]) (core.hash-set 1 2 3))
+ (assert-eq (core.into (core.hash-set) {:a 1 :b 2}) (core.hash-set [:a 1] [:b 2]))
+ (assert-eq (core.into (core.hash-set) "vaiv") (core.hash-set "v" "a" "i" "v"))
+ (assert-eq (core.into (core.hash-set) [1 2 3]) (core.hash-set 1 2 3))
+ (assert-eq (core.into (core.hash-set) {:a 1 :b 2}) (core.hash-set [:a 1] [:b 2]))
+ (assert-eq (core.into (core.hash-set) "vaiv") (core.hash-set "v" "a" "i" "v")))
(testing "sets into tables"
- (assert-eq (into [] (ordered-set 1 2 3)) [1 2 3])
- (assert-eq (into [] (ordered-set :a :b :c)) [:a :b :c])
- (assert-eq (into {} (ordered-set [:a 1] [:b 2])) {:a 1 :b 2})))
+ (assert-eq (core.into (core.vector) (core.hash-set 1 2 3)) [1 2 3])
+ (assert-eq (core.into (core.vector) (core.hash-set :a)) [:a])
+ (assert-eq (core.into (core.hash-map) (core.hash-set [:a 1] [:b 2])) {:a 1 :b 2})))
(deftest test-memoization
(testing "memoize"
- (macros {:time #`(let [clock# os.clock
- start# (clock#)
- res# ,$
- end# (clock#)]
- (values res# (* 1000 (- end# start#))))})
+ (macro time [expr]
+ `(let [clock# os.clock
+ start# (clock#)
+ res# ,expr
+ end# (clock#)]
+ (values res# (* 1000 (- end# start#)))))
(fn sleep [ms]
(let [clock os.clock
@@ -894,22 +965,22 @@
(fn slow [x] (sleep 100) x)
- (assert-not (pcall memoize))
- (assert-not (pcall memoize slow 2))
+ (assert-not (pcall core.memoize))
+ (assert-not (pcall core.memoize slow 2))
- (local fast (memoize slow))
+ (local fast (core.memoize slow))
(let [(res1 time1) (time (fast 42))
(res2 time2) (time (fast 42))]
- (assert-is (eq res1 res2 42))
+ (assert-is (core.eq res1 res2 42))
(assert-is (< time2 time1)))
(let [(res1 time1) (time (fast [10]))
(res2 time2) (time (fast [10]))]
- (assert-is (eq res1 res2 [10]))
+ (assert-is (core.eq res1 res2 [10]))
(assert-is (< time2 time1)))
(let [(res1 time1) (time (fast {[[1] [2 [3]]] {:a 2} {{:a 1} {:b 1}} {{:c 3} {:d 4}}}))
(res2 time2) (time (fast {[[1] [2 [3]]] {:a 2} {{:a 1} {:b 1}} {{:c 3} {:d 4}}}))]
- (assert-is (eq res1 res2 {[[1] [2 [3]]] {:a 2} {{:a 1} {:b 1}} {{:c 3} {:d 4}}}))
+ (assert-is (core.eq res1 res2 {[[1] [2 [3]]] {:a 2} {{:a 1} {:b 1}} {{:c 3} {:d 4}}}))
(assert-is (< time2 time1)))))
diff --git a/tests/fn.fnl b/tests/fn.fnl
index 2cbe94b..83c45f5 100644
--- a/tests/fn.fnl
+++ b/tests/fn.fnl
@@ -1,84 +1,73 @@
(require-macros :fennel-test)
(require-macros :init-macros)
+(local (meta? fennel) (pcall require :fennel))
-(deftest test-fn*
- (testing "fn* meta"
- (fn* f
- "single arity"
- [x] x)
- (assert-eq (meta f)
- {:fnl/docstring "single arity"
- :fnl/arglist ["[x]"]})
- (fn* f
- "single empty arity"
- [])
- (assert-eq (meta f)
- {:fnl/docstring "single empty arity"
- :fnl/arglist ["[]"]})
- (fn* f
- "multiarity with single entry"
- ([x] x))
- (assert-eq (meta f)
- {:fnl/docstring "multiarity with single entry"
- :fnl/arglist ["[x]"]})
- (fn* f
- "multiarity"
- ([x] x)
- ([x y] (+ x y)))
- (assert-eq (meta f)
- {:fnl/docstring "multiarity"
- :fnl/arglist ["([x])"
- "([x y])"]})
- (fn* f
- "multiarity with one empty arity"
- ([])
- ([x y] (+ x y)))
- (assert-eq (meta f)
- {:fnl/docstring "multiarity with one empty arity"
- :fnl/arglist ["([])"
- "([x y])"]})
- (fn* f
- "multiarity with two or more arity"
- ([x] x)
- ([x y] (+ x y))
- ([x y & z] (+ x y)))
- (assert-eq (meta f)
- {:fnl/docstring "multiarity with two or more arity"
- :fnl/arglist ["([x])"
- "([x y])"
- "([x y & z])"]}))
-
- (testing "fn* doc destructuring"
- (fn* f [[a b c]])
- (assert-eq (meta f)
- {:fnl/arglist ["[[a b c]]"]})
- (fn* f ([[a b c]]))
- (assert-eq (meta f)
- {:fnl/arglist ["[[a b c]]"]})
- (fn* f ([[a b c]]) ([{: a}]) ([[{:a [a b c]}]]))
- (assert-eq (meta f)
- {:fnl/arglist ["([[a b c]])"
- "([{:a a}])"
- "([[{:a [a b c]}]])"]}))
+(fn meta [x]
+ {:fnl/docstring (fennel.metadata:get x :fnl/docstring)
+ :fnl/arglist (fennel.metadata:get x :fnl/arglist)})
- (testing "fn* methods"
- (local ns {:a 1 :b 2})
-
- (fn* ns:foo []
- (+ self.a self.b))
- (assert-eq (ns:foo) 3)
- (assert-not (pcall #(ns:foo 1)))
- (assert-not (pcall #(ns:foo 1 2)))
+(deftest test-fn*
+ (when meta?
+ (testing "fn* meta"
+ (defn f
+ "single arity"
+ [x] x)
+ (assert-eq {:fnl/docstring "single arity"
+ :fnl/arglist ["[x]"]}
+ (meta f))
+ (defn f
+ "single empty arity"
+ [])
+ (assert-eq {:fnl/docstring "single empty arity"
+ :fnl/arglist ["[]"]}
+ (meta f))
+ (defn f
+ "multiarity with single entry"
+ ([x] x))
+ (assert-eq {:fnl/docstring "multiarity with single entry"
+ :fnl/arglist ["([x])"]}
+ (meta f))
+ (defn f
+ "multiarity"
+ ([x] x)
+ ([x y] (+ x y)))
+ (assert-eq {:fnl/docstring "multiarity"
+ :fnl/arglist ["([x])"
+ "([x y])"]}
+ (meta f))
+ (defn f
+ "multiarity with one empty arity"
+ ([])
+ ([x y] (+ x y)))
+ (assert-eq {:fnl/docstring "multiarity with one empty arity"
+ :fnl/arglist ["([])"
+ "([x y])"]}
+ (meta f))
+ (defn f
+ "multiarity with two or more arity"
+ ([x] x)
+ ([x y] (+ x y))
+ ([x y & z] (+ x y)))
+ (assert-eq {:fnl/docstring "multiarity with two or more arity"
+ :fnl/arglist ["([x])"
+ "([x y])"
+ "([x y & z])"]}
+ (meta f))))
- (fn* ns:bar
- ([x] (+ self.a x))
- ([x y] (+ self.b x y)))
- (assert-eq (ns:bar -1) 0)
- (assert-eq (ns:bar 10 20) 32)
- (assert-not (pcall #(ns:bar)))
- (assert-not (pcall #(ns:bar 1 2 3))))
+ (testing "defn doc destructuring"
+ (defn f [[a b c]])
+ (assert-eq {:fnl/arglist ["[[a b c]]"]}
+ (meta f))
+ (defn f ([[a b c]]))
+ (assert-eq {:fnl/arglist ["([[a b c]])"]}
+ (meta f))
+ (defn f ([[a b c]]) ([{: a} b]) ([[{:a [a b c]}] d e]))
+ (assert-eq {:fnl/arglist ["([[a b c]])"
+ "([{:a a} b])"
+ "([[{:a [a b c]}] d e])"]}
+ (meta f)))
- (testing "fn* anonymous calls"
+ (testing "defn anonymous calls"
(assert-eq ((fn* [])) (values))
(assert-eq ((fn* [] nil)) nil)
(assert-eq ((fn* [x] x) 5) 5)
diff --git a/tests/macros.fnl b/tests/macros.fnl
index b142d4e..66cd158 100644
--- a/tests/macros.fnl
+++ b/tests/macros.fnl
@@ -1,63 +1,10 @@
(require-macros :fennel-test)
(require-macros :init-macros)
+(local (meta? fennel) (pcall require :fennel))
-(deftest test-into
- (testing "into"
- (assert-eq (into [] nil) [])
- (assert-eq (into nil nil) nil)
- (assert-eq (into nil [1 2 3]) [1 2 3])
-
- (assert-eq (into [] []) [])
- (assert-eq (into [1 2 3] []) [1 2 3])
- (assert-eq (into [1 2 3] [4 5 6]) [1 2 3 4 5 6])
-
- (assert-eq (into {} {}) {})
- (assert-eq (into {:a 1} {}) {:a 1})
- (assert-eq (into {:a 1} {:b 2}) {:a 1 :b 2})
-
- ;; different bodies are being used at compile time so worth testing
- (assert-eq (into [] {}) [])
- (assert-eq (into {} []) [])
- (assert-eq (. (getmetatable (into [] {})) :cljlib/type) :seq)
- (assert-eq (. (getmetatable (into {} [])) :cljlib/type) :table)
- (let [a []] (assert-eq (. (getmetatable (into a a)) :cljlib/type) :seq))
-
- ;; can't transform table with more than one key-value pair, as order
- ;; is undeterminitive
- (assert-eq (into [] {:a 1}) [[:a 1]])
- (assert-eq (into [[:b 2]] {:a 1}) [[:b 2] [:a 1]])
- (assert-eq (into [[:c 3]] {}) [[:c 3]])
-
- (assert-eq (into {} [[:c 3] [:a 1] [:b 2]]) {:a 1 :b 2 :c 3})
- (assert-eq (into {:d 4} [[:c 3] [:a 1] [:b 2]]) {:a 1 :b 2 :c 3 :d 4})
- (assert-eq (into {:a 0 :b 0 :c 0} [[:c 3] [:a 1] [:b 2]]) {:a 1 :b 2 :c 3})
-
- (let [a (fn [] {:a 1})
- b (fn [] [[:b 2]])]
- (assert-eq (into (a) (b)) {:a 1 :b 2})
- (assert-eq (into (b) (a)) [[:b 2] [:a 1]])
- (let [c []]
- (assert-eq (into c (b)) [[:b 2]]))
- (let [c []]
- (assert-eq (into c (a)) [[:a 1]]))
- (let [c []]
- (assert-eq (into (b) c) (b))
- (assert-eq (into (a) c) (a))))
-
- (let [a {}
- b []]
- (assert-eq (into a [1 2 3]) [1 2 3])
- (assert-eq (into b [1 2 3]) [1 2 3]))
- (let [a {}
- b []]
- (assert-eq (into b {:a 1}) [[:a 1]]))
-
- (let [a {}
- b []]
- (assert-eq (into a "vaiv") ["v" "a" "i" "v"])
- (when _G.utf8 (assert-eq (into b "ваыв") ["в" "а" "ы" "в"])))
- (assert-eq (into [] "vaiv") ["v" "a" "i" "v"])
- (when _G.utf8 (assert-eq (into [] "ваыв") ["в" "а" "ы" "в"]))))
+(fn meta [x]
+ {:fnl/docstring (fennel.metadata:get x :fnl/docstring)
+ :fnl/arglist (fennel.metadata:get x :fnl/arglist)})
(deftest test-let-variants
(testing "when-let"
@@ -125,13 +72,6 @@
(defmethod f :my-default [_] 42)
(assert-eq (f 10) 42))
-
- (testing "defmulti docstring"
- (defmulti f "documentation" (fn [x] x))
- (assert-eq (meta f) {:fnl/docstring "documentation"})
- (defmulti g "documentation" (fn [x] x) :default 0)
- (assert-eq (meta g) {:fnl/docstring "documentation"}))
-
(testing "defmulti with multiple arity"
(defmulti f (fn* ([x] x) ([x y] [x y])))
(defmethod f :default ([_] :def) ([_ _] :def2))
@@ -143,67 +83,6 @@
(assert-eq (f :4) :42)
(assert-eq (f :4 :2) 42)))
-(deftest test-def-macros
- (testing "def"
- (def {:mutable true} a 10)
- (assert-eq a 10)
- (set a 20)
- (assert-eq a 20)
- (def a {})
- (assert-eq a {})
- (def a.b 10)
- (assert-eq a.b 10)
- (assert-eq b 10)
- (def :mutable c 10)
- (set c 15)
- (assert-eq c 15))
-
- (testing "defonce"
- (defonce {:mutable true} a 10)
- (assert-eq a 10)
- (defonce a {})
- (assert-eq a 10)
- (defonce b {})
- (defonce b.a 10)
- (assert-eq b.a 10)
- (assert-eq a 10)))
-
-(deftest test-meta
- (testing "with-meta"
- (assert-eq (meta (with-meta :a {:k :v})) {:k :v}))
-
- (testing "def meta"
- (def {:doc "x"} x 10)
- (assert-eq (meta x) {:fnl/docstring "x"})
- (def {:doc "x" :mutable true} x 10)
- (assert-eq (meta x) {:fnl/docstring "x"}))
-
- (testing "defonce meta table"
- (defonce {:doc "x"} x 10)
- (assert-eq (meta x) {:fnl/docstring "x"})
- (defonce {:doc "y"} x 20)
- (assert-eq (meta x) {:fnl/docstring "x"})
- (defonce {:doc "y" :mutable true} y 20)
- (assert-eq (meta y) {:fnl/docstring "y"})))
-
-(deftest test-empty
- (testing "empty map"
- (assert-eq (empty {}) {})
- (assert-eq (getmetatable (empty {})) {:cljlib/type :table})
- (let [a {:a 1 :b 2}]
- (assert-eq (empty a) {})
- (assert-eq (getmetatable (empty a)) {:cljlib/type :table}))
- (let [a {}]
- (assert-eq (empty a) [])
- (assert-eq (getmetatable (empty a)) {:cljlib/type :empty})))
-
- (testing "empty seq"
- (assert-eq (empty []) {})
- (assert-eq (getmetatable (empty [])) {:cljlib/type :seq})
- (let [a [:a 1 :b 2]]
- (assert-eq (empty a) [])
- (assert-eq (getmetatable (empty a)) {:cljlib/type :seq}))))
-
(deftest test-try
(testing "try"
(assert-eq (try (+ 1 2 3)) 6)
@@ -213,35 +92,35 @@
(testing "catch-all"
(assert-eq (try
- (error "10")
- (catch _ :pass))
+ (error "10")
+ (catch _ :pass))
:pass)
(assert-eq (try
- (error [10])
- (catch err err))
+ (error [10])
+ (catch err err))
[10]))
(testing "finally"
(let [tbl []]
(try
- (try
- (finally (table.insert tbl 1)))
- (try
- (error 10)
- (catch _ (table.insert tbl 2))
- (finally (table.insert tbl 3)))
- (try
- (error 20)
- (finally (table.insert tbl 4)))
- (catch _ (table.insert tbl 5))
- (catch 20 (table.insert tbl 6))
- (finally (table.insert tbl 7)))
+ (try
+ (finally (table.insert tbl 1)))
+ (try
+ (error 10)
+ (catch _ (table.insert tbl 2))
+ (finally (table.insert tbl 3)))
+ (try
+ (error 20)
+ (finally (table.insert tbl 4)))
+ (catch _ (table.insert tbl 5))
+ (catch 20 (table.insert tbl 6))
+ (finally (table.insert tbl 7)))
(assert-eq tbl [1 2 3 4 5 7])))
(testing "runtime error"
(assert-eq 0 (try
- (/ 1 nil)
- (catch _ 0))))
+ (/ 1 nil)
+ (catch _ 0))))
(testing "multi-value results"
(assert-eq 3 (select :# (try (values 1 2 3))))