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