Adds json_pack / json_unpack variadic functions.
[jansson.git] / test / suites / api / test_pack.c
1 /*
2  * Copyright (c) 2009, 2010 Petri Lehtinen <petri@digip.org>
3  * Copyright (c) 2010 Graeme Smecher <graeme.smecher@mail.mcgill.ca>
4  *
5  * Jansson is free software; you can redistribute it and/or modify
6  * it under the terms of the MIT license. See LICENSE for details.
7  */
8
9 #include <string.h>
10 #include <jansson.h>
11 #include <stdio.h>
12 #include "util.h"
13
14 int main()
15 {
16     json_t *value;
17     int i;
18
19     /*
20      * Simple, valid json_pack cases
21      */
22
23     /* true */
24     value = json_pack(NULL, "b", 1);
25     if(!json_is_true(value))
26             fail("json_pack boolean failed");
27     if(value->refcount != (ssize_t)-1)
28             fail("json_pack boolean refcount failed");
29     json_decref(value);
30
31     /* false */
32     value = json_pack(NULL, "b", 0);
33     if(!json_is_false(value))
34             fail("json_pack boolean failed");
35     if(value->refcount != (ssize_t)-1)
36             fail("json_pack boolean refcount failed");
37     json_decref(value);
38
39     /* null */
40     value = json_pack(NULL, "n");
41     if(!json_is_null(value))
42             fail("json_pack null failed");
43     if(value->refcount != (ssize_t)-1)
44             fail("json_pack null refcount failed");
45     json_decref(value);
46
47     /* integer */
48     value = json_pack(NULL, "i", 1);
49     if(!json_is_integer(value) || json_integer_value(value) != 1)
50             fail("json_pack integer failed");
51     if(value->refcount != (ssize_t)1)
52             fail("json_pack integer refcount failed");
53     json_decref(value);
54
55
56     /* real */
57     value = json_pack(NULL, "f", 1.0);
58     if(!json_is_real(value) || json_real_value(value) != 1.0)
59             fail("json_pack real failed");
60     if(value->refcount != (ssize_t)1)
61             fail("json_pack real refcount failed");
62     json_decref(value);
63
64     /* string */
65     value = json_pack(NULL, "s", "test");
66     if(!json_is_string(value) || strcmp("test", json_string_value(value)))
67             fail("json_pack string failed");
68     if(value->refcount != (ssize_t)1)
69             fail("json_pack string refcount failed");
70     json_decref(value);
71
72     /* empty object */
73     value = json_pack(NULL, "{}", 1.0);
74     if(!json_is_object(value) || json_object_size(value) != 0)
75             fail("json_pack empty object failed");
76     if(value->refcount != (ssize_t)1)
77             fail("json_pack empty object refcount failed");
78     json_decref(value);
79
80     /* empty list */
81     value = json_pack(NULL, "[]", 1.0);
82     if(!json_is_array(value) || json_array_size(value) != 0)
83             fail("json_pack empty list failed");
84     if(value->refcount != (ssize_t)1)
85             fail("json_pack empty list failed");
86     json_decref(value);
87
88     /* non-incref'd object */
89     value = json_pack(NULL, "o", json_integer(1));
90     if(!json_is_integer(value) || json_integer_value(value) != 1)
91             fail("json_pack object failed");
92     if(value->refcount != (ssize_t)1)
93             fail("json_pack integer refcount failed");
94     json_decref(value);
95
96     /* incref'd object */
97     value = json_pack(NULL, "O", json_integer(1));
98     if(!json_is_integer(value) || json_integer_value(value) != 1)
99             fail("json_pack object failed");
100     if(value->refcount != (ssize_t)2)
101             fail("json_pack integer refcount failed");
102     json_decref(value);
103     json_decref(value);
104
105     /* simple object */
106     value = json_pack(NULL, "{s:[]}", "foo");
107     if(!json_is_object(value) || json_object_size(value) != 1)
108             fail("json_pack object failed");
109     if(!json_is_array(json_object_get(value, "foo")))
110             fail("json_pack object failed");
111     if(json_object_get(value, "foo")->refcount != (ssize_t)1)
112             fail("json_pack object refcount failed");
113     json_decref(value);
114
115     /* simple array */
116     value = json_pack(NULL, "[i,i,i]", 0, 1, 2);
117     if(!json_is_array(value) || json_array_size(value) != 3)
118             fail("json_pack object failed");
119     for(i=0; i<3; i++)
120     {
121         if(!json_is_integer(json_array_get(value, i)) ||
122            json_integer_value(json_array_get(value, i)) != i)
123
124             fail("json_pack integer array failed");
125     }
126     json_decref(value);
127
128     /*
129      * Invalid cases
130      */
131     
132     /* mismatched open/close array/object */
133     if(json_pack(NULL, "[}"))
134         fail("json_pack failed to catch mismatched '}'");
135
136     if(json_pack(NULL, "{]"))
137         fail("json_pack failed to catch mismatched ']'");
138
139     /* missing close array */
140     if(json_pack(NULL, "["))
141         fail("json_pack failed to catch missing ']'");
142
143     /* missing close object */
144     if(json_pack(NULL, "{"))
145         fail("json_pack failed to catch missing '}'");
146
147     /* NULL string */
148     if(json_pack(NULL, "s", NULL))
149         fail("json_pack failed to catch null string");
150
151     return(0);
152 }
153
154 /* vim: ts=4:expandtab:sw=4
155  */