1/*
2 * Copyright (c) 2009-2014 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
11static 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
117static 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
206static 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
275static 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
312static 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
357static 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
403static 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
423static 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