root / check-qjson.c @ be40edcd
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 | } |