|
| 1 | +(ns tests.basilisp.test-data |
| 2 | + (:import datetime) |
| 3 | + (:require |
| 4 | + [basilisp.data :refer [diff]] |
| 5 | + [basilisp.test :refer [deftest are testing]])) |
| 6 | + |
| 7 | +(deftest diff-test |
| 8 | + (testing "scalar types" |
| 9 | + (testing "no diff if equal" |
| 10 | + (are [x] (= [nil nil x] (diff x x)) |
| 11 | + "" |
| 12 | + "string" |
| 13 | + -1 |
| 14 | + 0 |
| 15 | + 1 |
| 16 | + -1.0 |
| 17 | + 0.0 |
| 18 | + 1.0 |
| 19 | + true |
| 20 | + false |
| 21 | + nil |
| 22 | + |
| 23 | + :kw |
| 24 | + :ns/kw |
| 25 | + 'sym |
| 26 | + 'ns/sym |
| 27 | + |
| 28 | + #inst "2020-06-04T22:32:29.871744" |
| 29 | + (datetime/date 2020 6 4) |
| 30 | + (datetime/time 22 35 38) |
| 31 | + 3.1415926535M |
| 32 | + 22/7 |
| 33 | + #uuid "632ac3d8-fcfd-4d36-a05b-a54277a345bc")) |
| 34 | + |
| 35 | + (testing "completely different if not equal" |
| 36 | + (are [x y] (= [x y nil] (diff x y)) |
| 37 | + "" "not empty" |
| 38 | + "string" "not a string" |
| 39 | + -1 -9327 |
| 40 | + 0 3 |
| 41 | + 1 1373 |
| 42 | + -1.0 -71.183 |
| 43 | + 0.0 1.373 |
| 44 | + 1.0 43727272.3 |
| 45 | + true false |
| 46 | + false true |
| 47 | + nil :not-nil |
| 48 | + |
| 49 | + :kw :other-kw |
| 50 | + :ns/kw :other-ns/kw |
| 51 | + 'sym 'other-sym |
| 52 | + 'ns/sym 'other-ns/sym |
| 53 | + |
| 54 | + #inst "2020-06-04T22:32:29.871744" #inst "2019-01-03T11:15:30.871744" |
| 55 | + (datetime/date 2020 6 4) (datetime/time 22 35 38) |
| 56 | + (datetime/time 22 35 38) (datetime/date 2020 6 4) |
| 57 | + 3.1415926535M 2.7182818284M |
| 58 | + 22/7 1/2 |
| 59 | + #uuid "632ac3d8-fcfd-4d36-a05b-a54277a345bc" #uuid "33fef9e5-071c-47e6-886c-f8790bf1d07d"))) |
| 60 | + |
| 61 | + (testing "set types" |
| 62 | + (testing "set types never equal to non-set type" |
| 63 | + (are [x] (= [#{} x nil] (diff #{} x)) |
| 64 | + "" |
| 65 | + "string" |
| 66 | + -1 |
| 67 | + 0 |
| 68 | + 1 |
| 69 | + -1.0 |
| 70 | + 0.0 |
| 71 | + 1.0 |
| 72 | + true |
| 73 | + false |
| 74 | + nil |
| 75 | + |
| 76 | + :kw |
| 77 | + :ns/kw |
| 78 | + 'sym |
| 79 | + 'ns/sym |
| 80 | + |
| 81 | + #inst "2020-06-04T22:32:29.871744" |
| 82 | + (datetime/date 2020 6 4) |
| 83 | + (datetime/time 22 35 38) |
| 84 | + 3.1415926535M |
| 85 | + 22/7 |
| 86 | + #uuid "632ac3d8-fcfd-4d36-a05b-a54277a345bc" |
| 87 | + |
| 88 | + {} |
| 89 | + [] |
| 90 | + '())) |
| 91 | + |
| 92 | + (testing "Basilisp set" |
| 93 | + (are [x y z] (= z (diff x y)) |
| 94 | + #{} #{} [nil nil #{}] |
| 95 | + #{:a} #{:a} [nil nil #{:a}] |
| 96 | + #{:a} #{:b} [#{:a} #{:b} nil] |
| 97 | + #{:a :b} #{:b :c} [#{:a} #{:c} #{:b}] |
| 98 | + |
| 99 | + ;; no subdiffs |
| 100 | + #{:a [:b :c]} #{:a [:c :d]} [#{[:b :c]} #{[:c :d]} #{:a}] |
| 101 | + #{:a '(:b :c)} #{:a '(:c :d)} [#{'(:b :c)} #{'(:c :d)} #{:a}] |
| 102 | + #{:a #{:b :c}} #{:a #{:c :d}} [#{#{:b :c}} #{#{:c :d}} #{:a}] |
| 103 | + #{:a {:b 2 :c 3}} #{:a {:c 3 :d 4}} [#{{:b 2 :c 3}} #{{:c 3 :d 4}} #{:a}])) |
| 104 | + |
| 105 | + (testing "mutable Python set" |
| 106 | + (are [x y z] (= z (diff (python/set x) (python/set y))) |
| 107 | + [] [] [nil nil #{}] |
| 108 | + [:a] [:a] [nil nil #{:a}] |
| 109 | + [:a] [:b] [#{:a} #{:b} nil] |
| 110 | + [:a :b] [:b :c] [#{:a} #{:c} #{:b}] |
| 111 | + |
| 112 | + ;; no subdiffs |
| 113 | + [:a [:b :c]] [:a [:c :d]] [#{[:b :c]} #{[:c :d]} #{:a}] |
| 114 | + [:a '(:b :c)] [:a '(:c :d)] [#{'(:b :c)} #{'(:c :d)} #{:a}] |
| 115 | + [:a #{:b :c}] [:a #{:c :d}] [#{#{:b :c}} #{#{:c :d}} #{:a}] |
| 116 | + [:a {:b 2 :c 3}] [:a {:c 3 :d 4}] [#{{:b 2 :c 3}} #{{:c 3 :d 4}} #{:a}])) |
| 117 | + |
| 118 | + (testing "Python frozenset" |
| 119 | + (are [x y z] (= z (diff (python/frozenset x) (python/frozenset y))) |
| 120 | + [] [] [nil nil #{}] |
| 121 | + [:a] [:a] [nil nil #{:a}] |
| 122 | + [:a] [:b] [#{:a} #{:b} nil] |
| 123 | + [:a :b] [:b :c] [#{:a} #{:c} #{:b}] |
| 124 | + |
| 125 | + ;; no subdiffs |
| 126 | + [:a [:b :c]] [:a [:c :d]] [#{[:b :c]} #{[:c :d]} #{:a}] |
| 127 | + [:a '(:b :c)] [:a '(:c :d)] [#{'(:b :c)} #{'(:c :d)} #{:a}] |
| 128 | + [:a #{:b :c}] [:a #{:c :d}] [#{#{:b :c}} #{#{:c :d}} #{:a}] |
| 129 | + [:a {:b 2 :c 3}] [:a {:c 3 :d 4}] [#{{:b 2 :c 3}} #{{:c 3 :d 4}} #{:a}]))) |
| 130 | + |
| 131 | + (testing "sequential types" |
| 132 | + (testing "vector types never equal to non-sequential type" |
| 133 | + (are [x] (= [[] x nil] (diff [] x)) |
| 134 | + "" |
| 135 | + "string" |
| 136 | + -1 |
| 137 | + 0 |
| 138 | + 1 |
| 139 | + -1.0 |
| 140 | + 0.0 |
| 141 | + 1.0 |
| 142 | + true |
| 143 | + false |
| 144 | + nil |
| 145 | + |
| 146 | + :kw |
| 147 | + :ns/kw |
| 148 | + 'sym |
| 149 | + 'ns/sym |
| 150 | + |
| 151 | + #inst "2020-06-04T22:32:29.871744" |
| 152 | + (datetime/date 2020 6 4) |
| 153 | + (datetime/time 22 35 38) |
| 154 | + 3.1415926535M |
| 155 | + 22/7 |
| 156 | + #uuid "632ac3d8-fcfd-4d36-a05b-a54277a345bc" |
| 157 | + |
| 158 | + {} |
| 159 | + {:a 1} |
| 160 | + #{} |
| 161 | + #{:a :b :c})) |
| 162 | + |
| 163 | + (testing "list types never equal to non-sequential type" |
| 164 | + (are [x] (= ['() x nil] (diff '() x)) |
| 165 | + "" |
| 166 | + "string" |
| 167 | + -1 |
| 168 | + 0 |
| 169 | + 1 |
| 170 | + -1.0 |
| 171 | + 0.0 |
| 172 | + 1.0 |
| 173 | + true |
| 174 | + false |
| 175 | + nil |
| 176 | + |
| 177 | + :kw |
| 178 | + :ns/kw |
| 179 | + 'sym |
| 180 | + 'ns/sym |
| 181 | + |
| 182 | + #inst "2020-06-04T22:32:29.871744" |
| 183 | + (datetime/date 2020 6 4) |
| 184 | + (datetime/time 22 35 38) |
| 185 | + 3.1415926535M |
| 186 | + 22/7 |
| 187 | + #uuid "632ac3d8-fcfd-4d36-a05b-a54277a345bc" |
| 188 | + |
| 189 | + {} |
| 190 | + {:a 1} |
| 191 | + #{} |
| 192 | + #{:a :b :c})) |
| 193 | + |
| 194 | + (testing "sequential types equal" |
| 195 | + (are [x y z] (= z (diff x y)) |
| 196 | + [] [] [nil nil []] |
| 197 | + [1 2 3] [2 3 4] [[1 2 3] [2 3 4] nil] |
| 198 | + [1 2 3] [1 2 4] [[nil nil 3] [nil nil 4] [1 2]] |
| 199 | + [1 2 3] [1 2 3] [nil nil [1 2 3]] |
| 200 | + [1 2 3] [1 2 3 4] [nil [nil nil nil 4] [1 2 3]] |
| 201 | + [1 2 3] [5 9 3 2 3 7] [[1 2] [5 9 nil 2 3 7] [nil nil 3]] |
| 202 | + [{:a 1 :b 2} 2 3] [{:a 1 :b 3} 0 3] [[{:b 2} 2] [{:b 3} 0] [{:a 1} nil 3]] |
| 203 | + [1 #{:a :b :c} 3] [1 #{:b :c :d} 4 3] [[nil #{:a} 3] [nil #{:d} 4 3] [1 #{:b :c}]] |
| 204 | + |
| 205 | + '() '() [nil nil []] |
| 206 | + '(1 2 3) '(2 3 4) [[1 2 3] [2 3 4] nil] |
| 207 | + '(1 2 3) '(1 2 4) [[nil nil 3] [nil nil 4] [1 2]] |
| 208 | + '(1 2 3) '(1 2 3) [nil nil [1 2 3]] |
| 209 | + '(1 2 3) '(1 2 3 4) [nil [nil nil nil 4] [1 2 3]] |
| 210 | + '(1 2 3) '(5 9 3 2 3 7) [[1 2] [5 9 nil 2 3 7] [nil nil 3]] |
| 211 | + '({:a 1 :b 2} 2 3) '({:a 1 :b 3} 0 3) [[{:b 2} 2] [{:b 3} 0] [{:a 1} nil 3]] |
| 212 | + '(1 #{:a :b :c} 3) '(1 #{:b :c :d} 4 3) [[nil #{:a} 3] [nil #{:d} 4 3] [1 #{:b :c}]]))) |
| 213 | + |
| 214 | + (testing "map types" |
| 215 | + (testing "map types never equal to non-map type" |
| 216 | + (are [x] (= [{} x nil] (diff {} x)) |
| 217 | + "" |
| 218 | + "string" |
| 219 | + -1 |
| 220 | + 0 |
| 221 | + 1 |
| 222 | + -1.0 |
| 223 | + 0.0 |
| 224 | + 1.0 |
| 225 | + true |
| 226 | + false |
| 227 | + nil |
| 228 | + |
| 229 | + :kw |
| 230 | + :ns/kw |
| 231 | + 'sym |
| 232 | + 'ns/sym |
| 233 | + |
| 234 | + #inst "2020-06-04T22:32:29.871744" |
| 235 | + (datetime/date 2020 6 4) |
| 236 | + (datetime/time 22 35 38) |
| 237 | + 3.1415926535M |
| 238 | + 22/7 |
| 239 | + #uuid "632ac3d8-fcfd-4d36-a05b-a54277a345bc" |
| 240 | + |
| 241 | + [] |
| 242 | + [:a :b :c] |
| 243 | + '() |
| 244 | + '(:a :b :c) |
| 245 | + #{} |
| 246 | + #{:a :b :c})) |
| 247 | + |
| 248 | + (are [x y z] (= z (diff x y)) |
| 249 | + {} {} [nil nil {}] |
| 250 | + {:a 1} {:a 1} [nil nil {:a 1}] |
| 251 | + {:a 1} {:a 2} [{:a 1} {:a 2} nil] |
| 252 | + {:a 1} {:b 2} [{:a 1} {:b 2} nil] |
| 253 | + {:a #{1 2 3}} {:a #{2 3 4}} [{:a #{1}} {:a #{4}} {:a #{3 2}}] |
| 254 | + {:a 1 :b {:c #{1 2 3}}} {:a 2 :b {:c #{2 3 4}}} [{:a 1 :b {:c #{1}}} {:a 2 :b {:c #{4}}} {:b {:c #{2 3}}}] |
| 255 | + {:a [1 2 3]} {:a [5 9 3 2 3 7]} [{:a [1 2]} {:a [5 9 nil 2 3 7]} {:a [nil nil 3]}] |
| 256 | + {:a [1 2 3]} {:a '(5 9 3 2 3 7)} [{:a [1 2]} {:a [5 9 nil 2 3 7]} {:a [nil nil 3]}] |
| 257 | + {:a 1 :b {:c '(1 2 3)}} {:a 2 :b {:c [5 9 3 2 3 7]}} [{:a 1 :b {:c [1 2]}} {:a 2 :b {:c [5 9 nil 2 3 7]}} {:b {:c [nil nil 3]}}] |
| 258 | + {:a 1 :b {:c 2 :d 3}} {:a 1 :b {:c 2 :e 5}} [{:b {:d 3}} {:b {:e 5}} {:a 1 :b {:c 2}}] |
| 259 | + {:a {:e :f :g :h} :b :c} {:a {:e :z :g :h} :c :d} [{:a {:e :f} :b :c} {:a {:e :z} :c :d} {:a {:g :h}}]))) |
0 commit comments