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