PageRenderTime 46ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/src/test/clojure/clojure/data/finger_tree/tests.clj

http://github.com/clojure/data.finger-tree
Clojure | 357 lines | 309 code | 39 blank | 9 comment | 111 complexity | f3d20b9c17a95172433359c69bb4e2fc MD5 | raw file
  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. (ns ^{:doc "Tests for finger tree collections."
  9. :author "Chris Houser"}
  10. clojure.data.finger-tree.tests
  11. (:use [clojure.test :only [deftest is are]]
  12. [clojure.data.finger-tree
  13. :only [finger-tree meter conjl ft-concat ft-split-at split-tree
  14. opfn idElem measure measured to-tree getMeter
  15. double-list counted-double-list counted-sorted-set
  16. counted-sorted-set-by]])
  17. (:import (clojure.data.finger_tree CountedSortedSet CountedDoubleList)))
  18. (deftest Conj-Seq-Queue
  19. (let [len 100]
  20. (are [x] (and (= (range len) x) (= x (range len)) (= x x))
  21. (rseq (reduce conjl (double-list) (range len)))
  22. (seq (reduce conj (double-list) (range len))))))
  23. (deftest Conj-Seq-Stack
  24. (let [len 100, r (range (dec len) -1 -1)]
  25. (are [x] (and (= x r) (= r x) (= x x))
  26. (rseq (reduce conj (double-list) (range len)))
  27. (seq (reduce conjl (double-list) (range len))))))
  28. (deftest Conj-Seq-Mixed
  29. (doseq [m (range 2 7)]
  30. (loop [ft (double-list), vc [], i (int 0)]
  31. (when (< i 40)
  32. (is (= ft vc))
  33. (is (= vc ft))
  34. (is (= ft ft))
  35. (if (zero? (rem i m))
  36. (recur (conjl ft i) (vec (cons i vc)) (inc i))
  37. (recur (conj ft i) (conj vc i) (inc i)))))))
  38. (deftest Concat
  39. (doseq [a-len (range 25), b-len (range 25)]
  40. (let [a-s (map #(symbol (str % 'a)) (range a-len))
  41. b-s (map #(symbol (str % 'b)) (range b-len))
  42. a (apply double-list a-s)
  43. b (apply double-list b-s)
  44. s (concat a-s b-s)
  45. ft (ft-concat a b)]
  46. (is (= s ft))
  47. (is (= ft s))
  48. (is (= ft ft)))))
  49. (defn test-split-at [expected-vec counted-tree tree-type]
  50. (dotimes [n (count expected-vec)]
  51. (let [[l m r] (ft-split-at counted-tree n)]
  52. (is (instance? tree-type l))
  53. (is (instance? tree-type r))
  54. (is (= (nth expected-vec n) m))
  55. (is (= n (count l)))
  56. (is (= (- (count expected-vec) n 1) (count r)))
  57. (is (= (seq (subvec expected-vec 0 n)) (seq l)))
  58. (is (= (seq (subvec expected-vec (inc n))) (seq r)))))
  59. (let [[l m r] (ft-split-at counted-tree -1)]
  60. (is (instance? tree-type l))
  61. (is (instance? tree-type r))
  62. (is (nil? m))
  63. (is (zero? (count l)))
  64. (is (= (count expected-vec) (count r)))
  65. (is (empty? l))
  66. (is (= (seq expected-vec) (seq r)))
  67. (is (= r expected-vec))
  68. (is (= r r)))
  69. (let [len (count expected-vec)
  70. [l m r] (ft-split-at counted-tree len)]
  71. (is (instance? tree-type l))
  72. (is (instance? tree-type r))
  73. (is (nil? m))
  74. (is (= len (count l)))
  75. (is (zero? (count r)))
  76. (is (= (seq expected-vec) (seq l)))
  77. (is (= l expected-vec))
  78. (is (= l l))
  79. (is (empty? r))))
  80. (deftest CDLSplit
  81. (let [basevec (vec (map #(format "x%02d" %) (range 50)))]
  82. (dotimes [len (count basevec)]
  83. (let [lenvec (subvec basevec 0 len)]
  84. (test-split-at lenvec (apply counted-double-list lenvec)
  85. CountedDoubleList)))))
  86. (deftest CDLAssoc
  87. (doseq [len (range 50), n (range (inc len))]
  88. (let [v (assoc (vec (range len)) n :x)
  89. cdl (assoc (apply counted-double-list (range len)) n :x)]
  90. (is (= v cdl))
  91. (is (= cdl v))
  92. (is (= cdl cdl))
  93. (doseq [i (range len)]
  94. (is (= (nth v i) (nth cdl i)))
  95. (is (= (get v i) (get cdl i))))
  96. (doseq [i [-1 len]]
  97. (is (= (nth v i :nf) (nth cdl i :nf)))
  98. (is (= (get v i :nf) (get cdl i :nf)))))))
  99. (deftest CDLAssocCons
  100. (doseq [len (range 50)]
  101. (let [v (vec (cons :x (range len)))
  102. cdl(assoc (apply counted-double-list (range len)) -1 :x)]
  103. (is (= v cdl))
  104. (is (= cdl v))
  105. (is (= cdl cdl)))))
  106. (deftest CDLAssocFail
  107. (doseq [len (range 50), n [-2 (inc len)]]
  108. (is (thrown? Exception
  109. (assoc (apply counted-double-list (range len)) n :x)))))
  110. ; XXX continue here
  111. (deftest CSSConjDisj
  112. (let [values (vec (concat (range 50) [4.5 10.5 45.5 30.5]))]
  113. (dotimes [len (count values)]
  114. (let [pset (apply sorted-set (take len values))
  115. base (apply counted-sorted-set (take len values))] ; cons
  116. (is (= len (count base))) ; counted
  117. (dotimes [n len]
  118. (is (= pset (conj base (values n)))) ; exclusive set, next
  119. (is (= (nth (seq pset) n) (nth base n))) ; indexed lookup
  120. (is (= (values n) (get base (values n))))) ; set lookup
  121. (reduce (fn [[pset base] value] ; disj
  122. (is (= pset base))
  123. (is (= base pset))
  124. (is (= (count pset) (count base)))
  125. [(disj pset value) (disj base value)])
  126. [pset base] (take len values))))))
  127. (deftest CSSSplitAt
  128. (let [basevec (vec (map #(format "x%02d" %) (range 50)))]
  129. (dotimes [len (count basevec)]
  130. (let [lenvec (subvec basevec 0 len)]
  131. (test-split-at lenvec (apply counted-sorted-set lenvec)
  132. CountedSortedSet)))))
  133. (deftest CSSPeekPop
  134. (let [basevec (vec (map #(format "x%02d" %) (range 50)))]
  135. (loop [v basevec, t (apply counted-sorted-set basevec)]
  136. (is (= (peek v) (peek t)))
  137. (is (= (seq v) (seq t)))
  138. (when (seq v)
  139. (recur (pop v) (pop t))))))
  140. ; for CSS: subseq, rsubseq
  141. (defrecord Len-Meter [^int len])
  142. (def measure-len (constantly (Len-Meter. 1)))
  143. (def len-meter (meter measure-len
  144. (Len-Meter. 0)
  145. #(Len-Meter. (+ (:len %1) (:len %2)))))
  146. (defrecord String-Meter [string])
  147. (defn ^:static measure-str [node] (String-Meter. (str node)))
  148. (def string-meter (meter measure-str
  149. (String-Meter. "")
  150. #(String-Meter. (str (:string %1) (:string %2)))))
  151. (defrecord Len-String-Meter [len string])
  152. (def len-string-meter
  153. (let [len-op (opfn len-meter)
  154. string-op (opfn string-meter)]
  155. (meter
  156. (fn [o]
  157. (Len-String-Meter. (:len (measure len-meter o))
  158. (:string (measure string-meter o))))
  159. (Len-String-Meter. (:len (idElem len-meter))
  160. (:string (idElem string-meter)))
  161. (fn [a b] (Len-String-Meter.
  162. (:len (len-op a b))
  163. (:string (string-op a b)))))))
  164. (deftest Annotate-One-Direction
  165. (let [measure-fns len-string-meter]
  166. (let [len 100]
  167. (are [x] (= x (Len-String-Meter. len (apply str (range len))))
  168. (measured (reduce conj (finger-tree measure-fns) (range len))))
  169. (are [x] (= x (Len-String-Meter. len (apply str (reverse (range len)))))
  170. (measured (reduce conjl (finger-tree measure-fns) (range len)))))))
  171. (deftest Annotate-Mixed-Conj
  172. (let [measure-fns len-string-meter]
  173. (doseq [m (range 2 7)]
  174. (loop [ft (finger-tree measure-fns), vc [], i (int 0)]
  175. (when (< i 40)
  176. (is (= (measured ft) (Len-String-Meter. (count vc) (apply str vc))))
  177. (if (zero? (rem i m))
  178. (recur (conjl ft i) (vec (cons i vc)) (inc i))
  179. (recur (conj ft i) (conj vc i) (inc i))))))))
  180. (deftest Ann-Conj-Seq-Queue
  181. (let [len 100]
  182. (are [x] (= (map identity x) (range len))
  183. (rseq (reduce conjl (counted-double-list) (range len)))
  184. (seq (reduce conj (counted-double-list) (range len))))))
  185. (deftest Counted-Test
  186. (let [xs (map #(str "x" %) (range 1000))
  187. cdl (apply counted-double-list xs)]
  188. (is (= (concat [nil] xs [nil]) (map #(get cdl %) (range -1 1001))))))
  189. (deftest Annotate-Concat
  190. (let [measure-fns len-string-meter]
  191. (doseq [a-len (range 25), b-len (range 25)]
  192. (let [a-s (map #(symbol (str % 'a)) (range a-len))
  193. b-s (map #(symbol (str % 'b)) (range b-len))
  194. a (apply finger-tree measure-fns a-s)
  195. b (apply finger-tree measure-fns b-s)]
  196. (is (= (Len-String-Meter.
  197. (+ (count a-s) (count b-s))
  198. (apply str (concat a-s b-s)))
  199. (measured (ft-concat a b))))))))
  200. (deftest Split
  201. (let [make-item (fn [i] (symbol (str i 'a)))]
  202. (doseq [len (range 10)
  203. :let [tree (to-tree len-string-meter (map make-item (range len)))]
  204. split-i (range len)]
  205. (is (= [len split-i (make-item split-i)]
  206. [len split-i (second (split-tree tree #(< split-i (:len %))))])))))
  207. (defrecord Right-Meter [right])
  208. (defn measure-right [x] (Right-Meter. x))
  209. (def zero-right (Right-Meter. nil))
  210. (def right-meter
  211. (meter measure-right
  212. zero-right
  213. #(if (:right %2) %2 %1)))
  214. (defn insert-where [tree pred value]
  215. (if (empty? tree)
  216. (conj tree value)
  217. (let [[l x r] (split-tree tree pred)
  218. [a b] (if (pred (measure (getMeter tree) x)) [value x] [x value])]
  219. (ft-concat (conj l a) (conjl r b)))))
  220. (deftest Sorted-Set
  221. (let [r (java.util.Random. 42)]
  222. (reduce (fn [[t s] i]
  223. (let [t2 (insert-where t
  224. #(when-let [r (:right %)] (< i r))
  225. i)
  226. s (conj s i)]
  227. (is (every? true? (map = s t2)))
  228. [t2 s]))
  229. [(finger-tree right-meter) (sorted-set)]
  230. (take 2 (repeatedly #(.nextInt r))))))
  231. (deftest Remove-From-Empty-Trees
  232. (is (= () (pop (double-list))))
  233. (is (= () (rest (double-list))))
  234. (is (= () (pop (counted-double-list))))
  235. (is (= () (rest (counted-double-list))))
  236. (is (= #{} (pop (counted-sorted-set))))
  237. (is (= #{} (rest (counted-sorted-set))))
  238. (is (= #{} (disj (counted-sorted-set) :foo))))
  239. (deftest Get-Empty-Trees
  240. (is (nil? (first (double-list))))
  241. (is (nil? (peek (double-list))))
  242. (is (nil? (get (double-list) :anything)))
  243. (is (nil? (first (counted-double-list))))
  244. (is (nil? (peek (counted-double-list))))
  245. (is (nil? (get (counted-double-list) 0)))
  246. (is (nil? (first (counted-sorted-set))))
  247. (is (nil? (peek (counted-sorted-set))))
  248. (is (nil? (get (counted-sorted-set) :foo))))
  249. (deftest Get-Not-Found
  250. (is (= :notfound (get (double-list) :anything :notfound)))
  251. (is (= :notfound (get (counted-double-list) 0 :notfound)))
  252. (is (= :notfound (get (counted-sorted-set) :foo :notfound))))
  253. (deftest Unequal-Lists
  254. (doseq [[a b] [[[] [1]] [[1] []] [[1] [2]] [[1 2] [2 1]]]
  255. ctor [double-list counted-double-list]]
  256. (let [aobj (apply ctor a)]
  257. (is (not= aobj b))
  258. (is (not= b aobj))
  259. (doseq [afn [#(apply hash-set %) #(zipmap % %)]]
  260. (is (not= aobj (afn a)))
  261. (is (not= (afn a) aobj))))))
  262. (deftest Unequal-Sets
  263. (doseq [[a b] [[[] [1]] [[1] []] [[1] [2]] [[1 2] [2 1]]]]
  264. (let [aobj (apply counted-sorted-set a)]
  265. (is (not= aobj b))
  266. (is (not= b aobj))
  267. (is (not= aobj (zipmap a a)))
  268. (is (not= (zipmap a a) aobj)))))
  269. (deftest Meta
  270. (doseq [data [[] [3 2 1] (range 50)]
  271. ctor [double-list counted-double-list counted-sorted-set]]
  272. (let [mdata {:foo :bar}
  273. coll (with-meta (apply ctor data) mdata)]
  274. (is (= mdata (meta coll)))
  275. (is (= coll (with-meta coll nil))))))
  276. (defn is-same-coll [a b]
  277. (let [msg (format "(class a)=%s (class b)=%s (count a)=%s (count b)=%s a=%s b=%s (seq a)=%s (seq b)=%s"
  278. (.getName (class a)) (.getName (class b))
  279. (count a) (count b)
  280. a b
  281. (seq a) (seq b))]
  282. (is (= (count a) (count b)) msg)
  283. (is (= a b) msg)
  284. (is (= b a) msg)
  285. (is (.equals ^Object a b) msg)
  286. (is (.equals ^Object b a) msg)
  287. (is (= (hash a) (hash b)) msg)
  288. (is (= (.hashCode ^Object a) (.hashCode ^Object b)) msg)))
  289. (deftest sanity-checks
  290. (let [colls [ [(int -2) 4 5 6 7]
  291. (double-list (int -2) 4 5 6 7)
  292. (counted-double-list (int -2) 4 5 6 7) ]]
  293. (doseq [e1 colls, e2 colls]
  294. (is-same-coll e1 e2)))
  295. (let [colls [ []
  296. (double-list)
  297. (counted-double-list)
  298. (empty [(int -2) 4 5 6 7])
  299. (empty (double-list (int -2) 4 5 6 7))
  300. (empty (counted-double-list (int -2) 4 5 6 7)) ]]
  301. (doseq [e1 colls, e2 colls]
  302. (is-same-coll e1 e2)))
  303. (let [colls [ (sorted-set)
  304. (sorted-set-by >)
  305. (counted-sorted-set)
  306. (counted-sorted-set-by (comparator >))
  307. (empty (sorted-set (int -2) 4 5 6 7))
  308. (empty (sorted-set-by > (int -2) 4 5 6 7))
  309. (empty (counted-sorted-set (int -2) 4 5 6 7))
  310. (empty (counted-sorted-set-by (comparator >) (int -2) 4 5 6 7)) ]]
  311. (doseq [e1 colls, e2 colls]
  312. (is-same-coll e1 e2)))
  313. (let [colls [ (sorted-set (int -2) 4 5 6 7)
  314. (sorted-set-by > (int -2) 4 5 6 7)
  315. (counted-sorted-set (int -2) 4 5 6 7)
  316. (counted-sorted-set-by (comparator >) (int -2) 4 5 6 7) ]]
  317. (doseq [e1 colls, e2 colls]
  318. (is-same-coll e1 e2))))