comparison src/clojure/test_clojure/sequences.clj @ 10:ef7dbbd6452c

added clojure source goodness
author Robert McIntyre <rlm@mit.edu>
date Sat, 21 Aug 2010 06:25:44 -0400
parents
children
comparison
equal deleted inserted replaced
9:35cf337adfcf 10:ef7dbbd6452c
1 ; Copyright (c) Rich Hickey. All rights reserved.
2 ; The use and distribution terms for this software are covered by the
3 ; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
4 ; which can be found in the file epl-v10.html at the root of this distribution.
5 ; By using this software in any fashion, you are agreeing to be bound by
6 ; the terms of this license.
7 ; You must not remove this notice, or any other, from this software.
8
9 ; Author: Frantisek Sodomka
10 ; Contributors: Stuart Halloway
11
12 (ns clojure.test-clojure.sequences
13 (:use clojure.test))
14
15 ;; *** Tests ***
16
17 ; TODO:
18 ; apply, map, filter, remove
19 ; and more...
20
21 (deftest test-reduce-from-chunked-into-unchunked
22 (= [1 2 \a \b] (into [] (concat [1 2] "ab"))))
23
24 (deftest test-reduce
25 (let [int+ (fn [a b] (+ (int a) (int b)))
26 arange (range 100) ;; enough to cross nodes
27 avec (into [] arange)
28 alist (into () arange)
29 obj-array (into-array arange)
30 int-array (into-array Integer/TYPE arange)
31 long-array (into-array Long/TYPE arange)
32 float-array (into-array Float/TYPE arange)
33 char-array (into-array Character/TYPE (map char arange))
34 double-array (into-array Double/TYPE arange)
35 byte-array (into-array Byte/TYPE (map byte arange))
36 int-vec (into (vector-of :int) arange)
37 long-vec (into (vector-of :long) arange)
38 float-vec (into (vector-of :float) arange)
39 char-vec (into (vector-of :char) (map char arange))
40 double-vec (into (vector-of :double) arange)
41 byte-vec (into (vector-of :byte) (map byte arange))
42 all-true (into-array Boolean/TYPE (repeat 10 true))]
43 (is (= 4950
44 (reduce + arange)
45 (reduce + avec)
46 (reduce + alist)
47 (reduce + obj-array)
48 (reduce + int-array)
49 (reduce + long-array)
50 (reduce + float-array)
51 (reduce int+ char-array)
52 (reduce + double-array)
53 (reduce int+ byte-array)
54 (reduce + int-vec)
55 (reduce + long-vec)
56 (reduce + float-vec)
57 (reduce int+ char-vec)
58 (reduce + double-vec)
59 (reduce int+ byte-vec)))
60 (is (= 4951
61 (reduce + 1 arange)
62 (reduce + 1 avec)
63 (reduce + 1 alist)
64 (reduce + 1 obj-array)
65 (reduce + 1 int-array)
66 (reduce + 1 long-array)
67 (reduce + 1 float-array)
68 (reduce int+ 1 char-array)
69 (reduce + 1 double-array)
70 (reduce int+ 1 byte-array)
71 (reduce + 1 int-vec)
72 (reduce + 1 long-vec)
73 (reduce + 1 float-vec)
74 (reduce int+ 1 char-vec)
75 (reduce + 1 double-vec)
76 (reduce int+ 1 byte-vec)))
77 (is (= true
78 (reduce #(and %1 %2) all-true)
79 (reduce #(and %1 %2) true all-true)))))
80
81 (deftest test-equality
82 ; lazy sequences
83 (are [x y] (= x y)
84 ; fixed SVN 1288 - LazySeq and EmptyList equals/equiv
85 ; http://groups.google.com/group/clojure/browse_frm/thread/286d807be9cae2a5#
86 (map inc nil) ()
87 (map inc ()) ()
88 (map inc []) ()
89 (map inc #{}) ()
90 (map inc {}) () ))
91
92
93 (deftest test-lazy-seq
94 (are [x] (seq? x)
95 (lazy-seq nil)
96 (lazy-seq [])
97 (lazy-seq [1 2]))
98
99 (are [x y] (= x y)
100 (lazy-seq nil) ()
101 (lazy-seq [nil]) '(nil)
102
103 (lazy-seq ()) ()
104 (lazy-seq []) ()
105 (lazy-seq #{}) ()
106 (lazy-seq {}) ()
107 (lazy-seq "") ()
108 (lazy-seq (into-array [])) ()
109
110 (lazy-seq (list 1 2)) '(1 2)
111 (lazy-seq [1 2]) '(1 2)
112 (lazy-seq (sorted-set 1 2)) '(1 2)
113 (lazy-seq (sorted-map :a 1 :b 2)) '([:a 1] [:b 2])
114 (lazy-seq "abc") '(\a \b \c)
115 (lazy-seq (into-array [1 2])) '(1 2) ))
116
117
118 (deftest test-seq
119 (is (not (seq? (seq []))))
120 (is (seq? (seq [1 2])))
121
122 (are [x y] (= x y)
123 (seq nil) nil
124 (seq [nil]) '(nil)
125
126 (seq ()) nil
127 (seq []) nil
128 (seq #{}) nil
129 (seq {}) nil
130 (seq "") nil
131 (seq (into-array [])) nil
132
133 (seq (list 1 2)) '(1 2)
134 (seq [1 2]) '(1 2)
135 (seq (sorted-set 1 2)) '(1 2)
136 (seq (sorted-map :a 1 :b 2)) '([:a 1] [:b 2])
137 (seq "abc") '(\a \b \c)
138 (seq (into-array [1 2])) '(1 2) ))
139
140
141 (deftest test-cons
142 (is (thrown? IllegalArgumentException (cons 1 2)))
143 (are [x y] (= x y)
144 (cons 1 nil) '(1)
145 (cons nil nil) '(nil)
146
147 (cons \a nil) '(\a)
148 (cons \a "") '(\a)
149 (cons \a "bc") '(\a \b \c)
150
151 (cons 1 ()) '(1)
152 (cons 1 '(2 3)) '(1 2 3)
153
154 (cons 1 []) [1]
155 (cons 1 [2 3]) [1 2 3]
156
157 (cons 1 #{}) '(1)
158 (cons 1 (sorted-set 2 3)) '(1 2 3)
159
160 (cons 1 (into-array [])) '(1)
161 (cons 1 (into-array [2 3])) '(1 2 3) ))
162
163
164 (deftest test-empty
165 (are [x y] (and (= (empty x) y)
166 (= (class (empty x)) (class y)))
167 nil nil
168
169 () ()
170 '(1 2) ()
171
172 [] []
173 [1 2] []
174
175 {} {}
176 {:a 1 :b 2} {}
177
178 (sorted-map) (sorted-map)
179 (sorted-map :a 1 :b 2) (sorted-map)
180
181 #{} #{}
182 #{1 2} #{}
183
184 (sorted-set) (sorted-set)
185 (sorted-set 1 2) (sorted-set)
186
187 (seq ()) nil ; (seq ()) => nil
188 (seq '(1 2)) ()
189
190 (seq []) nil ; (seq []) => nil
191 (seq [1 2]) ()
192
193 (seq "") nil ; (seq "") => nil
194 (seq "ab") ()
195
196 (lazy-seq ()) ()
197 (lazy-seq '(1 2)) ()
198
199 (lazy-seq []) ()
200 (lazy-seq [1 2]) ()
201
202 ; non-coll, non-seq => nil
203 42 nil
204 1.2 nil
205 "abc" nil ))
206
207 ;Tests that the comparator is preservered
208 ;The first element should be the same in each set if preserved.
209 (deftest test-empty-sorted
210 (let [inv-compare (comp - compare)]
211 (are [x y] (= (first (into (empty x) x))
212 (first y))
213 (sorted-set 1 2 3) (sorted-set 1 2 3)
214 (sorted-set-by inv-compare 1 2 3) (sorted-set-by inv-compare 1 2 3)
215
216 (sorted-map 1 :a 2 :b 3 :c) (sorted-map 1 :a 2 :b 3 :c)
217 (sorted-map-by inv-compare 1 :a 2 :b 3 :c) (sorted-map-by inv-compare 1 :a 2 :b 3 :c))))
218
219
220 (deftest test-not-empty
221 ; empty coll/seq => nil
222 (are [x] (= (not-empty x) nil)
223 ()
224 []
225 {}
226 #{}
227 (seq ())
228 (seq [])
229 (lazy-seq ())
230 (lazy-seq []) )
231
232 ; non-empty coll/seq => identity
233 (are [x] (and (= (not-empty x) x)
234 (= (class (not-empty x)) (class x)))
235 '(1 2)
236 [1 2]
237 {:a 1}
238 #{1 2}
239 (seq '(1 2))
240 (seq [1 2])
241 (lazy-seq '(1 2))
242 (lazy-seq [1 2]) ))
243
244
245 (deftest test-first
246 (is (thrown? IllegalArgumentException (first)))
247 (is (thrown? IllegalArgumentException (first true)))
248 (is (thrown? IllegalArgumentException (first false)))
249 (is (thrown? IllegalArgumentException (first 1)))
250 (is (thrown? IllegalArgumentException (first 1 2)))
251 (is (thrown? IllegalArgumentException (first \a)))
252 (is (thrown? IllegalArgumentException (first 's)))
253 (is (thrown? IllegalArgumentException (first :k)))
254 (are [x y] (= x y)
255 (first nil) nil
256
257 ; string
258 (first "") nil
259 (first "a") \a
260 (first "abc") \a
261
262 ; list
263 (first ()) nil
264 (first '(1)) 1
265 (first '(1 2 3)) 1
266
267 (first '(nil)) nil
268 (first '(1 nil)) 1
269 (first '(nil 2)) nil
270 (first '(())) ()
271 (first '(() nil)) ()
272 (first '(() 2 nil)) ()
273
274 ; vector
275 (first []) nil
276 (first [1]) 1
277 (first [1 2 3]) 1
278
279 (first [nil]) nil
280 (first [1 nil]) 1
281 (first [nil 2]) nil
282 (first [[]]) []
283 (first [[] nil]) []
284 (first [[] 2 nil]) []
285
286 ; set
287 (first #{}) nil
288 (first #{1}) 1
289 (first (sorted-set 1 2 3)) 1
290
291 (first #{nil}) nil
292 (first (sorted-set 1 nil)) nil
293 (first (sorted-set nil 2)) nil
294 (first #{#{}}) #{}
295 (first (sorted-set #{} nil)) nil
296 ;(first (sorted-set #{} 2 nil)) nil
297
298 ; map
299 (first {}) nil
300 (first (sorted-map :a 1)) '(:a 1)
301 (first (sorted-map :a 1 :b 2 :c 3)) '(:a 1)
302
303 ; array
304 (first (into-array [])) nil
305 (first (into-array [1])) 1
306 (first (into-array [1 2 3])) 1
307 (first (to-array [nil])) nil
308 (first (to-array [1 nil])) 1
309 (first (to-array [nil 2])) nil ))
310
311
312 (deftest test-next
313 (is (thrown? IllegalArgumentException (next)))
314 (is (thrown? IllegalArgumentException (next true)))
315 (is (thrown? IllegalArgumentException (next false)))
316 (is (thrown? IllegalArgumentException (next 1)))
317 (is (thrown? IllegalArgumentException (next 1 2)))
318 (is (thrown? IllegalArgumentException (next \a)))
319 (is (thrown? IllegalArgumentException (next 's)))
320 (is (thrown? IllegalArgumentException (next :k)))
321 (are [x y] (= x y)
322 (next nil) nil
323
324 ; string
325 (next "") nil
326 (next "a") nil
327 (next "abc") '(\b \c)
328
329 ; list
330 (next ()) nil
331 (next '(1)) nil
332 (next '(1 2 3)) '(2 3)
333
334 (next '(nil)) nil
335 (next '(1 nil)) '(nil)
336 (next '(1 ())) '(())
337 (next '(nil 2)) '(2)
338 (next '(())) nil
339 (next '(() nil)) '(nil)
340 (next '(() 2 nil)) '(2 nil)
341
342 ; vector
343 (next []) nil
344 (next [1]) nil
345 (next [1 2 3]) [2 3]
346
347 (next [nil]) nil
348 (next [1 nil]) [nil]
349 (next [1 []]) [[]]
350 (next [nil 2]) [2]
351 (next [[]]) nil
352 (next [[] nil]) [nil]
353 (next [[] 2 nil]) [2 nil]
354
355 ; set
356 (next #{}) nil
357 (next #{1}) nil
358 (next (sorted-set 1 2 3)) '(2 3)
359
360 (next #{nil}) nil
361 (next (sorted-set 1 nil)) '(1)
362 (next (sorted-set nil 2)) '(2)
363 (next #{#{}}) nil
364 (next (sorted-set #{} nil)) '(#{})
365 ;(next (sorted-set #{} 2 nil)) #{}
366
367 ; map
368 (next {}) nil
369 (next (sorted-map :a 1)) nil
370 (next (sorted-map :a 1 :b 2 :c 3)) '((:b 2) (:c 3))
371
372 ; array
373 (next (into-array [])) nil
374 (next (into-array [1])) nil
375 (next (into-array [1 2 3])) '(2 3)
376
377 (next (to-array [nil])) nil
378 (next (to-array [1 nil])) '(nil)
379 ;(next (to-array [1 (into-array [])])) (list (into-array []))
380 (next (to-array [nil 2])) '(2)
381 (next (to-array [(into-array [])])) nil
382 (next (to-array [(into-array []) nil])) '(nil)
383 (next (to-array [(into-array []) 2 nil])) '(2 nil) ))
384
385
386 (deftest test-last
387 (are [x y] (= x y)
388 (last nil) nil
389
390 ; list
391 (last ()) nil
392 (last '(1)) 1
393 (last '(1 2 3)) 3
394
395 (last '(nil)) nil
396 (last '(1 nil)) nil
397 (last '(nil 2)) 2
398 (last '(())) ()
399 (last '(() nil)) nil
400 (last '(() 2 nil)) nil
401
402 ; vector
403 (last []) nil
404 (last [1]) 1
405 (last [1 2 3]) 3
406
407 (last [nil]) nil
408 (last [1 nil]) nil
409 (last [nil 2]) 2
410 (last [[]]) []
411 (last [[] nil]) nil
412 (last [[] 2 nil]) nil
413
414 ; set
415 (last #{}) nil
416 (last #{1}) 1
417 (last (sorted-set 1 2 3)) 3
418
419 (last #{nil}) nil
420 (last (sorted-set 1 nil)) 1
421 (last (sorted-set nil 2)) 2
422 (last #{#{}}) #{}
423 (last (sorted-set #{} nil)) #{}
424 ;(last (sorted-set #{} 2 nil)) nil
425
426 ; map
427 (last {}) nil
428 (last (sorted-map :a 1)) [:a 1]
429 (last (sorted-map :a 1 :b 2 :c 3)) [:c 3]
430
431 ; string
432 (last "") nil
433 (last "a") \a
434 (last "abc") \c
435
436 ; array
437 (last (into-array [])) nil
438 (last (into-array [1])) 1
439 (last (into-array [1 2 3])) 3
440 (last (to-array [nil])) nil
441 (last (to-array [1 nil])) nil
442 (last (to-array [nil 2])) 2 ))
443
444
445 ;; (ffirst coll) = (first (first coll))
446 ;;
447 (deftest test-ffirst
448 (is (thrown? IllegalArgumentException (ffirst)))
449 (are [x y] (= x y)
450 (ffirst nil) nil
451
452 (ffirst ()) nil
453 (ffirst '((1 2) (3 4))) 1
454
455 (ffirst []) nil
456 (ffirst [[1 2] [3 4]]) 1
457
458 (ffirst {}) nil
459 (ffirst {:a 1}) :a
460
461 (ffirst #{}) nil
462 (ffirst #{[1 2]}) 1 ))
463
464
465 ;; (fnext coll) = (first (next coll)) = (second coll)
466 ;;
467 (deftest test-fnext
468 (is (thrown? IllegalArgumentException (fnext)))
469 (are [x y] (= x y)
470 (fnext nil) nil
471
472 (fnext ()) nil
473 (fnext '(1)) nil
474 (fnext '(1 2 3 4)) 2
475
476 (fnext []) nil
477 (fnext [1]) nil
478 (fnext [1 2 3 4]) 2
479
480 (fnext {}) nil
481 (fnext (sorted-map :a 1)) nil
482 (fnext (sorted-map :a 1 :b 2)) [:b 2]
483
484 (fnext #{}) nil
485 (fnext #{1}) nil
486 (fnext (sorted-set 1 2 3 4)) 2 ))
487
488
489 ;; (nfirst coll) = (next (first coll))
490 ;;
491 (deftest test-nfirst
492 (is (thrown? IllegalArgumentException (nfirst)))
493 (are [x y] (= x y)
494 (nfirst nil) nil
495
496 (nfirst ()) nil
497 (nfirst '((1 2 3) (4 5 6))) '(2 3)
498
499 (nfirst []) nil
500 (nfirst [[1 2 3] [4 5 6]]) '(2 3)
501
502 (nfirst {}) nil
503 (nfirst {:a 1}) '(1)
504
505 (nfirst #{}) nil
506 (nfirst #{[1 2]}) '(2) ))
507
508
509 ;; (nnext coll) = (next (next coll))
510 ;;
511 (deftest test-nnext
512 (is (thrown? IllegalArgumentException (nnext)))
513 (are [x y] (= x y)
514 (nnext nil) nil
515
516 (nnext ()) nil
517 (nnext '(1)) nil
518 (nnext '(1 2)) nil
519 (nnext '(1 2 3 4)) '(3 4)
520
521 (nnext []) nil
522 (nnext [1]) nil
523 (nnext [1 2]) nil
524 (nnext [1 2 3 4]) '(3 4)
525
526 (nnext {}) nil
527 (nnext (sorted-map :a 1)) nil
528 (nnext (sorted-map :a 1 :b 2)) nil
529 (nnext (sorted-map :a 1 :b 2 :c 3 :d 4)) '([:c 3] [:d 4])
530
531 (nnext #{}) nil
532 (nnext #{1}) nil
533 (nnext (sorted-set 1 2)) nil
534 (nnext (sorted-set 1 2 3 4)) '(3 4) ))
535
536
537 (deftest test-nth
538 ; maps, sets are not supported
539 (is (thrown? UnsupportedOperationException (nth {} 0)))
540 (is (thrown? UnsupportedOperationException (nth {:a 1 :b 2} 0)))
541 (is (thrown? UnsupportedOperationException (nth #{} 0)))
542 (is (thrown? UnsupportedOperationException (nth #{1 2 3} 0)))
543
544 ; out of bounds
545 (is (thrown? IndexOutOfBoundsException (nth '() 0)))
546 (is (thrown? IndexOutOfBoundsException (nth '(1 2 3) 5)))
547 (is (thrown? IndexOutOfBoundsException (nth '() -1)))
548 (is (thrown? IndexOutOfBoundsException (nth '(1 2 3) -1)))
549
550 (is (thrown? IndexOutOfBoundsException (nth [] 0)))
551 (is (thrown? IndexOutOfBoundsException (nth [1 2 3] 5)))
552 (is (thrown? IndexOutOfBoundsException (nth [] -1)))
553 (is (thrown? IndexOutOfBoundsException (nth [1 2 3] -1))) ; ???
554
555 (is (thrown? IndexOutOfBoundsException (nth (into-array []) 0)))
556 (is (thrown? IndexOutOfBoundsException (nth (into-array [1 2 3]) 5)))
557 (is (thrown? IndexOutOfBoundsException (nth (into-array []) -1)))
558 (is (thrown? IndexOutOfBoundsException (nth (into-array [1 2 3]) -1)))
559
560 (is (thrown? StringIndexOutOfBoundsException (nth "" 0)))
561 (is (thrown? StringIndexOutOfBoundsException (nth "abc" 5)))
562 (is (thrown? StringIndexOutOfBoundsException (nth "" -1)))
563 (is (thrown? StringIndexOutOfBoundsException (nth "abc" -1)))
564
565 (is (thrown? IndexOutOfBoundsException (nth (java.util.ArrayList. []) 0)))
566 (is (thrown? IndexOutOfBoundsException (nth (java.util.ArrayList. [1 2 3]) 5)))
567 (is (thrown? IndexOutOfBoundsException (nth (java.util.ArrayList. []) -1))) ; ???
568 (is (thrown? IndexOutOfBoundsException (nth (java.util.ArrayList. [1 2 3]) -1))) ; ???
569
570 (are [x y] (= x y)
571 (nth '(1) 0) 1
572 (nth '(1 2 3) 0) 1
573 (nth '(1 2 3 4 5) 1) 2
574 (nth '(1 2 3 4 5) 4) 5
575 (nth '(1 2 3) 5 :not-found) :not-found
576
577 (nth [1] 0) 1
578 (nth [1 2 3] 0) 1
579 (nth [1 2 3 4 5] 1) 2
580 (nth [1 2 3 4 5] 4) 5
581 (nth [1 2 3] 5 :not-found) :not-found
582
583 (nth (into-array [1]) 0) 1
584 (nth (into-array [1 2 3]) 0) 1
585 (nth (into-array [1 2 3 4 5]) 1) 2
586 (nth (into-array [1 2 3 4 5]) 4) 5
587 (nth (into-array [1 2 3]) 5 :not-found) :not-found
588
589 (nth "a" 0) \a
590 (nth "abc" 0) \a
591 (nth "abcde" 1) \b
592 (nth "abcde" 4) \e
593 (nth "abc" 5 :not-found) :not-found
594
595 (nth (java.util.ArrayList. [1]) 0) 1
596 (nth (java.util.ArrayList. [1 2 3]) 0) 1
597 (nth (java.util.ArrayList. [1 2 3 4 5]) 1) 2
598 (nth (java.util.ArrayList. [1 2 3 4 5]) 4) 5
599 (nth (java.util.ArrayList. [1 2 3]) 5 :not-found) :not-found )
600
601 ; regex Matchers
602 (let [m (re-matcher #"(a)(b)" "ababaa")]
603 (re-find m) ; => ["ab" "a" "b"]
604 (are [x y] (= x y)
605 (nth m 0) "ab"
606 (nth m 1) "a"
607 (nth m 2) "b"
608 (nth m 3 :not-found) :not-found
609 (nth m -1 :not-found) :not-found )
610 (is (thrown? IndexOutOfBoundsException (nth m 3)))
611 (is (thrown? IndexOutOfBoundsException (nth m -1))))
612
613 (let [m (re-matcher #"c" "ababaa")]
614 (re-find m) ; => nil
615 (are [x y] (= x y)
616 (nth m 0 :not-found) :not-found
617 (nth m 2 :not-found) :not-found
618 (nth m -1 :not-found) :not-found )
619 (is (thrown? IllegalStateException (nth m 0)))
620 (is (thrown? IllegalStateException (nth m 2)))
621 (is (thrown? IllegalStateException (nth m -1)))))
622
623
624 ; distinct was broken for nil & false:
625 ; fixed in rev 1278:
626 ; http://code.google.com/p/clojure/source/detail?r=1278
627 ;
628 (deftest test-distinct
629 (are [x y] (= x y)
630 (distinct ()) ()
631 (distinct '(1)) '(1)
632 (distinct '(1 2 3)) '(1 2 3)
633 (distinct '(1 2 3 1 1 1)) '(1 2 3)
634 (distinct '(1 1 1 2)) '(1 2)
635 (distinct '(1 2 1 2)) '(1 2)
636
637 (distinct []) ()
638 (distinct [1]) '(1)
639 (distinct [1 2 3]) '(1 2 3)
640 (distinct [1 2 3 1 2 2 1 1]) '(1 2 3)
641 (distinct [1 1 1 2]) '(1 2)
642 (distinct [1 2 1 2]) '(1 2)
643
644 (distinct "") ()
645 (distinct "a") '(\a)
646 (distinct "abc") '(\a \b \c)
647 (distinct "abcabab") '(\a \b \c)
648 (distinct "aaab") '(\a \b)
649 (distinct "abab") '(\a \b) )
650
651 (are [x] (= (distinct [x x]) [x])
652 nil
653 false true
654 0 42
655 0.0 3.14
656 2/3
657 0M 1M
658 \c
659 "" "abc"
660 'sym
661 :kw
662 () '(1 2)
663 [] [1 2]
664 {} {:a 1 :b 2}
665 #{} #{1 2} ))
666
667
668 (deftest test-interpose
669 (are [x y] (= x y)
670 (interpose 0 []) ()
671 (interpose 0 [1]) '(1)
672 (interpose 0 [1 2]) '(1 0 2)
673 (interpose 0 [1 2 3]) '(1 0 2 0 3) ))
674
675
676 (deftest test-interleave
677 (are [x y] (= x y)
678 (interleave [1 2] [3 4]) '(1 3 2 4)
679
680 (interleave [1] [3 4]) '(1 3)
681 (interleave [1 2] [3]) '(1 3)
682
683 (interleave [] [3 4]) ()
684 (interleave [1 2] []) ()
685 (interleave [] []) () ))
686
687
688 (deftest test-zipmap
689 (are [x y] (= x y)
690 (zipmap [:a :b] [1 2]) {:a 1 :b 2}
691
692 (zipmap [:a] [1 2]) {:a 1}
693 (zipmap [:a :b] [1]) {:a 1}
694
695 (zipmap [] [1 2]) {}
696 (zipmap [:a :b] []) {}
697 (zipmap [] []) {} ))
698
699
700 (deftest test-concat
701 (are [x y] (= x y)
702 (concat) ()
703
704 (concat []) ()
705 (concat [1 2]) '(1 2)
706
707 (concat [1 2] [3 4]) '(1 2 3 4)
708 (concat [] [3 4]) '(3 4)
709 (concat [1 2] []) '(1 2)
710 (concat [] []) ()
711
712 (concat [1 2] [3 4] [5 6]) '(1 2 3 4 5 6) ))
713
714
715 (deftest test-cycle
716 (are [x y] (= x y)
717 (cycle []) ()
718
719 (take 3 (cycle [1])) '(1 1 1)
720 (take 5 (cycle [1 2 3])) '(1 2 3 1 2)
721
722 (take 3 (cycle [nil])) '(nil nil nil) ))
723
724
725 (deftest test-partition
726 (are [x y] (= x y)
727 (partition 2 [1 2 3]) '((1 2))
728 (partition 2 [1 2 3 4]) '((1 2) (3 4))
729 (partition 2 []) ()
730
731 (partition 2 3 [1 2 3 4 5 6 7]) '((1 2) (4 5))
732 (partition 2 3 [1 2 3 4 5 6 7 8]) '((1 2) (4 5) (7 8))
733 (partition 2 3 []) ()
734
735 (partition 1 []) ()
736 (partition 1 [1 2 3]) '((1) (2) (3))
737
738 (partition 5 [1 2 3]) ()
739
740 ; (partition 0 [1 2 3]) (repeat nil) ; infinite sequence of nil
741 (partition -1 [1 2 3]) ()
742 (partition -2 [1 2 3]) () ))
743
744
745 (deftest test-reverse
746 (are [x y] (= x y)
747 (reverse nil) () ; since SVN 1294
748 (reverse []) ()
749 (reverse [1]) '(1)
750 (reverse [1 2 3]) '(3 2 1) ))
751
752
753 (deftest test-take
754 (are [x y] (= x y)
755 (take 1 [1 2 3 4 5]) '(1)
756 (take 3 [1 2 3 4 5]) '(1 2 3)
757 (take 5 [1 2 3 4 5]) '(1 2 3 4 5)
758 (take 9 [1 2 3 4 5]) '(1 2 3 4 5)
759
760 (take 0 [1 2 3 4 5]) ()
761 (take -1 [1 2 3 4 5]) ()
762 (take -2 [1 2 3 4 5]) () ))
763
764
765 (deftest test-drop
766 (are [x y] (= x y)
767 (drop 1 [1 2 3 4 5]) '(2 3 4 5)
768 (drop 3 [1 2 3 4 5]) '(4 5)
769 (drop 5 [1 2 3 4 5]) ()
770 (drop 9 [1 2 3 4 5]) ()
771
772 (drop 0 [1 2 3 4 5]) '(1 2 3 4 5)
773 (drop -1 [1 2 3 4 5]) '(1 2 3 4 5)
774 (drop -2 [1 2 3 4 5]) '(1 2 3 4 5) ))
775
776
777 (deftest test-take-nth
778 (are [x y] (= x y)
779 (take-nth 1 [1 2 3 4 5]) '(1 2 3 4 5)
780 (take-nth 2 [1 2 3 4 5]) '(1 3 5)
781 (take-nth 3 [1 2 3 4 5]) '(1 4)
782 (take-nth 4 [1 2 3 4 5]) '(1 5)
783 (take-nth 5 [1 2 3 4 5]) '(1)
784 (take-nth 9 [1 2 3 4 5]) '(1)
785
786 ; infinite seq of 1s = (repeat 1)
787 ;(take-nth 0 [1 2 3 4 5])
788 ;(take-nth -1 [1 2 3 4 5])
789 ;(take-nth -2 [1 2 3 4 5])
790 ))
791
792
793 (deftest test-take-while
794 (are [x y] (= x y)
795 (take-while pos? []) ()
796 (take-while pos? [1 2 3 4]) '(1 2 3 4)
797 (take-while pos? [1 2 3 -1]) '(1 2 3)
798 (take-while pos? [1 -1 2 3]) '(1)
799 (take-while pos? [-1 1 2 3]) ()
800 (take-while pos? [-1 -2 -3]) () ))
801
802
803 (deftest test-drop-while
804 (are [x y] (= x y)
805 (drop-while pos? []) ()
806 (drop-while pos? [1 2 3 4]) ()
807 (drop-while pos? [1 2 3 -1]) '(-1)
808 (drop-while pos? [1 -1 2 3]) '(-1 2 3)
809 (drop-while pos? [-1 1 2 3]) '(-1 1 2 3)
810 (drop-while pos? [-1 -2 -3]) '(-1 -2 -3) ))
811
812
813 (deftest test-butlast
814 (are [x y] (= x y)
815 (butlast []) nil
816 (butlast [1]) nil
817 (butlast [1 2 3]) '(1 2) ))
818
819
820 (deftest test-drop-last
821 (are [x y] (= x y)
822 ; as butlast
823 (drop-last []) ()
824 (drop-last [1]) ()
825 (drop-last [1 2 3]) '(1 2)
826
827 ; as butlast, but lazy
828 (drop-last 1 []) ()
829 (drop-last 1 [1]) ()
830 (drop-last 1 [1 2 3]) '(1 2)
831
832 (drop-last 2 []) ()
833 (drop-last 2 [1]) ()
834 (drop-last 2 [1 2 3]) '(1)
835
836 (drop-last 5 []) ()
837 (drop-last 5 [1]) ()
838 (drop-last 5 [1 2 3]) ()
839
840 (drop-last 0 []) ()
841 (drop-last 0 [1]) '(1)
842 (drop-last 0 [1 2 3]) '(1 2 3)
843
844 (drop-last -1 []) ()
845 (drop-last -1 [1]) '(1)
846 (drop-last -1 [1 2 3]) '(1 2 3)
847
848 (drop-last -2 []) ()
849 (drop-last -2 [1]) '(1)
850 (drop-last -2 [1 2 3]) '(1 2 3) ))
851
852
853 (deftest test-split-at
854 (is (vector? (split-at 2 [])))
855 (is (vector? (split-at 2 [1 2 3])))
856
857 (are [x y] (= x y)
858 (split-at 2 []) [() ()]
859 (split-at 2 [1 2 3 4 5]) [(list 1 2) (list 3 4 5)]
860
861 (split-at 5 [1 2 3]) [(list 1 2 3) ()]
862 (split-at 0 [1 2 3]) [() (list 1 2 3)]
863 (split-at -1 [1 2 3]) [() (list 1 2 3)]
864 (split-at -5 [1 2 3]) [() (list 1 2 3)] ))
865
866
867 (deftest test-split-with
868 (is (vector? (split-with pos? [])))
869 (is (vector? (split-with pos? [1 2 -1 0 3 4])))
870
871 (are [x y] (= x y)
872 (split-with pos? []) [() ()]
873 (split-with pos? [1 2 -1 0 3 4]) [(list 1 2) (list -1 0 3 4)]
874
875 (split-with pos? [-1 2 3 4 5]) [() (list -1 2 3 4 5)]
876 (split-with number? [1 -2 "abc" \x]) [(list 1 -2) (list "abc" \x)] ))
877
878
879 (deftest test-repeat
880 (is (thrown? IllegalArgumentException (repeat)))
881
882 ; infinite sequence => use take
883 (are [x y] (= x y)
884 (take 0 (repeat 7)) ()
885 (take 1 (repeat 7)) '(7)
886 (take 2 (repeat 7)) '(7 7)
887 (take 5 (repeat 7)) '(7 7 7 7 7) )
888
889 ; limited sequence
890 (are [x y] (= x y)
891 (repeat 0 7) ()
892 (repeat 1 7) '(7)
893 (repeat 2 7) '(7 7)
894 (repeat 5 7) '(7 7 7 7 7)
895
896 (repeat -1 7) ()
897 (repeat -3 7) () )
898
899 ; test different data types
900 (are [x] (= (repeat 3 x) (list x x x))
901 nil
902 false true
903 0 42
904 0.0 3.14
905 2/3
906 0M 1M
907 \c
908 "" "abc"
909 'sym
910 :kw
911 () '(1 2)
912 [] [1 2]
913 {} {:a 1 :b 2}
914 #{} #{1 2} ))
915
916
917 (deftest test-range
918 (are [x y] (= x y)
919 (range 0) () ; exclusive end!
920 (range 1) '(0)
921 (range 5) '(0 1 2 3 4)
922
923 (range -1) ()
924 (range -3) ()
925
926 (range 2.5) '(0 1 2)
927 (range 7/3) '(0 1 2)
928
929 (range 0 3) '(0 1 2)
930 (range 0 1) '(0)
931 (range 0 0) ()
932 (range 0 -3) ()
933
934 (range 3 6) '(3 4 5)
935 (range 3 4) '(3)
936 (range 3 3) ()
937 (range 3 1) ()
938 (range 3 0) ()
939 (range 3 -2) ()
940
941 (range -2 5) '(-2 -1 0 1 2 3 4)
942 (range -2 0) '(-2 -1)
943 (range -2 -1) '(-2)
944 (range -2 -2) ()
945 (range -2 -5) ()
946
947 (range 3 9 0) ()
948 (range 3 9 1) '(3 4 5 6 7 8)
949 (range 3 9 2) '(3 5 7)
950 (range 3 9 3) '(3 6)
951 (range 3 9 10) '(3)
952 (range 3 9 -1) () ))
953
954
955 (deftest test-empty?
956 (are [x] (empty? x)
957 nil
958 ()
959 (lazy-seq nil) ; => ()
960 []
961 {}
962 #{}
963 ""
964 (into-array []) )
965
966 (are [x] (not (empty? x))
967 '(1 2)
968 (lazy-seq [1 2])
969 [1 2]
970 {:a 1 :b 2}
971 #{1 2}
972 "abc"
973 (into-array [1 2]) ))
974
975
976 (deftest test-every?
977 ; always true for nil or empty coll/seq
978 (are [x] (= (every? pos? x) true)
979 nil
980 () [] {} #{}
981 (lazy-seq [])
982 (into-array []) )
983
984 (are [x y] (= x y)
985 true (every? pos? [1])
986 true (every? pos? [1 2])
987 true (every? pos? [1 2 3 4 5])
988
989 false (every? pos? [-1])
990 false (every? pos? [-1 -2])
991 false (every? pos? [-1 -2 3])
992 false (every? pos? [-1 2])
993 false (every? pos? [1 -2])
994 false (every? pos? [1 2 -3])
995 false (every? pos? [1 2 -3 4]) )
996
997 (are [x y] (= x y)
998 true (every? #{:a} [:a :a])
999 ;! false (every? #{:a} [:a :b]) ; Issue 68: every? returns nil instead of false
1000 ;! false (every? #{:a} [:b :b]) ; http://code.google.com/p/clojure/issues/detail?id=68
1001 ))
1002
1003
1004 (deftest test-not-every?
1005 ; always false for nil or empty coll/seq
1006 (are [x] (= (not-every? pos? x) false)
1007 nil
1008 () [] {} #{}
1009 (lazy-seq [])
1010 (into-array []) )
1011
1012 (are [x y] (= x y)
1013 false (not-every? pos? [1])
1014 false (not-every? pos? [1 2])
1015 false (not-every? pos? [1 2 3 4 5])
1016
1017 true (not-every? pos? [-1])
1018 true (not-every? pos? [-1 -2])
1019 true (not-every? pos? [-1 -2 3])
1020 true (not-every? pos? [-1 2])
1021 true (not-every? pos? [1 -2])
1022 true (not-every? pos? [1 2 -3])
1023 true (not-every? pos? [1 2 -3 4]) )
1024
1025 (are [x y] (= x y)
1026 false (not-every? #{:a} [:a :a])
1027 true (not-every? #{:a} [:a :b])
1028 true (not-every? #{:a} [:b :b]) ))
1029
1030
1031 (deftest test-not-any?
1032 ; always true for nil or empty coll/seq
1033 (are [x] (= (not-any? pos? x) true)
1034 nil
1035 () [] {} #{}
1036 (lazy-seq [])
1037 (into-array []) )
1038
1039 (are [x y] (= x y)
1040 false (not-any? pos? [1])
1041 false (not-any? pos? [1 2])
1042 false (not-any? pos? [1 2 3 4 5])
1043
1044 true (not-any? pos? [-1])
1045 true (not-any? pos? [-1 -2])
1046
1047 false (not-any? pos? [-1 -2 3])
1048 false (not-any? pos? [-1 2])
1049 false (not-any? pos? [1 -2])
1050 false (not-any? pos? [1 2 -3])
1051 false (not-any? pos? [1 2 -3 4]) )
1052
1053 (are [x y] (= x y)
1054 false (not-any? #{:a} [:a :a])
1055 false (not-any? #{:a} [:a :b])
1056 true (not-any? #{:a} [:b :b]) ))
1057
1058
1059 (deftest test-some
1060 ;; always nil for nil or empty coll/seq
1061 (are [x] (= (some pos? x) nil)
1062 nil
1063 () [] {} #{}
1064 (lazy-seq [])
1065 (into-array []))
1066
1067 (are [x y] (= x y)
1068 nil (some nil nil)
1069
1070 true (some pos? [1])
1071 true (some pos? [1 2])
1072
1073 nil (some pos? [-1])
1074 nil (some pos? [-1 -2])
1075 true (some pos? [-1 2])
1076 true (some pos? [1 -2])
1077
1078 :a (some #{:a} [:a :a])
1079 :a (some #{:a} [:b :a])
1080 nil (some #{:a} [:b :b])
1081
1082 :a (some #{:a} '(:a :b))
1083 :a (some #{:a} #{:a :b})
1084 ))
1085
1086 (deftest test-flatten-present
1087 (are [expected nested-val] (= (flatten nested-val) expected)
1088 ;simple literals
1089 [] nil
1090 [] 1
1091 [] 'test
1092 [] :keyword
1093 [] 1/2
1094 [] #"[\r\n]"
1095 [] true
1096 [] false
1097 ;vectors
1098 [1 2 3 4 5] [[1 2] [3 4 [5]]]
1099 [1 2 3 4 5] [1 2 3 4 5]
1100 [#{1 2} 3 4 5] [#{1 2} 3 4 5]
1101 ;sets
1102 [] #{}
1103 [] #{#{1 2} 3 4 5}
1104 [] #{1 2 3 4 5}
1105 [] #{#{1 2} 3 4 5}
1106 ;lists
1107 [] '()
1108 [1 2 3 4 5] `(1 2 3 4 5)
1109 ;maps
1110 [] {:a 1 :b 2}
1111 [:a 1 :b 2] (seq {:a 1 :b 2})
1112 [] {[:a :b] 1 :c 2}
1113 [:a :b 1 :c 2] (seq {[:a :b] 1 :c 2})
1114 [:a 1 2 :b 3] (seq {:a [1 2] :b 3})
1115 ;Strings
1116 [] "12345"
1117 [\1 \2 \3 \4 \5] (seq "12345")
1118 ;fns
1119 [] count
1120 [count even? odd?] [count even? odd?]))
1121
1122 (deftest test-group-by
1123 (is (= (group-by even? [1 2 3 4 5])
1124 {false [1 3 5], true [2 4]})))
1125
1126 (deftest test-partition-by
1127 (are [test-seq] (= (partition-by (comp even? count) test-seq)
1128 [["a"] ["bb" "cccc" "dd"] ["eee" "f"] ["" "hh"]])
1129 ["a" "bb" "cccc" "dd" "eee" "f" "" "hh"]
1130 '("a" "bb" "cccc" "dd" "eee" "f" "" "hh"))
1131 (is (=(partition-by #{\a \e \i \o \u} "abcdefghijklm")
1132 [[\a] [\b \c \d] [\e] [\f \g \h] [\i] [\j \k \l \m]])))
1133
1134 (deftest test-frequencies
1135 (are [expected test-seq] (= (frequencies test-seq) expected)
1136 {\p 2, \s 4, \i 4, \m 1} "mississippi"
1137 {1 4 2 2 3 1} [1 1 1 1 2 2 3]
1138 {1 4 2 2 3 1} '(1 1 1 1 2 2 3)))
1139
1140 (deftest test-reductions
1141 (is (= (reductions + nil)
1142 [0]))
1143 (is (= (reductions + [1 2 3 4 5])
1144 [1 3 6 10 15]))
1145 (is (= (reductions + 10 [1 2 3 4 5])
1146 [10 11 13 16 20 25])))
1147
1148 (deftest test-rand-nth-invariants
1149 (let [elt (rand-nth [:a :b :c :d])]
1150 (is (#{:a :b :c :d} elt))))
1151
1152 (deftest test-partition-all
1153 (is (= (partition-all 4 [1 2 3 4 5 6 7 8 9])
1154 [[1 2 3 4] [5 6 7 8] [9]]))
1155 (is (= (partition-all 4 2 [1 2 3 4 5 6 7 8 9])
1156 [[1 2 3 4] [3 4 5 6] [5 6 7 8] [7 8 9] [9]])))
1157
1158 (deftest test-shuffle-invariants
1159 (is (= (count (shuffle [1 2 3 4])) 4))
1160 (let [shuffled-seq (shuffle [1 2 3 4])]
1161 (is (every? #{1 2 3 4} shuffled-seq))))
1162