xref: /qemu/tests/unit/test-qobject-input-visitor.c (revision fc81fa1eb0d3049f715d74e6f01ca24c0501d582)
1d88f5fd1SLuiz Capitulino /*
2b3db211fSDaniel P. Berrange  * QObject Input Visitor unit-tests.
3d88f5fd1SLuiz Capitulino  *
468d07839SEric Blake  * Copyright (C) 2011-2016 Red Hat Inc.
5d88f5fd1SLuiz Capitulino  *
6d88f5fd1SLuiz Capitulino  * Authors:
7d88f5fd1SLuiz Capitulino  *  Luiz Capitulino <lcapitulino@redhat.com>
877c47de2SMarkus Armbruster  *  Paolo Bonzini <pbonzini@redhat.com>
9d88f5fd1SLuiz Capitulino  *
10d88f5fd1SLuiz Capitulino  * This work is licensed under the terms of the GNU GPL, version 2 or later.
11d88f5fd1SLuiz Capitulino  * See the COPYING file in the top-level directory.
12d88f5fd1SLuiz Capitulino  */
13d88f5fd1SLuiz Capitulino 
14681c28a3SPeter Maydell #include "qemu/osdep.h"
15d88f5fd1SLuiz Capitulino 
1679ee7df8SPaolo Bonzini #include "qemu-common.h"
17da34e65cSMarkus Armbruster #include "qapi/error.h"
18b3db211fSDaniel P. Berrange #include "qapi/qobject-input-visitor.h"
19d88f5fd1SLuiz Capitulino #include "test-qapi-visit.h"
206b673957SMarkus Armbruster #include "qapi/qmp/qbool.h"
21452fcdbcSMarkus Armbruster #include "qapi/qmp/qdict.h"
2215280c36SMarkus Armbruster #include "qapi/qmp/qnull.h"
2315280c36SMarkus Armbruster #include "qapi/qmp/qnum.h"
24*fc81fa1eSMarkus Armbruster #include "qapi/qmp/qstring.h"
25c7eb39cbSEric Blake #include "qapi/qmp/qjson.h"
2677c47de2SMarkus Armbruster #include "test-qmp-introspect.h"
2777c47de2SMarkus Armbruster #include "qmp-introspect.h"
2877c47de2SMarkus Armbruster #include "qapi-visit.h"
29d88f5fd1SLuiz Capitulino 
30d88f5fd1SLuiz Capitulino typedef struct TestInputVisitorData {
31d88f5fd1SLuiz Capitulino     QObject *obj;
32b70ce101SEric Blake     Visitor *qiv;
33d88f5fd1SLuiz Capitulino } TestInputVisitorData;
34d88f5fd1SLuiz Capitulino 
35d88f5fd1SLuiz Capitulino static void visitor_input_teardown(TestInputVisitorData *data,
36d88f5fd1SLuiz Capitulino                                    const void *unused)
37d88f5fd1SLuiz Capitulino {
38d88f5fd1SLuiz Capitulino     qobject_decref(data->obj);
39d88f5fd1SLuiz Capitulino     data->obj = NULL;
40d88f5fd1SLuiz Capitulino 
41d88f5fd1SLuiz Capitulino     if (data->qiv) {
42b70ce101SEric Blake         visit_free(data->qiv);
43d88f5fd1SLuiz Capitulino         data->qiv = NULL;
44d88f5fd1SLuiz Capitulino     }
45d88f5fd1SLuiz Capitulino }
46d88f5fd1SLuiz Capitulino 
470920a171SEric Blake /* The various test_init functions are provided instead of a test setup
480920a171SEric Blake    function so that the JSON string used by the tests are kept in the test
490920a171SEric Blake    functions (and not in main()). */
500920a171SEric Blake static Visitor *visitor_input_test_init_internal(TestInputVisitorData *data,
51cbd8acf3SDaniel P. Berrange                                                  bool keyval,
520920a171SEric Blake                                                  const char *json_string,
530920a171SEric Blake                                                  va_list *ap)
540920a171SEric Blake {
55b18f1141SEric Blake     visitor_input_teardown(data, NULL);
56b18f1141SEric Blake 
57bff17e84SMarkus Armbruster     data->obj = qobject_from_jsonv(json_string, ap, &error_abort);
580920a171SEric Blake     g_assert(data->obj);
590920a171SEric Blake 
60cbd8acf3SDaniel P. Berrange     if (keyval) {
61cbd8acf3SDaniel P. Berrange         data->qiv = qobject_input_visitor_new_keyval(data->obj);
62cbd8acf3SDaniel P. Berrange     } else {
63048abb7bSMarkus Armbruster         data->qiv = qobject_input_visitor_new(data->obj);
64cbd8acf3SDaniel P. Berrange     }
650920a171SEric Blake     g_assert(data->qiv);
66b70ce101SEric Blake     return data->qiv;
670920a171SEric Blake }
680920a171SEric Blake 
69cbd8acf3SDaniel P. Berrange static GCC_FMT_ATTR(3, 4)
70cbd8acf3SDaniel P. Berrange Visitor *visitor_input_test_init_full(TestInputVisitorData *data,
71cbd8acf3SDaniel P. Berrange                                       bool keyval,
72cbd8acf3SDaniel P. Berrange                                       const char *json_string, ...)
73cbd8acf3SDaniel P. Berrange {
74cbd8acf3SDaniel P. Berrange     Visitor *v;
75cbd8acf3SDaniel P. Berrange     va_list ap;
76cbd8acf3SDaniel P. Berrange 
77cbd8acf3SDaniel P. Berrange     va_start(ap, json_string);
78cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init_internal(data, keyval, json_string, &ap);
79cbd8acf3SDaniel P. Berrange     va_end(ap);
80cbd8acf3SDaniel P. Berrange     return v;
81cbd8acf3SDaniel P. Berrange }
82cbd8acf3SDaniel P. Berrange 
83aba2107aSStefan Weil static GCC_FMT_ATTR(2, 3)
84aba2107aSStefan Weil Visitor *visitor_input_test_init(TestInputVisitorData *data,
85d88f5fd1SLuiz Capitulino                                  const char *json_string, ...)
86d88f5fd1SLuiz Capitulino {
87d88f5fd1SLuiz Capitulino     Visitor *v;
88d88f5fd1SLuiz Capitulino     va_list ap;
89d88f5fd1SLuiz Capitulino 
90d88f5fd1SLuiz Capitulino     va_start(ap, json_string);
91cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init_internal(data, false, json_string, &ap);
92d88f5fd1SLuiz Capitulino     va_end(ap);
93d88f5fd1SLuiz Capitulino     return v;
94d88f5fd1SLuiz Capitulino }
95d88f5fd1SLuiz Capitulino 
96199e0f17SMichael Roth /* similar to visitor_input_test_init(), but does not expect a string
97199e0f17SMichael Roth  * literal/format json_string argument and so can be used for
98199e0f17SMichael Roth  * programatically generated strings (and we can't pass in programatically
99199e0f17SMichael Roth  * generated strings via %s format parameters since qobject_from_jsonv()
100199e0f17SMichael Roth  * will wrap those in double-quotes and treat the entire object as a
101199e0f17SMichael Roth  * string)
102199e0f17SMichael Roth  */
103199e0f17SMichael Roth static Visitor *visitor_input_test_init_raw(TestInputVisitorData *data,
104199e0f17SMichael Roth                                             const char *json_string)
105199e0f17SMichael Roth {
106cbd8acf3SDaniel P. Berrange     return visitor_input_test_init_internal(data, false, json_string, NULL);
107199e0f17SMichael Roth }
108199e0f17SMichael Roth 
109d88f5fd1SLuiz Capitulino static void test_visitor_in_int(TestInputVisitorData *data,
110d88f5fd1SLuiz Capitulino                                 const void *unused)
111d88f5fd1SLuiz Capitulino {
11229a6731aSEric Blake     int64_t res = 0;
113c1214ad3SMarc-André Lureau     double dbl;
11429a6731aSEric Blake     int value = -42;
115d88f5fd1SLuiz Capitulino     Visitor *v;
116d88f5fd1SLuiz Capitulino 
11729a6731aSEric Blake     v = visitor_input_test_init(data, "%d", value);
118d88f5fd1SLuiz Capitulino 
11951e72bc1SEric Blake     visit_type_int(v, NULL, &res, &error_abort);
120d88f5fd1SLuiz Capitulino     g_assert_cmpint(res, ==, value);
121c1214ad3SMarc-André Lureau 
122c1214ad3SMarc-André Lureau     visit_type_number(v, NULL, &dbl, &error_abort);
123c1214ad3SMarc-André Lureau     g_assert_cmpfloat(dbl, ==, -42.0);
124d88f5fd1SLuiz Capitulino }
125d88f5fd1SLuiz Capitulino 
1264bc0c94dSMarkus Armbruster static void test_visitor_in_uint(TestInputVisitorData *data,
1274bc0c94dSMarkus Armbruster                                 const void *unused)
1284bc0c94dSMarkus Armbruster {
1294bc0c94dSMarkus Armbruster     uint64_t res = 0;
130c1214ad3SMarc-André Lureau     int64_t i64;
131c1214ad3SMarc-André Lureau     double dbl;
1324bc0c94dSMarkus Armbruster     int value = 42;
1334bc0c94dSMarkus Armbruster     Visitor *v;
1344bc0c94dSMarkus Armbruster 
1354bc0c94dSMarkus Armbruster     v = visitor_input_test_init(data, "%d", value);
1364bc0c94dSMarkus Armbruster 
1374bc0c94dSMarkus Armbruster     visit_type_uint64(v, NULL, &res, &error_abort);
1384bc0c94dSMarkus Armbruster     g_assert_cmpuint(res, ==, (uint64_t)value);
1394bc0c94dSMarkus Armbruster 
140c1214ad3SMarc-André Lureau     visit_type_int(v, NULL, &i64, &error_abort);
141c1214ad3SMarc-André Lureau     g_assert_cmpint(i64, ==, value);
1424bc0c94dSMarkus Armbruster 
143c1214ad3SMarc-André Lureau     visit_type_number(v, NULL, &dbl, &error_abort);
144c1214ad3SMarc-André Lureau     g_assert_cmpfloat(dbl, ==, value);
145c1214ad3SMarc-André Lureau 
146c1214ad3SMarc-André Lureau     /* BUG: value between INT64_MIN and -1 accepted modulo 2^64 */
1474bc0c94dSMarkus Armbruster     v = visitor_input_test_init(data, "%d", -value);
1484bc0c94dSMarkus Armbruster 
1494bc0c94dSMarkus Armbruster     visit_type_uint64(v, NULL, &res, &error_abort);
1504bc0c94dSMarkus Armbruster     g_assert_cmpuint(res, ==, (uint64_t)-value);
1514bc0c94dSMarkus Armbruster 
1524bc0c94dSMarkus Armbruster     v = visitor_input_test_init(data, "18446744073709551574");
1534bc0c94dSMarkus Armbruster 
1545923f85fSMarc-André Lureau     visit_type_uint64(v, NULL, &res, &error_abort);
1555923f85fSMarc-André Lureau     g_assert_cmpuint(res, ==, 18446744073709551574U);
156c1214ad3SMarc-André Lureau 
157c1214ad3SMarc-André Lureau     visit_type_number(v, NULL, &dbl, &error_abort);
158c1214ad3SMarc-André Lureau     g_assert_cmpfloat(dbl, ==, 18446744073709552000.0);
1594bc0c94dSMarkus Armbruster }
1604bc0c94dSMarkus Armbruster 
161e92cfa0dSMichael Roth static void test_visitor_in_int_overflow(TestInputVisitorData *data,
162e92cfa0dSMichael Roth                                          const void *unused)
163e92cfa0dSMichael Roth {
164e92cfa0dSMichael Roth     int64_t res = 0;
165e940f543SMarkus Armbruster     Error *err = NULL;
166e92cfa0dSMichael Roth     Visitor *v;
167e92cfa0dSMichael Roth 
16801b2ffceSMarc-André Lureau     /*
16901b2ffceSMarc-André Lureau      * This will overflow a QNUM_I64, so should be deserialized into a
17001b2ffceSMarc-André Lureau      * QNUM_DOUBLE field instead, leading to an error if we pass it to
17101b2ffceSMarc-André Lureau      * visit_type_int().  Confirm this.
172e92cfa0dSMichael Roth      */
173e92cfa0dSMichael Roth     v = visitor_input_test_init(data, "%f", DBL_MAX);
174e92cfa0dSMichael Roth 
17551e72bc1SEric Blake     visit_type_int(v, NULL, &res, &err);
176a12a5a1aSEric Blake     error_free_or_abort(&err);
177e92cfa0dSMichael Roth }
178e92cfa0dSMichael Roth 
179cbd8acf3SDaniel P. Berrange static void test_visitor_in_int_keyval(TestInputVisitorData *data,
180cbd8acf3SDaniel P. Berrange                                        const void *unused)
181cbd8acf3SDaniel P. Berrange {
182cbd8acf3SDaniel P. Berrange     int64_t res = 0, value = -42;
183cbd8acf3SDaniel P. Berrange     Error *err = NULL;
184cbd8acf3SDaniel P. Berrange     Visitor *v;
185cbd8acf3SDaniel P. Berrange 
186cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init_full(data, true, "%" PRId64, value);
187cbd8acf3SDaniel P. Berrange     visit_type_int(v, NULL, &res, &err);
188cbd8acf3SDaniel P. Berrange     error_free_or_abort(&err);
189cbd8acf3SDaniel P. Berrange }
190cbd8acf3SDaniel P. Berrange 
191cbd8acf3SDaniel P. Berrange static void test_visitor_in_int_str_keyval(TestInputVisitorData *data,
192cbd8acf3SDaniel P. Berrange                                            const void *unused)
193cbd8acf3SDaniel P. Berrange {
194cbd8acf3SDaniel P. Berrange     int64_t res = 0, value = -42;
195cbd8acf3SDaniel P. Berrange     Visitor *v;
196cbd8acf3SDaniel P. Berrange 
197cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init_full(data, true, "\"-42\"");
198cbd8acf3SDaniel P. Berrange 
199cbd8acf3SDaniel P. Berrange     visit_type_int(v, NULL, &res, &error_abort);
200cbd8acf3SDaniel P. Berrange     g_assert_cmpint(res, ==, value);
201cbd8acf3SDaniel P. Berrange }
202cbd8acf3SDaniel P. Berrange 
203cbd8acf3SDaniel P. Berrange static void test_visitor_in_int_str_fail(TestInputVisitorData *data,
204cbd8acf3SDaniel P. Berrange                                          const void *unused)
205cbd8acf3SDaniel P. Berrange {
206cbd8acf3SDaniel P. Berrange     int64_t res = 0;
207cbd8acf3SDaniel P. Berrange     Visitor *v;
208cbd8acf3SDaniel P. Berrange     Error *err = NULL;
209cbd8acf3SDaniel P. Berrange 
210cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init(data, "\"-42\"");
211cbd8acf3SDaniel P. Berrange 
212cbd8acf3SDaniel P. Berrange     visit_type_int(v, NULL, &res, &err);
213cbd8acf3SDaniel P. Berrange     error_free_or_abort(&err);
214cbd8acf3SDaniel P. Berrange }
215cbd8acf3SDaniel P. Berrange 
216d88f5fd1SLuiz Capitulino static void test_visitor_in_bool(TestInputVisitorData *data,
217d88f5fd1SLuiz Capitulino                                  const void *unused)
218d88f5fd1SLuiz Capitulino {
219d88f5fd1SLuiz Capitulino     bool res = false;
220d88f5fd1SLuiz Capitulino     Visitor *v;
221d88f5fd1SLuiz Capitulino 
222d88f5fd1SLuiz Capitulino     v = visitor_input_test_init(data, "true");
223d88f5fd1SLuiz Capitulino 
22451e72bc1SEric Blake     visit_type_bool(v, NULL, &res, &error_abort);
225d88f5fd1SLuiz Capitulino     g_assert_cmpint(res, ==, true);
226d88f5fd1SLuiz Capitulino }
227d88f5fd1SLuiz Capitulino 
228cbd8acf3SDaniel P. Berrange static void test_visitor_in_bool_keyval(TestInputVisitorData *data,
229cbd8acf3SDaniel P. Berrange                                         const void *unused)
230cbd8acf3SDaniel P. Berrange {
231cbd8acf3SDaniel P. Berrange     bool res = false;
232cbd8acf3SDaniel P. Berrange     Error *err = NULL;
233cbd8acf3SDaniel P. Berrange     Visitor *v;
234cbd8acf3SDaniel P. Berrange 
235cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init_full(data, true, "true");
236cbd8acf3SDaniel P. Berrange 
237cbd8acf3SDaniel P. Berrange     visit_type_bool(v, NULL, &res, &err);
238cbd8acf3SDaniel P. Berrange     error_free_or_abort(&err);
239cbd8acf3SDaniel P. Berrange }
240cbd8acf3SDaniel P. Berrange 
241cbd8acf3SDaniel P. Berrange static void test_visitor_in_bool_str_keyval(TestInputVisitorData *data,
242cbd8acf3SDaniel P. Berrange                                             const void *unused)
243cbd8acf3SDaniel P. Berrange {
244cbd8acf3SDaniel P. Berrange     bool res = false;
245cbd8acf3SDaniel P. Berrange     Visitor *v;
246cbd8acf3SDaniel P. Berrange 
247cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init_full(data, true, "\"on\"");
248cbd8acf3SDaniel P. Berrange 
249cbd8acf3SDaniel P. Berrange     visit_type_bool(v, NULL, &res, &error_abort);
250cbd8acf3SDaniel P. Berrange     g_assert_cmpint(res, ==, true);
251cbd8acf3SDaniel P. Berrange }
252cbd8acf3SDaniel P. Berrange 
253cbd8acf3SDaniel P. Berrange static void test_visitor_in_bool_str_fail(TestInputVisitorData *data,
254cbd8acf3SDaniel P. Berrange                                           const void *unused)
255cbd8acf3SDaniel P. Berrange {
256cbd8acf3SDaniel P. Berrange     bool res = false;
257cbd8acf3SDaniel P. Berrange     Visitor *v;
258cbd8acf3SDaniel P. Berrange     Error *err = NULL;
259cbd8acf3SDaniel P. Berrange 
260cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init(data, "\"true\"");
261cbd8acf3SDaniel P. Berrange 
262cbd8acf3SDaniel P. Berrange     visit_type_bool(v, NULL, &res, &err);
263cbd8acf3SDaniel P. Berrange     error_free_or_abort(&err);
264cbd8acf3SDaniel P. Berrange }
265cbd8acf3SDaniel P. Berrange 
266d88f5fd1SLuiz Capitulino static void test_visitor_in_number(TestInputVisitorData *data,
267d88f5fd1SLuiz Capitulino                                    const void *unused)
268d88f5fd1SLuiz Capitulino {
269d88f5fd1SLuiz Capitulino     double res = 0, value = 3.14;
270d88f5fd1SLuiz Capitulino     Visitor *v;
271d88f5fd1SLuiz Capitulino 
272d88f5fd1SLuiz Capitulino     v = visitor_input_test_init(data, "%f", value);
273d88f5fd1SLuiz Capitulino 
27451e72bc1SEric Blake     visit_type_number(v, NULL, &res, &error_abort);
275d88f5fd1SLuiz Capitulino     g_assert_cmpfloat(res, ==, value);
276d88f5fd1SLuiz Capitulino }
277d88f5fd1SLuiz Capitulino 
278c1214ad3SMarc-André Lureau static void test_visitor_in_large_number(TestInputVisitorData *data,
279c1214ad3SMarc-André Lureau                                          const void *unused)
280c1214ad3SMarc-André Lureau {
281c1214ad3SMarc-André Lureau     Error *err = NULL;
282c1214ad3SMarc-André Lureau     double res = 0;
283c1214ad3SMarc-André Lureau     int64_t i64;
284c1214ad3SMarc-André Lureau     uint64_t u64;
285c1214ad3SMarc-André Lureau     Visitor *v;
286c1214ad3SMarc-André Lureau 
287c1214ad3SMarc-André Lureau     v = visitor_input_test_init(data, "-18446744073709551616"); /* -2^64 */
288c1214ad3SMarc-André Lureau 
289c1214ad3SMarc-André Lureau     visit_type_number(v, NULL, &res, &error_abort);
290c1214ad3SMarc-André Lureau     g_assert_cmpfloat(res, ==, -18446744073709552e3);
291c1214ad3SMarc-André Lureau 
292c1214ad3SMarc-André Lureau     visit_type_int(v, NULL, &i64, &err);
293c1214ad3SMarc-André Lureau     error_free_or_abort(&err);
294c1214ad3SMarc-André Lureau 
295c1214ad3SMarc-André Lureau     visit_type_uint64(v, NULL, &u64, &err);
296c1214ad3SMarc-André Lureau     error_free_or_abort(&err);
297c1214ad3SMarc-André Lureau }
298c1214ad3SMarc-André Lureau 
299cbd8acf3SDaniel P. Berrange static void test_visitor_in_number_keyval(TestInputVisitorData *data,
300cbd8acf3SDaniel P. Berrange                                           const void *unused)
301cbd8acf3SDaniel P. Berrange {
302cbd8acf3SDaniel P. Berrange     double res = 0, value = 3.14;
303cbd8acf3SDaniel P. Berrange     Error *err = NULL;
304cbd8acf3SDaniel P. Berrange     Visitor *v;
305cbd8acf3SDaniel P. Berrange 
306cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init_full(data, true, "%f", value);
307cbd8acf3SDaniel P. Berrange 
308cbd8acf3SDaniel P. Berrange     visit_type_number(v, NULL, &res, &err);
309cbd8acf3SDaniel P. Berrange     error_free_or_abort(&err);
310cbd8acf3SDaniel P. Berrange }
311cbd8acf3SDaniel P. Berrange 
312cbd8acf3SDaniel P. Berrange static void test_visitor_in_number_str_keyval(TestInputVisitorData *data,
313cbd8acf3SDaniel P. Berrange                                               const void *unused)
314cbd8acf3SDaniel P. Berrange {
315cbd8acf3SDaniel P. Berrange     double res = 0, value = 3.14;
316cbd8acf3SDaniel P. Berrange     Visitor *v;
3175891c388SMarkus Armbruster     Error *err = NULL;
318cbd8acf3SDaniel P. Berrange 
319cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init_full(data, true, "\"3.14\"");
320cbd8acf3SDaniel P. Berrange 
321cbd8acf3SDaniel P. Berrange     visit_type_number(v, NULL, &res, &error_abort);
322cbd8acf3SDaniel P. Berrange     g_assert_cmpfloat(res, ==, value);
3235891c388SMarkus Armbruster 
3245891c388SMarkus Armbruster     v = visitor_input_test_init_full(data, true, "\"inf\"");
3255891c388SMarkus Armbruster 
3265891c388SMarkus Armbruster     visit_type_number(v, NULL, &res, &err);
3275891c388SMarkus Armbruster     error_free_or_abort(&err);
328cbd8acf3SDaniel P. Berrange }
329cbd8acf3SDaniel P. Berrange 
330cbd8acf3SDaniel P. Berrange static void test_visitor_in_number_str_fail(TestInputVisitorData *data,
331cbd8acf3SDaniel P. Berrange                                             const void *unused)
332cbd8acf3SDaniel P. Berrange {
333cbd8acf3SDaniel P. Berrange     double res = 0;
334cbd8acf3SDaniel P. Berrange     Visitor *v;
335cbd8acf3SDaniel P. Berrange     Error *err = NULL;
336cbd8acf3SDaniel P. Berrange 
337cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init(data, "\"3.14\"");
338cbd8acf3SDaniel P. Berrange 
339cbd8acf3SDaniel P. Berrange     visit_type_number(v, NULL, &res, &err);
340cbd8acf3SDaniel P. Berrange     error_free_or_abort(&err);
341cbd8acf3SDaniel P. Berrange }
342cbd8acf3SDaniel P. Berrange 
343cbd8acf3SDaniel P. Berrange static void test_visitor_in_size_str_keyval(TestInputVisitorData *data,
344cbd8acf3SDaniel P. Berrange                                             const void *unused)
345cbd8acf3SDaniel P. Berrange {
346cbd8acf3SDaniel P. Berrange     uint64_t res, value = 500 * 1024 * 1024;
347cbd8acf3SDaniel P. Berrange     Visitor *v;
348cbd8acf3SDaniel P. Berrange 
349cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init_full(data, true, "\"500M\"");
350cbd8acf3SDaniel P. Berrange 
351cbd8acf3SDaniel P. Berrange     visit_type_size(v, NULL, &res, &error_abort);
352cbd8acf3SDaniel P. Berrange     g_assert_cmpfloat(res, ==, value);
353cbd8acf3SDaniel P. Berrange }
354cbd8acf3SDaniel P. Berrange 
355cbd8acf3SDaniel P. Berrange static void test_visitor_in_size_str_fail(TestInputVisitorData *data,
356cbd8acf3SDaniel P. Berrange                                           const void *unused)
357cbd8acf3SDaniel P. Berrange {
358cbd8acf3SDaniel P. Berrange     uint64_t res = 0;
359cbd8acf3SDaniel P. Berrange     Visitor *v;
360cbd8acf3SDaniel P. Berrange     Error *err = NULL;
361cbd8acf3SDaniel P. Berrange 
362cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init(data, "\"500M\"");
363cbd8acf3SDaniel P. Berrange 
364cbd8acf3SDaniel P. Berrange     visit_type_size(v, NULL, &res, &err);
365cbd8acf3SDaniel P. Berrange     error_free_or_abort(&err);
366cbd8acf3SDaniel P. Berrange }
367cbd8acf3SDaniel P. Berrange 
368d88f5fd1SLuiz Capitulino static void test_visitor_in_string(TestInputVisitorData *data,
369d88f5fd1SLuiz Capitulino                                    const void *unused)
370d88f5fd1SLuiz Capitulino {
371d88f5fd1SLuiz Capitulino     char *res = NULL, *value = (char *) "Q E M U";
372d88f5fd1SLuiz Capitulino     Visitor *v;
373d88f5fd1SLuiz Capitulino 
374d88f5fd1SLuiz Capitulino     v = visitor_input_test_init(data, "%s", value);
375d88f5fd1SLuiz Capitulino 
37651e72bc1SEric Blake     visit_type_str(v, NULL, &res, &error_abort);
377d88f5fd1SLuiz Capitulino     g_assert_cmpstr(res, ==, value);
378d88f5fd1SLuiz Capitulino 
379d88f5fd1SLuiz Capitulino     g_free(res);
380d88f5fd1SLuiz Capitulino }
381d88f5fd1SLuiz Capitulino 
382d88f5fd1SLuiz Capitulino static void test_visitor_in_enum(TestInputVisitorData *data,
383d88f5fd1SLuiz Capitulino                                  const void *unused)
384d88f5fd1SLuiz Capitulino {
385d88f5fd1SLuiz Capitulino     Visitor *v;
386d88f5fd1SLuiz Capitulino     EnumOne i;
387d88f5fd1SLuiz Capitulino 
3881c236ba5SMarkus Armbruster     for (i = 0; i < ENUM_ONE__MAX; i++) {
389d88f5fd1SLuiz Capitulino         EnumOne res = -1;
390d88f5fd1SLuiz Capitulino 
391977c736fSMarkus Armbruster         v = visitor_input_test_init(data, "%s", EnumOne_str(i));
392d88f5fd1SLuiz Capitulino 
39351e72bc1SEric Blake         visit_type_EnumOne(v, NULL, &res, &error_abort);
394d88f5fd1SLuiz Capitulino         g_assert_cmpint(i, ==, res);
395d88f5fd1SLuiz Capitulino     }
396d88f5fd1SLuiz Capitulino }
397d88f5fd1SLuiz Capitulino 
398d88f5fd1SLuiz Capitulino 
399d88f5fd1SLuiz Capitulino static void test_visitor_in_struct(TestInputVisitorData *data,
400d88f5fd1SLuiz Capitulino                                    const void *unused)
401d88f5fd1SLuiz Capitulino {
402d88f5fd1SLuiz Capitulino     TestStruct *p = NULL;
403d88f5fd1SLuiz Capitulino     Visitor *v;
404d88f5fd1SLuiz Capitulino 
405d88f5fd1SLuiz Capitulino     v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }");
406d88f5fd1SLuiz Capitulino 
40751e72bc1SEric Blake     visit_type_TestStruct(v, NULL, &p, &error_abort);
408d88f5fd1SLuiz Capitulino     g_assert_cmpint(p->integer, ==, -42);
409d88f5fd1SLuiz Capitulino     g_assert(p->boolean == true);
410d88f5fd1SLuiz Capitulino     g_assert_cmpstr(p->string, ==, "foo");
411d88f5fd1SLuiz Capitulino 
412d88f5fd1SLuiz Capitulino     g_free(p->string);
413d88f5fd1SLuiz Capitulino     g_free(p);
414d88f5fd1SLuiz Capitulino }
415d88f5fd1SLuiz Capitulino 
416d88f5fd1SLuiz Capitulino static void test_visitor_in_struct_nested(TestInputVisitorData *data,
417d88f5fd1SLuiz Capitulino                                           const void *unused)
418d88f5fd1SLuiz Capitulino {
419b6fcf32dSEric Blake     UserDefTwo *udp = NULL;
420d88f5fd1SLuiz Capitulino     Visitor *v;
421d88f5fd1SLuiz Capitulino 
422b6fcf32dSEric Blake     v = visitor_input_test_init(data, "{ 'string0': 'string0', "
423b6fcf32dSEric Blake                                 "'dict1': { 'string1': 'string1', "
424b6fcf32dSEric Blake                                 "'dict2': { 'userdef': { 'integer': 42, "
425b6fcf32dSEric Blake                                 "'string': 'string' }, 'string': 'string2'}}}");
426d88f5fd1SLuiz Capitulino 
42751e72bc1SEric Blake     visit_type_UserDefTwo(v, NULL, &udp, &error_abort);
428d88f5fd1SLuiz Capitulino 
429b18f1141SEric Blake     g_assert_cmpstr(udp->string0, ==, "string0");
430b18f1141SEric Blake     g_assert_cmpstr(udp->dict1->string1, ==, "string1");
431ddf21908SEric Blake     g_assert_cmpint(udp->dict1->dict2->userdef->integer, ==, 42);
432b18f1141SEric Blake     g_assert_cmpstr(udp->dict1->dict2->userdef->string, ==, "string");
433b18f1141SEric Blake     g_assert_cmpstr(udp->dict1->dict2->string, ==, "string2");
4346446a592SEric Blake     g_assert(udp->dict1->has_dict3 == false);
435d88f5fd1SLuiz Capitulino 
436b18f1141SEric Blake     qapi_free_UserDefTwo(udp);
437d88f5fd1SLuiz Capitulino }
438d88f5fd1SLuiz Capitulino 
439d88f5fd1SLuiz Capitulino static void test_visitor_in_list(TestInputVisitorData *data,
440d88f5fd1SLuiz Capitulino                                  const void *unused)
441d88f5fd1SLuiz Capitulino {
442d88f5fd1SLuiz Capitulino     UserDefOneList *item, *head = NULL;
443d88f5fd1SLuiz Capitulino     Visitor *v;
444d88f5fd1SLuiz Capitulino     int i;
445d88f5fd1SLuiz Capitulino 
446d88f5fd1SLuiz Capitulino     v = visitor_input_test_init(data, "[ { 'string': 'string0', 'integer': 42 }, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44 } ]");
447d88f5fd1SLuiz Capitulino 
44851e72bc1SEric Blake     visit_type_UserDefOneList(v, NULL, &head, &error_abort);
449d88f5fd1SLuiz Capitulino     g_assert(head != NULL);
450d88f5fd1SLuiz Capitulino 
451d88f5fd1SLuiz Capitulino     for (i = 0, item = head; item; item = item->next, i++) {
452d88f5fd1SLuiz Capitulino         char string[12];
453d88f5fd1SLuiz Capitulino 
454d88f5fd1SLuiz Capitulino         snprintf(string, sizeof(string), "string%d", i);
455d88f5fd1SLuiz Capitulino         g_assert_cmpstr(item->value->string, ==, string);
456ddf21908SEric Blake         g_assert_cmpint(item->value->integer, ==, 42 + i);
457d88f5fd1SLuiz Capitulino     }
458d88f5fd1SLuiz Capitulino 
459d88f5fd1SLuiz Capitulino     qapi_free_UserDefOneList(head);
4602533377cSEric Blake     head = NULL;
4612533377cSEric Blake 
4622533377cSEric Blake     /* An empty list is valid */
4632533377cSEric Blake     v = visitor_input_test_init(data, "[]");
46451e72bc1SEric Blake     visit_type_UserDefOneList(v, NULL, &head, &error_abort);
4652533377cSEric Blake     g_assert(!head);
466d88f5fd1SLuiz Capitulino }
467d88f5fd1SLuiz Capitulino 
46828770e05SMarkus Armbruster static void test_visitor_in_any(TestInputVisitorData *data,
46928770e05SMarkus Armbruster                                 const void *unused)
47028770e05SMarkus Armbruster {
47128770e05SMarkus Armbruster     QObject *res = NULL;
47228770e05SMarkus Armbruster     Visitor *v;
47301b2ffceSMarc-André Lureau     QNum *qnum;
47428770e05SMarkus Armbruster     QBool *qbool;
47528770e05SMarkus Armbruster     QString *qstring;
47628770e05SMarkus Armbruster     QDict *qdict;
47728770e05SMarkus Armbruster     QObject *qobj;
47801b2ffceSMarc-André Lureau     int64_t val;
47928770e05SMarkus Armbruster 
48028770e05SMarkus Armbruster     v = visitor_input_test_init(data, "-42");
48151e72bc1SEric Blake     visit_type_any(v, NULL, &res, &error_abort);
48201b2ffceSMarc-André Lureau     qnum = qobject_to_qnum(res);
48301b2ffceSMarc-André Lureau     g_assert(qnum);
48401b2ffceSMarc-André Lureau     g_assert(qnum_get_try_int(qnum, &val));
48501b2ffceSMarc-André Lureau     g_assert_cmpint(val, ==, -42);
48628770e05SMarkus Armbruster     qobject_decref(res);
48728770e05SMarkus Armbruster 
48828770e05SMarkus Armbruster     v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }");
48951e72bc1SEric Blake     visit_type_any(v, NULL, &res, &error_abort);
49028770e05SMarkus Armbruster     qdict = qobject_to_qdict(res);
49128770e05SMarkus Armbruster     g_assert(qdict && qdict_size(qdict) == 3);
49228770e05SMarkus Armbruster     qobj = qdict_get(qdict, "integer");
49328770e05SMarkus Armbruster     g_assert(qobj);
49401b2ffceSMarc-André Lureau     qnum = qobject_to_qnum(qobj);
49501b2ffceSMarc-André Lureau     g_assert(qnum);
49601b2ffceSMarc-André Lureau     g_assert(qnum_get_try_int(qnum, &val));
49701b2ffceSMarc-André Lureau     g_assert_cmpint(val, ==, -42);
49828770e05SMarkus Armbruster     qobj = qdict_get(qdict, "boolean");
49928770e05SMarkus Armbruster     g_assert(qobj);
50028770e05SMarkus Armbruster     qbool = qobject_to_qbool(qobj);
50128770e05SMarkus Armbruster     g_assert(qbool);
50228770e05SMarkus Armbruster     g_assert(qbool_get_bool(qbool) == true);
50328770e05SMarkus Armbruster     qobj = qdict_get(qdict, "string");
50428770e05SMarkus Armbruster     g_assert(qobj);
50528770e05SMarkus Armbruster     qstring = qobject_to_qstring(qobj);
50628770e05SMarkus Armbruster     g_assert(qstring);
50728770e05SMarkus Armbruster     g_assert_cmpstr(qstring_get_str(qstring), ==, "foo");
50828770e05SMarkus Armbruster     qobject_decref(res);
50928770e05SMarkus Armbruster }
51028770e05SMarkus Armbruster 
5113df016f1SEric Blake static void test_visitor_in_null(TestInputVisitorData *data,
5123df016f1SEric Blake                                  const void *unused)
5133df016f1SEric Blake {
5143df016f1SEric Blake     Visitor *v;
5153df016f1SEric Blake     Error *err = NULL;
516d2f95f4dSMarkus Armbruster     QNull *null;
5173df016f1SEric Blake     char *tmp;
5183df016f1SEric Blake 
5193df016f1SEric Blake     /*
5203df016f1SEric Blake      * FIXME: Since QAPI doesn't know the 'null' type yet, we can't
5213df016f1SEric Blake      * test visit_type_null() by reading into a QAPI struct then
5223df016f1SEric Blake      * checking that it was populated correctly.  The best we can do
5233df016f1SEric Blake      * for now is ensure that we consumed null from the input, proven
5243df016f1SEric Blake      * by the fact that we can't re-read the key; and that we detect
5253df016f1SEric Blake      * when input is not null.
5263df016f1SEric Blake      */
5273df016f1SEric Blake 
528cbd8acf3SDaniel P. Berrange     v = visitor_input_test_init_full(data, false,
529cbd8acf3SDaniel P. Berrange                                      "{ 'a': null, 'b': '' }");
5303df016f1SEric Blake     visit_start_struct(v, NULL, NULL, 0, &error_abort);
531d2f95f4dSMarkus Armbruster     visit_type_null(v, "a", &null, &error_abort);
532d2f95f4dSMarkus Armbruster     g_assert(qobject_type(QOBJECT(null)) == QTYPE_QNULL);
533d2f95f4dSMarkus Armbruster     QDECREF(null);
534d2f95f4dSMarkus Armbruster     visit_type_null(v, "b", &null, &err);
5353df016f1SEric Blake     error_free_or_abort(&err);
536d2f95f4dSMarkus Armbruster     g_assert(!null);
537ec95f614SMarkus Armbruster     visit_type_str(v, "c", &tmp, &err);
538ec95f614SMarkus Armbruster     error_free_or_abort(&err);
539d2f95f4dSMarkus Armbruster     g_assert(!tmp);
54015c2f669SEric Blake     visit_check_struct(v, &error_abort);
5411158bb2aSEric Blake     visit_end_struct(v, NULL);
5423df016f1SEric Blake }
5433df016f1SEric Blake 
5442fc00432SMarkus Armbruster static void test_visitor_in_union_flat(TestInputVisitorData *data,
5452fc00432SMarkus Armbruster                                        const void *unused)
5462fc00432SMarkus Armbruster {
5472fc00432SMarkus Armbruster     Visitor *v;
5482fc00432SMarkus Armbruster     UserDefFlatUnion *tmp;
54930594fe1SEric Blake     UserDefUnionBase *base;
5502fc00432SMarkus Armbruster 
5515223070cSWenchao Xia     v = visitor_input_test_init(data,
5525223070cSWenchao Xia                                 "{ 'enum1': 'value1', "
553441cbac0SMarkus Armbruster                                 "'integer': 41, "
5545223070cSWenchao Xia                                 "'string': 'str', "
5555223070cSWenchao Xia                                 "'boolean': true }");
5562fc00432SMarkus Armbruster 
55751e72bc1SEric Blake     visit_type_UserDefFlatUnion(v, NULL, &tmp, &error_abort);
5580f61af3eSMarkus Armbruster     g_assert_cmpint(tmp->enum1, ==, ENUM_ONE_VALUE1);
5595223070cSWenchao Xia     g_assert_cmpstr(tmp->string, ==, "str");
560441cbac0SMarkus Armbruster     g_assert_cmpint(tmp->integer, ==, 41);
561544a3731SEric Blake     g_assert_cmpint(tmp->u.value1.boolean, ==, true);
56230594fe1SEric Blake 
56330594fe1SEric Blake     base = qapi_UserDefFlatUnion_base(tmp);
56430594fe1SEric Blake     g_assert(&base->enum1 == &tmp->enum1);
56530594fe1SEric Blake 
5662fc00432SMarkus Armbruster     qapi_free_UserDefFlatUnion(tmp);
5672fc00432SMarkus Armbruster }
5682fc00432SMarkus Armbruster 
569ab045267SEric Blake static void test_visitor_in_alternate(TestInputVisitorData *data,
5702c38b600SMarkus Armbruster                                       const void *unused)
5712c38b600SMarkus Armbruster {
5722c38b600SMarkus Armbruster     Visitor *v;
573ab045267SEric Blake     UserDefAlternate *tmp;
57468d07839SEric Blake     WrapAlternate *wrap;
5752c38b600SMarkus Armbruster 
5762c38b600SMarkus Armbruster     v = visitor_input_test_init(data, "42");
57751e72bc1SEric Blake     visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort);
57801b2ffceSMarc-André Lureau     g_assert_cmpint(tmp->type, ==, QTYPE_QNUM);
579c363acefSEric Blake     g_assert_cmpint(tmp->u.i, ==, 42);
580ab045267SEric Blake     qapi_free_UserDefAlternate(tmp);
5819c51b441SEric Blake 
5828168ca8eSMarkus Armbruster     v = visitor_input_test_init(data, "'value1'");
58351e72bc1SEric Blake     visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort);
5840426d53cSEric Blake     g_assert_cmpint(tmp->type, ==, QTYPE_QSTRING);
5858168ca8eSMarkus Armbruster     g_assert_cmpint(tmp->u.e, ==, ENUM_ONE_VALUE1);
5869c51b441SEric Blake     qapi_free_UserDefAlternate(tmp);
5879c51b441SEric Blake 
5884d2d5c41SMarkus Armbruster     v = visitor_input_test_init(data, "null");
5894d2d5c41SMarkus Armbruster     visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort);
5904d2d5c41SMarkus Armbruster     g_assert_cmpint(tmp->type, ==, QTYPE_QNULL);
5914d2d5c41SMarkus Armbruster     qapi_free_UserDefAlternate(tmp);
5924d2d5c41SMarkus Armbruster 
59368d07839SEric Blake     v = visitor_input_test_init(data, "{'integer':1, 'string':'str', "
59468d07839SEric Blake                                 "'enum1':'value1', 'boolean':true}");
59568d07839SEric Blake     visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort);
59668d07839SEric Blake     g_assert_cmpint(tmp->type, ==, QTYPE_QDICT);
597becceedcSEric Blake     g_assert_cmpint(tmp->u.udfu.integer, ==, 1);
598becceedcSEric Blake     g_assert_cmpstr(tmp->u.udfu.string, ==, "str");
599becceedcSEric Blake     g_assert_cmpint(tmp->u.udfu.enum1, ==, ENUM_ONE_VALUE1);
600544a3731SEric Blake     g_assert_cmpint(tmp->u.udfu.u.value1.boolean, ==, true);
601544a3731SEric Blake     g_assert_cmpint(tmp->u.udfu.u.value1.has_a_b, ==, false);
60268d07839SEric Blake     qapi_free_UserDefAlternate(tmp);
60368d07839SEric Blake 
60468d07839SEric Blake     v = visitor_input_test_init(data, "{ 'alt': 42 }");
60568d07839SEric Blake     visit_type_WrapAlternate(v, NULL, &wrap, &error_abort);
60601b2ffceSMarc-André Lureau     g_assert_cmpint(wrap->alt->type, ==, QTYPE_QNUM);
60768d07839SEric Blake     g_assert_cmpint(wrap->alt->u.i, ==, 42);
60868d07839SEric Blake     qapi_free_WrapAlternate(wrap);
60968d07839SEric Blake 
6108168ca8eSMarkus Armbruster     v = visitor_input_test_init(data, "{ 'alt': 'value1' }");
61168d07839SEric Blake     visit_type_WrapAlternate(v, NULL, &wrap, &error_abort);
61268d07839SEric Blake     g_assert_cmpint(wrap->alt->type, ==, QTYPE_QSTRING);
6138168ca8eSMarkus Armbruster     g_assert_cmpint(wrap->alt->u.e, ==, ENUM_ONE_VALUE1);
61468d07839SEric Blake     qapi_free_WrapAlternate(wrap);
61568d07839SEric Blake 
61668d07839SEric Blake     v = visitor_input_test_init(data, "{ 'alt': {'integer':1, 'string':'str', "
61768d07839SEric Blake                                 "'enum1':'value1', 'boolean':true} }");
61868d07839SEric Blake     visit_type_WrapAlternate(v, NULL, &wrap, &error_abort);
61968d07839SEric Blake     g_assert_cmpint(wrap->alt->type, ==, QTYPE_QDICT);
620becceedcSEric Blake     g_assert_cmpint(wrap->alt->u.udfu.integer, ==, 1);
621becceedcSEric Blake     g_assert_cmpstr(wrap->alt->u.udfu.string, ==, "str");
622becceedcSEric Blake     g_assert_cmpint(wrap->alt->u.udfu.enum1, ==, ENUM_ONE_VALUE1);
623544a3731SEric Blake     g_assert_cmpint(wrap->alt->u.udfu.u.value1.boolean, ==, true);
624544a3731SEric Blake     g_assert_cmpint(wrap->alt->u.udfu.u.value1.has_a_b, ==, false);
62568d07839SEric Blake     qapi_free_WrapAlternate(wrap);
6269c51b441SEric Blake }
6279c51b441SEric Blake 
6289c51b441SEric Blake static void test_visitor_in_alternate_number(TestInputVisitorData *data,
6299c51b441SEric Blake                                              const void *unused)
6309c51b441SEric Blake {
6319c51b441SEric Blake     Visitor *v;
6329c51b441SEric Blake     Error *err = NULL;
6338168ca8eSMarkus Armbruster     AltEnumBool *aeb;
6348168ca8eSMarkus Armbruster     AltEnumNum *aen;
6358168ca8eSMarkus Armbruster     AltNumEnum *ans;
6368168ca8eSMarkus Armbruster     AltEnumInt *asi;
6379c51b441SEric Blake 
6389c51b441SEric Blake     /* Parsing an int */
6399c51b441SEric Blake 
6409c51b441SEric Blake     v = visitor_input_test_init(data, "42");
6418168ca8eSMarkus Armbruster     visit_type_AltEnumBool(v, NULL, &aeb, &err);
642a12a5a1aSEric Blake     error_free_or_abort(&err);
6438168ca8eSMarkus Armbruster     qapi_free_AltEnumBool(aeb);
6449c51b441SEric Blake 
6459c51b441SEric Blake     v = visitor_input_test_init(data, "42");
6468168ca8eSMarkus Armbruster     visit_type_AltEnumNum(v, NULL, &aen, &error_abort);
64701b2ffceSMarc-André Lureau     g_assert_cmpint(aen->type, ==, QTYPE_QNUM);
6488168ca8eSMarkus Armbruster     g_assert_cmpfloat(aen->u.n, ==, 42);
6498168ca8eSMarkus Armbruster     qapi_free_AltEnumNum(aen);
6509c51b441SEric Blake 
6519c51b441SEric Blake     v = visitor_input_test_init(data, "42");
6528168ca8eSMarkus Armbruster     visit_type_AltNumEnum(v, NULL, &ans, &error_abort);
65301b2ffceSMarc-André Lureau     g_assert_cmpint(ans->type, ==, QTYPE_QNUM);
654d00341afSEric Blake     g_assert_cmpfloat(ans->u.n, ==, 42);
6558168ca8eSMarkus Armbruster     qapi_free_AltNumEnum(ans);
6569c51b441SEric Blake 
6579c51b441SEric Blake     v = visitor_input_test_init(data, "42");
6588168ca8eSMarkus Armbruster     visit_type_AltEnumInt(v, NULL, &asi, &error_abort);
65901b2ffceSMarc-André Lureau     g_assert_cmpint(asi->type, ==, QTYPE_QNUM);
660c363acefSEric Blake     g_assert_cmpint(asi->u.i, ==, 42);
6618168ca8eSMarkus Armbruster     qapi_free_AltEnumInt(asi);
6629c51b441SEric Blake 
6639c51b441SEric Blake     /* Parsing a double */
6649c51b441SEric Blake 
6659c51b441SEric Blake     v = visitor_input_test_init(data, "42.5");
6668168ca8eSMarkus Armbruster     visit_type_AltEnumBool(v, NULL, &aeb, &err);
667a12a5a1aSEric Blake     error_free_or_abort(&err);
6688168ca8eSMarkus Armbruster     qapi_free_AltEnumBool(aeb);
6699c51b441SEric Blake 
6709c51b441SEric Blake     v = visitor_input_test_init(data, "42.5");
6718168ca8eSMarkus Armbruster     visit_type_AltEnumNum(v, NULL, &aen, &error_abort);
67201b2ffceSMarc-André Lureau     g_assert_cmpint(aen->type, ==, QTYPE_QNUM);
6738168ca8eSMarkus Armbruster     g_assert_cmpfloat(aen->u.n, ==, 42.5);
6748168ca8eSMarkus Armbruster     qapi_free_AltEnumNum(aen);
6759c51b441SEric Blake 
6769c51b441SEric Blake     v = visitor_input_test_init(data, "42.5");
6778168ca8eSMarkus Armbruster     visit_type_AltNumEnum(v, NULL, &ans, &error_abort);
67801b2ffceSMarc-André Lureau     g_assert_cmpint(ans->type, ==, QTYPE_QNUM);
679c363acefSEric Blake     g_assert_cmpfloat(ans->u.n, ==, 42.5);
6808168ca8eSMarkus Armbruster     qapi_free_AltNumEnum(ans);
6819c51b441SEric Blake 
6829c51b441SEric Blake     v = visitor_input_test_init(data, "42.5");
6838168ca8eSMarkus Armbruster     visit_type_AltEnumInt(v, NULL, &asi, &err);
684a12a5a1aSEric Blake     error_free_or_abort(&err);
6858168ca8eSMarkus Armbruster     qapi_free_AltEnumInt(asi);
6862c38b600SMarkus Armbruster }
6872c38b600SMarkus Armbruster 
688199e0f17SMichael Roth static void test_native_list_integer_helper(TestInputVisitorData *data,
689199e0f17SMichael Roth                                             const void *unused,
690199e0f17SMichael Roth                                             UserDefNativeListUnionKind kind)
691199e0f17SMichael Roth {
692199e0f17SMichael Roth     UserDefNativeListUnion *cvalue = NULL;
693199e0f17SMichael Roth     Visitor *v;
694199e0f17SMichael Roth     GString *gstr_list = g_string_new("");
695199e0f17SMichael Roth     GString *gstr_union = g_string_new("");
696199e0f17SMichael Roth     int i;
697199e0f17SMichael Roth 
698199e0f17SMichael Roth     for (i = 0; i < 32; i++) {
699199e0f17SMichael Roth         g_string_append_printf(gstr_list, "%d", i);
700199e0f17SMichael Roth         if (i != 31) {
701199e0f17SMichael Roth             g_string_append(gstr_list, ", ");
702199e0f17SMichael Roth         }
703199e0f17SMichael Roth     }
704199e0f17SMichael Roth     g_string_append_printf(gstr_union,  "{ 'type': '%s', 'data': [ %s ] }",
705977c736fSMarkus Armbruster                            UserDefNativeListUnionKind_str(kind),
706199e0f17SMichael Roth                            gstr_list->str);
707199e0f17SMichael Roth     v = visitor_input_test_init_raw(data,  gstr_union->str);
708199e0f17SMichael Roth 
70951e72bc1SEric Blake     visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort);
710199e0f17SMichael Roth     g_assert(cvalue != NULL);
711c363acefSEric Blake     g_assert_cmpint(cvalue->type, ==, kind);
712199e0f17SMichael Roth 
713199e0f17SMichael Roth     switch (kind) {
714199e0f17SMichael Roth     case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER: {
715199e0f17SMichael Roth         intList *elem = NULL;
71632bafa8fSEric Blake         for (i = 0, elem = cvalue->u.integer.data;
71732bafa8fSEric Blake              elem; elem = elem->next, i++) {
718199e0f17SMichael Roth             g_assert_cmpint(elem->value, ==, i);
719199e0f17SMichael Roth         }
720199e0f17SMichael Roth         break;
721199e0f17SMichael Roth     }
722199e0f17SMichael Roth     case USER_DEF_NATIVE_LIST_UNION_KIND_S8: {
723199e0f17SMichael Roth         int8List *elem = NULL;
72432bafa8fSEric Blake         for (i = 0, elem = cvalue->u.s8.data; elem; elem = elem->next, i++) {
725199e0f17SMichael Roth             g_assert_cmpint(elem->value, ==, i);
726199e0f17SMichael Roth         }
727199e0f17SMichael Roth         break;
728199e0f17SMichael Roth     }
729199e0f17SMichael Roth     case USER_DEF_NATIVE_LIST_UNION_KIND_S16: {
730199e0f17SMichael Roth         int16List *elem = NULL;
73132bafa8fSEric Blake         for (i = 0, elem = cvalue->u.s16.data; elem; elem = elem->next, i++) {
732199e0f17SMichael Roth             g_assert_cmpint(elem->value, ==, i);
733199e0f17SMichael Roth         }
734199e0f17SMichael Roth         break;
735199e0f17SMichael Roth     }
736199e0f17SMichael Roth     case USER_DEF_NATIVE_LIST_UNION_KIND_S32: {
737199e0f17SMichael Roth         int32List *elem = NULL;
73832bafa8fSEric Blake         for (i = 0, elem = cvalue->u.s32.data; elem; elem = elem->next, i++) {
739199e0f17SMichael Roth             g_assert_cmpint(elem->value, ==, i);
740199e0f17SMichael Roth         }
741199e0f17SMichael Roth         break;
742199e0f17SMichael Roth     }
743199e0f17SMichael Roth     case USER_DEF_NATIVE_LIST_UNION_KIND_S64: {
744199e0f17SMichael Roth         int64List *elem = NULL;
74532bafa8fSEric Blake         for (i = 0, elem = cvalue->u.s64.data; elem; elem = elem->next, i++) {
746199e0f17SMichael Roth             g_assert_cmpint(elem->value, ==, i);
747199e0f17SMichael Roth         }
748199e0f17SMichael Roth         break;
749199e0f17SMichael Roth     }
750199e0f17SMichael Roth     case USER_DEF_NATIVE_LIST_UNION_KIND_U8: {
751199e0f17SMichael Roth         uint8List *elem = NULL;
75232bafa8fSEric Blake         for (i = 0, elem = cvalue->u.u8.data; elem; elem = elem->next, i++) {
753199e0f17SMichael Roth             g_assert_cmpint(elem->value, ==, i);
754199e0f17SMichael Roth         }
755199e0f17SMichael Roth         break;
756199e0f17SMichael Roth     }
757199e0f17SMichael Roth     case USER_DEF_NATIVE_LIST_UNION_KIND_U16: {
758199e0f17SMichael Roth         uint16List *elem = NULL;
75932bafa8fSEric Blake         for (i = 0, elem = cvalue->u.u16.data; elem; elem = elem->next, i++) {
760199e0f17SMichael Roth             g_assert_cmpint(elem->value, ==, i);
761199e0f17SMichael Roth         }
762199e0f17SMichael Roth         break;
763199e0f17SMichael Roth     }
764199e0f17SMichael Roth     case USER_DEF_NATIVE_LIST_UNION_KIND_U32: {
765199e0f17SMichael Roth         uint32List *elem = NULL;
76632bafa8fSEric Blake         for (i = 0, elem = cvalue->u.u32.data; elem; elem = elem->next, i++) {
767199e0f17SMichael Roth             g_assert_cmpint(elem->value, ==, i);
768199e0f17SMichael Roth         }
769199e0f17SMichael Roth         break;
770199e0f17SMichael Roth     }
771199e0f17SMichael Roth     case USER_DEF_NATIVE_LIST_UNION_KIND_U64: {
772199e0f17SMichael Roth         uint64List *elem = NULL;
77332bafa8fSEric Blake         for (i = 0, elem = cvalue->u.u64.data; elem; elem = elem->next, i++) {
774199e0f17SMichael Roth             g_assert_cmpint(elem->value, ==, i);
775199e0f17SMichael Roth         }
776199e0f17SMichael Roth         break;
777199e0f17SMichael Roth     }
778199e0f17SMichael Roth     default:
779dfc6f865SStefan Weil         g_assert_not_reached();
780199e0f17SMichael Roth     }
781199e0f17SMichael Roth 
782199e0f17SMichael Roth     g_string_free(gstr_union, true);
783199e0f17SMichael Roth     g_string_free(gstr_list, true);
784199e0f17SMichael Roth     qapi_free_UserDefNativeListUnion(cvalue);
785199e0f17SMichael Roth }
786199e0f17SMichael Roth 
787199e0f17SMichael Roth static void test_visitor_in_native_list_int(TestInputVisitorData *data,
788199e0f17SMichael Roth                                             const void *unused)
789199e0f17SMichael Roth {
790199e0f17SMichael Roth     test_native_list_integer_helper(data, unused,
791199e0f17SMichael Roth                                     USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER);
792199e0f17SMichael Roth }
793199e0f17SMichael Roth 
794199e0f17SMichael Roth static void test_visitor_in_native_list_int8(TestInputVisitorData *data,
795199e0f17SMichael Roth                                              const void *unused)
796199e0f17SMichael Roth {
797199e0f17SMichael Roth     test_native_list_integer_helper(data, unused,
798199e0f17SMichael Roth                                     USER_DEF_NATIVE_LIST_UNION_KIND_S8);
799199e0f17SMichael Roth }
800199e0f17SMichael Roth 
801199e0f17SMichael Roth static void test_visitor_in_native_list_int16(TestInputVisitorData *data,
802199e0f17SMichael Roth                                               const void *unused)
803199e0f17SMichael Roth {
804199e0f17SMichael Roth     test_native_list_integer_helper(data, unused,
805199e0f17SMichael Roth                                     USER_DEF_NATIVE_LIST_UNION_KIND_S16);
806199e0f17SMichael Roth }
807199e0f17SMichael Roth 
808199e0f17SMichael Roth static void test_visitor_in_native_list_int32(TestInputVisitorData *data,
809199e0f17SMichael Roth                                               const void *unused)
810199e0f17SMichael Roth {
811199e0f17SMichael Roth     test_native_list_integer_helper(data, unused,
812199e0f17SMichael Roth                                     USER_DEF_NATIVE_LIST_UNION_KIND_S32);
813199e0f17SMichael Roth }
814199e0f17SMichael Roth 
815199e0f17SMichael Roth static void test_visitor_in_native_list_int64(TestInputVisitorData *data,
816199e0f17SMichael Roth                                               const void *unused)
817199e0f17SMichael Roth {
818199e0f17SMichael Roth     test_native_list_integer_helper(data, unused,
819199e0f17SMichael Roth                                     USER_DEF_NATIVE_LIST_UNION_KIND_S64);
820199e0f17SMichael Roth }
821199e0f17SMichael Roth 
822199e0f17SMichael Roth static void test_visitor_in_native_list_uint8(TestInputVisitorData *data,
823199e0f17SMichael Roth                                              const void *unused)
824199e0f17SMichael Roth {
825199e0f17SMichael Roth     test_native_list_integer_helper(data, unused,
826199e0f17SMichael Roth                                     USER_DEF_NATIVE_LIST_UNION_KIND_U8);
827199e0f17SMichael Roth }
828199e0f17SMichael Roth 
829199e0f17SMichael Roth static void test_visitor_in_native_list_uint16(TestInputVisitorData *data,
830199e0f17SMichael Roth                                                const void *unused)
831199e0f17SMichael Roth {
832199e0f17SMichael Roth     test_native_list_integer_helper(data, unused,
833199e0f17SMichael Roth                                     USER_DEF_NATIVE_LIST_UNION_KIND_U16);
834199e0f17SMichael Roth }
835199e0f17SMichael Roth 
836199e0f17SMichael Roth static void test_visitor_in_native_list_uint32(TestInputVisitorData *data,
837199e0f17SMichael Roth                                                const void *unused)
838199e0f17SMichael Roth {
839199e0f17SMichael Roth     test_native_list_integer_helper(data, unused,
840199e0f17SMichael Roth                                     USER_DEF_NATIVE_LIST_UNION_KIND_U32);
841199e0f17SMichael Roth }
842199e0f17SMichael Roth 
843199e0f17SMichael Roth static void test_visitor_in_native_list_uint64(TestInputVisitorData *data,
844199e0f17SMichael Roth                                                const void *unused)
845199e0f17SMichael Roth {
846199e0f17SMichael Roth     test_native_list_integer_helper(data, unused,
847199e0f17SMichael Roth                                     USER_DEF_NATIVE_LIST_UNION_KIND_U64);
848199e0f17SMichael Roth }
849199e0f17SMichael Roth 
850199e0f17SMichael Roth static void test_visitor_in_native_list_bool(TestInputVisitorData *data,
851199e0f17SMichael Roth                                             const void *unused)
852199e0f17SMichael Roth {
853199e0f17SMichael Roth     UserDefNativeListUnion *cvalue = NULL;
854199e0f17SMichael Roth     boolList *elem = NULL;
855199e0f17SMichael Roth     Visitor *v;
856199e0f17SMichael Roth     GString *gstr_list = g_string_new("");
857199e0f17SMichael Roth     GString *gstr_union = g_string_new("");
858199e0f17SMichael Roth     int i;
859199e0f17SMichael Roth 
860199e0f17SMichael Roth     for (i = 0; i < 32; i++) {
861199e0f17SMichael Roth         g_string_append_printf(gstr_list, "%s",
862199e0f17SMichael Roth                                (i % 3 == 0) ? "true" : "false");
863199e0f17SMichael Roth         if (i != 31) {
864199e0f17SMichael Roth             g_string_append(gstr_list, ", ");
865199e0f17SMichael Roth         }
866199e0f17SMichael Roth     }
867199e0f17SMichael Roth     g_string_append_printf(gstr_union,  "{ 'type': 'boolean', 'data': [ %s ] }",
868199e0f17SMichael Roth                            gstr_list->str);
869199e0f17SMichael Roth     v = visitor_input_test_init_raw(data,  gstr_union->str);
870199e0f17SMichael Roth 
87151e72bc1SEric Blake     visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort);
872199e0f17SMichael Roth     g_assert(cvalue != NULL);
873c363acefSEric Blake     g_assert_cmpint(cvalue->type, ==, USER_DEF_NATIVE_LIST_UNION_KIND_BOOLEAN);
874199e0f17SMichael Roth 
87532bafa8fSEric Blake     for (i = 0, elem = cvalue->u.boolean.data; elem; elem = elem->next, i++) {
876199e0f17SMichael Roth         g_assert_cmpint(elem->value, ==, (i % 3 == 0) ? 1 : 0);
877199e0f17SMichael Roth     }
878199e0f17SMichael Roth 
879199e0f17SMichael Roth     g_string_free(gstr_union, true);
880199e0f17SMichael Roth     g_string_free(gstr_list, true);
881199e0f17SMichael Roth     qapi_free_UserDefNativeListUnion(cvalue);
882199e0f17SMichael Roth }
883199e0f17SMichael Roth 
884199e0f17SMichael Roth static void test_visitor_in_native_list_string(TestInputVisitorData *data,
885199e0f17SMichael Roth                                                const void *unused)
886199e0f17SMichael Roth {
887199e0f17SMichael Roth     UserDefNativeListUnion *cvalue = NULL;
888199e0f17SMichael Roth     strList *elem = NULL;
889199e0f17SMichael Roth     Visitor *v;
890199e0f17SMichael Roth     GString *gstr_list = g_string_new("");
891199e0f17SMichael Roth     GString *gstr_union = g_string_new("");
892199e0f17SMichael Roth     int i;
893199e0f17SMichael Roth 
894199e0f17SMichael Roth     for (i = 0; i < 32; i++) {
895199e0f17SMichael Roth         g_string_append_printf(gstr_list, "'%d'", i);
896199e0f17SMichael Roth         if (i != 31) {
897199e0f17SMichael Roth             g_string_append(gstr_list, ", ");
898199e0f17SMichael Roth         }
899199e0f17SMichael Roth     }
900199e0f17SMichael Roth     g_string_append_printf(gstr_union,  "{ 'type': 'string', 'data': [ %s ] }",
901199e0f17SMichael Roth                            gstr_list->str);
902199e0f17SMichael Roth     v = visitor_input_test_init_raw(data,  gstr_union->str);
903199e0f17SMichael Roth 
90451e72bc1SEric Blake     visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort);
905199e0f17SMichael Roth     g_assert(cvalue != NULL);
906c363acefSEric Blake     g_assert_cmpint(cvalue->type, ==, USER_DEF_NATIVE_LIST_UNION_KIND_STRING);
907199e0f17SMichael Roth 
90832bafa8fSEric Blake     for (i = 0, elem = cvalue->u.string.data; elem; elem = elem->next, i++) {
909199e0f17SMichael Roth         gchar str[8];
910199e0f17SMichael Roth         sprintf(str, "%d", i);
911199e0f17SMichael Roth         g_assert_cmpstr(elem->value, ==, str);
912199e0f17SMichael Roth     }
913199e0f17SMichael Roth 
914199e0f17SMichael Roth     g_string_free(gstr_union, true);
915199e0f17SMichael Roth     g_string_free(gstr_list, true);
916199e0f17SMichael Roth     qapi_free_UserDefNativeListUnion(cvalue);
917199e0f17SMichael Roth }
918199e0f17SMichael Roth 
919199e0f17SMichael Roth #define DOUBLE_STR_MAX 16
920199e0f17SMichael Roth 
921199e0f17SMichael Roth static void test_visitor_in_native_list_number(TestInputVisitorData *data,
922199e0f17SMichael Roth                                                const void *unused)
923199e0f17SMichael Roth {
924199e0f17SMichael Roth     UserDefNativeListUnion *cvalue = NULL;
925199e0f17SMichael Roth     numberList *elem = NULL;
926199e0f17SMichael Roth     Visitor *v;
927199e0f17SMichael Roth     GString *gstr_list = g_string_new("");
928199e0f17SMichael Roth     GString *gstr_union = g_string_new("");
929199e0f17SMichael Roth     int i;
930199e0f17SMichael Roth 
931199e0f17SMichael Roth     for (i = 0; i < 32; i++) {
932199e0f17SMichael Roth         g_string_append_printf(gstr_list, "%f", (double)i / 3);
933199e0f17SMichael Roth         if (i != 31) {
934199e0f17SMichael Roth             g_string_append(gstr_list, ", ");
935199e0f17SMichael Roth         }
936199e0f17SMichael Roth     }
937199e0f17SMichael Roth     g_string_append_printf(gstr_union,  "{ 'type': 'number', 'data': [ %s ] }",
938199e0f17SMichael Roth                            gstr_list->str);
939199e0f17SMichael Roth     v = visitor_input_test_init_raw(data,  gstr_union->str);
940199e0f17SMichael Roth 
94151e72bc1SEric Blake     visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort);
942199e0f17SMichael Roth     g_assert(cvalue != NULL);
943c363acefSEric Blake     g_assert_cmpint(cvalue->type, ==, USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER);
944199e0f17SMichael Roth 
94532bafa8fSEric Blake     for (i = 0, elem = cvalue->u.number.data; elem; elem = elem->next, i++) {
946199e0f17SMichael Roth         GString *double_expected = g_string_new("");
947199e0f17SMichael Roth         GString *double_actual = g_string_new("");
948199e0f17SMichael Roth 
949199e0f17SMichael Roth         g_string_printf(double_expected, "%.6f", (double)i / 3);
950199e0f17SMichael Roth         g_string_printf(double_actual, "%.6f", elem->value);
951199e0f17SMichael Roth         g_assert_cmpstr(double_expected->str, ==, double_actual->str);
952199e0f17SMichael Roth 
953199e0f17SMichael Roth         g_string_free(double_expected, true);
954199e0f17SMichael Roth         g_string_free(double_actual, true);
955199e0f17SMichael Roth     }
956199e0f17SMichael Roth 
957199e0f17SMichael Roth     g_string_free(gstr_union, true);
958199e0f17SMichael Roth     g_string_free(gstr_list, true);
959199e0f17SMichael Roth     qapi_free_UserDefNativeListUnion(cvalue);
960199e0f17SMichael Roth }
961199e0f17SMichael Roth 
962d88f5fd1SLuiz Capitulino static void input_visitor_test_add(const char *testpath,
963b1d2e5f1SDaniel P. Berrange                                    const void *user_data,
964b1d2e5f1SDaniel P. Berrange                                    void (*test_func)(TestInputVisitorData *data,
965b1d2e5f1SDaniel P. Berrange                                                      const void *user_data))
966d88f5fd1SLuiz Capitulino {
967b1d2e5f1SDaniel P. Berrange     g_test_add(testpath, TestInputVisitorData, user_data, NULL, test_func,
968d88f5fd1SLuiz Capitulino                visitor_input_teardown);
969d88f5fd1SLuiz Capitulino }
970d88f5fd1SLuiz Capitulino 
9713dcf71f6SPaolo Bonzini static void test_visitor_in_errors(TestInputVisitorData *data,
9723dcf71f6SPaolo Bonzini                                    const void *unused)
9733dcf71f6SPaolo Bonzini {
9743dcf71f6SPaolo Bonzini     TestStruct *p = NULL;
975e940f543SMarkus Armbruster     Error *err = NULL;
9763dcf71f6SPaolo Bonzini     Visitor *v;
977dd5ee2c2SEric Blake     strList *q = NULL;
9789b4e38feSEric Blake     UserDefTwo *r = NULL;
9799b4e38feSEric Blake     WrapAlternate *s = NULL;
9803dcf71f6SPaolo Bonzini 
981dd5ee2c2SEric Blake     v = visitor_input_test_init(data, "{ 'integer': false, 'boolean': 'foo', "
982dd5ee2c2SEric Blake                                 "'string': -42 }");
9833dcf71f6SPaolo Bonzini 
98451e72bc1SEric Blake     visit_type_TestStruct(v, NULL, &p, &err);
985a12a5a1aSEric Blake     error_free_or_abort(&err);
98668ab47e4SEric Blake     g_assert(!p);
987dd5ee2c2SEric Blake 
988dd5ee2c2SEric Blake     v = visitor_input_test_init(data, "[ '1', '2', false, '3' ]");
98951e72bc1SEric Blake     visit_type_strList(v, NULL, &q, &err);
990dd5ee2c2SEric Blake     error_free_or_abort(&err);
99168ab47e4SEric Blake     assert(!q);
9929b4e38feSEric Blake 
9939b4e38feSEric Blake     v = visitor_input_test_init(data, "{ 'str':'hi' }");
9949b4e38feSEric Blake     visit_type_UserDefTwo(v, NULL, &r, &err);
9959b4e38feSEric Blake     error_free_or_abort(&err);
9969b4e38feSEric Blake     assert(!r);
9979b4e38feSEric Blake 
9989b4e38feSEric Blake     v = visitor_input_test_init(data, "{ }");
9999b4e38feSEric Blake     visit_type_WrapAlternate(v, NULL, &s, &err);
10009b4e38feSEric Blake     error_free_or_abort(&err);
10019b4e38feSEric Blake     assert(!s);
10023dcf71f6SPaolo Bonzini }
10033dcf71f6SPaolo Bonzini 
10042533377cSEric Blake static void test_visitor_in_wrong_type(TestInputVisitorData *data,
10052533377cSEric Blake                                        const void *unused)
10062533377cSEric Blake {
10072533377cSEric Blake     TestStruct *p = NULL;
10082533377cSEric Blake     Visitor *v;
10092533377cSEric Blake     strList *q = NULL;
10102533377cSEric Blake     int64_t i;
10112533377cSEric Blake     Error *err = NULL;
10122533377cSEric Blake 
10132533377cSEric Blake     /* Make sure arrays and structs cannot be confused */
10142533377cSEric Blake 
10152533377cSEric Blake     v = visitor_input_test_init(data, "[]");
101651e72bc1SEric Blake     visit_type_TestStruct(v, NULL, &p, &err);
10172533377cSEric Blake     error_free_or_abort(&err);
10182533377cSEric Blake     g_assert(!p);
10192533377cSEric Blake 
10202533377cSEric Blake     v = visitor_input_test_init(data, "{}");
102151e72bc1SEric Blake     visit_type_strList(v, NULL, &q, &err);
10222533377cSEric Blake     error_free_or_abort(&err);
10232533377cSEric Blake     assert(!q);
10242533377cSEric Blake 
10252533377cSEric Blake     /* Make sure primitives and struct cannot be confused */
10262533377cSEric Blake 
10272533377cSEric Blake     v = visitor_input_test_init(data, "1");
102851e72bc1SEric Blake     visit_type_TestStruct(v, NULL, &p, &err);
10292533377cSEric Blake     error_free_or_abort(&err);
10302533377cSEric Blake     g_assert(!p);
10312533377cSEric Blake 
10322533377cSEric Blake     v = visitor_input_test_init(data, "{}");
103351e72bc1SEric Blake     visit_type_int(v, NULL, &i, &err);
10342533377cSEric Blake     error_free_or_abort(&err);
10352533377cSEric Blake 
10362533377cSEric Blake     /* Make sure primitives and arrays cannot be confused */
10372533377cSEric Blake 
10382533377cSEric Blake     v = visitor_input_test_init(data, "1");
103951e72bc1SEric Blake     visit_type_strList(v, NULL, &q, &err);
10402533377cSEric Blake     error_free_or_abort(&err);
10412533377cSEric Blake     assert(!q);
10422533377cSEric Blake 
10432533377cSEric Blake     v = visitor_input_test_init(data, "[]");
104451e72bc1SEric Blake     visit_type_int(v, NULL, &i, &err);
10452533377cSEric Blake     error_free_or_abort(&err);
10462533377cSEric Blake }
10472533377cSEric Blake 
104877c47de2SMarkus Armbruster static void test_visitor_in_fail_struct(TestInputVisitorData *data,
104977c47de2SMarkus Armbruster                                         const void *unused)
105077c47de2SMarkus Armbruster {
105177c47de2SMarkus Armbruster     TestStruct *p = NULL;
105277c47de2SMarkus Armbruster     Error *err = NULL;
105377c47de2SMarkus Armbruster     Visitor *v;
105477c47de2SMarkus Armbruster 
105577c47de2SMarkus Armbruster     v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo', 'extra': 42 }");
105677c47de2SMarkus Armbruster 
105777c47de2SMarkus Armbruster     visit_type_TestStruct(v, NULL, &p, &err);
105877c47de2SMarkus Armbruster     error_free_or_abort(&err);
105977c47de2SMarkus Armbruster     g_assert(!p);
106077c47de2SMarkus Armbruster }
106177c47de2SMarkus Armbruster 
106277c47de2SMarkus Armbruster static void test_visitor_in_fail_struct_nested(TestInputVisitorData *data,
106377c47de2SMarkus Armbruster                                                const void *unused)
106477c47de2SMarkus Armbruster {
106577c47de2SMarkus Armbruster     UserDefTwo *udp = NULL;
106677c47de2SMarkus Armbruster     Error *err = NULL;
106777c47de2SMarkus Armbruster     Visitor *v;
106877c47de2SMarkus Armbruster 
106977c47de2SMarkus Armbruster     v = visitor_input_test_init(data, "{ 'string0': 'string0', 'dict1': { 'string1': 'string1', 'dict2': { 'userdef1': { 'integer': 42, 'string': 'string', 'extra': [42, 23, {'foo':'bar'}] }, 'string2': 'string2'}}}");
107077c47de2SMarkus Armbruster 
107177c47de2SMarkus Armbruster     visit_type_UserDefTwo(v, NULL, &udp, &err);
107277c47de2SMarkus Armbruster     error_free_or_abort(&err);
107377c47de2SMarkus Armbruster     g_assert(!udp);
107477c47de2SMarkus Armbruster }
107577c47de2SMarkus Armbruster 
107677c47de2SMarkus Armbruster static void test_visitor_in_fail_struct_in_list(TestInputVisitorData *data,
107777c47de2SMarkus Armbruster                                                 const void *unused)
107877c47de2SMarkus Armbruster {
107977c47de2SMarkus Armbruster     UserDefOneList *head = NULL;
108077c47de2SMarkus Armbruster     Error *err = NULL;
108177c47de2SMarkus Armbruster     Visitor *v;
108277c47de2SMarkus Armbruster 
108377c47de2SMarkus Armbruster     v = visitor_input_test_init(data, "[ { 'string': 'string0', 'integer': 42 }, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44, 'extra': 'ggg' } ]");
108477c47de2SMarkus Armbruster 
108577c47de2SMarkus Armbruster     visit_type_UserDefOneList(v, NULL, &head, &err);
108677c47de2SMarkus Armbruster     error_free_or_abort(&err);
108777c47de2SMarkus Armbruster     g_assert(!head);
108877c47de2SMarkus Armbruster }
108977c47de2SMarkus Armbruster 
109077c47de2SMarkus Armbruster static void test_visitor_in_fail_struct_missing(TestInputVisitorData *data,
109177c47de2SMarkus Armbruster                                                 const void *unused)
109277c47de2SMarkus Armbruster {
109377c47de2SMarkus Armbruster     Error *err = NULL;
109477c47de2SMarkus Armbruster     Visitor *v;
109577c47de2SMarkus Armbruster     QObject *any;
1096d2f95f4dSMarkus Armbruster     QNull *null;
109777c47de2SMarkus Armbruster     GenericAlternate *alt;
109877c47de2SMarkus Armbruster     bool present;
109977c47de2SMarkus Armbruster     int en;
110077c47de2SMarkus Armbruster     int64_t i64;
110177c47de2SMarkus Armbruster     uint32_t u32;
110277c47de2SMarkus Armbruster     int8_t i8;
110377c47de2SMarkus Armbruster     char *str;
110477c47de2SMarkus Armbruster     double dbl;
110577c47de2SMarkus Armbruster 
110686ca0dbeSMarkus Armbruster     v = visitor_input_test_init(data, "{ 'sub': [ {} ] }");
110777c47de2SMarkus Armbruster     visit_start_struct(v, NULL, NULL, 0, &error_abort);
110877c47de2SMarkus Armbruster     visit_start_struct(v, "struct", NULL, 0, &err);
110977c47de2SMarkus Armbruster     error_free_or_abort(&err);
111077c47de2SMarkus Armbruster     visit_start_list(v, "list", NULL, 0, &err);
111177c47de2SMarkus Armbruster     error_free_or_abort(&err);
111260390d2dSMarc-André Lureau     visit_start_alternate(v, "alternate", &alt, sizeof(*alt), &err);
111377c47de2SMarkus Armbruster     error_free_or_abort(&err);
111477c47de2SMarkus Armbruster     visit_optional(v, "optional", &present);
111577c47de2SMarkus Armbruster     g_assert(!present);
1116f7abe0ecSMarc-André Lureau     visit_type_enum(v, "enum", &en, &EnumOne_lookup, &err);
111777c47de2SMarkus Armbruster     error_free_or_abort(&err);
111877c47de2SMarkus Armbruster     visit_type_int(v, "i64", &i64, &err);
111977c47de2SMarkus Armbruster     error_free_or_abort(&err);
112077c47de2SMarkus Armbruster     visit_type_uint32(v, "u32", &u32, &err);
112177c47de2SMarkus Armbruster     error_free_or_abort(&err);
112277c47de2SMarkus Armbruster     visit_type_int8(v, "i8", &i8, &err);
112377c47de2SMarkus Armbruster     error_free_or_abort(&err);
112477c47de2SMarkus Armbruster     visit_type_str(v, "i8", &str, &err);
112577c47de2SMarkus Armbruster     error_free_or_abort(&err);
112677c47de2SMarkus Armbruster     visit_type_number(v, "dbl", &dbl, &err);
112777c47de2SMarkus Armbruster     error_free_or_abort(&err);
112877c47de2SMarkus Armbruster     visit_type_any(v, "any", &any, &err);
112977c47de2SMarkus Armbruster     error_free_or_abort(&err);
1130d2f95f4dSMarkus Armbruster     visit_type_null(v, "null", &null, &err);
113177c47de2SMarkus Armbruster     error_free_or_abort(&err);
113286ca0dbeSMarkus Armbruster     visit_start_list(v, "sub", NULL, 0, &error_abort);
113386ca0dbeSMarkus Armbruster     visit_start_struct(v, NULL, NULL, 0, &error_abort);
113486ca0dbeSMarkus Armbruster     visit_type_int(v, "i64", &i64, &err);
113586ca0dbeSMarkus Armbruster     error_free_or_abort(&err);
113686ca0dbeSMarkus Armbruster     visit_end_struct(v, NULL);
113786ca0dbeSMarkus Armbruster     visit_end_list(v, NULL);
113877c47de2SMarkus Armbruster     visit_end_struct(v, NULL);
113977c47de2SMarkus Armbruster }
114077c47de2SMarkus Armbruster 
11419cb8ef36SMarkus Armbruster static void test_visitor_in_fail_list(TestInputVisitorData *data,
11429cb8ef36SMarkus Armbruster                                       const void *unused)
11439cb8ef36SMarkus Armbruster {
11449cb8ef36SMarkus Armbruster     int64_t i64 = -1;
1145a4a1c70dSMarkus Armbruster     Error *err = NULL;
11469cb8ef36SMarkus Armbruster     Visitor *v;
11479cb8ef36SMarkus Armbruster 
11489cb8ef36SMarkus Armbruster     /* Unvisited list tail */
11499cb8ef36SMarkus Armbruster 
11509cb8ef36SMarkus Armbruster     v = visitor_input_test_init(data, "[ 1, 2, 3 ]");
11519cb8ef36SMarkus Armbruster 
11529cb8ef36SMarkus Armbruster     visit_start_list(v, NULL, NULL, 0, &error_abort);
11539cb8ef36SMarkus Armbruster     visit_type_int(v, NULL, &i64, &error_abort);
11549cb8ef36SMarkus Armbruster     g_assert_cmpint(i64, ==, 1);
11559cb8ef36SMarkus Armbruster     visit_type_int(v, NULL, &i64, &error_abort);
11569cb8ef36SMarkus Armbruster     g_assert_cmpint(i64, ==, 2);
1157a4a1c70dSMarkus Armbruster     visit_check_list(v, &err);
1158a4a1c70dSMarkus Armbruster     error_free_or_abort(&err);
11599cb8ef36SMarkus Armbruster     visit_end_list(v, NULL);
1160a9416dc6SMarkus Armbruster 
1161a9416dc6SMarkus Armbruster     /* Visit beyond end of list */
1162a9416dc6SMarkus Armbruster     v = visitor_input_test_init(data, "[]");
1163a9416dc6SMarkus Armbruster 
1164a9416dc6SMarkus Armbruster     visit_start_list(v, NULL, NULL, 0, &error_abort);
1165a9416dc6SMarkus Armbruster     visit_type_int(v, NULL, &i64, &err);
1166a9416dc6SMarkus Armbruster     error_free_or_abort(&err);
1167a9416dc6SMarkus Armbruster     visit_end_list(v, NULL);
11689cb8ef36SMarkus Armbruster }
11699cb8ef36SMarkus Armbruster 
11709cb8ef36SMarkus Armbruster static void test_visitor_in_fail_list_nested(TestInputVisitorData *data,
11719cb8ef36SMarkus Armbruster                                              const void *unused)
11729cb8ef36SMarkus Armbruster {
11739cb8ef36SMarkus Armbruster     int64_t i64 = -1;
1174a4a1c70dSMarkus Armbruster     Error *err = NULL;
11759cb8ef36SMarkus Armbruster     Visitor *v;
11769cb8ef36SMarkus Armbruster 
11779cb8ef36SMarkus Armbruster     /* Unvisited nested list tail */
11789cb8ef36SMarkus Armbruster 
11799cb8ef36SMarkus Armbruster     v = visitor_input_test_init(data, "[ 0, [ 1, 2, 3 ] ]");
11809cb8ef36SMarkus Armbruster 
11819cb8ef36SMarkus Armbruster     visit_start_list(v, NULL, NULL, 0, &error_abort);
11829cb8ef36SMarkus Armbruster     visit_type_int(v, NULL, &i64, &error_abort);
11839cb8ef36SMarkus Armbruster     g_assert_cmpint(i64, ==, 0);
11849cb8ef36SMarkus Armbruster     visit_start_list(v, NULL, NULL, 0, &error_abort);
11859cb8ef36SMarkus Armbruster     visit_type_int(v, NULL, &i64, &error_abort);
11869cb8ef36SMarkus Armbruster     g_assert_cmpint(i64, ==, 1);
1187a4a1c70dSMarkus Armbruster     visit_check_list(v, &err);
1188a4a1c70dSMarkus Armbruster     error_free_or_abort(&err);
11899cb8ef36SMarkus Armbruster     visit_end_list(v, NULL);
1190a4a1c70dSMarkus Armbruster     visit_check_list(v, &error_abort);
11919cb8ef36SMarkus Armbruster     visit_end_list(v, NULL);
11929cb8ef36SMarkus Armbruster }
11939cb8ef36SMarkus Armbruster 
119477c47de2SMarkus Armbruster static void test_visitor_in_fail_union_native_list(TestInputVisitorData *data,
119577c47de2SMarkus Armbruster                                                    const void *unused)
119677c47de2SMarkus Armbruster {
119777c47de2SMarkus Armbruster     UserDefNativeListUnion *tmp = NULL;
119877c47de2SMarkus Armbruster     Error *err = NULL;
119977c47de2SMarkus Armbruster     Visitor *v;
120077c47de2SMarkus Armbruster 
120177c47de2SMarkus Armbruster     v = visitor_input_test_init(data,
120277c47de2SMarkus Armbruster                                 "{ 'type': 'integer', 'data' : [ 'string' ] }");
120377c47de2SMarkus Armbruster 
120477c47de2SMarkus Armbruster     visit_type_UserDefNativeListUnion(v, NULL, &tmp, &err);
120577c47de2SMarkus Armbruster     error_free_or_abort(&err);
120677c47de2SMarkus Armbruster     g_assert(!tmp);
120777c47de2SMarkus Armbruster }
120877c47de2SMarkus Armbruster 
120977c47de2SMarkus Armbruster static void test_visitor_in_fail_union_flat(TestInputVisitorData *data,
121077c47de2SMarkus Armbruster                                             const void *unused)
121177c47de2SMarkus Armbruster {
121277c47de2SMarkus Armbruster     UserDefFlatUnion *tmp = NULL;
121377c47de2SMarkus Armbruster     Error *err = NULL;
121477c47de2SMarkus Armbruster     Visitor *v;
121577c47de2SMarkus Armbruster 
121677c47de2SMarkus Armbruster     v = visitor_input_test_init(data, "{ 'string': 'c', 'integer': 41, 'boolean': true }");
121777c47de2SMarkus Armbruster 
121877c47de2SMarkus Armbruster     visit_type_UserDefFlatUnion(v, NULL, &tmp, &err);
121977c47de2SMarkus Armbruster     error_free_or_abort(&err);
122077c47de2SMarkus Armbruster     g_assert(!tmp);
122177c47de2SMarkus Armbruster }
122277c47de2SMarkus Armbruster 
122377c47de2SMarkus Armbruster static void test_visitor_in_fail_union_flat_no_discrim(TestInputVisitorData *data,
122477c47de2SMarkus Armbruster                                                        const void *unused)
122577c47de2SMarkus Armbruster {
122677c47de2SMarkus Armbruster     UserDefFlatUnion2 *tmp = NULL;
122777c47de2SMarkus Armbruster     Error *err = NULL;
122877c47de2SMarkus Armbruster     Visitor *v;
122977c47de2SMarkus Armbruster 
123077c47de2SMarkus Armbruster     /* test situation where discriminator field ('enum1' here) is missing */
123177c47de2SMarkus Armbruster     v = visitor_input_test_init(data, "{ 'integer': 42, 'string': 'c', 'string1': 'd', 'string2': 'e' }");
123277c47de2SMarkus Armbruster 
123377c47de2SMarkus Armbruster     visit_type_UserDefFlatUnion2(v, NULL, &tmp, &err);
123477c47de2SMarkus Armbruster     error_free_or_abort(&err);
123577c47de2SMarkus Armbruster     g_assert(!tmp);
123677c47de2SMarkus Armbruster }
123777c47de2SMarkus Armbruster 
123877c47de2SMarkus Armbruster static void test_visitor_in_fail_alternate(TestInputVisitorData *data,
123977c47de2SMarkus Armbruster                                            const void *unused)
124077c47de2SMarkus Armbruster {
124177c47de2SMarkus Armbruster     UserDefAlternate *tmp;
124277c47de2SMarkus Armbruster     Visitor *v;
124377c47de2SMarkus Armbruster     Error *err = NULL;
124477c47de2SMarkus Armbruster 
124577c47de2SMarkus Armbruster     v = visitor_input_test_init(data, "3.14");
124677c47de2SMarkus Armbruster 
124777c47de2SMarkus Armbruster     visit_type_UserDefAlternate(v, NULL, &tmp, &err);
124877c47de2SMarkus Armbruster     error_free_or_abort(&err);
124977c47de2SMarkus Armbruster     g_assert(!tmp);
125077c47de2SMarkus Armbruster }
125177c47de2SMarkus Armbruster 
125277c47de2SMarkus Armbruster static void do_test_visitor_in_qmp_introspect(TestInputVisitorData *data,
125377c47de2SMarkus Armbruster                                               const char *schema_json)
125477c47de2SMarkus Armbruster {
125577c47de2SMarkus Armbruster     SchemaInfoList *schema = NULL;
125677c47de2SMarkus Armbruster     Visitor *v;
125777c47de2SMarkus Armbruster 
125877c47de2SMarkus Armbruster     v = visitor_input_test_init_raw(data, schema_json);
125977c47de2SMarkus Armbruster 
126077c47de2SMarkus Armbruster     visit_type_SchemaInfoList(v, NULL, &schema, &error_abort);
126177c47de2SMarkus Armbruster     g_assert(schema);
126277c47de2SMarkus Armbruster 
126377c47de2SMarkus Armbruster     qapi_free_SchemaInfoList(schema);
126477c47de2SMarkus Armbruster }
126577c47de2SMarkus Armbruster 
126677c47de2SMarkus Armbruster static void test_visitor_in_qmp_introspect(TestInputVisitorData *data,
126777c47de2SMarkus Armbruster                                            const void *unused)
126877c47de2SMarkus Armbruster {
126977c47de2SMarkus Armbruster     do_test_visitor_in_qmp_introspect(data, test_qmp_schema_json);
127077c47de2SMarkus Armbruster     do_test_visitor_in_qmp_introspect(data, qmp_schema_json);
127177c47de2SMarkus Armbruster }
127277c47de2SMarkus Armbruster 
1273d88f5fd1SLuiz Capitulino int main(int argc, char **argv)
1274d88f5fd1SLuiz Capitulino {
1275d88f5fd1SLuiz Capitulino     g_test_init(&argc, &argv, NULL);
1276d88f5fd1SLuiz Capitulino 
1277d88f5fd1SLuiz Capitulino     input_visitor_test_add("/visitor/input/int",
1278b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_int);
12794bc0c94dSMarkus Armbruster     input_visitor_test_add("/visitor/input/uint",
12804bc0c94dSMarkus Armbruster                            NULL, test_visitor_in_uint);
1281e92cfa0dSMichael Roth     input_visitor_test_add("/visitor/input/int_overflow",
1282b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_int_overflow);
1283cbd8acf3SDaniel P. Berrange     input_visitor_test_add("/visitor/input/int_keyval",
1284cbd8acf3SDaniel P. Berrange                            NULL, test_visitor_in_int_keyval);
1285cbd8acf3SDaniel P. Berrange     input_visitor_test_add("/visitor/input/int_str_keyval",
1286cbd8acf3SDaniel P. Berrange                            NULL, test_visitor_in_int_str_keyval);
1287cbd8acf3SDaniel P. Berrange     input_visitor_test_add("/visitor/input/int_str_fail",
1288cbd8acf3SDaniel P. Berrange                            NULL, test_visitor_in_int_str_fail);
1289d88f5fd1SLuiz Capitulino     input_visitor_test_add("/visitor/input/bool",
1290b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_bool);
1291cbd8acf3SDaniel P. Berrange     input_visitor_test_add("/visitor/input/bool_keyval",
1292cbd8acf3SDaniel P. Berrange                            NULL, test_visitor_in_bool_keyval);
1293cbd8acf3SDaniel P. Berrange     input_visitor_test_add("/visitor/input/bool_str_keyval",
1294cbd8acf3SDaniel P. Berrange                            NULL, test_visitor_in_bool_str_keyval);
1295cbd8acf3SDaniel P. Berrange     input_visitor_test_add("/visitor/input/bool_str_fail",
1296cbd8acf3SDaniel P. Berrange                            NULL, test_visitor_in_bool_str_fail);
1297d88f5fd1SLuiz Capitulino     input_visitor_test_add("/visitor/input/number",
1298b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_number);
1299c1214ad3SMarc-André Lureau     input_visitor_test_add("/visitor/input/large_number",
1300c1214ad3SMarc-André Lureau                            NULL, test_visitor_in_large_number);
1301cbd8acf3SDaniel P. Berrange     input_visitor_test_add("/visitor/input/number_keyval",
1302cbd8acf3SDaniel P. Berrange                            NULL, test_visitor_in_number_keyval);
1303cbd8acf3SDaniel P. Berrange     input_visitor_test_add("/visitor/input/number_str_keyval",
1304cbd8acf3SDaniel P. Berrange                            NULL, test_visitor_in_number_str_keyval);
1305cbd8acf3SDaniel P. Berrange     input_visitor_test_add("/visitor/input/number_str_fail",
1306cbd8acf3SDaniel P. Berrange                            NULL, test_visitor_in_number_str_fail);
1307cbd8acf3SDaniel P. Berrange     input_visitor_test_add("/visitor/input/size_str_keyval",
1308cbd8acf3SDaniel P. Berrange                            NULL, test_visitor_in_size_str_keyval);
1309cbd8acf3SDaniel P. Berrange     input_visitor_test_add("/visitor/input/size_str_fail",
1310cbd8acf3SDaniel P. Berrange                            NULL, test_visitor_in_size_str_fail);
1311d88f5fd1SLuiz Capitulino     input_visitor_test_add("/visitor/input/string",
1312b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_string);
1313d88f5fd1SLuiz Capitulino     input_visitor_test_add("/visitor/input/enum",
1314b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_enum);
1315d88f5fd1SLuiz Capitulino     input_visitor_test_add("/visitor/input/struct",
1316b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_struct);
1317d88f5fd1SLuiz Capitulino     input_visitor_test_add("/visitor/input/struct-nested",
1318b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_struct_nested);
1319d88f5fd1SLuiz Capitulino     input_visitor_test_add("/visitor/input/list",
1320b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_list);
132128770e05SMarkus Armbruster     input_visitor_test_add("/visitor/input/any",
1322b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_any);
13233df016f1SEric Blake     input_visitor_test_add("/visitor/input/null",
1324b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_null);
13252fc00432SMarkus Armbruster     input_visitor_test_add("/visitor/input/union-flat",
1326b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_union_flat);
1327ab045267SEric Blake     input_visitor_test_add("/visitor/input/alternate",
1328b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_alternate);
13293dcf71f6SPaolo Bonzini     input_visitor_test_add("/visitor/input/errors",
1330b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_errors);
13312533377cSEric Blake     input_visitor_test_add("/visitor/input/wrong-type",
1332b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_wrong_type);
13339c51b441SEric Blake     input_visitor_test_add("/visitor/input/alternate-number",
1334b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_alternate_number);
1335199e0f17SMichael Roth     input_visitor_test_add("/visitor/input/native_list/int",
1336b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_native_list_int);
1337199e0f17SMichael Roth     input_visitor_test_add("/visitor/input/native_list/int8",
1338b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_native_list_int8);
1339199e0f17SMichael Roth     input_visitor_test_add("/visitor/input/native_list/int16",
1340b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_native_list_int16);
1341199e0f17SMichael Roth     input_visitor_test_add("/visitor/input/native_list/int32",
1342b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_native_list_int32);
1343199e0f17SMichael Roth     input_visitor_test_add("/visitor/input/native_list/int64",
1344b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_native_list_int64);
1345199e0f17SMichael Roth     input_visitor_test_add("/visitor/input/native_list/uint8",
1346b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_native_list_uint8);
1347199e0f17SMichael Roth     input_visitor_test_add("/visitor/input/native_list/uint16",
1348b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_native_list_uint16);
1349199e0f17SMichael Roth     input_visitor_test_add("/visitor/input/native_list/uint32",
1350b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_native_list_uint32);
1351199e0f17SMichael Roth     input_visitor_test_add("/visitor/input/native_list/uint64",
1352b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_native_list_uint64);
1353199e0f17SMichael Roth     input_visitor_test_add("/visitor/input/native_list/bool",
1354b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_native_list_bool);
1355199e0f17SMichael Roth     input_visitor_test_add("/visitor/input/native_list/str",
1356b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_native_list_string);
1357199e0f17SMichael Roth     input_visitor_test_add("/visitor/input/native_list/number",
1358b1d2e5f1SDaniel P. Berrange                            NULL, test_visitor_in_native_list_number);
135977c47de2SMarkus Armbruster     input_visitor_test_add("/visitor/input/fail/struct",
136077c47de2SMarkus Armbruster                            NULL, test_visitor_in_fail_struct);
136177c47de2SMarkus Armbruster     input_visitor_test_add("/visitor/input/fail/struct-nested",
136277c47de2SMarkus Armbruster                            NULL, test_visitor_in_fail_struct_nested);
136377c47de2SMarkus Armbruster     input_visitor_test_add("/visitor/input/fail/struct-in-list",
136477c47de2SMarkus Armbruster                            NULL, test_visitor_in_fail_struct_in_list);
136577c47de2SMarkus Armbruster     input_visitor_test_add("/visitor/input/fail/struct-missing",
136677c47de2SMarkus Armbruster                            NULL, test_visitor_in_fail_struct_missing);
13679cb8ef36SMarkus Armbruster     input_visitor_test_add("/visitor/input/fail/list",
13689cb8ef36SMarkus Armbruster                            NULL, test_visitor_in_fail_list);
13699cb8ef36SMarkus Armbruster     input_visitor_test_add("/visitor/input/fail/list-nested",
13709cb8ef36SMarkus Armbruster                            NULL, test_visitor_in_fail_list_nested);
137177c47de2SMarkus Armbruster     input_visitor_test_add("/visitor/input/fail/union-flat",
137277c47de2SMarkus Armbruster                            NULL, test_visitor_in_fail_union_flat);
137377c47de2SMarkus Armbruster     input_visitor_test_add("/visitor/input/fail/union-flat-no-discriminator",
137477c47de2SMarkus Armbruster                            NULL, test_visitor_in_fail_union_flat_no_discrim);
137577c47de2SMarkus Armbruster     input_visitor_test_add("/visitor/input/fail/alternate",
137677c47de2SMarkus Armbruster                            NULL, test_visitor_in_fail_alternate);
137777c47de2SMarkus Armbruster     input_visitor_test_add("/visitor/input/fail/union-native-list",
137877c47de2SMarkus Armbruster                            NULL, test_visitor_in_fail_union_native_list);
137977c47de2SMarkus Armbruster     input_visitor_test_add("/visitor/input/qmp-introspect",
138077c47de2SMarkus Armbruster                            NULL, test_visitor_in_qmp_introspect);
1381d88f5fd1SLuiz Capitulino 
1382d88f5fd1SLuiz Capitulino     g_test_run();
1383d88f5fd1SLuiz Capitulino 
1384d88f5fd1SLuiz Capitulino     return 0;
1385d88f5fd1SLuiz Capitulino }
1386