Mercurial > lasercutter
comparison src/clojure/test_clojure/for.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 ;; Tests for the Clojure 'for' macro | |
10 ;; | |
11 ;; by Chouser | |
12 ;; Created Dec 2008 | |
13 | |
14 (ns clojure.test-clojure.for | |
15 (:use clojure.test)) | |
16 | |
17 (deftest Docstring-Example | |
18 (is (= (take 100 (for [x (range 100000000) | |
19 y (range 1000000) :while (< y x)] | |
20 [x y])) | |
21 '([1 0] [2 0] [2 1] [3 0] [3 1] [3 2] [4 0] [4 1] [4 2] [4 3] | |
22 [5 0] [5 1] [5 2] [5 3] [5 4] | |
23 [6 0] [6 1] [6 2] [6 3] [6 4] [6 5] | |
24 [7 0] [7 1] [7 2] [7 3] [7 4] [7 5] [7 6] | |
25 [8 0] [8 1] [8 2] [8 3] [8 4] [8 5] [8 6] [8 7] | |
26 [9 0] [9 1] [9 2] [9 3] [9 4] [9 5] [9 6] [9 7] [9 8] | |
27 [10 0] [10 1] [10 2] [10 3] [10 4] [10 5] [10 6] [10 7] [10 8] [10 9] | |
28 [11 0] [11 1] [11 2] [11 3] [11 4] [11 5] [11 6] [11 7] [11 8] [11 9] | |
29 [11 10] | |
30 [12 0] [12 1] [12 2] [12 3] [12 4] [12 5] [12 6] [12 7] [12 8] [12 9] | |
31 [12 10] [12 11] | |
32 [13 0] [13 1] [13 2] [13 3] [13 4] [13 5] [13 6] [13 7] [13 8] [13 9] | |
33 [13 10] [13 11] [13 12] | |
34 [14 0] [14 1] [14 2] [14 3] [14 4] [14 5] [14 6] [14 7] [14 8])))) | |
35 | |
36 (defmacro deftest-both [txt & ises] | |
37 `(do | |
38 (deftest ~(symbol (str "For-" txt)) ~@ises) | |
39 (deftest ~(symbol (str "Doseq-" txt)) | |
40 ~@(map (fn [[x-is [x-= [x-for binds body] value]]] | |
41 (when (and (= x-is 'is) (= x-= '=) (= x-for 'for)) | |
42 `(is (= (let [acc# (atom [])] | |
43 (doseq ~binds (swap! acc# conj ~body)) | |
44 @acc#) | |
45 ~value)))) | |
46 ises)))) | |
47 | |
48 (deftest-both When | |
49 (is (= (for [x (range 10) :when (odd? x)] x) '(1 3 5 7 9))) | |
50 (is (= (for [x (range 4) y (range 4) :when (odd? y)] [x y]) | |
51 '([0 1] [0 3] [1 1] [1 3] [2 1] [2 3] [3 1] [3 3]))) | |
52 (is (= (for [x (range 4) y (range 4) :when (odd? x)] [x y]) | |
53 '([1 0] [1 1] [1 2] [1 3] [3 0] [3 1] [3 2] [3 3]))) | |
54 (is (= (for [x (range 4) :when (odd? x) y (range 4)] [x y]) | |
55 '([1 0] [1 1] [1 2] [1 3] [3 0] [3 1] [3 2] [3 3]))) | |
56 (is (= (for [x (range 5) y (range 5) :when (< x y)] [x y]) | |
57 '([0 1] [0 2] [0 3] [0 4] [1 2] [1 3] [1 4] [2 3] [2 4] [3 4])))) | |
58 | |
59 (defn only | |
60 "Returns a lazy seq of increasing ints starting at 0. Trying to get | |
61 the nth+1 value of the seq throws an exception. This is meant to | |
62 help detecting over-eagerness in lazy seq consumers." | |
63 [n] | |
64 (lazy-cat (range n) | |
65 (throw (Exception. "consumer went too far in lazy seq")))) | |
66 | |
67 (deftest-both While | |
68 (is (= (for [x (only 6) :while (< x 5)] x) '(0 1 2 3 4))) | |
69 (is (= (for [x (range 4) y (only 4) :while (< y 3)] [x y]) | |
70 '([0 0] [0 1] [0 2] [1 0] [1 1] [1 2] | |
71 [2 0] [2 1] [2 2] [3 0] [3 1] [3 2]))) | |
72 (is (= (for [x (range 4) y (range 4) :while (< x 3)] [x y]) | |
73 '([0 0] [0 1] [0 2] [0 3] [1 0] [1 1] [1 2] [1 3] | |
74 [2 0] [2 1] [2 2] [2 3]))) | |
75 (is (= (for [x (only 4) :while (< x 3) y (range 4)] [x y]) | |
76 '([0 0] [0 1] [0 2] [0 3] [1 0] [1 1] [1 2] [1 3] | |
77 [2 0] [2 1] [2 2] [2 3]))) | |
78 (is (= (for [x (range 4) y (range 4) :while (even? x)] [x y]) | |
79 '([0 0] [0 1] [0 2] [0 3] [2 0] [2 1] [2 2] [2 3]))) | |
80 (is (= (for [x (only 2) :while (even? x) y (range 4)] [x y]) | |
81 '([0 0] [0 1] [0 2] [0 3]))) | |
82 (is (= (for [x (range 4) y (only 4) :while (< y x)] [x y]) | |
83 '([1 0] [2 0] [2 1] [3 0] [3 1] [3 2])))) | |
84 | |
85 (deftest-both While-and-When | |
86 (is (= (for [x (only 6) :while (< x 5) y (range 4) :when (odd? y)] [x y]) | |
87 '([0 1] [0 3] [1 1] [1 3] [2 1] [2 3] [3 1] [3 3] [4 1] [4 3]))) | |
88 (is (= (for [x (range 4) :when (odd? x) y (only 6) :while (< y 5)] [x y]) | |
89 '([1 0] [1 1] [1 2] [1 3] [1 4] [3 0] [3 1] [3 2] [3 3] [3 4]))) | |
90 (is (= (for [x (only 6) :while (< x 5) y (range 4) :when (odd? (+ x y))] | |
91 [x y]) | |
92 '([0 1] [0 3] [1 0] [1 2] [2 1] [2 3] [3 0] [3 2] [4 1] [4 3]))) | |
93 (is (= (for [x (range 4) :when (odd? x) y (only 2) :while (odd? (+ x y))] | |
94 [x y]) | |
95 '([1 0] [3 0])))) | |
96 | |
97 (deftest-both While-and-When-Same-Binding | |
98 (is (= (for [x (only 6) :while (< x 5) :when (odd? x)] x) '(1 3))) | |
99 (is (= (for [x (only 6) | |
100 :while (< x 5) ; if :while is false, :when should not be evaled | |
101 :when (do (if (< x 5) (odd? x)))] x) '(1 3))) | |
102 (is (= (for [a (range -2 5) | |
103 :when (not= a 0) ; :when may guard :while | |
104 :while (> (Math/abs (/ 1.0 a)) 1/3)] a) '(-2 -1 1 2)))) | |
105 | |
106 (deftest-both Nesting | |
107 (is (= (for [x '(a b) y (interpose x '(1 2)) z (list x y)] [x y z]) | |
108 '([a 1 a] [a 1 1] [a a a] [a a a] [a 2 a] [a 2 2] | |
109 [b 1 b] [b 1 1] [b b b] [b b b] [b 2 b] [b 2 2]))) | |
110 (is (= (for [x ['a nil] y [x 'b]] [x y]) | |
111 '([a a] [a b] [nil nil] [nil b])))) | |
112 | |
113 (deftest-both Destructuring | |
114 (is (= (for [{:syms [a b c]} (map #(zipmap '(a b c) (range % 5)) (range 3)) | |
115 x [a b c]] | |
116 (Integer. (str a b c x))) | |
117 '(120 121 122 1231 1232 1233 2342 2343 2344)))) | |
118 | |
119 (deftest-both Let | |
120 (is (= (for [x (range 3) y (range 3) :let [z (+ x y)] :when (odd? z)] [x y z]) | |
121 '([0 1 1] [1 0 1] [1 2 3] [2 1 3]))) | |
122 (is (= (for [x (range 6) :let [y (rem x 2)] :when (even? y) z [8 9]] [x z]) | |
123 '([0 8] [0 9] [2 8] [2 9] [4 8] [4 9])))) | |
124 | |
125 ; :while must skip all subsequent chunks as well as the remainder of | |
126 ; the current chunk: | |
127 (deftest-both Chunked-While | |
128 (is (= (for [x (range 100) :while (even? x)] x) '(0)))) |