rlm@10
|
1 ; Copyright (c) Rich Hickey. All rights reserved.
|
rlm@10
|
2 ; The use and distribution terms for this software are covered by the
|
rlm@10
|
3 ; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
|
rlm@10
|
4 ; which can be found in the file epl-v10.html at the root of this distribution.
|
rlm@10
|
5 ; By using this software in any fashion, you are agreeing to be bound by
|
rlm@10
|
6 ; the terms of this license.
|
rlm@10
|
7 ; You must not remove this notice, or any other, from this software.
|
rlm@10
|
8
|
rlm@10
|
9 ; Author: Stephen C. Gilardi
|
rlm@10
|
10
|
rlm@10
|
11 ;;
|
rlm@10
|
12 ;; Tests for the Clojure functions documented at the URL:
|
rlm@10
|
13 ;;
|
rlm@10
|
14 ;; http://clojure.org/Reader
|
rlm@10
|
15 ;;
|
rlm@10
|
16 ;; scgilardi (gmail)
|
rlm@10
|
17 ;; Created 22 October 2008
|
rlm@10
|
18
|
rlm@10
|
19 (ns clojure.test-clojure.reader
|
rlm@10
|
20 (:use clojure.test))
|
rlm@10
|
21
|
rlm@10
|
22 ;; Symbols
|
rlm@10
|
23
|
rlm@10
|
24 (deftest Symbols
|
rlm@10
|
25 (is (= 'abc (symbol "abc")))
|
rlm@10
|
26 (is (= '*+!-_? (symbol "*+!-_?")))
|
rlm@10
|
27 (is (= 'abc:def:ghi (symbol "abc:def:ghi")))
|
rlm@10
|
28 (is (= 'abc/def (symbol "abc" "def")))
|
rlm@10
|
29 (is (= 'abc.def/ghi (symbol "abc.def" "ghi")))
|
rlm@10
|
30 (is (= 'abc/def.ghi (symbol "abc" "def.ghi")))
|
rlm@10
|
31 (is (= 'abc:def/ghi:jkl.mno (symbol "abc:def" "ghi:jkl.mno")))
|
rlm@10
|
32 (is (instance? clojure.lang.Symbol 'alphabet))
|
rlm@10
|
33 )
|
rlm@10
|
34
|
rlm@10
|
35 ;; Literals
|
rlm@10
|
36
|
rlm@10
|
37 (deftest Literals
|
rlm@10
|
38 ; 'nil 'false 'true are reserved by Clojure and are not symbols
|
rlm@10
|
39 (is (= 'nil nil))
|
rlm@10
|
40 (is (= 'false false))
|
rlm@10
|
41 (is (= 'true true)) )
|
rlm@10
|
42
|
rlm@10
|
43 ;; Strings
|
rlm@10
|
44
|
rlm@10
|
45 (deftest Strings
|
rlm@10
|
46 (is (= "abcde" (str \a \b \c \d \e)))
|
rlm@10
|
47 (is (= "abc
|
rlm@10
|
48 def" (str \a \b \c \newline \space \space \d \e \f)))
|
rlm@10
|
49 )
|
rlm@10
|
50
|
rlm@10
|
51 ;; Numbers
|
rlm@10
|
52
|
rlm@10
|
53 (deftest Numbers
|
rlm@10
|
54
|
rlm@10
|
55 ; Read Integer
|
rlm@10
|
56 (is (instance? Integer 2147483647))
|
rlm@10
|
57 (is (instance? Integer +1))
|
rlm@10
|
58 (is (instance? Integer 1))
|
rlm@10
|
59 (is (instance? Integer +0))
|
rlm@10
|
60 (is (instance? Integer 0))
|
rlm@10
|
61 (is (instance? Integer -0))
|
rlm@10
|
62 (is (instance? Integer -1))
|
rlm@10
|
63 (is (instance? Integer -2147483648))
|
rlm@10
|
64
|
rlm@10
|
65 ; Read Long
|
rlm@10
|
66 (is (instance? Long 2147483648))
|
rlm@10
|
67 (is (instance? Long -2147483649))
|
rlm@10
|
68 (is (instance? Long 9223372036854775807))
|
rlm@10
|
69 (is (instance? Long -9223372036854775808))
|
rlm@10
|
70
|
rlm@10
|
71 ;; Numeric constants of different types don't wash out. Regression fixed in
|
rlm@10
|
72 ;; r1157. Previously the compiler saw 0 and 0.0 as the same constant and
|
rlm@10
|
73 ;; caused the sequence to be built of Doubles.
|
rlm@10
|
74 (let [x 0.0]
|
rlm@10
|
75 (let [sequence (loop [i 0 l '()]
|
rlm@10
|
76 (if (< i 5)
|
rlm@10
|
77 (recur (inc i) (conj l i))
|
rlm@10
|
78 l))]
|
rlm@10
|
79 (is (= [4 3 2 1 0] sequence))
|
rlm@10
|
80 (is (every? #(instance? Integer %)
|
rlm@10
|
81 sequence))))
|
rlm@10
|
82
|
rlm@10
|
83 ; Read BigInteger
|
rlm@10
|
84 (is (instance? BigInteger 9223372036854775808))
|
rlm@10
|
85 (is (instance? BigInteger -9223372036854775809))
|
rlm@10
|
86 (is (instance? BigInteger 10000000000000000000000000000000000000000000000000))
|
rlm@10
|
87 (is (instance? BigInteger -10000000000000000000000000000000000000000000000000))
|
rlm@10
|
88
|
rlm@10
|
89 ; Read Double
|
rlm@10
|
90 (is (instance? Double +1.0e+1))
|
rlm@10
|
91 (is (instance? Double +1.e+1))
|
rlm@10
|
92 (is (instance? Double +1e+1))
|
rlm@10
|
93
|
rlm@10
|
94 (is (instance? Double +1.0e1))
|
rlm@10
|
95 (is (instance? Double +1.e1))
|
rlm@10
|
96 (is (instance? Double +1e1))
|
rlm@10
|
97
|
rlm@10
|
98 (is (instance? Double +1.0e-1))
|
rlm@10
|
99 (is (instance? Double +1.e-1))
|
rlm@10
|
100 (is (instance? Double +1e-1))
|
rlm@10
|
101
|
rlm@10
|
102 (is (instance? Double 1.0e+1))
|
rlm@10
|
103 (is (instance? Double 1.e+1))
|
rlm@10
|
104 (is (instance? Double 1e+1))
|
rlm@10
|
105
|
rlm@10
|
106 (is (instance? Double 1.0e1))
|
rlm@10
|
107 (is (instance? Double 1.e1))
|
rlm@10
|
108 (is (instance? Double 1e1))
|
rlm@10
|
109
|
rlm@10
|
110 (is (instance? Double 1.0e-1))
|
rlm@10
|
111 (is (instance? Double 1.e-1))
|
rlm@10
|
112 (is (instance? Double 1e-1))
|
rlm@10
|
113
|
rlm@10
|
114 (is (instance? Double -1.0e+1))
|
rlm@10
|
115 (is (instance? Double -1.e+1))
|
rlm@10
|
116 (is (instance? Double -1e+1))
|
rlm@10
|
117
|
rlm@10
|
118 (is (instance? Double -1.0e1))
|
rlm@10
|
119 (is (instance? Double -1.e1))
|
rlm@10
|
120 (is (instance? Double -1e1))
|
rlm@10
|
121
|
rlm@10
|
122 (is (instance? Double -1.0e-1))
|
rlm@10
|
123 (is (instance? Double -1.e-1))
|
rlm@10
|
124 (is (instance? Double -1e-1))
|
rlm@10
|
125
|
rlm@10
|
126 (is (instance? Double +1.0))
|
rlm@10
|
127 (is (instance? Double +1.))
|
rlm@10
|
128
|
rlm@10
|
129 (is (instance? Double 1.0))
|
rlm@10
|
130 (is (instance? Double 1.))
|
rlm@10
|
131
|
rlm@10
|
132 (is (instance? Double +0.0))
|
rlm@10
|
133 (is (instance? Double +0.))
|
rlm@10
|
134
|
rlm@10
|
135 (is (instance? Double 0.0))
|
rlm@10
|
136 (is (instance? Double 0.))
|
rlm@10
|
137
|
rlm@10
|
138 (is (instance? Double -0.0))
|
rlm@10
|
139 (is (instance? Double -0.))
|
rlm@10
|
140
|
rlm@10
|
141 (is (instance? Double -1.0))
|
rlm@10
|
142 (is (instance? Double -1.))
|
rlm@10
|
143
|
rlm@10
|
144 ; Read BigDecimal
|
rlm@10
|
145 (is (instance? BigDecimal 9223372036854775808M))
|
rlm@10
|
146 (is (instance? BigDecimal -9223372036854775809M))
|
rlm@10
|
147 (is (instance? BigDecimal 2147483647M))
|
rlm@10
|
148 (is (instance? BigDecimal +1M))
|
rlm@10
|
149 (is (instance? BigDecimal 1M))
|
rlm@10
|
150 (is (instance? BigDecimal +0M))
|
rlm@10
|
151 (is (instance? BigDecimal 0M))
|
rlm@10
|
152 (is (instance? BigDecimal -0M))
|
rlm@10
|
153 (is (instance? BigDecimal -1M))
|
rlm@10
|
154 (is (instance? BigDecimal -2147483648M))
|
rlm@10
|
155
|
rlm@10
|
156 (is (instance? BigDecimal +1.0e+1M))
|
rlm@10
|
157 (is (instance? BigDecimal +1.e+1M))
|
rlm@10
|
158 (is (instance? BigDecimal +1e+1M))
|
rlm@10
|
159
|
rlm@10
|
160 (is (instance? BigDecimal +1.0e1M))
|
rlm@10
|
161 (is (instance? BigDecimal +1.e1M))
|
rlm@10
|
162 (is (instance? BigDecimal +1e1M))
|
rlm@10
|
163
|
rlm@10
|
164 (is (instance? BigDecimal +1.0e-1M))
|
rlm@10
|
165 (is (instance? BigDecimal +1.e-1M))
|
rlm@10
|
166 (is (instance? BigDecimal +1e-1M))
|
rlm@10
|
167
|
rlm@10
|
168 (is (instance? BigDecimal 1.0e+1M))
|
rlm@10
|
169 (is (instance? BigDecimal 1.e+1M))
|
rlm@10
|
170 (is (instance? BigDecimal 1e+1M))
|
rlm@10
|
171
|
rlm@10
|
172 (is (instance? BigDecimal 1.0e1M))
|
rlm@10
|
173 (is (instance? BigDecimal 1.e1M))
|
rlm@10
|
174 (is (instance? BigDecimal 1e1M))
|
rlm@10
|
175
|
rlm@10
|
176 (is (instance? BigDecimal 1.0e-1M))
|
rlm@10
|
177 (is (instance? BigDecimal 1.e-1M))
|
rlm@10
|
178 (is (instance? BigDecimal 1e-1M))
|
rlm@10
|
179
|
rlm@10
|
180 (is (instance? BigDecimal -1.0e+1M))
|
rlm@10
|
181 (is (instance? BigDecimal -1.e+1M))
|
rlm@10
|
182 (is (instance? BigDecimal -1e+1M))
|
rlm@10
|
183
|
rlm@10
|
184 (is (instance? BigDecimal -1.0e1M))
|
rlm@10
|
185 (is (instance? BigDecimal -1.e1M))
|
rlm@10
|
186 (is (instance? BigDecimal -1e1M))
|
rlm@10
|
187
|
rlm@10
|
188 (is (instance? BigDecimal -1.0e-1M))
|
rlm@10
|
189 (is (instance? BigDecimal -1.e-1M))
|
rlm@10
|
190 (is (instance? BigDecimal -1e-1M))
|
rlm@10
|
191
|
rlm@10
|
192 (is (instance? BigDecimal +1.0M))
|
rlm@10
|
193 (is (instance? BigDecimal +1.M))
|
rlm@10
|
194
|
rlm@10
|
195 (is (instance? BigDecimal 1.0M))
|
rlm@10
|
196 (is (instance? BigDecimal 1.M))
|
rlm@10
|
197
|
rlm@10
|
198 (is (instance? BigDecimal +0.0M))
|
rlm@10
|
199 (is (instance? BigDecimal +0.M))
|
rlm@10
|
200
|
rlm@10
|
201 (is (instance? BigDecimal 0.0M))
|
rlm@10
|
202 (is (instance? BigDecimal 0.M))
|
rlm@10
|
203
|
rlm@10
|
204 (is (instance? BigDecimal -0.0M))
|
rlm@10
|
205 (is (instance? BigDecimal -0.M))
|
rlm@10
|
206
|
rlm@10
|
207 (is (instance? BigDecimal -1.0M))
|
rlm@10
|
208 (is (instance? BigDecimal -1.M))
|
rlm@10
|
209 )
|
rlm@10
|
210
|
rlm@10
|
211 ;; Characters
|
rlm@10
|
212
|
rlm@10
|
213 (deftest t-Characters)
|
rlm@10
|
214
|
rlm@10
|
215 ;; nil
|
rlm@10
|
216
|
rlm@10
|
217 (deftest t-nil)
|
rlm@10
|
218
|
rlm@10
|
219 ;; Booleans
|
rlm@10
|
220
|
rlm@10
|
221 (deftest t-Booleans)
|
rlm@10
|
222
|
rlm@10
|
223 ;; Keywords
|
rlm@10
|
224
|
rlm@10
|
225 (deftest t-Keywords
|
rlm@10
|
226 (is (= :abc (keyword "abc")))
|
rlm@10
|
227 (is (= :abc (keyword 'abc)))
|
rlm@10
|
228 (is (= :*+!-_? (keyword "*+!-_?")))
|
rlm@10
|
229 (is (= :abc:def:ghi (keyword "abc:def:ghi")))
|
rlm@10
|
230 (is (= :abc/def (keyword "abc" "def")))
|
rlm@10
|
231 (is (= :abc/def (keyword 'abc/def)))
|
rlm@10
|
232 (is (= :abc.def/ghi (keyword "abc.def" "ghi")))
|
rlm@10
|
233 (is (= :abc/def.ghi (keyword "abc" "def.ghi")))
|
rlm@10
|
234 (is (= :abc:def/ghi:jkl.mno (keyword "abc:def" "ghi:jkl.mno")))
|
rlm@10
|
235 (is (instance? clojure.lang.Keyword :alphabet))
|
rlm@10
|
236 )
|
rlm@10
|
237
|
rlm@10
|
238 (deftest reading-keywords
|
rlm@10
|
239 (are [x y] (= x (read-string y))
|
rlm@10
|
240 :foo ":foo"
|
rlm@10
|
241 :foo/bar ":foo/bar"
|
rlm@10
|
242 :user/foo "::foo")
|
rlm@10
|
243 (are [err msg form] (thrown-with-msg? err msg (read-string form))
|
rlm@10
|
244 Exception #"Invalid token: foo:" "foo:"
|
rlm@10
|
245 Exception #"Invalid token: :bar/" ":bar/"
|
rlm@10
|
246 Exception #"Invalid token: ::does.not/exist" "::does.not/exist"))
|
rlm@10
|
247 ;; Lists
|
rlm@10
|
248
|
rlm@10
|
249 (deftest t-Lists)
|
rlm@10
|
250
|
rlm@10
|
251 ;; Vectors
|
rlm@10
|
252
|
rlm@10
|
253 (deftest t-Vectors)
|
rlm@10
|
254
|
rlm@10
|
255 ;; Maps
|
rlm@10
|
256
|
rlm@10
|
257 (deftest t-Maps)
|
rlm@10
|
258
|
rlm@10
|
259 ;; Sets
|
rlm@10
|
260
|
rlm@10
|
261 (deftest t-Sets)
|
rlm@10
|
262
|
rlm@10
|
263 ;; Macro characters
|
rlm@10
|
264
|
rlm@10
|
265 ;; Quote (')
|
rlm@10
|
266
|
rlm@10
|
267 (deftest t-Quote)
|
rlm@10
|
268
|
rlm@10
|
269 ;; Character (\)
|
rlm@10
|
270
|
rlm@10
|
271 (deftest t-Character)
|
rlm@10
|
272
|
rlm@10
|
273 ;; Comment (;)
|
rlm@10
|
274
|
rlm@10
|
275 (deftest t-Comment)
|
rlm@10
|
276
|
rlm@10
|
277 ;; Meta (^)
|
rlm@10
|
278
|
rlm@10
|
279 (deftest t-Meta)
|
rlm@10
|
280
|
rlm@10
|
281 ;; Deref (@)
|
rlm@10
|
282
|
rlm@10
|
283 (deftest t-Deref)
|
rlm@10
|
284
|
rlm@10
|
285 ;; Dispatch (#)
|
rlm@10
|
286
|
rlm@10
|
287 ;; #{} - see Sets above
|
rlm@10
|
288
|
rlm@10
|
289 ;; Regex patterns (#"pattern")
|
rlm@10
|
290
|
rlm@10
|
291 (deftest t-Regex)
|
rlm@10
|
292
|
rlm@10
|
293 ;; Metadata (#^)
|
rlm@10
|
294
|
rlm@10
|
295 (deftest t-Metadata)
|
rlm@10
|
296
|
rlm@10
|
297 ;; Var-quote (#')
|
rlm@10
|
298
|
rlm@10
|
299 (deftest t-Var-quote)
|
rlm@10
|
300
|
rlm@10
|
301 ;; Anonymous function literal (#())
|
rlm@10
|
302
|
rlm@10
|
303 (deftest t-Anonymouns-function-literal)
|
rlm@10
|
304
|
rlm@10
|
305 ;; Syntax-quote (`, note, the "backquote" character), Unquote (~) and
|
rlm@10
|
306 ;; Unquote-splicing (~@)
|
rlm@10
|
307
|
rlm@10
|
308 (deftest t-Syntax-quote
|
rlm@10
|
309 (are [x y] (= x y)
|
rlm@10
|
310 `() () ; was NPE before SVN r1337
|
rlm@10
|
311 ))
|
rlm@10
|
312
|
rlm@10
|
313 ;; (read)
|
rlm@10
|
314 ;; (read stream)
|
rlm@10
|
315 ;; (read stream eof-is-error)
|
rlm@10
|
316 ;; (read stream eof-is-error eof-value)
|
rlm@10
|
317 ;; (read stream eof-is-error eof-value is-recursive)
|
rlm@10
|
318
|
rlm@10
|
319 (deftest t-read)
|