Mercurial > lasercutter
comparison src/clojure/test_clojure/serialization.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 ;; Author: Chas Emerick | |
10 ;; cemerick@snowtide.com | |
11 | |
12 (ns clojure.test-clojure.serialization | |
13 (:use clojure.test) | |
14 (:import (java.io ObjectOutputStream ObjectInputStream | |
15 ByteArrayOutputStream ByteArrayInputStream))) | |
16 | |
17 (defn- serialize | |
18 "Serializes a single object, returning a byte array." | |
19 [v] | |
20 (with-open [bout (ByteArrayOutputStream.) | |
21 oos (ObjectOutputStream. bout)] | |
22 (.writeObject oos v) | |
23 (.flush oos) | |
24 (.toByteArray bout))) | |
25 | |
26 (defn- deserialize | |
27 "Deserializes and returns a single object from the given byte array." | |
28 [bytes] | |
29 (with-open [ois (-> bytes ByteArrayInputStream. ObjectInputStream.)] | |
30 (.readObject ois))) | |
31 | |
32 (defrecord SerializationRecord [a b c]) | |
33 (defstruct SerializationStruct :a :b :c) | |
34 | |
35 (defn- build-via-transient | |
36 [coll] | |
37 (persistent! | |
38 (reduce conj! (transient coll) (map vec (partition 2 (range 1000)))))) | |
39 | |
40 (defn- roundtrip | |
41 [v] | |
42 (let [rt (-> v serialize deserialize) | |
43 rt-seq (-> v seq serialize deserialize)] | |
44 (and (= v rt) | |
45 (= (seq v) (seq rt)) | |
46 (= (seq v) rt-seq)))) | |
47 | |
48 (deftest sequable-serialization | |
49 (are [val] (roundtrip val) | |
50 ; lists and related | |
51 (list) | |
52 (apply list (range 10)) | |
53 (cons 0 nil) | |
54 (clojure.lang.Cons. 0 nil) | |
55 | |
56 ; vectors | |
57 [] | |
58 (into [] (range 10)) | |
59 (into [] (range 25)) | |
60 (into [] (range 100)) | |
61 (into [] (range 500)) | |
62 (into [] (range 1000)) | |
63 | |
64 ; maps | |
65 {} | |
66 {:a 5 :b 0} | |
67 (apply array-map (range 100)) | |
68 (apply hash-map (range 100)) | |
69 | |
70 ; sets | |
71 #{} | |
72 #{'a 'b 'c} | |
73 (set (range 10)) | |
74 (set (range 25)) | |
75 (set (range 100)) | |
76 (set (range 500)) | |
77 (set (range 1000)) | |
78 (sorted-set) | |
79 (sorted-set 'a 'b 'c) | |
80 (apply sorted-set (reverse (range 10))) | |
81 (apply sorted-set (reverse (range 25))) | |
82 (apply sorted-set (reverse (range 100))) | |
83 (apply sorted-set (reverse (range 500))) | |
84 (apply sorted-set (reverse (range 1000))) | |
85 | |
86 ; queues | |
87 clojure.lang.PersistentQueue/EMPTY | |
88 (into clojure.lang.PersistentQueue/EMPTY (range 50)) | |
89 | |
90 ; lazy seqs | |
91 (lazy-seq nil) | |
92 (lazy-seq (range 50)) | |
93 | |
94 ; transient / persistent! round-trip | |
95 (build-via-transient []) | |
96 (build-via-transient {}) | |
97 (build-via-transient #{}) | |
98 | |
99 ; array-seqs | |
100 (seq (make-array Object 10)) | |
101 (seq (make-array Boolean/TYPE 10)) | |
102 (seq (make-array Byte/TYPE 10)) | |
103 (seq (make-array Character/TYPE 10)) | |
104 (seq (make-array Double/TYPE 10)) | |
105 (seq (make-array Float/TYPE 10)) | |
106 (seq (make-array Integer/TYPE 10)) | |
107 (seq (make-array Long/TYPE 10)) | |
108 | |
109 ; "records" | |
110 (SerializationRecord. 0 :foo (range 20)) | |
111 (struct SerializationStruct 0 :foo (range 20)) | |
112 | |
113 ; misc seqs | |
114 (seq "s11n") | |
115 (range 50) | |
116 (rseq (apply sorted-set (reverse (range 100)))))) | |
117 | |
118 (deftest misc-serialization | |
119 (are [v] (= v (-> v serialize deserialize)) | |
120 25/3 | |
121 :keyword | |
122 ::namespaced-keyword | |
123 'symbol)) | |
124 | |
125 (deftest interned-serializations | |
126 (are [v] (identical? v (-> v serialize deserialize)) | |
127 clojure.lang.RT/DEFAULT_COMPARATOR | |
128 | |
129 ; namespaces just get deserialized back into the same-named ns in the present runtime | |
130 ; (they're referred to by defrecord instances) | |
131 *ns*)) | |
132 | |
133 (deftest function-serialization | |
134 (let [capture 5] | |
135 (are [f] (= capture ((-> f serialize deserialize))) | |
136 (constantly 5) | |
137 (fn [] 5) | |
138 #(do 5) | |
139 (constantly capture) | |
140 (fn [] capture) | |
141 #(do capture)))) | |
142 | |
143 (deftest check-unserializable-objects | |
144 (are [t] (thrown? java.io.NotSerializableException (serialize t)) | |
145 ;; transients | |
146 (transient []) | |
147 (transient {}) | |
148 (transient #{}) | |
149 | |
150 ;; reference types | |
151 (atom nil) | |
152 (ref nil) | |
153 (agent nil) | |
154 #'+ | |
155 | |
156 ;; stateful seqs | |
157 (enumeration-seq (java.util.Collections/enumeration (range 50))) | |
158 (iterator-seq (.iterator (range 50))))) |