1 /*
2 * Copyright (c) 2009-2016 Petri Lehtinen <petri@digip.org>
3 *
4 * Jansson is free software; you can redistribute it and/or modify
5 * it under the terms of the MIT license. See LICENSE for details.
6 */
7
8 #include <jansson.h>
9 #include "util.h"
10
test_misc(void)11 static void test_misc(void)
12 {
13 json_t *array, *five, *seven, *value;
14 size_t i;
15
16 array = json_array();
17 five = json_integer(5);
18 seven = json_integer(7);
19
20 if(!array)
21 fail("unable to create array");
22 if(!five || !seven)
23 fail("unable to create integer");
24
25 if(json_array_size(array) != 0)
26 fail("empty array has nonzero size");
27
28 if(!json_array_append(array, NULL))
29 fail("able to append NULL");
30
31 if(json_array_append(array, five))
32 fail("unable to append");
33
34 if(json_array_size(array) != 1)
35 fail("wrong array size");
36
37 value = json_array_get(array, 0);
38 if(!value)
39 fail("unable to get item");
40 if(value != five)
41 fail("got wrong value");
42
43 if(json_array_append(array, seven))
44 fail("unable to append value");
45
46 if(json_array_size(array) != 2)
47 fail("wrong array size");
48
49 value = json_array_get(array, 1);
50 if(!value)
51 fail("unable to get item");
52 if(value != seven)
53 fail("got wrong value");
54
55 if(json_array_set(array, 0, seven))
56 fail("unable to set value");
57
58 if(!json_array_set(array, 0, NULL))
59 fail("able to set NULL");
60
61 if(json_array_size(array) != 2)
62 fail("wrong array size");
63
64 value = json_array_get(array, 0);
65 if(!value)
66 fail("unable to get item");
67 if(value != seven)
68 fail("got wrong value");
69
70 if(json_array_get(array, 2) != NULL)
71 fail("able to get value out of bounds");
72
73 if(!json_array_set(array, 2, seven))
74 fail("able to set value out of bounds");
75
76 for(i = 2; i < 30; i++) {
77 if(json_array_append(array, seven))
78 fail("unable to append value");
79
80 if(json_array_size(array) != i + 1)
81 fail("wrong array size");
82 }
83
84 for(i = 0; i < 30; i++) {
85 value = json_array_get(array, i);
86 if(!value)
87 fail("unable to get item");
88 if(value != seven)
89 fail("got wrong value");
90 }
91
92 if(json_array_set_new(array, 15, json_integer(123)))
93 fail("unable to set new value");
94
95 value = json_array_get(array, 15);
96 if(!json_is_integer(value) || json_integer_value(value) != 123)
97 fail("json_array_set_new works incorrectly");
98
99 if(!json_array_set_new(array, 15, NULL))
100 fail("able to set_new NULL value");
101
102 if(json_array_append_new(array, json_integer(321)))
103 fail("unable to append new value");
104
105 value = json_array_get(array, json_array_size(array) - 1);
106 if(!json_is_integer(value) || json_integer_value(value) != 321)
107 fail("json_array_append_new works incorrectly");
108
109 if(!json_array_append_new(array, NULL))
110 fail("able to append_new NULL value");
111
112 json_decref(five);
113 json_decref(seven);
114 json_decref(array);
115 }
116
test_insert(void)117 static void test_insert(void)
118 {
119 json_t *array, *five, *seven, *eleven, *value;
120 int i;
121
122 array = json_array();
123 five = json_integer(5);
124 seven = json_integer(7);
125 eleven = json_integer(11);
126
127 if(!array)
128 fail("unable to create array");
129 if(!five || !seven || !eleven)
130 fail("unable to create integer");
131
132
133 if(!json_array_insert(array, 1, five))
134 fail("able to insert value out of bounds");
135
136
137 if(json_array_insert(array, 0, five))
138 fail("unable to insert value in an empty array");
139
140 if(json_array_get(array, 0) != five)
141 fail("json_array_insert works incorrectly");
142
143 if(json_array_size(array) != 1)
144 fail("array size is invalid after insertion");
145
146
147 if(json_array_insert(array, 1, seven))
148 fail("unable to insert value at the end of an array");
149
150 if(json_array_get(array, 0) != five)
151 fail("json_array_insert works incorrectly");
152
153 if(json_array_get(array, 1) != seven)
154 fail("json_array_insert works incorrectly");
155
156 if(json_array_size(array) != 2)
157 fail("array size is invalid after insertion");
158
159
160 if(json_array_insert(array, 1, eleven))
161 fail("unable to insert value in the middle of an array");
162
163 if(json_array_get(array, 0) != five)
164 fail("json_array_insert works incorrectly");
165
166 if(json_array_get(array, 1) != eleven)
167 fail("json_array_insert works incorrectly");
168
169 if(json_array_get(array, 2) != seven)
170 fail("json_array_insert works incorrectly");
171
172 if(json_array_size(array) != 3)
173 fail("array size is invalid after insertion");
174
175
176 if(json_array_insert_new(array, 2, json_integer(123)))
177 fail("unable to insert value in the middle of an array");
178
179 value = json_array_get(array, 2);
180 if(!json_is_integer(value) || json_integer_value(value) != 123)
181 fail("json_array_insert_new works incorrectly");
182
183 if(json_array_size(array) != 4)
184 fail("array size is invalid after insertion");
185
186
187 for(i = 0; i < 20; i++) {
188 if(json_array_insert(array, 0, seven))
189 fail("unable to insert value at the begining of an array");
190 }
191
192 for(i = 0; i < 20; i++) {
193 if(json_array_get(array, i) != seven)
194 fail("json_aray_insert works incorrectly");
195 }
196
197 if(json_array_size(array) != 24)
198 fail("array size is invalid after loop insertion");
199
200 json_decref(five);
201 json_decref(seven);
202 json_decref(eleven);
203 json_decref(array);
204 }
205
test_remove(void)206 static void test_remove(void)
207 {
208 json_t *array, *five, *seven;
209 int i;
210
211 array = json_array();
212 five = json_integer(5);
213 seven = json_integer(7);
214
215 if(!array)
216 fail("unable to create array");
217 if(!five)
218 fail("unable to create integer");
219 if(!seven)
220 fail("unable to create integer");
221
222
223 if(!json_array_remove(array, 0))
224 fail("able to remove an unexisting index");
225
226
227 if(json_array_append(array, five))
228 fail("unable to append");
229
230 if(!json_array_remove(array, 1))
231 fail("able to remove an unexisting index");
232
233 if(json_array_remove(array, 0))
234 fail("unable to remove");
235
236 if(json_array_size(array) != 0)
237 fail("array size is invalid after removing");
238
239
240 if(json_array_append(array, five) ||
241 json_array_append(array, seven) ||
242 json_array_append(array, five) ||
243 json_array_append(array, seven))
244 fail("unable to append");
245
246 if(json_array_remove(array, 2))
247 fail("unable to remove");
248
249 if(json_array_size(array) != 3)
250 fail("array size is invalid after removing");
251
252 if(json_array_get(array, 0) != five ||
253 json_array_get(array, 1) != seven ||
254 json_array_get(array, 2) != seven)
255 fail("remove works incorrectly");
256
257 json_decref(array);
258
259 array = json_array();
260 for(i = 0; i < 4; i++) {
261 json_array_append(array, five);
262 json_array_append(array, seven);
263 }
264 if(json_array_size(array) != 8)
265 fail("unable to append 8 items to array");
266
267 /* Remove an element from a "full" array. */
268 json_array_remove(array, 5);
269
270 json_decref(five);
271 json_decref(seven);
272 json_decref(array);
273 }
274
test_clear(void)275 static void test_clear(void)
276 {
277 json_t *array, *five, *seven;
278 int i;
279
280 array = json_array();
281 five = json_integer(5);
282 seven = json_integer(7);
283
284 if(!array)
285 fail("unable to create array");
286 if(!five || !seven)
287 fail("unable to create integer");
288
289 for(i = 0; i < 10; i++) {
290 if(json_array_append(array, five))
291 fail("unable to append");
292 }
293 for(i = 0; i < 10; i++) {
294 if(json_array_append(array, seven))
295 fail("unable to append");
296 }
297
298 if(json_array_size(array) != 20)
299 fail("array size is invalid after appending");
300
301 if(json_array_clear(array))
302 fail("unable to clear");
303
304 if(json_array_size(array) != 0)
305 fail("array size is invalid after clearing");
306
307 json_decref(five);
308 json_decref(seven);
309 json_decref(array);
310 }
311
test_extend(void)312 static void test_extend(void)
313 {
314 json_t *array1, *array2, *five, *seven;
315 int i;
316
317 array1 = json_array();
318 array2 = json_array();
319 five = json_integer(5);
320 seven = json_integer(7);
321
322 if(!array1 || !array2)
323 fail("unable to create array");
324 if(!five || !seven)
325 fail("unable to create integer");
326
327 for(i = 0; i < 10; i++) {
328 if(json_array_append(array1, five))
329 fail("unable to append");
330 }
331 for(i = 0; i < 10; i++) {
332 if(json_array_append(array2, seven))
333 fail("unable to append");
334 }
335
336 if(json_array_size(array1) != 10 || json_array_size(array2) != 10)
337 fail("array size is invalid after appending");
338
339 if(json_array_extend(array1, array2))
340 fail("unable to extend");
341
342 for(i = 0; i < 10; i++) {
343 if(json_array_get(array1, i) != five)
344 fail("invalid array contents after extending");
345 }
346 for(i = 10; i < 20; i++) {
347 if(json_array_get(array1, i) != seven)
348 fail("invalid array contents after extending");
349 }
350
351 json_decref(five);
352 json_decref(seven);
353 json_decref(array1);
354 json_decref(array2);
355 }
356
test_circular()357 static void test_circular()
358 {
359 json_t *array1, *array2;
360
361 /* the simple cases are checked */
362
363 array1 = json_array();
364 if(!array1)
365 fail("unable to create array");
366
367 if(json_array_append(array1, array1) == 0)
368 fail("able to append self");
369
370 if(json_array_insert(array1, 0, array1) == 0)
371 fail("able to insert self");
372
373 if(json_array_append_new(array1, json_true()))
374 fail("failed to append true");
375
376 if(json_array_set(array1, 0, array1) == 0)
377 fail("able to set self");
378
379 json_decref(array1);
380
381
382 /* create circular references */
383
384 array1 = json_array();
385 array2 = json_array();
386 if(!array1 || !array2)
387 fail("unable to create array");
388
389 if(json_array_append(array1, array2) ||
390 json_array_append(array2, array1))
391 fail("unable to append");
392
393 /* circularity is detected when dumping */
394 if(json_dumps(array1, 0) != NULL)
395 fail("able to dump circulars");
396
397 /* decref twice to deal with the circular references */
398 json_decref(array1);
399 json_decref(array2);
400 json_decref(array1);
401 }
402
test_array_foreach()403 static void test_array_foreach()
404 {
405 size_t index;
406 json_t *array1, *array2, *value;
407
408 array1 = json_pack("[sisisi]", "foo", 1, "bar", 2, "baz", 3);
409 array2 = json_array();
410
411 json_array_foreach(array1, index, value) {
412 json_array_append(array2, value);
413 }
414
415 if(!json_equal(array1, array2))
416 fail("json_array_foreach failed to iterate all elements");
417
418 json_decref(array1);
419 json_decref(array2);
420 }
421
422
run_tests()423 static void run_tests()
424 {
425 test_misc();
426 test_insert();
427 test_remove();
428 test_clear();
429 test_extend();
430 test_circular();
431 test_array_foreach();
432 }
433