Statistics
| Branch: | Revision:

root / check-qjson.c @ 463ce4ae

History | View | Annotate | Download (19.9 kB)

1 422c46a8 Anthony Liguori
/*
2 422c46a8 Anthony Liguori
 * Copyright IBM, Corp. 2009
3 422c46a8 Anthony Liguori
 *
4 422c46a8 Anthony Liguori
 * Authors:
5 422c46a8 Anthony Liguori
 *  Anthony Liguori   <aliguori@us.ibm.com>
6 422c46a8 Anthony Liguori
 *
7 422c46a8 Anthony Liguori
 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
8 422c46a8 Anthony Liguori
 * See the COPYING.LIB file in the top-level directory.
9 422c46a8 Anthony Liguori
 *
10 422c46a8 Anthony Liguori
 */
11 422c46a8 Anthony Liguori
#include <check.h>
12 422c46a8 Anthony Liguori
13 422c46a8 Anthony Liguori
#include "qstring.h"
14 422c46a8 Anthony Liguori
#include "qint.h"
15 422c46a8 Anthony Liguori
#include "qdict.h"
16 422c46a8 Anthony Liguori
#include "qlist.h"
17 422c46a8 Anthony Liguori
#include "qfloat.h"
18 422c46a8 Anthony Liguori
#include "qbool.h"
19 422c46a8 Anthony Liguori
#include "qjson.h"
20 422c46a8 Anthony Liguori
21 422c46a8 Anthony Liguori
#include "qemu-common.h"
22 422c46a8 Anthony Liguori
23 422c46a8 Anthony Liguori
START_TEST(escaped_string)
24 422c46a8 Anthony Liguori
{
25 422c46a8 Anthony Liguori
    int i;
26 422c46a8 Anthony Liguori
    struct {
27 422c46a8 Anthony Liguori
        const char *encoded;
28 422c46a8 Anthony Liguori
        const char *decoded;
29 6ee59202 Anthony Liguori
        int skip;
30 422c46a8 Anthony Liguori
    } test_cases[] = {
31 d22b0bd7 Luiz Capitulino
        { "\"\\b\"", "\b" },
32 d22b0bd7 Luiz Capitulino
        { "\"\\f\"", "\f" },
33 d22b0bd7 Luiz Capitulino
        { "\"\\n\"", "\n" },
34 d22b0bd7 Luiz Capitulino
        { "\"\\r\"", "\r" },
35 d22b0bd7 Luiz Capitulino
        { "\"\\t\"", "\t" },
36 69faeee1 Jan Kiszka
        { "\"/\"", "/" },
37 69faeee1 Jan Kiszka
        { "\"\\/\"", "/", .skip = 1 },
38 d22b0bd7 Luiz Capitulino
        { "\"\\\\\"", "\\" },
39 422c46a8 Anthony Liguori
        { "\"\\\"\"", "\"" },
40 422c46a8 Anthony Liguori
        { "\"hello world \\\"embedded string\\\"\"",
41 422c46a8 Anthony Liguori
          "hello world \"embedded string\"" },
42 422c46a8 Anthony Liguori
        { "\"hello world\\nwith new line\"", "hello world\nwith new line" },
43 6ee59202 Anthony Liguori
        { "\"single byte utf-8 \\u0020\"", "single byte utf-8  ", .skip = 1 },
44 422c46a8 Anthony Liguori
        { "\"double byte utf-8 \\u00A2\"", "double byte utf-8 \xc2\xa2" },
45 422c46a8 Anthony Liguori
        { "\"triple byte utf-8 \\u20AC\"", "triple byte utf-8 \xe2\x82\xac" },
46 422c46a8 Anthony Liguori
        {}
47 422c46a8 Anthony Liguori
    };
48 422c46a8 Anthony Liguori
49 422c46a8 Anthony Liguori
    for (i = 0; test_cases[i].encoded; i++) {
50 422c46a8 Anthony Liguori
        QObject *obj;
51 422c46a8 Anthony Liguori
        QString *str;
52 422c46a8 Anthony Liguori
53 422c46a8 Anthony Liguori
        obj = qobject_from_json(test_cases[i].encoded);
54 422c46a8 Anthony Liguori
55 422c46a8 Anthony Liguori
        fail_unless(obj != NULL);
56 422c46a8 Anthony Liguori
        fail_unless(qobject_type(obj) == QTYPE_QSTRING);
57 422c46a8 Anthony Liguori
        
58 422c46a8 Anthony Liguori
        str = qobject_to_qstring(obj);
59 d22b0bd7 Luiz Capitulino
        fail_unless(strcmp(qstring_get_str(str), test_cases[i].decoded) == 0,
60 d22b0bd7 Luiz Capitulino
                    "%s != %s\n", qstring_get_str(str), test_cases[i].decoded);
61 422c46a8 Anthony Liguori
62 6ee59202 Anthony Liguori
        if (test_cases[i].skip == 0) {
63 6ee59202 Anthony Liguori
            str = qobject_to_json(obj);
64 d22b0bd7 Luiz Capitulino
            fail_unless(strcmp(qstring_get_str(str),test_cases[i].encoded) == 0,
65 d22b0bd7 Luiz Capitulino
                        "%s != %s\n", qstring_get_str(str),
66 d22b0bd7 Luiz Capitulino
                                      test_cases[i].encoded);
67 6ee59202 Anthony Liguori
68 6ee59202 Anthony Liguori
            qobject_decref(obj);
69 6ee59202 Anthony Liguori
        }
70 6ee59202 Anthony Liguori
71 422c46a8 Anthony Liguori
        QDECREF(str);
72 422c46a8 Anthony Liguori
    }
73 422c46a8 Anthony Liguori
}
74 422c46a8 Anthony Liguori
END_TEST
75 422c46a8 Anthony Liguori
76 422c46a8 Anthony Liguori
START_TEST(simple_string)
77 422c46a8 Anthony Liguori
{
78 422c46a8 Anthony Liguori
    int i;
79 422c46a8 Anthony Liguori
    struct {
80 422c46a8 Anthony Liguori
        const char *encoded;
81 422c46a8 Anthony Liguori
        const char *decoded;
82 422c46a8 Anthony Liguori
    } test_cases[] = {
83 422c46a8 Anthony Liguori
        { "\"hello world\"", "hello world" },
84 422c46a8 Anthony Liguori
        { "\"the quick brown fox jumped over the fence\"",
85 422c46a8 Anthony Liguori
          "the quick brown fox jumped over the fence" },
86 422c46a8 Anthony Liguori
        {}
87 422c46a8 Anthony Liguori
    };
88 422c46a8 Anthony Liguori
89 422c46a8 Anthony Liguori
    for (i = 0; test_cases[i].encoded; i++) {
90 422c46a8 Anthony Liguori
        QObject *obj;
91 422c46a8 Anthony Liguori
        QString *str;
92 422c46a8 Anthony Liguori
93 422c46a8 Anthony Liguori
        obj = qobject_from_json(test_cases[i].encoded);
94 422c46a8 Anthony Liguori
95 422c46a8 Anthony Liguori
        fail_unless(obj != NULL);
96 422c46a8 Anthony Liguori
        fail_unless(qobject_type(obj) == QTYPE_QSTRING);
97 422c46a8 Anthony Liguori
        
98 422c46a8 Anthony Liguori
        str = qobject_to_qstring(obj);
99 422c46a8 Anthony Liguori
        fail_unless(strcmp(qstring_get_str(str), test_cases[i].decoded) == 0);
100 422c46a8 Anthony Liguori
101 6ee59202 Anthony Liguori
        str = qobject_to_json(obj);
102 6ee59202 Anthony Liguori
        fail_unless(strcmp(qstring_get_str(str), test_cases[i].encoded) == 0);
103 6ee59202 Anthony Liguori
104 6ee59202 Anthony Liguori
        qobject_decref(obj);
105 6ee59202 Anthony Liguori
        
106 422c46a8 Anthony Liguori
        QDECREF(str);
107 422c46a8 Anthony Liguori
    }
108 422c46a8 Anthony Liguori
}
109 422c46a8 Anthony Liguori
END_TEST
110 422c46a8 Anthony Liguori
111 422c46a8 Anthony Liguori
START_TEST(single_quote_string)
112 422c46a8 Anthony Liguori
{
113 422c46a8 Anthony Liguori
    int i;
114 422c46a8 Anthony Liguori
    struct {
115 422c46a8 Anthony Liguori
        const char *encoded;
116 422c46a8 Anthony Liguori
        const char *decoded;
117 422c46a8 Anthony Liguori
    } test_cases[] = {
118 422c46a8 Anthony Liguori
        { "'hello world'", "hello world" },
119 422c46a8 Anthony Liguori
        { "'the quick brown fox \\' jumped over the fence'",
120 422c46a8 Anthony Liguori
          "the quick brown fox ' jumped over the fence" },
121 422c46a8 Anthony Liguori
        {}
122 422c46a8 Anthony Liguori
    };
123 422c46a8 Anthony Liguori
124 422c46a8 Anthony Liguori
    for (i = 0; test_cases[i].encoded; i++) {
125 422c46a8 Anthony Liguori
        QObject *obj;
126 422c46a8 Anthony Liguori
        QString *str;
127 422c46a8 Anthony Liguori
128 422c46a8 Anthony Liguori
        obj = qobject_from_json(test_cases[i].encoded);
129 422c46a8 Anthony Liguori
130 422c46a8 Anthony Liguori
        fail_unless(obj != NULL);
131 422c46a8 Anthony Liguori
        fail_unless(qobject_type(obj) == QTYPE_QSTRING);
132 422c46a8 Anthony Liguori
        
133 422c46a8 Anthony Liguori
        str = qobject_to_qstring(obj);
134 422c46a8 Anthony Liguori
        fail_unless(strcmp(qstring_get_str(str), test_cases[i].decoded) == 0);
135 422c46a8 Anthony Liguori
136 422c46a8 Anthony Liguori
        QDECREF(str);
137 422c46a8 Anthony Liguori
    }
138 422c46a8 Anthony Liguori
}
139 422c46a8 Anthony Liguori
END_TEST
140 422c46a8 Anthony Liguori
141 422c46a8 Anthony Liguori
START_TEST(vararg_string)
142 422c46a8 Anthony Liguori
{
143 422c46a8 Anthony Liguori
    int i;
144 422c46a8 Anthony Liguori
    struct {
145 422c46a8 Anthony Liguori
        const char *decoded;
146 422c46a8 Anthony Liguori
    } test_cases[] = {
147 422c46a8 Anthony Liguori
        { "hello world" },
148 422c46a8 Anthony Liguori
        { "the quick brown fox jumped over the fence" },
149 422c46a8 Anthony Liguori
        {}
150 422c46a8 Anthony Liguori
    };
151 422c46a8 Anthony Liguori
152 422c46a8 Anthony Liguori
    for (i = 0; test_cases[i].decoded; i++) {
153 422c46a8 Anthony Liguori
        QObject *obj;
154 422c46a8 Anthony Liguori
        QString *str;
155 422c46a8 Anthony Liguori
156 422c46a8 Anthony Liguori
        obj = qobject_from_jsonf("%s", test_cases[i].decoded);
157 422c46a8 Anthony Liguori
158 422c46a8 Anthony Liguori
        fail_unless(obj != NULL);
159 422c46a8 Anthony Liguori
        fail_unless(qobject_type(obj) == QTYPE_QSTRING);
160 422c46a8 Anthony Liguori
        
161 422c46a8 Anthony Liguori
        str = qobject_to_qstring(obj);
162 422c46a8 Anthony Liguori
        fail_unless(strcmp(qstring_get_str(str), test_cases[i].decoded) == 0);
163 422c46a8 Anthony Liguori
164 422c46a8 Anthony Liguori
        QDECREF(str);
165 422c46a8 Anthony Liguori
    }
166 422c46a8 Anthony Liguori
}
167 422c46a8 Anthony Liguori
END_TEST
168 422c46a8 Anthony Liguori
169 422c46a8 Anthony Liguori
START_TEST(simple_number)
170 422c46a8 Anthony Liguori
{
171 422c46a8 Anthony Liguori
    int i;
172 422c46a8 Anthony Liguori
    struct {
173 422c46a8 Anthony Liguori
        const char *encoded;
174 422c46a8 Anthony Liguori
        int64_t decoded;
175 6ee59202 Anthony Liguori
        int skip;
176 422c46a8 Anthony Liguori
    } test_cases[] = {
177 422c46a8 Anthony Liguori
        { "0", 0 },
178 422c46a8 Anthony Liguori
        { "1234", 1234 },
179 422c46a8 Anthony Liguori
        { "1", 1 },
180 422c46a8 Anthony Liguori
        { "-32", -32 },
181 6ee59202 Anthony Liguori
        { "-0", 0, .skip = 1 },
182 422c46a8 Anthony Liguori
        { },
183 422c46a8 Anthony Liguori
    };
184 422c46a8 Anthony Liguori
185 422c46a8 Anthony Liguori
    for (i = 0; test_cases[i].encoded; i++) {
186 422c46a8 Anthony Liguori
        QObject *obj;
187 422c46a8 Anthony Liguori
        QInt *qint;
188 422c46a8 Anthony Liguori
189 422c46a8 Anthony Liguori
        obj = qobject_from_json(test_cases[i].encoded);
190 422c46a8 Anthony Liguori
        fail_unless(obj != NULL);
191 422c46a8 Anthony Liguori
        fail_unless(qobject_type(obj) == QTYPE_QINT);
192 422c46a8 Anthony Liguori
193 422c46a8 Anthony Liguori
        qint = qobject_to_qint(obj);
194 422c46a8 Anthony Liguori
        fail_unless(qint_get_int(qint) == test_cases[i].decoded);
195 6ee59202 Anthony Liguori
        if (test_cases[i].skip == 0) {
196 6ee59202 Anthony Liguori
            QString *str;
197 6ee59202 Anthony Liguori
198 6ee59202 Anthony Liguori
            str = qobject_to_json(obj);
199 6ee59202 Anthony Liguori
            fail_unless(strcmp(qstring_get_str(str), test_cases[i].encoded) == 0);
200 6ee59202 Anthony Liguori
            QDECREF(str);
201 6ee59202 Anthony Liguori
        }
202 422c46a8 Anthony Liguori
203 422c46a8 Anthony Liguori
        QDECREF(qint);
204 422c46a8 Anthony Liguori
    }
205 422c46a8 Anthony Liguori
}
206 422c46a8 Anthony Liguori
END_TEST
207 422c46a8 Anthony Liguori
208 422c46a8 Anthony Liguori
START_TEST(float_number)
209 422c46a8 Anthony Liguori
{
210 422c46a8 Anthony Liguori
    int i;
211 422c46a8 Anthony Liguori
    struct {
212 422c46a8 Anthony Liguori
        const char *encoded;
213 422c46a8 Anthony Liguori
        double decoded;
214 6ee59202 Anthony Liguori
        int skip;
215 422c46a8 Anthony Liguori
    } test_cases[] = {
216 422c46a8 Anthony Liguori
        { "32.43", 32.43 },
217 422c46a8 Anthony Liguori
        { "0.222", 0.222 },
218 422c46a8 Anthony Liguori
        { "-32.12313", -32.12313 },
219 6ee59202 Anthony Liguori
        { "-32.20e-10", -32.20e-10, .skip = 1 },
220 422c46a8 Anthony Liguori
        { },
221 422c46a8 Anthony Liguori
    };
222 422c46a8 Anthony Liguori
223 422c46a8 Anthony Liguori
    for (i = 0; test_cases[i].encoded; i++) {
224 422c46a8 Anthony Liguori
        QObject *obj;
225 422c46a8 Anthony Liguori
        QFloat *qfloat;
226 422c46a8 Anthony Liguori
227 422c46a8 Anthony Liguori
        obj = qobject_from_json(test_cases[i].encoded);
228 422c46a8 Anthony Liguori
        fail_unless(obj != NULL);
229 422c46a8 Anthony Liguori
        fail_unless(qobject_type(obj) == QTYPE_QFLOAT);
230 422c46a8 Anthony Liguori
231 422c46a8 Anthony Liguori
        qfloat = qobject_to_qfloat(obj);
232 422c46a8 Anthony Liguori
        fail_unless(qfloat_get_double(qfloat) == test_cases[i].decoded);
233 422c46a8 Anthony Liguori
234 6ee59202 Anthony Liguori
        if (test_cases[i].skip == 0) {
235 6ee59202 Anthony Liguori
            QString *str;
236 6ee59202 Anthony Liguori
237 6ee59202 Anthony Liguori
            str = qobject_to_json(obj);
238 6ee59202 Anthony Liguori
            fail_unless(strcmp(qstring_get_str(str), test_cases[i].encoded) == 0);
239 6ee59202 Anthony Liguori
            QDECREF(str);
240 6ee59202 Anthony Liguori
        }
241 6ee59202 Anthony Liguori
242 422c46a8 Anthony Liguori
        QDECREF(qfloat);
243 422c46a8 Anthony Liguori
    }
244 422c46a8 Anthony Liguori
}
245 422c46a8 Anthony Liguori
END_TEST
246 422c46a8 Anthony Liguori
247 422c46a8 Anthony Liguori
START_TEST(vararg_number)
248 422c46a8 Anthony Liguori
{
249 422c46a8 Anthony Liguori
    QObject *obj;
250 422c46a8 Anthony Liguori
    QInt *qint;
251 422c46a8 Anthony Liguori
    QFloat *qfloat;
252 422c46a8 Anthony Liguori
    int value = 0x2342;
253 422c46a8 Anthony Liguori
    int64_t value64 = 0x2342342343LL;
254 422c46a8 Anthony Liguori
    double valuef = 2.323423423;
255 422c46a8 Anthony Liguori
256 422c46a8 Anthony Liguori
    obj = qobject_from_jsonf("%d", value);
257 422c46a8 Anthony Liguori
    fail_unless(obj != NULL);
258 422c46a8 Anthony Liguori
    fail_unless(qobject_type(obj) == QTYPE_QINT);
259 422c46a8 Anthony Liguori
260 422c46a8 Anthony Liguori
    qint = qobject_to_qint(obj);
261 422c46a8 Anthony Liguori
    fail_unless(qint_get_int(qint) == value);
262 422c46a8 Anthony Liguori
263 422c46a8 Anthony Liguori
    QDECREF(qint);
264 422c46a8 Anthony Liguori
265 422c46a8 Anthony Liguori
    obj = qobject_from_jsonf("%" PRId64, value64);
266 422c46a8 Anthony Liguori
    fail_unless(obj != NULL);
267 422c46a8 Anthony Liguori
    fail_unless(qobject_type(obj) == QTYPE_QINT);
268 422c46a8 Anthony Liguori
269 422c46a8 Anthony Liguori
    qint = qobject_to_qint(obj);
270 422c46a8 Anthony Liguori
    fail_unless(qint_get_int(qint) == value64);
271 422c46a8 Anthony Liguori
272 422c46a8 Anthony Liguori
    QDECREF(qint);
273 422c46a8 Anthony Liguori
274 422c46a8 Anthony Liguori
    obj = qobject_from_jsonf("%f", valuef);
275 422c46a8 Anthony Liguori
    fail_unless(obj != NULL);
276 422c46a8 Anthony Liguori
    fail_unless(qobject_type(obj) == QTYPE_QFLOAT);
277 422c46a8 Anthony Liguori
278 422c46a8 Anthony Liguori
    qfloat = qobject_to_qfloat(obj);
279 422c46a8 Anthony Liguori
    fail_unless(qfloat_get_double(qfloat) == valuef);
280 422c46a8 Anthony Liguori
281 422c46a8 Anthony Liguori
    QDECREF(qfloat);
282 422c46a8 Anthony Liguori
}
283 422c46a8 Anthony Liguori
END_TEST
284 422c46a8 Anthony Liguori
285 422c46a8 Anthony Liguori
START_TEST(keyword_literal)
286 422c46a8 Anthony Liguori
{
287 422c46a8 Anthony Liguori
    QObject *obj;
288 422c46a8 Anthony Liguori
    QBool *qbool;
289 6ee59202 Anthony Liguori
    QString *str;
290 422c46a8 Anthony Liguori
291 422c46a8 Anthony Liguori
    obj = qobject_from_json("true");
292 422c46a8 Anthony Liguori
    fail_unless(obj != NULL);
293 422c46a8 Anthony Liguori
    fail_unless(qobject_type(obj) == QTYPE_QBOOL);
294 422c46a8 Anthony Liguori
295 422c46a8 Anthony Liguori
    qbool = qobject_to_qbool(obj);
296 422c46a8 Anthony Liguori
    fail_unless(qbool_get_int(qbool) != 0);
297 422c46a8 Anthony Liguori
298 6ee59202 Anthony Liguori
    str = qobject_to_json(obj);
299 6ee59202 Anthony Liguori
    fail_unless(strcmp(qstring_get_str(str), "true") == 0);
300 6ee59202 Anthony Liguori
    QDECREF(str);
301 6ee59202 Anthony Liguori
302 422c46a8 Anthony Liguori
    QDECREF(qbool);
303 422c46a8 Anthony Liguori
304 422c46a8 Anthony Liguori
    obj = qobject_from_json("false");
305 422c46a8 Anthony Liguori
    fail_unless(obj != NULL);
306 422c46a8 Anthony Liguori
    fail_unless(qobject_type(obj) == QTYPE_QBOOL);
307 422c46a8 Anthony Liguori
308 422c46a8 Anthony Liguori
    qbool = qobject_to_qbool(obj);
309 422c46a8 Anthony Liguori
    fail_unless(qbool_get_int(qbool) == 0);
310 422c46a8 Anthony Liguori
311 6ee59202 Anthony Liguori
    str = qobject_to_json(obj);
312 6ee59202 Anthony Liguori
    fail_unless(strcmp(qstring_get_str(str), "false") == 0);
313 6ee59202 Anthony Liguori
    QDECREF(str);
314 6ee59202 Anthony Liguori
315 422c46a8 Anthony Liguori
    QDECREF(qbool);
316 422c46a8 Anthony Liguori
317 422c46a8 Anthony Liguori
    obj = qobject_from_jsonf("%i", false);
318 422c46a8 Anthony Liguori
    fail_unless(obj != NULL);
319 422c46a8 Anthony Liguori
    fail_unless(qobject_type(obj) == QTYPE_QBOOL);
320 422c46a8 Anthony Liguori
321 422c46a8 Anthony Liguori
    qbool = qobject_to_qbool(obj);
322 422c46a8 Anthony Liguori
    fail_unless(qbool_get_int(qbool) == 0);
323 422c46a8 Anthony Liguori
324 422c46a8 Anthony Liguori
    QDECREF(qbool);
325 422c46a8 Anthony Liguori
    
326 422c46a8 Anthony Liguori
    obj = qobject_from_jsonf("%i", true);
327 422c46a8 Anthony Liguori
    fail_unless(obj != NULL);
328 422c46a8 Anthony Liguori
    fail_unless(qobject_type(obj) == QTYPE_QBOOL);
329 422c46a8 Anthony Liguori
330 422c46a8 Anthony Liguori
    qbool = qobject_to_qbool(obj);
331 422c46a8 Anthony Liguori
    fail_unless(qbool_get_int(qbool) != 0);
332 422c46a8 Anthony Liguori
333 422c46a8 Anthony Liguori
    QDECREF(qbool);
334 422c46a8 Anthony Liguori
}
335 422c46a8 Anthony Liguori
END_TEST
336 422c46a8 Anthony Liguori
337 422c46a8 Anthony Liguori
typedef struct LiteralQDictEntry LiteralQDictEntry;
338 422c46a8 Anthony Liguori
typedef struct LiteralQObject LiteralQObject;
339 422c46a8 Anthony Liguori
340 422c46a8 Anthony Liguori
struct LiteralQObject
341 422c46a8 Anthony Liguori
{
342 422c46a8 Anthony Liguori
    int type;
343 422c46a8 Anthony Liguori
    union {
344 422c46a8 Anthony Liguori
        int64_t qint;
345 422c46a8 Anthony Liguori
        const char *qstr;
346 422c46a8 Anthony Liguori
        LiteralQDictEntry *qdict;
347 422c46a8 Anthony Liguori
        LiteralQObject *qlist;
348 422c46a8 Anthony Liguori
    } value;
349 422c46a8 Anthony Liguori
};
350 422c46a8 Anthony Liguori
351 422c46a8 Anthony Liguori
struct LiteralQDictEntry
352 422c46a8 Anthony Liguori
{
353 422c46a8 Anthony Liguori
    const char *key;
354 422c46a8 Anthony Liguori
    LiteralQObject value;
355 422c46a8 Anthony Liguori
};
356 422c46a8 Anthony Liguori
357 422c46a8 Anthony Liguori
#define QLIT_QINT(val) (LiteralQObject){.type = QTYPE_QINT, .value.qint = (val)}
358 422c46a8 Anthony Liguori
#define QLIT_QSTR(val) (LiteralQObject){.type = QTYPE_QSTRING, .value.qstr = (val)}
359 422c46a8 Anthony Liguori
#define QLIT_QDICT(val) (LiteralQObject){.type = QTYPE_QDICT, .value.qdict = (val)}
360 422c46a8 Anthony Liguori
#define QLIT_QLIST(val) (LiteralQObject){.type = QTYPE_QLIST, .value.qlist = (val)}
361 422c46a8 Anthony Liguori
362 422c46a8 Anthony Liguori
typedef struct QListCompareHelper
363 422c46a8 Anthony Liguori
{
364 422c46a8 Anthony Liguori
    int index;
365 422c46a8 Anthony Liguori
    LiteralQObject *objs;
366 422c46a8 Anthony Liguori
    int result;
367 422c46a8 Anthony Liguori
} QListCompareHelper;
368 422c46a8 Anthony Liguori
369 422c46a8 Anthony Liguori
static int compare_litqobj_to_qobj(LiteralQObject *lhs, QObject *rhs);
370 422c46a8 Anthony Liguori
371 422c46a8 Anthony Liguori
static void compare_helper(QObject *obj, void *opaque)
372 422c46a8 Anthony Liguori
{
373 422c46a8 Anthony Liguori
    QListCompareHelper *helper = opaque;
374 422c46a8 Anthony Liguori
375 422c46a8 Anthony Liguori
    if (helper->result == 0) {
376 422c46a8 Anthony Liguori
        return;
377 422c46a8 Anthony Liguori
    }
378 422c46a8 Anthony Liguori
379 422c46a8 Anthony Liguori
    if (helper->objs[helper->index].type == QTYPE_NONE) {
380 422c46a8 Anthony Liguori
        helper->result = 0;
381 422c46a8 Anthony Liguori
        return;
382 422c46a8 Anthony Liguori
    }
383 422c46a8 Anthony Liguori
384 422c46a8 Anthony Liguori
    helper->result = compare_litqobj_to_qobj(&helper->objs[helper->index++], obj);
385 422c46a8 Anthony Liguori
}
386 422c46a8 Anthony Liguori
387 422c46a8 Anthony Liguori
static int compare_litqobj_to_qobj(LiteralQObject *lhs, QObject *rhs)
388 422c46a8 Anthony Liguori
{
389 422c46a8 Anthony Liguori
    if (lhs->type != qobject_type(rhs)) {
390 422c46a8 Anthony Liguori
        return 0;
391 422c46a8 Anthony Liguori
    }
392 422c46a8 Anthony Liguori
393 422c46a8 Anthony Liguori
    switch (lhs->type) {
394 422c46a8 Anthony Liguori
    case QTYPE_QINT:
395 422c46a8 Anthony Liguori
        return lhs->value.qint == qint_get_int(qobject_to_qint(rhs));
396 422c46a8 Anthony Liguori
    case QTYPE_QSTRING:
397 422c46a8 Anthony Liguori
        return (strcmp(lhs->value.qstr, qstring_get_str(qobject_to_qstring(rhs))) == 0);
398 422c46a8 Anthony Liguori
    case QTYPE_QDICT: {
399 422c46a8 Anthony Liguori
        int i;
400 422c46a8 Anthony Liguori
401 422c46a8 Anthony Liguori
        for (i = 0; lhs->value.qdict[i].key; i++) {
402 422c46a8 Anthony Liguori
            QObject *obj = qdict_get(qobject_to_qdict(rhs), lhs->value.qdict[i].key);
403 422c46a8 Anthony Liguori
404 422c46a8 Anthony Liguori
            if (!compare_litqobj_to_qobj(&lhs->value.qdict[i].value, obj)) {
405 422c46a8 Anthony Liguori
                return 0;
406 422c46a8 Anthony Liguori
            }
407 422c46a8 Anthony Liguori
        }
408 422c46a8 Anthony Liguori
409 422c46a8 Anthony Liguori
        return 1;
410 422c46a8 Anthony Liguori
    }
411 422c46a8 Anthony Liguori
    case QTYPE_QLIST: {
412 422c46a8 Anthony Liguori
        QListCompareHelper helper;
413 422c46a8 Anthony Liguori
414 422c46a8 Anthony Liguori
        helper.index = 0;
415 422c46a8 Anthony Liguori
        helper.objs = lhs->value.qlist;
416 422c46a8 Anthony Liguori
        helper.result = 1;
417 422c46a8 Anthony Liguori
        
418 422c46a8 Anthony Liguori
        qlist_iter(qobject_to_qlist(rhs), compare_helper, &helper);
419 422c46a8 Anthony Liguori
420 422c46a8 Anthony Liguori
        return helper.result;
421 422c46a8 Anthony Liguori
    }
422 422c46a8 Anthony Liguori
    default:
423 422c46a8 Anthony Liguori
        break;
424 422c46a8 Anthony Liguori
    }
425 422c46a8 Anthony Liguori
426 422c46a8 Anthony Liguori
    return 0;
427 422c46a8 Anthony Liguori
}
428 422c46a8 Anthony Liguori
429 422c46a8 Anthony Liguori
START_TEST(simple_dict)
430 422c46a8 Anthony Liguori
{
431 422c46a8 Anthony Liguori
    int i;
432 422c46a8 Anthony Liguori
    struct {
433 422c46a8 Anthony Liguori
        const char *encoded;
434 422c46a8 Anthony Liguori
        LiteralQObject decoded;
435 422c46a8 Anthony Liguori
    } test_cases[] = {
436 422c46a8 Anthony Liguori
        {
437 6ee59202 Anthony Liguori
            .encoded = "{\"foo\": 42, \"bar\": \"hello world\"}",
438 422c46a8 Anthony Liguori
            .decoded = QLIT_QDICT(((LiteralQDictEntry[]){
439 422c46a8 Anthony Liguori
                        { "foo", QLIT_QINT(42) },
440 422c46a8 Anthony Liguori
                        { "bar", QLIT_QSTR("hello world") },
441 422c46a8 Anthony Liguori
                        { }
442 422c46a8 Anthony Liguori
                    })),
443 422c46a8 Anthony Liguori
        }, {
444 422c46a8 Anthony Liguori
            .encoded = "{}",
445 422c46a8 Anthony Liguori
            .decoded = QLIT_QDICT(((LiteralQDictEntry[]){
446 422c46a8 Anthony Liguori
                        { }
447 422c46a8 Anthony Liguori
                    })),
448 422c46a8 Anthony Liguori
        }, {
449 6ee59202 Anthony Liguori
            .encoded = "{\"foo\": 43}",
450 422c46a8 Anthony Liguori
            .decoded = QLIT_QDICT(((LiteralQDictEntry[]){
451 422c46a8 Anthony Liguori
                        { "foo", QLIT_QINT(43) },
452 422c46a8 Anthony Liguori
                        { }
453 422c46a8 Anthony Liguori
                    })),
454 422c46a8 Anthony Liguori
        },
455 422c46a8 Anthony Liguori
        { }
456 422c46a8 Anthony Liguori
    };
457 422c46a8 Anthony Liguori
458 422c46a8 Anthony Liguori
    for (i = 0; test_cases[i].encoded; i++) {
459 422c46a8 Anthony Liguori
        QObject *obj;
460 6ee59202 Anthony Liguori
        QString *str;
461 422c46a8 Anthony Liguori
462 422c46a8 Anthony Liguori
        obj = qobject_from_json(test_cases[i].encoded);
463 422c46a8 Anthony Liguori
        fail_unless(obj != NULL);
464 422c46a8 Anthony Liguori
        fail_unless(qobject_type(obj) == QTYPE_QDICT);
465 422c46a8 Anthony Liguori
466 422c46a8 Anthony Liguori
        fail_unless(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
467 422c46a8 Anthony Liguori
468 6ee59202 Anthony Liguori
        str = qobject_to_json(obj);
469 6ee59202 Anthony Liguori
        qobject_decref(obj);
470 6ee59202 Anthony Liguori
471 6ee59202 Anthony Liguori
        obj = qobject_from_json(qstring_get_str(str));
472 6ee59202 Anthony Liguori
        fail_unless(obj != NULL);
473 6ee59202 Anthony Liguori
        fail_unless(qobject_type(obj) == QTYPE_QDICT);
474 6ee59202 Anthony Liguori
475 6ee59202 Anthony Liguori
        fail_unless(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
476 422c46a8 Anthony Liguori
        qobject_decref(obj);
477 6ee59202 Anthony Liguori
        QDECREF(str);
478 422c46a8 Anthony Liguori
    }
479 422c46a8 Anthony Liguori
}
480 422c46a8 Anthony Liguori
END_TEST
481 422c46a8 Anthony Liguori
482 422c46a8 Anthony Liguori
START_TEST(simple_list)
483 422c46a8 Anthony Liguori
{
484 422c46a8 Anthony Liguori
    int i;
485 422c46a8 Anthony Liguori
    struct {
486 422c46a8 Anthony Liguori
        const char *encoded;
487 422c46a8 Anthony Liguori
        LiteralQObject decoded;
488 422c46a8 Anthony Liguori
    } test_cases[] = {
489 422c46a8 Anthony Liguori
        {
490 422c46a8 Anthony Liguori
            .encoded = "[43,42]",
491 422c46a8 Anthony Liguori
            .decoded = QLIT_QLIST(((LiteralQObject[]){
492 422c46a8 Anthony Liguori
                        QLIT_QINT(43),
493 422c46a8 Anthony Liguori
                        QLIT_QINT(42),
494 422c46a8 Anthony Liguori
                        { }
495 422c46a8 Anthony Liguori
                    })),
496 422c46a8 Anthony Liguori
        },
497 422c46a8 Anthony Liguori
        {
498 422c46a8 Anthony Liguori
            .encoded = "[43]",
499 422c46a8 Anthony Liguori
            .decoded = QLIT_QLIST(((LiteralQObject[]){
500 422c46a8 Anthony Liguori
                        QLIT_QINT(43),
501 422c46a8 Anthony Liguori
                        { }
502 422c46a8 Anthony Liguori
                    })),
503 422c46a8 Anthony Liguori
        },
504 422c46a8 Anthony Liguori
        {
505 422c46a8 Anthony Liguori
            .encoded = "[]",
506 422c46a8 Anthony Liguori
            .decoded = QLIT_QLIST(((LiteralQObject[]){
507 422c46a8 Anthony Liguori
                        { }
508 422c46a8 Anthony Liguori
                    })),
509 422c46a8 Anthony Liguori
        },
510 422c46a8 Anthony Liguori
        {
511 422c46a8 Anthony Liguori
            .encoded = "[{}]",
512 422c46a8 Anthony Liguori
            .decoded = QLIT_QLIST(((LiteralQObject[]){
513 422c46a8 Anthony Liguori
                        QLIT_QDICT(((LiteralQDictEntry[]){
514 422c46a8 Anthony Liguori
                                    {},
515 422c46a8 Anthony Liguori
                                        })),
516 422c46a8 Anthony Liguori
                        {},
517 422c46a8 Anthony Liguori
                            })),
518 422c46a8 Anthony Liguori
        },
519 422c46a8 Anthony Liguori
        { }
520 422c46a8 Anthony Liguori
    };
521 422c46a8 Anthony Liguori
522 422c46a8 Anthony Liguori
    for (i = 0; test_cases[i].encoded; i++) {
523 422c46a8 Anthony Liguori
        QObject *obj;
524 6ee59202 Anthony Liguori
        QString *str;
525 422c46a8 Anthony Liguori
526 422c46a8 Anthony Liguori
        obj = qobject_from_json(test_cases[i].encoded);
527 422c46a8 Anthony Liguori
        fail_unless(obj != NULL);
528 422c46a8 Anthony Liguori
        fail_unless(qobject_type(obj) == QTYPE_QLIST);
529 422c46a8 Anthony Liguori
530 422c46a8 Anthony Liguori
        fail_unless(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
531 422c46a8 Anthony Liguori
532 6ee59202 Anthony Liguori
        str = qobject_to_json(obj);
533 6ee59202 Anthony Liguori
        qobject_decref(obj);
534 6ee59202 Anthony Liguori
535 6ee59202 Anthony Liguori
        obj = qobject_from_json(qstring_get_str(str));
536 6ee59202 Anthony Liguori
        fail_unless(obj != NULL);
537 6ee59202 Anthony Liguori
        fail_unless(qobject_type(obj) == QTYPE_QLIST);
538 6ee59202 Anthony Liguori
539 6ee59202 Anthony Liguori
        fail_unless(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
540 422c46a8 Anthony Liguori
        qobject_decref(obj);
541 6ee59202 Anthony Liguori
        QDECREF(str);
542 422c46a8 Anthony Liguori
    }
543 422c46a8 Anthony Liguori
}
544 422c46a8 Anthony Liguori
END_TEST
545 422c46a8 Anthony Liguori
546 422c46a8 Anthony Liguori
START_TEST(simple_whitespace)
547 422c46a8 Anthony Liguori
{
548 422c46a8 Anthony Liguori
    int i;
549 422c46a8 Anthony Liguori
    struct {
550 422c46a8 Anthony Liguori
        const char *encoded;
551 422c46a8 Anthony Liguori
        LiteralQObject decoded;
552 422c46a8 Anthony Liguori
    } test_cases[] = {
553 422c46a8 Anthony Liguori
        {
554 422c46a8 Anthony Liguori
            .encoded = " [ 43 , 42 ]",
555 422c46a8 Anthony Liguori
            .decoded = QLIT_QLIST(((LiteralQObject[]){
556 422c46a8 Anthony Liguori
                        QLIT_QINT(43),
557 422c46a8 Anthony Liguori
                        QLIT_QINT(42),
558 422c46a8 Anthony Liguori
                        { }
559 422c46a8 Anthony Liguori
                    })),
560 422c46a8 Anthony Liguori
        },
561 422c46a8 Anthony Liguori
        {
562 422c46a8 Anthony Liguori
            .encoded = " [ 43 , { 'h' : 'b' }, [ ], 42 ]",
563 422c46a8 Anthony Liguori
            .decoded = QLIT_QLIST(((LiteralQObject[]){
564 422c46a8 Anthony Liguori
                        QLIT_QINT(43),
565 422c46a8 Anthony Liguori
                        QLIT_QDICT(((LiteralQDictEntry[]){
566 422c46a8 Anthony Liguori
                                    { "h", QLIT_QSTR("b") },
567 422c46a8 Anthony Liguori
                                    { }})),
568 422c46a8 Anthony Liguori
                        QLIT_QLIST(((LiteralQObject[]){
569 422c46a8 Anthony Liguori
                                    { }})),
570 422c46a8 Anthony Liguori
                        QLIT_QINT(42),
571 422c46a8 Anthony Liguori
                        { }
572 422c46a8 Anthony Liguori
                    })),
573 422c46a8 Anthony Liguori
        },
574 422c46a8 Anthony Liguori
        {
575 422c46a8 Anthony Liguori
            .encoded = " [ 43 , { 'h' : 'b' , 'a' : 32 }, [ ], 42 ]",
576 422c46a8 Anthony Liguori
            .decoded = QLIT_QLIST(((LiteralQObject[]){
577 422c46a8 Anthony Liguori
                        QLIT_QINT(43),
578 422c46a8 Anthony Liguori
                        QLIT_QDICT(((LiteralQDictEntry[]){
579 422c46a8 Anthony Liguori
                                    { "h", QLIT_QSTR("b") },
580 422c46a8 Anthony Liguori
                                    { "a", QLIT_QINT(32) },
581 422c46a8 Anthony Liguori
                                    { }})),
582 422c46a8 Anthony Liguori
                        QLIT_QLIST(((LiteralQObject[]){
583 422c46a8 Anthony Liguori
                                    { }})),
584 422c46a8 Anthony Liguori
                        QLIT_QINT(42),
585 422c46a8 Anthony Liguori
                        { }
586 422c46a8 Anthony Liguori
                    })),
587 422c46a8 Anthony Liguori
        },
588 422c46a8 Anthony Liguori
        { }
589 422c46a8 Anthony Liguori
    };
590 422c46a8 Anthony Liguori
591 422c46a8 Anthony Liguori
    for (i = 0; test_cases[i].encoded; i++) {
592 422c46a8 Anthony Liguori
        QObject *obj;
593 6ee59202 Anthony Liguori
        QString *str;
594 422c46a8 Anthony Liguori
595 422c46a8 Anthony Liguori
        obj = qobject_from_json(test_cases[i].encoded);
596 422c46a8 Anthony Liguori
        fail_unless(obj != NULL);
597 422c46a8 Anthony Liguori
        fail_unless(qobject_type(obj) == QTYPE_QLIST);
598 422c46a8 Anthony Liguori
599 422c46a8 Anthony Liguori
        fail_unless(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
600 422c46a8 Anthony Liguori
601 6ee59202 Anthony Liguori
        str = qobject_to_json(obj);
602 422c46a8 Anthony Liguori
        qobject_decref(obj);
603 6ee59202 Anthony Liguori
604 6ee59202 Anthony Liguori
        obj = qobject_from_json(qstring_get_str(str));
605 6ee59202 Anthony Liguori
        fail_unless(obj != NULL);
606 6ee59202 Anthony Liguori
        fail_unless(qobject_type(obj) == QTYPE_QLIST);
607 6ee59202 Anthony Liguori
608 6ee59202 Anthony Liguori
        fail_unless(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
609 6ee59202 Anthony Liguori
610 6ee59202 Anthony Liguori
        qobject_decref(obj);
611 6ee59202 Anthony Liguori
        QDECREF(str);
612 422c46a8 Anthony Liguori
    }
613 422c46a8 Anthony Liguori
}
614 422c46a8 Anthony Liguori
END_TEST
615 422c46a8 Anthony Liguori
616 422c46a8 Anthony Liguori
START_TEST(simple_varargs)
617 422c46a8 Anthony Liguori
{
618 422c46a8 Anthony Liguori
    QObject *embedded_obj;
619 422c46a8 Anthony Liguori
    QObject *obj;
620 422c46a8 Anthony Liguori
    LiteralQObject decoded = QLIT_QLIST(((LiteralQObject[]){
621 422c46a8 Anthony Liguori
            QLIT_QINT(1),
622 422c46a8 Anthony Liguori
            QLIT_QINT(2),
623 422c46a8 Anthony Liguori
            QLIT_QLIST(((LiteralQObject[]){
624 422c46a8 Anthony Liguori
                        QLIT_QINT(32),
625 422c46a8 Anthony Liguori
                        QLIT_QINT(42),
626 422c46a8 Anthony Liguori
                        {}})),
627 422c46a8 Anthony Liguori
            {}}));
628 422c46a8 Anthony Liguori
629 422c46a8 Anthony Liguori
    embedded_obj = qobject_from_json("[32, 42]");
630 422c46a8 Anthony Liguori
    fail_unless(embedded_obj != NULL);
631 422c46a8 Anthony Liguori
632 422c46a8 Anthony Liguori
    obj = qobject_from_jsonf("[%d, 2, %p]", 1, embedded_obj);
633 422c46a8 Anthony Liguori
    fail_unless(obj != NULL);
634 422c46a8 Anthony Liguori
635 422c46a8 Anthony Liguori
    fail_unless(compare_litqobj_to_qobj(&decoded, obj) == 1);
636 422c46a8 Anthony Liguori
637 422c46a8 Anthony Liguori
    qobject_decref(obj);
638 422c46a8 Anthony Liguori
}
639 422c46a8 Anthony Liguori
END_TEST
640 422c46a8 Anthony Liguori
641 7f8fca7c Paolo Bonzini
START_TEST(empty_input)
642 7f8fca7c Paolo Bonzini
{
643 e7a06af8 Jan Kiszka
    const char *empty = "";
644 e7a06af8 Jan Kiszka
645 e7a06af8 Jan Kiszka
    QObject *obj = qobject_from_json(empty);
646 7f8fca7c Paolo Bonzini
    fail_unless(obj == NULL);
647 7f8fca7c Paolo Bonzini
}
648 7f8fca7c Paolo Bonzini
END_TEST
649 7f8fca7c Paolo Bonzini
650 7f8fca7c Paolo Bonzini
START_TEST(unterminated_string)
651 7f8fca7c Paolo Bonzini
{
652 7f8fca7c Paolo Bonzini
    QObject *obj = qobject_from_json("\"abc");
653 7f8fca7c Paolo Bonzini
    fail_unless(obj == NULL);
654 7f8fca7c Paolo Bonzini
}
655 7f8fca7c Paolo Bonzini
END_TEST
656 7f8fca7c Paolo Bonzini
657 7f8fca7c Paolo Bonzini
START_TEST(unterminated_sq_string)
658 7f8fca7c Paolo Bonzini
{
659 7f8fca7c Paolo Bonzini
    QObject *obj = qobject_from_json("'abc");
660 7f8fca7c Paolo Bonzini
    fail_unless(obj == NULL);
661 7f8fca7c Paolo Bonzini
}
662 7f8fca7c Paolo Bonzini
END_TEST
663 7f8fca7c Paolo Bonzini
664 7f8fca7c Paolo Bonzini
START_TEST(unterminated_escape)
665 7f8fca7c Paolo Bonzini
{
666 7f8fca7c Paolo Bonzini
    QObject *obj = qobject_from_json("\"abc\\\"");
667 7f8fca7c Paolo Bonzini
    fail_unless(obj == NULL);
668 7f8fca7c Paolo Bonzini
}
669 7f8fca7c Paolo Bonzini
END_TEST
670 7f8fca7c Paolo Bonzini
671 7f8fca7c Paolo Bonzini
START_TEST(unterminated_array)
672 7f8fca7c Paolo Bonzini
{
673 7f8fca7c Paolo Bonzini
    QObject *obj = qobject_from_json("[32");
674 7f8fca7c Paolo Bonzini
    fail_unless(obj == NULL);
675 7f8fca7c Paolo Bonzini
}
676 7f8fca7c Paolo Bonzini
END_TEST
677 7f8fca7c Paolo Bonzini
678 7f8fca7c Paolo Bonzini
START_TEST(unterminated_array_comma)
679 7f8fca7c Paolo Bonzini
{
680 7f8fca7c Paolo Bonzini
    QObject *obj = qobject_from_json("[32,");
681 7f8fca7c Paolo Bonzini
    fail_unless(obj == NULL);
682 7f8fca7c Paolo Bonzini
}
683 7f8fca7c Paolo Bonzini
END_TEST
684 7f8fca7c Paolo Bonzini
685 7f8fca7c Paolo Bonzini
START_TEST(invalid_array_comma)
686 7f8fca7c Paolo Bonzini
{
687 7f8fca7c Paolo Bonzini
    QObject *obj = qobject_from_json("[32,}");
688 7f8fca7c Paolo Bonzini
    fail_unless(obj == NULL);
689 7f8fca7c Paolo Bonzini
}
690 7f8fca7c Paolo Bonzini
END_TEST
691 7f8fca7c Paolo Bonzini
692 7f8fca7c Paolo Bonzini
START_TEST(unterminated_dict)
693 7f8fca7c Paolo Bonzini
{
694 7f8fca7c Paolo Bonzini
    QObject *obj = qobject_from_json("{'abc':32");
695 7f8fca7c Paolo Bonzini
    fail_unless(obj == NULL);
696 7f8fca7c Paolo Bonzini
}
697 7f8fca7c Paolo Bonzini
END_TEST
698 7f8fca7c Paolo Bonzini
699 7f8fca7c Paolo Bonzini
START_TEST(unterminated_dict_comma)
700 7f8fca7c Paolo Bonzini
{
701 7f8fca7c Paolo Bonzini
    QObject *obj = qobject_from_json("{'abc':32,");
702 7f8fca7c Paolo Bonzini
    fail_unless(obj == NULL);
703 7f8fca7c Paolo Bonzini
}
704 7f8fca7c Paolo Bonzini
END_TEST
705 7f8fca7c Paolo Bonzini
706 7f8fca7c Paolo Bonzini
#if 0
707 7f8fca7c Paolo Bonzini
START_TEST(invalid_dict_comma)
708 7f8fca7c Paolo Bonzini
{
709 7f8fca7c Paolo Bonzini
    QObject *obj = qobject_from_json("{'abc':32,}");
710 7f8fca7c Paolo Bonzini
    fail_unless(obj == NULL);
711 7f8fca7c Paolo Bonzini
}
712 7f8fca7c Paolo Bonzini
END_TEST
713 7f8fca7c Paolo Bonzini

714 7f8fca7c Paolo Bonzini
START_TEST(unterminated_literal)
715 7f8fca7c Paolo Bonzini
{
716 7f8fca7c Paolo Bonzini
    QObject *obj = qobject_from_json("nul");
717 7f8fca7c Paolo Bonzini
    fail_unless(obj == NULL);
718 7f8fca7c Paolo Bonzini
}
719 7f8fca7c Paolo Bonzini
END_TEST
720 7f8fca7c Paolo Bonzini
#endif
721 7f8fca7c Paolo Bonzini
722 422c46a8 Anthony Liguori
static Suite *qjson_suite(void)
723 422c46a8 Anthony Liguori
{
724 422c46a8 Anthony Liguori
    Suite *suite;
725 422c46a8 Anthony Liguori
    TCase *string_literals, *number_literals, *keyword_literals;
726 7f8fca7c Paolo Bonzini
    TCase *dicts, *lists, *whitespace, *varargs, *errors;
727 422c46a8 Anthony Liguori
728 422c46a8 Anthony Liguori
    string_literals = tcase_create("String Literals");
729 422c46a8 Anthony Liguori
    tcase_add_test(string_literals, simple_string);
730 422c46a8 Anthony Liguori
    tcase_add_test(string_literals, escaped_string);
731 422c46a8 Anthony Liguori
    tcase_add_test(string_literals, single_quote_string);
732 422c46a8 Anthony Liguori
    tcase_add_test(string_literals, vararg_string);
733 422c46a8 Anthony Liguori
734 422c46a8 Anthony Liguori
    number_literals = tcase_create("Number Literals");
735 422c46a8 Anthony Liguori
    tcase_add_test(number_literals, simple_number);
736 422c46a8 Anthony Liguori
    tcase_add_test(number_literals, float_number);
737 422c46a8 Anthony Liguori
    tcase_add_test(number_literals, vararg_number);
738 422c46a8 Anthony Liguori
739 422c46a8 Anthony Liguori
    keyword_literals = tcase_create("Keywords");
740 422c46a8 Anthony Liguori
    tcase_add_test(keyword_literals, keyword_literal);
741 422c46a8 Anthony Liguori
    dicts = tcase_create("Objects");
742 422c46a8 Anthony Liguori
    tcase_add_test(dicts, simple_dict);
743 422c46a8 Anthony Liguori
    lists = tcase_create("Lists");
744 422c46a8 Anthony Liguori
    tcase_add_test(lists, simple_list);
745 422c46a8 Anthony Liguori
746 422c46a8 Anthony Liguori
    whitespace = tcase_create("Whitespace");
747 422c46a8 Anthony Liguori
    tcase_add_test(whitespace, simple_whitespace);
748 422c46a8 Anthony Liguori
749 422c46a8 Anthony Liguori
    varargs = tcase_create("Varargs");
750 422c46a8 Anthony Liguori
    tcase_add_test(varargs, simple_varargs);
751 422c46a8 Anthony Liguori
752 7f8fca7c Paolo Bonzini
    errors = tcase_create("Invalid JSON");
753 7f8fca7c Paolo Bonzini
    tcase_add_test(errors, empty_input);
754 7f8fca7c Paolo Bonzini
    tcase_add_test(errors, unterminated_string);
755 7f8fca7c Paolo Bonzini
    tcase_add_test(errors, unterminated_escape);
756 7f8fca7c Paolo Bonzini
    tcase_add_test(errors, unterminated_sq_string);
757 7f8fca7c Paolo Bonzini
    tcase_add_test(errors, unterminated_array);
758 7f8fca7c Paolo Bonzini
    tcase_add_test(errors, unterminated_array_comma);
759 7f8fca7c Paolo Bonzini
    tcase_add_test(errors, invalid_array_comma);
760 7f8fca7c Paolo Bonzini
    tcase_add_test(errors, unterminated_dict);
761 7f8fca7c Paolo Bonzini
    tcase_add_test(errors, unterminated_dict_comma);
762 7f8fca7c Paolo Bonzini
#if 0
763 7f8fca7c Paolo Bonzini
    /* FIXME: this print parse error messages on stderr.  */
764 7f8fca7c Paolo Bonzini
    tcase_add_test(errors, invalid_dict_comma);
765 7f8fca7c Paolo Bonzini
    tcase_add_test(errors, unterminated_literal);
766 7f8fca7c Paolo Bonzini
#endif
767 7f8fca7c Paolo Bonzini
768 422c46a8 Anthony Liguori
    suite = suite_create("QJSON test-suite");
769 422c46a8 Anthony Liguori
    suite_add_tcase(suite, string_literals);
770 422c46a8 Anthony Liguori
    suite_add_tcase(suite, number_literals);
771 422c46a8 Anthony Liguori
    suite_add_tcase(suite, keyword_literals);
772 422c46a8 Anthony Liguori
    suite_add_tcase(suite, dicts);
773 422c46a8 Anthony Liguori
    suite_add_tcase(suite, lists);
774 422c46a8 Anthony Liguori
    suite_add_tcase(suite, whitespace);
775 422c46a8 Anthony Liguori
    suite_add_tcase(suite, varargs);
776 7f8fca7c Paolo Bonzini
    suite_add_tcase(suite, errors);
777 422c46a8 Anthony Liguori
778 422c46a8 Anthony Liguori
    return suite;
779 422c46a8 Anthony Liguori
}
780 422c46a8 Anthony Liguori
781 422c46a8 Anthony Liguori
int main(void)
782 422c46a8 Anthony Liguori
{
783 422c46a8 Anthony Liguori
    int nf;
784 422c46a8 Anthony Liguori
    Suite *s;
785 422c46a8 Anthony Liguori
    SRunner *sr;
786 422c46a8 Anthony Liguori
787 422c46a8 Anthony Liguori
    s = qjson_suite();
788 422c46a8 Anthony Liguori
    sr = srunner_create(s);
789 422c46a8 Anthony Liguori
        
790 422c46a8 Anthony Liguori
    srunner_run_all(sr, CK_NORMAL);
791 422c46a8 Anthony Liguori
    nf = srunner_ntests_failed(sr);
792 422c46a8 Anthony Liguori
    srunner_free(sr);
793 422c46a8 Anthony Liguori
    
794 422c46a8 Anthony Liguori
    return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
795 422c46a8 Anthony Liguori
}