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))))