Merge branch '1.2'
[jansson.git] / test / suites / api / test_object.c
1 /*
2  * Copyright (c) 2009, 2010 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 <string.h>
10 #include "util.h"
11
12 static void test_clear()
13 {
14     json_t *object, *ten;
15
16     object = json_object();
17     ten = json_integer(10);
18
19     if(!object)
20         fail("unable to create object");
21     if(!ten)
22         fail("unable to create integer");
23
24     if(json_object_set(object, "a", ten) ||
25        json_object_set(object, "b", ten) ||
26        json_object_set(object, "c", ten) ||
27        json_object_set(object, "d", ten) ||
28        json_object_set(object, "e", ten))
29         fail("unable to set value");
30
31     if(json_object_size(object) != 5)
32         fail("invalid size");
33
34     json_object_clear(object);
35
36     if(json_object_size(object) != 0)
37         fail("invalid size after clear");
38
39     json_decref(ten);
40     json_decref(object);
41 }
42
43 static void test_update()
44 {
45     json_t *object, *other, *nine, *ten;
46
47     object = json_object();
48     other = json_object();
49
50     nine = json_integer(9);
51     ten = json_integer(10);
52
53     if(!object || !other)
54         fail("unable to create object");
55     if(!nine || !ten)
56         fail("unable to create integer");
57
58
59     /* update an empty object with an empty object */
60
61     if(json_object_update(object, other))
62         fail("unable to update an emtpy object with an empty object");
63
64     if(json_object_size(object) != 0)
65         fail("invalid size after update");
66
67     if(json_object_size(other) != 0)
68         fail("invalid size for updater after update");
69
70
71     /* update an empty object with a nonempty object */
72
73     if(json_object_set(other, "a", ten) ||
74        json_object_set(other, "b", ten) ||
75        json_object_set(other, "c", ten) ||
76        json_object_set(other, "d", ten) ||
77        json_object_set(other, "e", ten))
78         fail("unable to set value");
79
80     if(json_object_update(object, other))
81         fail("unable to update an empty object");
82
83     if(json_object_size(object) != 5)
84         fail("invalid size after update");
85
86     if(json_object_get(object, "a") != ten ||
87        json_object_get(object, "b") != ten ||
88        json_object_get(object, "c") != ten ||
89        json_object_get(object, "d") != ten ||
90        json_object_get(object, "e") != ten)
91         fail("update works incorrectly");
92
93
94     /* perform the same update again */
95
96     if(json_object_update(object, other))
97         fail("unable to update an empty object");
98
99     if(json_object_size(object) != 5)
100         fail("invalid size after update");
101
102     if(json_object_get(object, "a") != ten ||
103        json_object_get(object, "b") != ten ||
104        json_object_get(object, "c") != ten ||
105        json_object_get(object, "d") != ten ||
106        json_object_get(object, "e") != ten)
107         fail("update works incorrectly");
108
109
110     /* update a nonempty object with a nonempty object with both old
111        and new keys */
112
113     if(json_object_clear(other))
114         fail("clear failed");
115
116     if(json_object_set(other, "a", nine) ||
117        json_object_set(other, "b", nine) ||
118        json_object_set(other, "f", nine) ||
119        json_object_set(other, "g", nine) ||
120        json_object_set(other, "h", nine))
121         fail("unable to set value");
122
123     if(json_object_update(object, other))
124         fail("unable to update a nonempty object");
125
126     if(json_object_size(object) != 8)
127         fail("invalid size after update");
128
129     if(json_object_get(object, "a") != nine ||
130        json_object_get(object, "b") != nine ||
131        json_object_get(object, "f") != nine ||
132        json_object_get(object, "g") != nine ||
133        json_object_get(object, "h") != nine)
134         fail("update works incorrectly");
135
136     json_decref(nine);
137     json_decref(ten);
138     json_decref(other);
139     json_decref(object);
140 }
141
142 static void test_circular()
143 {
144     json_t *object1, *object2;
145
146     object1 = json_object();
147     object2 = json_object();
148     if(!object1 || !object2)
149         fail("unable to create object");
150
151     /* the simple case is checked */
152     if(json_object_set(object1, "a", object1) == 0)
153         fail("able to set self");
154
155     /* create circular references */
156     if(json_object_set(object1, "a", object2) ||
157        json_object_set(object2, "a", object1))
158         fail("unable to set value");
159
160     /* circularity is detected when dumping */
161     if(json_dumps(object1, 0) != NULL)
162         fail("able to dump circulars");
163
164     /* decref twice to deal with the circular references */
165     json_decref(object1);
166     json_decref(object2);
167     json_decref(object1);
168 }
169
170 static void test_set_nocheck()
171 {
172     json_t *object, *string;
173
174     object = json_object();
175     string = json_string("bar");
176
177     if(!object)
178         fail("unable to create object");
179     if(!string)
180         fail("unable to create string");
181
182     if(json_object_set_nocheck(object, "foo", string))
183         fail("json_object_set_nocheck failed");
184     if(json_object_get(object, "foo") != string)
185         fail("json_object_get after json_object_set_nocheck failed");
186
187     /* invalid UTF-8 in key */
188     if(json_object_set_nocheck(object, "a\xefz", string))
189         fail("json_object_set_nocheck failed for invalid UTF-8");
190     if(json_object_get(object, "a\xefz") != string)
191         fail("json_object_get after json_object_set_nocheck failed");
192
193     if(json_object_set_new_nocheck(object, "bax", json_integer(123)))
194         fail("json_object_set_new_nocheck failed");
195     if(json_integer_value(json_object_get(object, "bax")) != 123)
196         fail("json_object_get after json_object_set_new_nocheck failed");
197
198     /* invalid UTF-8 in key */
199     if(json_object_set_new_nocheck(object, "asdf\xfe", json_integer(321)))
200         fail("json_object_set_new_nocheck failed for invalid UTF-8");
201     if(json_integer_value(json_object_get(object, "asdf\xfe")) != 321)
202         fail("json_object_get after json_object_set_new_nocheck failed");
203
204     json_decref(string);
205     json_decref(object);
206 }
207
208 static void test_iterators()
209 {
210     json_t *object, *foo, *bar, *baz;
211     void *iter;
212
213     if(json_object_iter(NULL))
214         fail("able to iterate over NULL");
215
216     if(json_object_iter_next(NULL, NULL))
217         fail("able to increment an iterator on a NULL object");
218
219     object = json_object();
220     foo = json_string("foo");
221     bar = json_string("bar");
222     baz = json_string("baz");
223     if(!object || !foo || !bar || !bar)
224         fail("unable to create values");
225
226     if(json_object_iter_next(object, NULL))
227         fail("able to increment a NULL iterator");
228
229     if(json_object_set(object, "a", foo) ||
230        json_object_set(object, "b", bar) ||
231        json_object_set(object, "c", baz))
232         fail("unable to populate object");
233
234     iter = json_object_iter(object);
235     if(!iter)
236         fail("unable to get iterator");
237     if(strcmp(json_object_iter_key(iter), "a"))
238         fail("iterating failed: wrong key");
239     if(json_object_iter_value(iter) != foo)
240         fail("iterating failed: wrong value");
241
242     iter = json_object_iter_next(object, iter);
243     if(!iter)
244         fail("unable to increment iterator");
245     if(strcmp(json_object_iter_key(iter), "b"))
246         fail("iterating failed: wrong key");
247     if(json_object_iter_value(iter) != bar)
248         fail("iterating failed: wrong value");
249
250     iter = json_object_iter_next(object, iter);
251     if(!iter)
252         fail("unable to increment iterator");
253     if(strcmp(json_object_iter_key(iter), "c"))
254         fail("iterating failed: wrong key");
255     if(json_object_iter_value(iter) != baz)
256         fail("iterating failed: wrong value");
257
258     if(json_object_iter_next(object, iter) != NULL)
259         fail("able to iterate over the end");
260
261     if(json_object_iter_at(object, "foo"))
262         fail("json_object_iter_at() succeeds for non-existent key");
263
264     iter = json_object_iter_at(object, "b");
265     if(!iter)
266         fail("json_object_iter_at() fails for an existing key");
267
268     if(strcmp(json_object_iter_key(iter), "b"))
269         fail("iterating failed: wrong key");
270     if(json_object_iter_value(iter) != bar)
271         fail("iterating failed: wrong value");
272
273     iter = json_object_iter_next(object, iter);
274     if(!iter)
275         fail("unable to increment iterator");
276     if(strcmp(json_object_iter_key(iter), "c"))
277         fail("iterating failed: wrong key");
278     if(json_object_iter_value(iter) != baz)
279         fail("iterating failed: wrong value");
280
281     if(json_object_iter_set(object, iter, bar))
282         fail("unable to set value at iterator");
283
284     if(strcmp(json_object_iter_key(iter), "c"))
285         fail("json_object_iter_key() fails after json_object_iter_set()");
286     if(json_object_iter_value(iter) != bar)
287         fail("json_object_iter_value() fails after json_object_iter_set()");
288     if(json_object_get(object, "c") != bar)
289         fail("json_object_get() fails after json_object_iter_set()");
290
291     json_decref(object);
292     json_decref(foo);
293     json_decref(bar);
294     json_decref(baz);
295 }
296
297 static void test_misc()
298 {
299     json_t *object, *string, *other_string, *value;
300
301     object = json_object();
302     string = json_string("test");
303     other_string = json_string("other");
304
305     if(!object)
306         fail("unable to create object");
307     if(!string || !other_string)
308         fail("unable to create string");
309
310     if(json_object_get(object, "a"))
311         fail("value for nonexisting key");
312
313     if(json_object_set(object, "a", string))
314         fail("unable to set value");
315
316     if(!json_object_set(object, NULL, string))
317         fail("able to set NULL key");
318
319     if(!json_object_set(object, "a", NULL))
320         fail("able to set NULL value");
321
322     /* invalid UTF-8 in key */
323     if(!json_object_set(object, "a\xefz", string))
324         fail("able to set invalid unicode key");
325
326     value = json_object_get(object, "a");
327     if(!value)
328         fail("no value for existing key");
329     if(value != string)
330         fail("got different value than what was added");
331
332     /* "a", "lp" and "px" collide in a five-bucket hashtable */
333     if(json_object_set(object, "b", string) ||
334        json_object_set(object, "lp", string) ||
335        json_object_set(object, "px", string))
336         fail("unable to set value");
337
338     value = json_object_get(object, "a");
339     if(!value)
340         fail("no value for existing key");
341     if(value != string)
342         fail("got different value than what was added");
343
344     if(json_object_set(object, "a", other_string))
345         fail("unable to replace an existing key");
346
347     value = json_object_get(object, "a");
348     if(!value)
349         fail("no value for existing key");
350     if(value != other_string)
351         fail("got different value than what was set");
352
353     if(!json_object_del(object, "nonexisting"))
354         fail("able to delete a nonexisting key");
355
356     if(json_object_del(object, "px"))
357         fail("unable to delete an existing key");
358
359     if(json_object_del(object, "a"))
360         fail("unable to delete an existing key");
361
362     if(json_object_del(object, "lp"))
363         fail("unable to delete an existing key");
364
365
366     /* add many keys to initiate rehashing */
367
368     if(json_object_set(object, "a", string))
369         fail("unable to set value");
370
371     if(json_object_set(object, "lp", string))
372         fail("unable to set value");
373
374     if(json_object_set(object, "px", string))
375         fail("unable to set value");
376
377     if(json_object_set(object, "c", string))
378         fail("unable to set value");
379
380     if(json_object_set(object, "d", string))
381         fail("unable to set value");
382
383     if(json_object_set(object, "e", string))
384         fail("unable to set value");
385
386
387     if(json_object_set_new(object, "foo", json_integer(123)))
388         fail("unable to set new value");
389
390     value = json_object_get(object, "foo");
391     if(!json_is_integer(value) || json_integer_value(value) != 123)
392         fail("json_object_set_new works incorrectly");
393
394     if(!json_object_set_new(object, NULL, json_integer(432)))
395         fail("able to set_new NULL key");
396
397     if(!json_object_set_new(object, "foo", NULL))
398         fail("able to set_new NULL value");
399
400     json_decref(string);
401     json_decref(other_string);
402     json_decref(object);
403 }
404
405 int main()
406 {
407     test_misc();
408     test_clear();
409     test_update();
410     test_circular();
411     test_set_nocheck();
412     test_iterators();
413
414     return 0;
415 }