Skip to content

Commit 85a7b0c

Browse files
authored
Test assoc! (#783)
This closes #153.
1 parent fea043c commit 85a7b0c

1 file changed

Lines changed: 65 additions & 0 deletions

File tree

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
(ns clojure.core-test.assoc-bang
2+
(:require [clojure.test :refer [deftest testing are]]
3+
[clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]]))
4+
5+
(when-var-exists assoc!
6+
7+
(deftest test-assoc!
8+
9+
(testing "maps"
10+
(testing "maps - single value"
11+
(are [expected map key val] (= expected (persistent! (assoc! (transient map) key val)))
12+
{:a 1} {} :a 1
13+
{:a 1 :b 2} {:a 1} :b 2
14+
{:a 3 :b 2} {:a 1 :b 2} :a 3))
15+
(testing "maps - multiple values"
16+
(are [expected map kvs] (= expected (persistent! (apply assoc! (transient map) kvs)))
17+
{:a 1 :b 2} {} [:a 1 :b 2]
18+
{:a 1 :b 3} {} [:a 1 :b 2 :b 3]
19+
{:a 1 :b 3 :c 5 :d 7} {:a 1 :b 2} [:b 3 :c 5 :d 7])))
20+
21+
(testing "vectors"
22+
(testing "vectors - single value"
23+
(are [expected vec index val] (= expected (persistent! (assoc! (transient vec) index val)))
24+
[nil] [] 0 nil
25+
[0] [] 0 0
26+
[0 3 2] [0 1 2] 1 3
27+
[0 1 2 3] [0 1 2] 3 3))
28+
(testing "vectors - multiple values"
29+
; assoc coll index-1 val-1 index-2 val-2 ...
30+
(are [expected vec ivs] (= expected (persistent! (apply assoc! (transient vec) ivs)))
31+
[1 nil] [] [0 1 1]
32+
[1 2] [] [0 1 1 2]
33+
[1 3 5 7] [1 2] [1 3 2 5 3 7]))
34+
(testing "vectors - out-of-bounds indices"
35+
(are [vec ivs] (thrown? #?(:cljs js/Error :default Exception) (apply assoc! (transient vec) ivs))
36+
[] [-1 0]
37+
[] [1 0]
38+
[0 1 2] [-1 -1]
39+
[0 1 2] [4 4]
40+
[1 2] [1 3 3 5]
41+
[1 2] [-1 3 2 5]
42+
[1 2] [-1 3 3 5])))
43+
44+
(testing "odd number of args"
45+
; on the contrary to assoc, assoc! accepts an odd number (> 1) of args and assumes missing value is nil
46+
(are [coll kvs] (= (apply assoc coll (conj kvs nil)) (persistent! (apply assoc! (transient coll) kvs)))
47+
{:a 1} [:b 2 :c]
48+
{:a 1} [:b 2 :c 3 :d]
49+
[1] [0 1 1]
50+
[1] [0 1 1 2 2]))
51+
52+
(testing "bad shape"
53+
(are [coll] (thrown? #?(:cljs js/Error :default Exception) (assoc! coll 1 3))
54+
nil
55+
{:a 1 :b 2}
56+
[0 1 2]
57+
'(0 1 2)
58+
(transient '(0 1 2))
59+
#{0 1 2}
60+
(transient #{0 1 2})
61+
true
62+
false
63+
:k
64+
42
65+
3.14))))

0 commit comments

Comments
 (0)