Commit | Line | Data |
---|---|---|
db31c358 NR |
1 | package be.nikiroo.utils.test; |
2 | ||
f4053377 NR |
3 | import java.net.URL; |
4 | ||
db31c358 NR |
5 | import be.nikiroo.utils.serial.Exporter; |
6 | import be.nikiroo.utils.serial.Importer; | |
7 | ||
8 | class SerialTest extends TestLauncher { | |
452f38c8 NR |
9 | /** |
10 | * Required for Import/Export of objects. | |
11 | */ | |
12 | public SerialTest() { | |
13 | this(null); | |
14 | } | |
15 | ||
db31c358 NR |
16 | public SerialTest(String[] args) { |
17 | super("Serial test", args); | |
18 | ||
19 | addTest(new TestCase("Simple class Import/Export") { | |
20 | @Override | |
21 | public void test() throws Exception { | |
22 | Data data = new Data(42); | |
3f277541 NR |
23 | String encoded = new Exporter().append(data).toString(false, |
24 | false); | |
db31c358 | 25 | Object redata = new Importer().read(encoded).getValue(); |
3f277541 NR |
26 | String reencoded = new Exporter().append(redata).toString( |
27 | false, false); | |
72648e75 NR |
28 | |
29 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
30 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
31 | } | |
32 | }); | |
33 | ||
34 | addTest(new TestCase() { | |
edeff2ab | 35 | @SuppressWarnings("unused") |
72648e75 NR |
36 | private TestCase me = setName("Anonymous inner class"); |
37 | ||
38 | @Override | |
39 | public void test() throws Exception { | |
40 | Data data = new Data() { | |
3f277541 | 41 | @SuppressWarnings("unused") |
15c2dc9f | 42 | int value = 42; |
72648e75 NR |
43 | }; |
44 | ||
3f277541 NR |
45 | String encoded = new Exporter().append(data).toString(false, |
46 | false); | |
72648e75 | 47 | Object redata = new Importer().read(encoded).getValue(); |
3f277541 NR |
48 | String reencoded = new Exporter().append(redata).toString( |
49 | false, false); | |
db31c358 NR |
50 | |
51 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
52 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
53 | } | |
54 | }); | |
55 | ||
edeff2ab NR |
56 | addTest(new TestCase() { |
57 | @SuppressWarnings("unused") | |
58 | private TestCase me = setName("Array of anonymous inner classes"); | |
59 | ||
60 | @Override | |
61 | public void test() throws Exception { | |
62 | Data[] data = new Data[] { new Data() { | |
3f277541 | 63 | @SuppressWarnings("unused") |
15c2dc9f | 64 | int value = 42; |
edeff2ab NR |
65 | } }; |
66 | ||
3f277541 NR |
67 | String encoded = new Exporter().append(data).toString(false, |
68 | false); | |
edeff2ab | 69 | Object redata = new Importer().read(encoded).getValue(); |
3f277541 NR |
70 | String reencoded = new Exporter().append(redata).toString( |
71 | false, false); | |
edeff2ab NR |
72 | |
73 | // Comparing the 2 strings won't be useful, because the @REFs | |
74 | // will be ZIP-encoded; so we parse and re-encode the object | |
3f277541 | 75 | encoded = new Exporter().append(data[0]).toString(false, false); |
edeff2ab NR |
76 | try { |
77 | reencoded = new Exporter().append(((Data[]) redata)[0]) | |
3f277541 | 78 | .toString(false, false); |
edeff2ab NR |
79 | } catch (Exception e) { |
80 | fail("Cannot cast the returned data into its original object", | |
81 | e); | |
82 | } | |
83 | ||
84 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
85 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
86 | } | |
87 | }); | |
88 | ||
f4053377 NR |
89 | addTest(new TestCase("URL Import/Export") { |
90 | @Override | |
91 | public void test() throws Exception { | |
92 | URL data = new URL("https://fanfan.be/"); | |
3f277541 NR |
93 | String encoded = new Exporter().append(data).toString(false, |
94 | false); | |
f4053377 | 95 | Object redata = new Importer().read(encoded).getValue(); |
3f277541 NR |
96 | String reencoded = new Exporter().append(redata).toString( |
97 | false, false); | |
f4053377 NR |
98 | |
99 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
100 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
101 | } | |
102 | }); | |
103 | ||
104 | addTest(new TestCase("URL-String Import/Export") { | |
105 | @Override | |
106 | public void test() throws Exception { | |
107 | String data = new URL("https://fanfan.be/").toString(); | |
3f277541 NR |
108 | String encoded = new Exporter().append(data).toString(false, |
109 | false); | |
f4053377 | 110 | Object redata = new Importer().read(encoded).getValue(); |
3f277541 NR |
111 | String reencoded = new Exporter().append(redata).toString( |
112 | false, false); | |
f4053377 NR |
113 | |
114 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
115 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
116 | assertEquals(data, redata); | |
117 | } | |
118 | }); | |
119 | ||
120 | addTest(new TestCase("URL/URL-String arrays Import/Export") { | |
121 | @Override | |
122 | public void test() throws Exception { | |
123 | final String url = "https://fanfan.be/"; | |
124 | ||
125 | Object[] data = new Object[] { new URL(url), url }; | |
3f277541 NR |
126 | String encoded = new Exporter().append(data).toString(false, |
127 | false); | |
f4053377 | 128 | Object redata = new Importer().read(encoded).getValue(); |
3f277541 NR |
129 | String reencoded = new Exporter().append(redata).toString( |
130 | false, false); | |
f4053377 NR |
131 | |
132 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
133 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
134 | assertEquals(data[0], ((Object[]) redata)[0]); | |
135 | assertEquals(data[1], ((Object[]) redata)[1]); | |
136 | } | |
137 | }); | |
138 | ||
db31c358 NR |
139 | addTest(new TestCase("Import/Export with nested objects") { |
140 | @Override | |
141 | public void test() throws Exception { | |
142 | Data data = new DataObject(new Data(21)); | |
3f277541 NR |
143 | String encoded = new Exporter().append(data).toString(false, |
144 | false); | |
db31c358 | 145 | Object redata = new Importer().read(encoded).getValue(); |
3f277541 NR |
146 | String reencoded = new Exporter().append(redata).toString( |
147 | false, false); | |
db31c358 NR |
148 | |
149 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
150 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
151 | } | |
152 | }); | |
153 | ||
154 | addTest(new TestCase("Import/Export with nested objects forming a loop") { | |
155 | @Override | |
156 | public void test() throws Exception { | |
157 | DataLoop data = new DataLoop("looping"); | |
158 | data.next = new DataLoop("level 2"); | |
159 | data.next.next = data; | |
160 | ||
3f277541 NR |
161 | String encoded = new Exporter().append(data).toString(false, |
162 | false); | |
db31c358 | 163 | Object redata = new Importer().read(encoded).getValue(); |
3f277541 NR |
164 | String reencoded = new Exporter().append(redata).toString( |
165 | false, false); | |
db31c358 NR |
166 | |
167 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
168 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
169 | } | |
170 | }); | |
ce0974c4 NR |
171 | |
172 | addTest(new TestCase("Array in Object Import/Export") { | |
173 | @Override | |
174 | public void test() throws Exception { | |
175 | Object data = new DataArray();// new String[] { "un", "deux" }; | |
3f277541 NR |
176 | String encoded = new Exporter().append(data).toString(false, |
177 | false); | |
ce0974c4 | 178 | Object redata = new Importer().read(encoded).getValue(); |
3f277541 NR |
179 | String reencoded = new Exporter().append(redata).toString( |
180 | false, false); | |
ce0974c4 NR |
181 | |
182 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
183 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
184 | } | |
185 | }); | |
186 | ||
187 | addTest(new TestCase("Array Import/Export") { | |
188 | @Override | |
189 | public void test() throws Exception { | |
190 | Object data = new String[] { "un", "deux" }; | |
3f277541 NR |
191 | String encoded = new Exporter().append(data).toString(false, |
192 | false); | |
ce0974c4 | 193 | Object redata = new Importer().read(encoded).getValue(); |
3f277541 NR |
194 | String reencoded = new Exporter().append(redata).toString( |
195 | false, false); | |
ce0974c4 NR |
196 | |
197 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
198 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
199 | } | |
200 | }); | |
e570f7eb NR |
201 | |
202 | addTest(new TestCase("Enum Import/Export") { | |
203 | @Override | |
204 | public void test() throws Exception { | |
205 | Object data = EnumToSend.FANFAN; | |
3f277541 NR |
206 | String encoded = new Exporter().append(data).toString(false, |
207 | false); | |
e570f7eb | 208 | Object redata = new Importer().read(encoded).getValue(); |
3f277541 NR |
209 | String reencoded = new Exporter().append(redata).toString( |
210 | false, false); | |
e570f7eb NR |
211 | |
212 | assertEquals(encoded.replaceAll("@[0-9]*", "@REF"), | |
213 | reencoded.replaceAll("@[0-9]*", "@REF")); | |
214 | } | |
215 | }); | |
3f277541 NR |
216 | |
217 | addTest(new TestCase("B64 and ZIP String test") { | |
218 | @Override | |
219 | public void test() throws Exception { | |
220 | Object data = "Fanfan la tulipe"; | |
221 | String encoded = new Exporter().append(data).toString(true, | |
222 | false); | |
223 | String redata = (String) new Importer().read(encoded) | |
224 | .getValue(); | |
225 | ||
226 | assertEquals("Items not identical after B64", data, redata); | |
227 | ||
228 | encoded = new Exporter().append(data).toString(true, true); | |
229 | redata = (String) new Importer().read(encoded).getValue(); | |
230 | ||
231 | assertEquals("Items not identical after ZIP", data, redata); | |
232 | } | |
233 | }); | |
234 | ||
235 | addTest(new TestCase("B64 and ZIP Data test") { | |
236 | @Override | |
237 | public void test() throws Exception { | |
238 | Object data = new Data(55); | |
239 | String encoded = new Exporter().append(data).toString(true, | |
240 | false); | |
241 | Data redata = (Data) new Importer().read(encoded).getValue(); | |
242 | ||
243 | assertEquals("Items not identical after B64", data, redata); | |
244 | ||
245 | encoded = new Exporter().append(data).toString(true, true); | |
246 | redata = (Data) new Importer().read(encoded).getValue(); | |
247 | ||
248 | assertEquals("Items not identical after ZIP", data, redata); | |
249 | } | |
250 | }); | |
251 | ||
252 | addTest(new TestCase("B64 and ZIP 70000 chars test") { | |
253 | @Override | |
254 | public void test() throws Exception { | |
255 | StringBuilder builder = new StringBuilder(); | |
256 | for (int i = 0; i < 7000; i++) { | |
257 | builder.append("0123456789"); | |
258 | } | |
259 | ||
260 | Object data = builder.toString(); | |
261 | String encoded = new Exporter().append(data).toString(true, | |
262 | false); | |
263 | String redata = (String) new Importer().read(encoded) | |
264 | .getValue(); | |
265 | ||
266 | assertEquals("Items not identical after B64", data, redata); | |
267 | ||
268 | encoded = new Exporter().append(data).toString(true, true); | |
269 | redata = (String) new Importer().read(encoded).getValue(); | |
270 | ||
271 | assertEquals("Items not identical after ZIP", data, redata); | |
272 | } | |
273 | }); | |
ce0974c4 NR |
274 | } |
275 | ||
276 | class DataArray { | |
277 | public String[] data = new String[] { "un", "deux" }; | |
db31c358 NR |
278 | } |
279 | ||
db31c358 NR |
280 | class Data { |
281 | private int value; | |
282 | ||
283 | private Data() { | |
284 | } | |
285 | ||
286 | public Data(int value) { | |
287 | this.value = value; | |
288 | } | |
3f277541 NR |
289 | |
290 | @Override | |
291 | public boolean equals(Object obj) { | |
292 | if (obj instanceof Data) { | |
293 | Data other = (Data) obj; | |
294 | return other.value == this.value; | |
295 | } | |
296 | ||
297 | return false; | |
298 | } | |
299 | ||
300 | @Override | |
301 | public int hashCode() { | |
b6d4ace8 | 302 | return new Integer(value).hashCode(); |
3f277541 | 303 | } |
db31c358 NR |
304 | } |
305 | ||
306 | @SuppressWarnings("unused") | |
307 | class DataObject extends Data { | |
308 | private Data data; | |
309 | ||
310 | @SuppressWarnings("synthetic-access") | |
311 | private DataObject() { | |
312 | } | |
313 | ||
314 | @SuppressWarnings("synthetic-access") | |
315 | public DataObject(Data data) { | |
316 | this.data = data; | |
317 | } | |
318 | } | |
319 | ||
320 | @SuppressWarnings("unused") | |
321 | class DataLoop extends Data { | |
322 | public DataLoop next; | |
323 | private String value; | |
324 | ||
325 | @SuppressWarnings("synthetic-access") | |
326 | private DataLoop() { | |
327 | } | |
328 | ||
329 | @SuppressWarnings("synthetic-access") | |
330 | public DataLoop(String value) { | |
331 | this.value = value; | |
332 | } | |
333 | } | |
e570f7eb NR |
334 | |
335 | enum EnumToSend { | |
336 | FANFAN, TULIPE, | |
337 | } | |
db31c358 | 338 | } |