Mercurial > lasercutter
diff src/clojure/test_clojure/vectors.clj @ 10:ef7dbbd6452c
added clojure source goodness
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 21 Aug 2010 06:25:44 -0400 |
parents | |
children |
line wrap: on
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/clojure/test_clojure/vectors.clj Sat Aug 21 06:25:44 2010 -0400 1.3 @@ -0,0 +1,304 @@ 1.4 +; Copyright (c) Rich Hickey. All rights reserved. 1.5 +; The use and distribution terms for this software are covered by the 1.6 +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) 1.7 +; which can be found in the file epl-v10.html at the root of this distribution. 1.8 +; By using this software in any fashion, you are agreeing to be bound by 1.9 +; the terms of this license. 1.10 +; You must not remove this notice, or any other, from this software. 1.11 + 1.12 +; Author: Stuart Halloway, Daniel Solano Gómez 1.13 + 1.14 +(ns clojure.test-clojure.vectors 1.15 + (:use clojure.test)) 1.16 + 1.17 +(deftest test-reversed-vec 1.18 + (let [r (range 6) 1.19 + v (into (vector-of :int) r) 1.20 + reversed (.rseq v)] 1.21 + (testing "returns the right impl" 1.22 + (is (= clojure.lang.APersistentVector$RSeq (class reversed)))) 1.23 + (testing "RSeq methods" 1.24 + (is (= [5 4 3 2 1 0] reversed)) 1.25 + (is (= 5 (.index reversed))) 1.26 + (is (= 5 (.first reversed))) 1.27 + (is (= [4 3 2 1 0] (.next reversed))) 1.28 + (is (= [3 2 1 0] (.. reversed next next))) 1.29 + (is (= 6 (.count reversed)))) 1.30 + (testing "clojure calling through" 1.31 + (is (= 5 (first reversed))) 1.32 + (is (= 5 (nth reversed 0)))) 1.33 + (testing "empty reverses to nil" 1.34 + (is (nil? (.. v empty rseq)))))) 1.35 + 1.36 +(deftest test-vecseq 1.37 + (let [r (range 100) 1.38 + vs (into (vector-of :int) r) 1.39 + vs-1 (next vs) 1.40 + vs-32 (.chunkedNext (seq vs))] 1.41 + (testing "=" 1.42 + (are [a b] (= a b) 1.43 + vs vs 1.44 + vs-1 vs-1 1.45 + vs-32 vs-32) 1.46 + (are [a b] (not= a b) 1.47 + vs vs-1 1.48 + vs-1 vs 1.49 + vs vs-32 1.50 + vs-32 vs)) 1.51 + (testing "IPersistentCollection.empty" 1.52 + (are [a] (identical? clojure.lang.PersistentList/EMPTY (.empty (seq a))) 1.53 + vs vs-1 vs-32)) 1.54 + (testing "IPersistentCollection.cons" 1.55 + (are [result input] (= result (.cons input :foo)) 1.56 + [:foo 1] (seq (into (vector-of :int) [1])))) 1.57 + (testing "IPersistentCollection.count" 1.58 + (are [ct s] (= ct (.count (seq s))) 1.59 + 100 vs 1.60 + 99 vs-1 1.61 + 68 vs-32) 1.62 + ;; can't manufacture this scenario: ASeq defers to Counted, but 1.63 + ;; LazySeq doesn't, so Counted never gets checked on reified seq below 1.64 + #_(testing "hops to counted when available" 1.65 + (is (= 200 1.66 + (.count (concat 1.67 + (seq vs) 1.68 + (reify clojure.lang.ISeq 1.69 + (seq [this] this) 1.70 + clojure.lang.Counted 1.71 + (count [_] 100)))))))) 1.72 + (testing "IPersistentCollection.equiv" 1.73 + (are [a b] (true? (.equiv a b)) 1.74 + vs vs 1.75 + vs-1 vs-1 1.76 + vs-32 vs-32 1.77 + vs r) 1.78 + (are [a b] (false? (.equiv a b)) 1.79 + vs vs-1 1.80 + vs-1 vs 1.81 + vs vs-32 1.82 + vs-32 vs 1.83 + vs nil)))) 1.84 + 1.85 +(deftest test-vec-compare 1.86 + (let [nums (range 1 100) 1.87 + ; randomly replaces a single item with the given value 1.88 + rand-replace (fn[val] 1.89 + (let [r (rand-int 99)] 1.90 + (concat (take r nums) [val] (drop (inc r) nums)))) 1.91 + ; all num sequences in map 1.92 + num-seqs {:standard nums 1.93 + :empty '() 1.94 + ; different lengths 1.95 + :longer (concat nums [100]) 1.96 + :shorter (drop-last nums) 1.97 + ; greater by value 1.98 + :first-greater (concat [100] (next nums)) 1.99 + :last-greater (concat (drop-last nums) [100]) 1.100 + :rand-greater-1 (rand-replace 100) 1.101 + :rand-greater-2 (rand-replace 100) 1.102 + :rand-greater-3 (rand-replace 100) 1.103 + ; lesser by value 1.104 + :first-lesser (concat [0] (next nums)) 1.105 + :last-lesser (concat (drop-last nums) [0]) 1.106 + :rand-lesser-1 (rand-replace 0) 1.107 + :rand-lesser-2 (rand-replace 0) 1.108 + :rand-lesser-3 (rand-replace 0)} 1.109 + ; a way to create compare values based on num-seqs 1.110 + create-vals (fn[base-val] 1.111 + (zipmap (keys num-seqs) 1.112 + (map #(into base-val %1) (vals num-seqs)))) 1.113 + ; Vecs made of int primitives 1.114 + int-vecs (create-vals (vector-of :int)) 1.115 + ; Vecs made of long primitives 1.116 + long-vecs (create-vals (vector-of :long)) 1.117 + ; standard boxing vectors 1.118 + regular-vecs (create-vals []) 1.119 + ; the standard int Vec for comparisons 1.120 + int-vec (:standard int-vecs)] 1.121 + (testing "compare" 1.122 + (testing "identical" 1.123 + (is (= 0 (compare int-vec int-vec)))) 1.124 + (testing "equivalent" 1.125 + (are [x y] (= 0 (compare x y)) 1.126 + ; standard 1.127 + int-vec (:standard long-vecs) 1.128 + (:standard long-vecs) int-vec 1.129 + int-vec (:standard regular-vecs) 1.130 + (:standard regular-vecs) int-vec 1.131 + ; empty 1.132 + (:empty int-vecs) (:empty long-vecs) 1.133 + (:empty long-vecs) (:empty int-vecs))) 1.134 + (testing "lesser" 1.135 + (are [x] (= -1 (compare int-vec x)) 1.136 + (:longer int-vecs) 1.137 + (:longer long-vecs) 1.138 + (:longer regular-vecs) 1.139 + (:first-greater int-vecs) 1.140 + (:first-greater long-vecs) 1.141 + (:first-greater regular-vecs) 1.142 + (:last-greater int-vecs) 1.143 + (:last-greater long-vecs) 1.144 + (:last-greater regular-vecs) 1.145 + (:rand-greater-1 int-vecs) 1.146 + (:rand-greater-1 long-vecs) 1.147 + (:rand-greater-1 regular-vecs) 1.148 + (:rand-greater-2 int-vecs) 1.149 + (:rand-greater-2 long-vecs) 1.150 + (:rand-greater-2 regular-vecs) 1.151 + (:rand-greater-3 int-vecs) 1.152 + (:rand-greater-3 long-vecs) 1.153 + (:rand-greater-3 regular-vecs)) 1.154 + (are [x] (= -1 (compare x int-vec)) 1.155 + nil 1.156 + (:empty int-vecs) 1.157 + (:empty long-vecs) 1.158 + (:empty regular-vecs) 1.159 + (:shorter int-vecs) 1.160 + (:shorter long-vecs) 1.161 + (:shorter regular-vecs) 1.162 + (:first-lesser int-vecs) 1.163 + (:first-lesser long-vecs) 1.164 + (:first-lesser regular-vecs) 1.165 + (:last-lesser int-vecs) 1.166 + (:last-lesser long-vecs) 1.167 + (:last-lesser regular-vecs) 1.168 + (:rand-lesser-1 int-vecs) 1.169 + (:rand-lesser-1 long-vecs) 1.170 + (:rand-lesser-1 regular-vecs) 1.171 + (:rand-lesser-2 int-vecs) 1.172 + (:rand-lesser-2 long-vecs) 1.173 + (:rand-lesser-2 regular-vecs) 1.174 + (:rand-lesser-3 int-vecs) 1.175 + (:rand-lesser-3 long-vecs) 1.176 + (:rand-lesser-3 regular-vecs))) 1.177 + (testing "greater" 1.178 + (are [x] (= 1 (compare int-vec x)) 1.179 + nil 1.180 + (:empty int-vecs) 1.181 + (:empty long-vecs) 1.182 + (:empty regular-vecs) 1.183 + (:shorter int-vecs) 1.184 + (:shorter long-vecs) 1.185 + (:shorter regular-vecs) 1.186 + (:first-lesser int-vecs) 1.187 + (:first-lesser long-vecs) 1.188 + (:first-lesser regular-vecs) 1.189 + (:last-lesser int-vecs) 1.190 + (:last-lesser long-vecs) 1.191 + (:last-lesser regular-vecs) 1.192 + (:rand-lesser-1 int-vecs) 1.193 + (:rand-lesser-1 long-vecs) 1.194 + (:rand-lesser-1 regular-vecs) 1.195 + (:rand-lesser-2 int-vecs) 1.196 + (:rand-lesser-2 long-vecs) 1.197 + (:rand-lesser-2 regular-vecs) 1.198 + (:rand-lesser-3 int-vecs) 1.199 + (:rand-lesser-3 long-vecs) 1.200 + (:rand-lesser-3 regular-vecs)) 1.201 + (are [x] (= 1 (compare x int-vec)) 1.202 + (:longer int-vecs) 1.203 + (:longer long-vecs) 1.204 + (:longer regular-vecs) 1.205 + (:first-greater int-vecs) 1.206 + (:first-greater long-vecs) 1.207 + (:first-greater regular-vecs) 1.208 + (:last-greater int-vecs) 1.209 + (:last-greater long-vecs) 1.210 + (:last-greater regular-vecs) 1.211 + (:rand-greater-1 int-vecs) 1.212 + (:rand-greater-1 long-vecs) 1.213 + (:rand-greater-1 regular-vecs) 1.214 + (:rand-greater-2 int-vecs) 1.215 + (:rand-greater-2 long-vecs) 1.216 + (:rand-greater-2 regular-vecs) 1.217 + (:rand-greater-3 int-vecs) 1.218 + (:rand-greater-3 long-vecs) 1.219 + (:rand-greater-3 regular-vecs)))) 1.220 + (testing "Comparable.compareTo" 1.221 + (testing "incompatible" 1.222 + (is (thrown? NullPointerException (.compareTo int-vec nil))) 1.223 + (are [x] (thrown? ClassCastException (.compareTo int-vec x)) 1.224 + '() 1.225 + {} 1.226 + #{} 1.227 + (sorted-set) 1.228 + (sorted-map) 1.229 + nums 1.230 + 1)) 1.231 + (testing "identical" 1.232 + (is (= 0 (.compareTo int-vec int-vec)))) 1.233 + (testing "equivalent" 1.234 + (are [x] (= 0 (.compareTo int-vec x)) 1.235 + (:standard long-vecs) 1.236 + (:standard regular-vecs))) 1.237 + (testing "lesser" 1.238 + (are [x] (= -1 (.compareTo int-vec x)) 1.239 + (:longer int-vecs) 1.240 + (:longer long-vecs) 1.241 + (:longer regular-vecs) 1.242 + (:first-greater int-vecs) 1.243 + (:first-greater long-vecs) 1.244 + (:first-greater regular-vecs) 1.245 + (:last-greater int-vecs) 1.246 + (:last-greater long-vecs) 1.247 + (:last-greater regular-vecs) 1.248 + (:rand-greater-1 int-vecs) 1.249 + (:rand-greater-1 long-vecs) 1.250 + (:rand-greater-1 regular-vecs) 1.251 + (:rand-greater-2 int-vecs) 1.252 + (:rand-greater-2 long-vecs) 1.253 + (:rand-greater-2 regular-vecs) 1.254 + (:rand-greater-3 int-vecs) 1.255 + (:rand-greater-3 long-vecs) 1.256 + (:rand-greater-3 regular-vecs))) 1.257 + (testing "greater" 1.258 + (are [x] (= 1 (.compareTo int-vec x)) 1.259 + (:empty int-vecs) 1.260 + (:empty long-vecs) 1.261 + (:empty regular-vecs) 1.262 + (:shorter int-vecs) 1.263 + (:shorter long-vecs) 1.264 + (:shorter regular-vecs) 1.265 + (:first-lesser int-vecs) 1.266 + (:first-lesser long-vecs) 1.267 + (:first-lesser regular-vecs) 1.268 + (:last-lesser int-vecs) 1.269 + (:last-lesser long-vecs) 1.270 + (:last-lesser regular-vecs) 1.271 + (:rand-lesser-1 int-vecs) 1.272 + (:rand-lesser-1 long-vecs) 1.273 + (:rand-lesser-1 regular-vecs) 1.274 + (:rand-lesser-2 int-vecs) 1.275 + (:rand-lesser-2 long-vecs) 1.276 + (:rand-lesser-2 regular-vecs) 1.277 + (:rand-lesser-3 int-vecs) 1.278 + (:rand-lesser-3 long-vecs) 1.279 + (:rand-lesser-3 regular-vecs)))))) 1.280 + 1.281 +(deftest test-vec-associative 1.282 + (let [empty-v (vector-of :long) 1.283 + v (into empty-v (range 1 6))] 1.284 + (testing "Associative.containsKey" 1.285 + (are [x] (.containsKey v x) 1.286 + 0 1 2 3 4) 1.287 + (are [x] (not (.containsKey v x)) 1.288 + -1 -100 nil [] "" #"" #{} 5 100) 1.289 + (are [x] (not (.containsKey empty-v x)) 1.290 + 0 1)) 1.291 + (testing "contains?" 1.292 + (are [x] (contains? v x) 1.293 + 0 2 4) 1.294 + (are [x] (not (contains? v x)) 1.295 + -1 -100 nil "" 5 100) 1.296 + (are [x] (not (contains? empty-v x)) 1.297 + 0 1)) 1.298 + (testing "Associative.entryAt" 1.299 + (are [idx val] (= (clojure.lang.MapEntry. idx val) 1.300 + (.entryAt v idx)) 1.301 + 0 1 1.302 + 2 3 1.303 + 4 5) 1.304 + (are [idx] (nil? (.entryAt v idx)) 1.305 + -5 -1 5 10 nil "") 1.306 + (are [idx] (nil? (.entryAt empty-v idx)) 1.307 + 0 1))))