d077fa8b83c10ad247144a2b226d3aee45d68222
[jansson.git] / test / testprogs / test_array.c
1 /*
2  * Copyright (c) 2009 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
11 static void test_misc(void)
12 {
13     json_t *array, *five, *seven, *value;
14     int 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
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
206 static void test_remove(void)
207 {
208     json_t *array, *five, *seven;
209
210     array = json_array();
211     five = json_integer(5);
212     seven = json_integer(7);
213
214     if(!array)
215         fail("unable to create array");
216     if(!five)
217         fail("unable to create integer");
218     if(!seven)
219         fail("unable to create integer");
220
221
222     if(!json_array_remove(array, 0))
223         fail("able to remove an unexisting index");
224
225
226     if(json_array_append(array, five))
227         fail("unable to append");
228
229     if(!json_array_remove(array, 1))
230         fail("able to remove an unexisting index");
231
232     if(json_array_remove(array, 0))
233         fail("unable to remove");
234
235     if(json_array_size(array) != 0)
236         fail("array size is invalid after removing");
237
238
239     if(json_array_append(array, five) ||
240        json_array_append(array, seven) ||
241        json_array_append(array, five) ||
242        json_array_append(array, seven))
243         fail("unable to append");
244
245     if(json_array_remove(array, 2))
246         fail("unable to remove");
247
248     if(json_array_size(array) != 3)
249         fail("array size is invalid after removing");
250
251     if(json_array_get(array, 0) != five ||
252        json_array_get(array, 1) != seven ||
253        json_array_get(array, 2) != seven)
254         fail("remove works incorrectly");
255
256     json_decref(five);
257     json_decref(seven);
258     json_decref(array);
259 }
260
261 static void test_clear(void)
262 {
263     json_t *array, *five, *seven;
264     int i;
265
266     array = json_array();
267     five = json_integer(5);
268     seven = json_integer(7);
269
270     if(!array)
271         fail("unable to create array");
272     if(!five || !seven)
273         fail("unable to create integer");
274
275     for(i = 0; i < 10; i++) {
276         if(json_array_append(array, five))
277             fail("unable to append");
278     }
279     for(i = 0; i < 10; i++) {
280         if(json_array_append(array, seven))
281             fail("unable to append");
282     }
283
284     if(json_array_size(array) != 20)
285         fail("array size is invalid after appending");
286
287     if(json_array_clear(array))
288         fail("unable to clear");
289
290     if(json_array_size(array) != 0)
291         fail("array size is invalid after clearing");
292
293     json_decref(five);
294     json_decref(seven);
295     json_decref(array);
296 }
297
298 static void test_extend(void)
299 {
300     json_t *array1, *array2, *five, *seven;
301     int i;
302
303     array1 = json_array();
304     array2 = json_array();
305     five = json_integer(5);
306     seven = json_integer(7);
307
308     if(!array1 || !array2)
309         fail("unable to create array");
310     if(!five || !seven)
311         fail("unable to create integer");
312
313     for(i = 0; i < 10; i++) {
314         if(json_array_append(array1, five))
315             fail("unable to append");
316     }
317     for(i = 0; i < 10; i++) {
318         if(json_array_append(array2, seven))
319             fail("unable to append");
320     }
321
322     if(json_array_size(array1) != 10 || json_array_size(array2) != 10)
323         fail("array size is invalid after appending");
324
325     if(json_array_extend(array1, array2))
326         fail("unable to extend");
327
328     for(i = 0; i < 10; i++) {
329         if(json_array_get(array1, i) != five)
330             fail("invalid array contents after extending");
331     }
332     for(i = 10; i < 20; i++) {
333         if(json_array_get(array1, i) != seven)
334             fail("invalid array contents after extending");
335     }
336
337     json_decref(five);
338     json_decref(seven);
339     json_decref(array1);
340     json_decref(array2);
341 }
342
343 static void test_circular()
344 {
345     json_t *array1, *array2;
346
347     /* the simple cases are checked */
348
349     array1 = json_array();
350     if(!array1)
351         fail("unable to create array");
352
353     if(json_array_append(array1, array1) == 0)
354         fail("able to append self");
355
356     if(json_array_insert(array1, 0, array1) == 0)
357         fail("able to insert self");
358
359     if(json_array_append_new(array1, json_true()))
360         fail("failed to append true");
361
362     if(json_array_set(array1, 0, array1) == 0)
363         fail("able to set self");
364
365     json_decref(array1);
366
367
368     /* create circular references */
369
370     array1 = json_array();
371     array2 = json_array();
372     if(!array1 || !array2)
373         fail("unable to create array");
374
375     if(json_array_append(array1, array2) ||
376        json_array_append(array2, array1))
377         fail("unable to append");
378
379     /* circularity is detected when dumping */
380     if(json_dumps(array1, 0) != NULL)
381         fail("able to dump circulars");
382
383     /* decref twice to deal with the circular references */
384     json_decref(array1);
385     json_decref(array2);
386     json_decref(array1);
387 }
388
389
390 int main()
391 {
392     test_misc();
393     test_insert();
394     test_remove();
395     test_clear();
396     test_extend();
397     test_circular();
398
399     return 0;
400 }