blob: 1c856d9bd20a788edad897207e1d33ea4cccd8e9 [file] [log] [blame]
Luiz Capitulinof294f822011-11-14 19:05:29 -02001/*
Daniel P. Berrangeb3db2112016-09-30 15:45:27 +01002 * QObject Output Visitor unit-tests.
Luiz Capitulinof294f822011-11-14 19:05:29 -02003 *
Eric Blake68d07832016-02-17 23:48:18 -07004 * Copyright (C) 2011-2016 Red Hat Inc.
Luiz Capitulinof294f822011-11-14 19:05:29 -02005 *
6 * Authors:
7 * Luiz Capitulino <lcapitulino@redhat.com>
8 *
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
11 */
12
Peter Maydell681c28a2016-02-08 18:08:51 +000013#include "qemu/osdep.h"
Luiz Capitulinof294f822011-11-14 19:05:29 -020014
Paolo Bonzini79ee7df2012-12-06 11:22:34 +010015#include "qemu-common.h"
Markus Armbrusterda34e652016-03-14 09:01:28 +010016#include "qapi/error.h"
Daniel P. Berrangeb3db2112016-09-30 15:45:27 +010017#include "qapi/qobject-output-visitor.h"
Luiz Capitulinof294f822011-11-14 19:05:29 -020018#include "test-qapi-visit.h"
Markus Armbruster6b673952018-02-01 12:18:35 +010019#include "qapi/qmp/qbool.h"
Markus Armbruster452fcdb2018-02-01 12:18:39 +010020#include "qapi/qmp/qdict.h"
Markus Armbruster47e6b292018-02-01 12:18:38 +010021#include "qapi/qmp/qlist.h"
Markus Armbruster15280c32018-02-01 12:18:36 +010022#include "qapi/qmp/qnull.h"
23#include "qapi/qmp/qnum.h"
Markus Armbrusterfc81fa12018-02-01 12:18:40 +010024#include "qapi/qmp/qstring.h"
Luiz Capitulinof294f822011-11-14 19:05:29 -020025
26typedef struct TestOutputVisitorData {
Luiz Capitulinof294f822011-11-14 19:05:29 -020027 Visitor *ov;
Eric Blake23d17052016-06-09 10:48:42 -060028 QObject *obj;
Luiz Capitulinof294f822011-11-14 19:05:29 -020029} TestOutputVisitorData;
30
31static void visitor_output_setup(TestOutputVisitorData *data,
32 const void *unused)
33{
Daniel P. Berrange7d5e1992016-09-30 15:45:28 +010034 data->ov = qobject_output_visitor_new(&data->obj);
Eric Blake3b098d52016-06-09 10:48:43 -060035 g_assert(data->ov);
Luiz Capitulinof294f822011-11-14 19:05:29 -020036}
37
38static void visitor_output_teardown(TestOutputVisitorData *data,
39 const void *unused)
40{
Eric Blake1830f222016-06-09 10:48:40 -060041 visit_free(data->ov);
Luiz Capitulinof294f822011-11-14 19:05:29 -020042 data->ov = NULL;
Marc-André Lureaucb3e7f02018-04-19 17:01:43 +020043 qobject_unref(data->obj);
Eric Blake23d17052016-06-09 10:48:42 -060044 data->obj = NULL;
45}
46
47static QObject *visitor_get(TestOutputVisitorData *data)
48{
Eric Blake3b098d52016-06-09 10:48:43 -060049 visit_complete(data->ov, &data->obj);
Eric Blake23d17052016-06-09 10:48:42 -060050 g_assert(data->obj);
51 return data->obj;
Luiz Capitulinof294f822011-11-14 19:05:29 -020052}
53
Eric Blakef2ff4292016-05-09 22:20:06 -060054static void visitor_reset(TestOutputVisitorData *data)
55{
56 visitor_output_teardown(data, NULL);
57 visitor_output_setup(data, NULL);
58}
59
Luiz Capitulinof294f822011-11-14 19:05:29 -020060static void test_visitor_out_int(TestOutputVisitorData *data,
61 const void *unused)
62{
63 int64_t value = -42;
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +040064 int64_t val;
65 QNum *qnum;
Luiz Capitulinof294f822011-11-14 19:05:29 -020066
Eric Blake51e72bc2016-01-29 06:48:54 -070067 visit_type_int(data->ov, NULL, &value, &error_abort);
Luiz Capitulinof294f822011-11-14 19:05:29 -020068
Max Reitz7dc847e2018-02-24 16:40:29 +010069 qnum = qobject_to(QNum, visitor_get(data));
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +040070 g_assert(qnum);
71 g_assert(qnum_get_try_int(qnum, &val));
72 g_assert_cmpint(val, ==, value);
Luiz Capitulinof294f822011-11-14 19:05:29 -020073}
74
75static void test_visitor_out_bool(TestOutputVisitorData *data,
76 const void *unused)
77{
Luiz Capitulinof294f822011-11-14 19:05:29 -020078 bool value = true;
Markus Armbrusterdfad9ec2017-02-17 21:38:23 +010079 QBool *qbool;
Luiz Capitulinof294f822011-11-14 19:05:29 -020080
Eric Blake51e72bc2016-01-29 06:48:54 -070081 visit_type_bool(data->ov, NULL, &value, &error_abort);
Luiz Capitulinof294f822011-11-14 19:05:29 -020082
Max Reitz7dc847e2018-02-24 16:40:29 +010083 qbool = qobject_to(QBool, visitor_get(data));
Markus Armbrusterdfad9ec2017-02-17 21:38:23 +010084 g_assert(qbool);
85 g_assert(qbool_get_bool(qbool) == value);
Luiz Capitulinof294f822011-11-14 19:05:29 -020086}
87
88static void test_visitor_out_number(TestOutputVisitorData *data,
89 const void *unused)
90{
91 double value = 3.14;
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +040092 QNum *qnum;
Luiz Capitulinof294f822011-11-14 19:05:29 -020093
Eric Blake51e72bc2016-01-29 06:48:54 -070094 visit_type_number(data->ov, NULL, &value, &error_abort);
Luiz Capitulinof294f822011-11-14 19:05:29 -020095
Max Reitz7dc847e2018-02-24 16:40:29 +010096 qnum = qobject_to(QNum, visitor_get(data));
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +040097 g_assert(qnum);
98 g_assert(qnum_get_double(qnum) == value);
Luiz Capitulinof294f822011-11-14 19:05:29 -020099}
100
101static void test_visitor_out_string(TestOutputVisitorData *data,
102 const void *unused)
103{
104 char *string = (char *) "Q E M U";
Markus Armbruster363e13f2017-02-17 21:38:20 +0100105 QString *qstr;
Luiz Capitulinof294f822011-11-14 19:05:29 -0200106
Eric Blake51e72bc2016-01-29 06:48:54 -0700107 visit_type_str(data->ov, NULL, &string, &error_abort);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200108
Max Reitz7dc847e2018-02-24 16:40:29 +0100109 qstr = qobject_to(QString, visitor_get(data));
Markus Armbruster363e13f2017-02-17 21:38:20 +0100110 g_assert(qstr);
111 g_assert_cmpstr(qstring_get_str(qstr), ==, string);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200112}
113
114static void test_visitor_out_no_string(TestOutputVisitorData *data,
115 const void *unused)
116{
117 char *string = NULL;
Markus Armbruster363e13f2017-02-17 21:38:20 +0100118 QString *qstr;
Luiz Capitulinof294f822011-11-14 19:05:29 -0200119
120 /* A null string should return "" */
Eric Blake51e72bc2016-01-29 06:48:54 -0700121 visit_type_str(data->ov, NULL, &string, &error_abort);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200122
Max Reitz7dc847e2018-02-24 16:40:29 +0100123 qstr = qobject_to(QString, visitor_get(data));
Markus Armbruster363e13f2017-02-17 21:38:20 +0100124 g_assert(qstr);
125 g_assert_cmpstr(qstring_get_str(qstr), ==, "");
Luiz Capitulinof294f822011-11-14 19:05:29 -0200126}
127
128static void test_visitor_out_enum(TestOutputVisitorData *data,
129 const void *unused)
130{
Luiz Capitulinof294f822011-11-14 19:05:29 -0200131 EnumOne i;
Markus Armbruster363e13f2017-02-17 21:38:20 +0100132 QString *qstr;
Luiz Capitulinof294f822011-11-14 19:05:29 -0200133
Eric Blake7fb1cf12015-11-18 01:52:57 -0700134 for (i = 0; i < ENUM_ONE__MAX; i++) {
Eric Blake51e72bc2016-01-29 06:48:54 -0700135 visit_type_EnumOne(data->ov, "unused", &i, &error_abort);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200136
Max Reitz7dc847e2018-02-24 16:40:29 +0100137 qstr = qobject_to(QString, visitor_get(data));
Markus Armbruster363e13f2017-02-17 21:38:20 +0100138 g_assert(qstr);
Markus Armbruster977c7362017-08-24 10:46:08 +0200139 g_assert_cmpstr(qstring_get_str(qstr), ==, EnumOne_str(i));
Eric Blakef2ff4292016-05-09 22:20:06 -0600140 visitor_reset(data);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200141 }
142}
143
Luiz Capitulinof294f822011-11-14 19:05:29 -0200144static void test_visitor_out_struct(TestOutputVisitorData *data,
145 const void *unused)
146{
147 TestStruct test_struct = { .integer = 42,
148 .boolean = false,
149 .string = (char *) "foo"};
150 TestStruct *p = &test_struct;
Luiz Capitulinof294f822011-11-14 19:05:29 -0200151 QDict *qdict;
152
Eric Blake51e72bc2016-01-29 06:48:54 -0700153 visit_type_TestStruct(data->ov, NULL, &p, &error_abort);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200154
Max Reitz7dc847e2018-02-24 16:40:29 +0100155 qdict = qobject_to(QDict, visitor_get(data));
Markus Armbrusterca6b6e12017-02-17 21:38:18 +0100156 g_assert(qdict);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200157 g_assert_cmpint(qdict_size(qdict), ==, 3);
158 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 42);
Eric Blake34acbc92015-05-15 16:25:00 -0600159 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, false);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200160 g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, "foo");
Luiz Capitulinof294f822011-11-14 19:05:29 -0200161}
162
163static void test_visitor_out_struct_nested(TestOutputVisitorData *data,
164 const void *unused)
165{
166 int64_t value = 42;
Eric Blakeb6fcf322015-05-04 09:05:29 -0600167 UserDefTwo *ud2;
Luiz Capitulinof294f822011-11-14 19:05:29 -0200168 QDict *qdict, *dict1, *dict2, *dict3, *userdef;
169 const char *string = "user def string";
Stefan Weilbeae9d72012-02-25 13:47:10 +0100170 const char *strings[] = { "forty two", "forty three", "forty four",
171 "forty five" };
Luiz Capitulinof294f822011-11-14 19:05:29 -0200172
173 ud2 = g_malloc0(sizeof(*ud2));
174 ud2->string0 = g_strdup(strings[0]);
175
Eric Blake6446a592015-05-04 09:05:30 -0600176 ud2->dict1 = g_malloc0(sizeof(*ud2->dict1));
177 ud2->dict1->string1 = g_strdup(strings[1]);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200178
Eric Blake6446a592015-05-04 09:05:30 -0600179 ud2->dict1->dict2 = g_malloc0(sizeof(*ud2->dict1->dict2));
180 ud2->dict1->dict2->userdef = g_new0(UserDefOne, 1);
181 ud2->dict1->dict2->userdef->string = g_strdup(string);
Eric Blakeddf21902015-10-26 16:34:49 -0600182 ud2->dict1->dict2->userdef->integer = value;
Eric Blake6446a592015-05-04 09:05:30 -0600183 ud2->dict1->dict2->string = g_strdup(strings[2]);
184
185 ud2->dict1->dict3 = g_malloc0(sizeof(*ud2->dict1->dict3));
186 ud2->dict1->has_dict3 = true;
187 ud2->dict1->dict3->userdef = g_new0(UserDefOne, 1);
188 ud2->dict1->dict3->userdef->string = g_strdup(string);
Eric Blakeddf21902015-10-26 16:34:49 -0600189 ud2->dict1->dict3->userdef->integer = value;
Eric Blake6446a592015-05-04 09:05:30 -0600190 ud2->dict1->dict3->string = g_strdup(strings[3]);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200191
Eric Blake51e72bc2016-01-29 06:48:54 -0700192 visit_type_UserDefTwo(data->ov, "unused", &ud2, &error_abort);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200193
Max Reitz7dc847e2018-02-24 16:40:29 +0100194 qdict = qobject_to(QDict, visitor_get(data));
Markus Armbrusterca6b6e12017-02-17 21:38:18 +0100195 g_assert(qdict);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200196 g_assert_cmpint(qdict_size(qdict), ==, 2);
197 g_assert_cmpstr(qdict_get_str(qdict, "string0"), ==, strings[0]);
198
199 dict1 = qdict_get_qdict(qdict, "dict1");
200 g_assert_cmpint(qdict_size(dict1), ==, 3);
201 g_assert_cmpstr(qdict_get_str(dict1, "string1"), ==, strings[1]);
202
203 dict2 = qdict_get_qdict(dict1, "dict2");
204 g_assert_cmpint(qdict_size(dict2), ==, 2);
Eric Blakeb6fcf322015-05-04 09:05:29 -0600205 g_assert_cmpstr(qdict_get_str(dict2, "string"), ==, strings[2]);
206 userdef = qdict_get_qdict(dict2, "userdef");
Luiz Capitulinof294f822011-11-14 19:05:29 -0200207 g_assert_cmpint(qdict_size(userdef), ==, 2);
208 g_assert_cmpint(qdict_get_int(userdef, "integer"), ==, value);
209 g_assert_cmpstr(qdict_get_str(userdef, "string"), ==, string);
210
211 dict3 = qdict_get_qdict(dict1, "dict3");
212 g_assert_cmpint(qdict_size(dict3), ==, 2);
Eric Blakeb6fcf322015-05-04 09:05:29 -0600213 g_assert_cmpstr(qdict_get_str(dict3, "string"), ==, strings[3]);
214 userdef = qdict_get_qdict(dict3, "userdef");
Luiz Capitulinof294f822011-11-14 19:05:29 -0200215 g_assert_cmpint(qdict_size(userdef), ==, 2);
216 g_assert_cmpint(qdict_get_int(userdef, "integer"), ==, value);
217 g_assert_cmpstr(qdict_get_str(userdef, "string"), ==, string);
218
Eric Blakeb6fcf322015-05-04 09:05:29 -0600219 qapi_free_UserDefTwo(ud2);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200220}
221
Luiz Capitulinof294f822011-11-14 19:05:29 -0200222static void test_visitor_out_list(TestOutputVisitorData *data,
223 const void *unused)
224{
Eric Blakebd205882015-11-05 23:35:26 -0700225 const char *value_str = "list value";
Luiz Capitulinof294f822011-11-14 19:05:29 -0200226 TestStructList *p, *head = NULL;
227 const int max_items = 10;
228 bool value_bool = true;
229 int value_int = 10;
Luiz Capitulinof294f822011-11-14 19:05:29 -0200230 QListEntry *entry;
Luiz Capitulinof294f822011-11-14 19:05:29 -0200231 QList *qlist;
232 int i;
233
Eric Blakebd205882015-11-05 23:35:26 -0700234 /* Build the list in reverse order... */
Luiz Capitulinof294f822011-11-14 19:05:29 -0200235 for (i = 0; i < max_items; i++) {
236 p = g_malloc0(sizeof(*p));
237 p->value = g_malloc0(sizeof(*p->value));
Eric Blakebd205882015-11-05 23:35:26 -0700238 p->value->integer = value_int + (max_items - i - 1);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200239 p->value->boolean = value_bool;
Eric Blakebd205882015-11-05 23:35:26 -0700240 p->value->string = g_strdup(value_str);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200241
242 p->next = head;
243 head = p;
244 }
245
Eric Blake51e72bc2016-01-29 06:48:54 -0700246 visit_type_TestStructList(data->ov, NULL, &head, &error_abort);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200247
Max Reitz7dc847e2018-02-24 16:40:29 +0100248 qlist = qobject_to(QList, visitor_get(data));
Markus Armbrustercd17ba52017-02-17 21:38:19 +0100249 g_assert(qlist);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200250 g_assert(!qlist_empty(qlist));
251
Eric Blakebd205882015-11-05 23:35:26 -0700252 /* ...and ensure that the visitor sees it in order */
Luiz Capitulinof294f822011-11-14 19:05:29 -0200253 i = 0;
254 QLIST_FOREACH_ENTRY(qlist, entry) {
255 QDict *qdict;
256
Max Reitz7dc847e2018-02-24 16:40:29 +0100257 qdict = qobject_to(QDict, entry->value);
Markus Armbrusterca6b6e12017-02-17 21:38:18 +0100258 g_assert(qdict);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200259 g_assert_cmpint(qdict_size(qdict), ==, 3);
Eric Blakebd205882015-11-05 23:35:26 -0700260 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, value_int + i);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200261 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, value_bool);
262 g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, value_str);
263 i++;
264 }
265 g_assert_cmpint(i, ==, max_items);
266
Eric Blakebd205882015-11-05 23:35:26 -0700267 qapi_free_TestStructList(head);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200268}
269
270static void test_visitor_out_list_qapi_free(TestOutputVisitorData *data,
271 const void *unused)
272{
Eric Blakeb6fcf322015-05-04 09:05:29 -0600273 UserDefTwoList *p, *head = NULL;
Luiz Capitulinof294f822011-11-14 19:05:29 -0200274 const char string[] = "foo bar";
275 int i, max_count = 1024;
276
277 for (i = 0; i < max_count; i++) {
278 p = g_malloc0(sizeof(*p));
279 p->value = g_malloc0(sizeof(*p->value));
280
281 p->value->string0 = g_strdup(string);
Eric Blake6446a592015-05-04 09:05:30 -0600282 p->value->dict1 = g_new0(UserDefTwoDict, 1);
283 p->value->dict1->string1 = g_strdup(string);
284 p->value->dict1->dict2 = g_new0(UserDefTwoDictDict, 1);
285 p->value->dict1->dict2->userdef = g_new0(UserDefOne, 1);
286 p->value->dict1->dict2->userdef->string = g_strdup(string);
Eric Blakeddf21902015-10-26 16:34:49 -0600287 p->value->dict1->dict2->userdef->integer = 42;
Eric Blake6446a592015-05-04 09:05:30 -0600288 p->value->dict1->dict2->string = g_strdup(string);
289 p->value->dict1->has_dict3 = false;
Luiz Capitulinof294f822011-11-14 19:05:29 -0200290
291 p->next = head;
292 head = p;
293 }
294
Eric Blakeb6fcf322015-05-04 09:05:29 -0600295 qapi_free_UserDefTwoList(head);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200296}
297
Markus Armbruster28770e02015-09-16 13:06:24 +0200298static void test_visitor_out_any(TestOutputVisitorData *data,
299 const void *unused)
300{
301 QObject *qobj;
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400302 QNum *qnum;
Markus Armbruster28770e02015-09-16 13:06:24 +0200303 QBool *qbool;
304 QString *qstring;
305 QDict *qdict;
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400306 int64_t val;
Markus Armbruster28770e02015-09-16 13:06:24 +0200307
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400308 qobj = QOBJECT(qnum_from_int(-42));
Eric Blake51e72bc2016-01-29 06:48:54 -0700309 visit_type_any(data->ov, NULL, &qobj, &error_abort);
Max Reitz7dc847e2018-02-24 16:40:29 +0100310 qnum = qobject_to(QNum, visitor_get(data));
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400311 g_assert(qnum);
312 g_assert(qnum_get_try_int(qnum, &val));
313 g_assert_cmpint(val, ==, -42);
Marc-André Lureaucb3e7f02018-04-19 17:01:43 +0200314 qobject_unref(qobj);
Markus Armbruster28770e02015-09-16 13:06:24 +0200315
Eric Blakef2ff4292016-05-09 22:20:06 -0600316 visitor_reset(data);
Markus Armbruster28770e02015-09-16 13:06:24 +0200317 qdict = qdict_new();
Eric Blake46f5ac22017-04-27 16:58:17 -0500318 qdict_put_int(qdict, "integer", -42);
319 qdict_put_bool(qdict, "boolean", true);
320 qdict_put_str(qdict, "string", "foo");
Markus Armbruster28770e02015-09-16 13:06:24 +0200321 qobj = QOBJECT(qdict);
Eric Blake51e72bc2016-01-29 06:48:54 -0700322 visit_type_any(data->ov, NULL, &qobj, &error_abort);
Marc-André Lureaucb3e7f02018-04-19 17:01:43 +0200323 qobject_unref(qobj);
Max Reitz7dc847e2018-02-24 16:40:29 +0100324 qdict = qobject_to(QDict, visitor_get(data));
Markus Armbruster28770e02015-09-16 13:06:24 +0200325 g_assert(qdict);
Max Reitz7dc847e2018-02-24 16:40:29 +0100326 qnum = qobject_to(QNum, qdict_get(qdict, "integer"));
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400327 g_assert(qnum);
328 g_assert(qnum_get_try_int(qnum, &val));
329 g_assert_cmpint(val, ==, -42);
Max Reitz7dc847e2018-02-24 16:40:29 +0100330 qbool = qobject_to(QBool, qdict_get(qdict, "boolean"));
Markus Armbruster28770e02015-09-16 13:06:24 +0200331 g_assert(qbool);
332 g_assert(qbool_get_bool(qbool) == true);
Max Reitz7dc847e2018-02-24 16:40:29 +0100333 qstring = qobject_to(QString, qdict_get(qdict, "string"));
Markus Armbruster28770e02015-09-16 13:06:24 +0200334 g_assert(qstring);
335 g_assert_cmpstr(qstring_get_str(qstring), ==, "foo");
Markus Armbruster28770e02015-09-16 13:06:24 +0200336}
337
Markus Armbruster2fc00432014-03-01 08:40:33 +0100338static void test_visitor_out_union_flat(TestOutputVisitorData *data,
339 const void *unused)
340{
Markus Armbruster2fc00432014-03-01 08:40:33 +0100341 QDict *qdict;
342
Markus Armbruster2fc00432014-03-01 08:40:33 +0100343 UserDefFlatUnion *tmp = g_malloc0(sizeof(UserDefFlatUnion));
Markus Armbruster0f61af32015-07-31 10:30:04 +0200344 tmp->enum1 = ENUM_ONE_VALUE1;
Wenchao Xia52230702014-03-04 18:44:39 -0800345 tmp->string = g_strdup("str");
Eric Blakec363ace2015-10-26 16:34:53 -0600346 tmp->integer = 41;
Eric Blake544a3732016-02-17 23:48:27 -0700347 tmp->u.value1.boolean = true;
Markus Armbruster2fc00432014-03-01 08:40:33 +0100348
Eric Blake51e72bc2016-01-29 06:48:54 -0700349 visit_type_UserDefFlatUnion(data->ov, NULL, &tmp, &error_abort);
Max Reitz7dc847e2018-02-24 16:40:29 +0100350 qdict = qobject_to(QDict, visitor_get(data));
Markus Armbrusterca6b6e12017-02-17 21:38:18 +0100351 g_assert(qdict);
Wenchao Xia52230702014-03-04 18:44:39 -0800352 g_assert_cmpstr(qdict_get_str(qdict, "enum1"), ==, "value1");
353 g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, "str");
Eric Blakec363ace2015-10-26 16:34:53 -0600354 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 41);
Markus Armbruster2fc00432014-03-01 08:40:33 +0100355 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, true);
356
357 qapi_free_UserDefFlatUnion(tmp);
Markus Armbruster2fc00432014-03-01 08:40:33 +0100358}
359
Eric Blakeab045262015-05-04 09:05:11 -0600360static void test_visitor_out_alternate(TestOutputVisitorData *data,
361 const void *unused)
Markus Armbruster2c38b602014-03-01 08:40:30 +0100362{
Eric Blake12fafd72015-11-05 23:35:32 -0700363 UserDefAlternate *tmp;
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400364 QNum *qnum;
Markus Armbruster363e13f2017-02-17 21:38:20 +0100365 QString *qstr;
Eric Blake68d07832016-02-17 23:48:18 -0700366 QDict *qdict;
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400367 int64_t val;
Markus Armbruster2c38b602014-03-01 08:40:30 +0100368
Eric Blake12fafd72015-11-05 23:35:32 -0700369 tmp = g_new0(UserDefAlternate, 1);
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400370 tmp->type = QTYPE_QNUM;
Eric Blakec363ace2015-10-26 16:34:53 -0600371 tmp->u.i = 42;
Markus Armbruster2c38b602014-03-01 08:40:30 +0100372
Eric Blake51e72bc2016-01-29 06:48:54 -0700373 visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
Max Reitz7dc847e2018-02-24 16:40:29 +0100374 qnum = qobject_to(QNum, visitor_get(data));
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400375 g_assert(qnum);
376 g_assert(qnum_get_try_int(qnum, &val));
377 g_assert_cmpint(val, ==, 42);
Markus Armbruster2c38b602014-03-01 08:40:30 +0100378
Eric Blakeab045262015-05-04 09:05:11 -0600379 qapi_free_UserDefAlternate(tmp);
Eric Blake12fafd72015-11-05 23:35:32 -0700380
Eric Blakef2ff4292016-05-09 22:20:06 -0600381 visitor_reset(data);
Eric Blake12fafd72015-11-05 23:35:32 -0700382 tmp = g_new0(UserDefAlternate, 1);
Eric Blake0426d532015-12-01 22:20:48 -0700383 tmp->type = QTYPE_QSTRING;
Markus Armbruster8168ca82017-05-22 18:42:14 +0200384 tmp->u.e = ENUM_ONE_VALUE1;
Eric Blake12fafd72015-11-05 23:35:32 -0700385
Eric Blake51e72bc2016-01-29 06:48:54 -0700386 visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
Max Reitz7dc847e2018-02-24 16:40:29 +0100387 qstr = qobject_to(QString, visitor_get(data));
Markus Armbruster363e13f2017-02-17 21:38:20 +0100388 g_assert(qstr);
Markus Armbruster8168ca82017-05-22 18:42:14 +0200389 g_assert_cmpstr(qstring_get_str(qstr), ==, "value1");
Eric Blake12fafd72015-11-05 23:35:32 -0700390
391 qapi_free_UserDefAlternate(tmp);
Eric Blake68d07832016-02-17 23:48:18 -0700392
Eric Blakef2ff4292016-05-09 22:20:06 -0600393 visitor_reset(data);
Eric Blake68d07832016-02-17 23:48:18 -0700394 tmp = g_new0(UserDefAlternate, 1);
Markus Armbruster4d2d5c42017-06-26 19:25:14 +0200395 tmp->type = QTYPE_QNULL;
396 tmp->u.n = qnull();
397
398 visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
399 g_assert_cmpint(qobject_type(visitor_get(data)), ==, QTYPE_QNULL);
400
401 qapi_free_UserDefAlternate(tmp);
402
403 visitor_reset(data);
404 tmp = g_new0(UserDefAlternate, 1);
Eric Blake68d07832016-02-17 23:48:18 -0700405 tmp->type = QTYPE_QDICT;
Eric Blakebecceed2016-02-17 23:48:26 -0700406 tmp->u.udfu.integer = 1;
407 tmp->u.udfu.string = g_strdup("str");
408 tmp->u.udfu.enum1 = ENUM_ONE_VALUE1;
Eric Blake544a3732016-02-17 23:48:27 -0700409 tmp->u.udfu.u.value1.boolean = true;
Eric Blake68d07832016-02-17 23:48:18 -0700410
411 visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
Max Reitz7dc847e2018-02-24 16:40:29 +0100412 qdict = qobject_to(QDict, visitor_get(data));
Markus Armbrusterca6b6e12017-02-17 21:38:18 +0100413 g_assert(qdict);
Eric Blake68d07832016-02-17 23:48:18 -0700414 g_assert_cmpint(qdict_size(qdict), ==, 4);
415 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 1);
416 g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, "str");
417 g_assert_cmpstr(qdict_get_str(qdict, "enum1"), ==, "value1");
418 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, true);
419
420 qapi_free_UserDefAlternate(tmp);
Markus Armbruster2c38b602014-03-01 08:40:30 +0100421}
422
Eric Blake3df016f2016-04-28 15:45:23 -0600423static void test_visitor_out_null(TestOutputVisitorData *data,
424 const void *unused)
Marcel Apfelbauma199b2b2014-05-26 15:40:56 +0300425{
Markus Armbrusterd2f95f42017-06-26 18:22:59 +0200426 QNull *null = NULL;
Eric Blake3df016f2016-04-28 15:45:23 -0600427 QDict *qdict;
428 QObject *nil;
Marcel Apfelbauma199b2b2014-05-26 15:40:56 +0300429
Eric Blake3df016f2016-04-28 15:45:23 -0600430 visit_start_struct(data->ov, NULL, NULL, 0, &error_abort);
Markus Armbrusterd2f95f42017-06-26 18:22:59 +0200431 visit_type_null(data->ov, "a", &null, &error_abort);
Eric Blake15c2f662016-04-28 15:45:27 -0600432 visit_check_struct(data->ov, &error_abort);
Eric Blake1158bb22016-06-09 10:48:34 -0600433 visit_end_struct(data->ov, NULL);
Max Reitz7dc847e2018-02-24 16:40:29 +0100434 qdict = qobject_to(QDict, visitor_get(data));
Markus Armbrusterca6b6e12017-02-17 21:38:18 +0100435 g_assert(qdict);
Eric Blake3df016f2016-04-28 15:45:23 -0600436 g_assert_cmpint(qdict_size(qdict), ==, 1);
437 nil = qdict_get(qdict, "a");
438 g_assert(nil);
439 g_assert(qobject_type(nil) == QTYPE_QNULL);
Marcel Apfelbauma199b2b2014-05-26 15:40:56 +0300440}
441
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100442static void init_list_union(UserDefListUnion *cvalue)
Michael Roth83c84662013-05-10 17:46:09 -0500443{
444 int i;
Eric Blakec363ace2015-10-26 16:34:53 -0600445 switch (cvalue->type) {
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100446 case USER_DEF_LIST_UNION_KIND_INTEGER: {
Eric Blake32bafa82016-03-17 16:48:37 -0600447 intList **list = &cvalue->u.integer.data;
Michael Roth83c84662013-05-10 17:46:09 -0500448 for (i = 0; i < 32; i++) {
449 *list = g_new0(intList, 1);
450 (*list)->value = i;
451 (*list)->next = NULL;
452 list = &(*list)->next;
453 }
454 break;
455 }
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100456 case USER_DEF_LIST_UNION_KIND_S8: {
Eric Blake32bafa82016-03-17 16:48:37 -0600457 int8List **list = &cvalue->u.s8.data;
Michael Roth83c84662013-05-10 17:46:09 -0500458 for (i = 0; i < 32; i++) {
459 *list = g_new0(int8List, 1);
460 (*list)->value = i;
461 (*list)->next = NULL;
462 list = &(*list)->next;
463 }
464 break;
465 }
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100466 case USER_DEF_LIST_UNION_KIND_S16: {
Eric Blake32bafa82016-03-17 16:48:37 -0600467 int16List **list = &cvalue->u.s16.data;
Michael Roth83c84662013-05-10 17:46:09 -0500468 for (i = 0; i < 32; i++) {
469 *list = g_new0(int16List, 1);
470 (*list)->value = i;
471 (*list)->next = NULL;
472 list = &(*list)->next;
473 }
474 break;
475 }
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100476 case USER_DEF_LIST_UNION_KIND_S32: {
Eric Blake32bafa82016-03-17 16:48:37 -0600477 int32List **list = &cvalue->u.s32.data;
Michael Roth83c84662013-05-10 17:46:09 -0500478 for (i = 0; i < 32; i++) {
479 *list = g_new0(int32List, 1);
480 (*list)->value = i;
481 (*list)->next = NULL;
482 list = &(*list)->next;
483 }
484 break;
485 }
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100486 case USER_DEF_LIST_UNION_KIND_S64: {
Eric Blake32bafa82016-03-17 16:48:37 -0600487 int64List **list = &cvalue->u.s64.data;
Michael Roth83c84662013-05-10 17:46:09 -0500488 for (i = 0; i < 32; i++) {
489 *list = g_new0(int64List, 1);
490 (*list)->value = i;
491 (*list)->next = NULL;
492 list = &(*list)->next;
493 }
494 break;
495 }
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100496 case USER_DEF_LIST_UNION_KIND_U8: {
Eric Blake32bafa82016-03-17 16:48:37 -0600497 uint8List **list = &cvalue->u.u8.data;
Michael Roth83c84662013-05-10 17:46:09 -0500498 for (i = 0; i < 32; i++) {
499 *list = g_new0(uint8List, 1);
500 (*list)->value = i;
501 (*list)->next = NULL;
502 list = &(*list)->next;
503 }
504 break;
505 }
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100506 case USER_DEF_LIST_UNION_KIND_U16: {
Eric Blake32bafa82016-03-17 16:48:37 -0600507 uint16List **list = &cvalue->u.u16.data;
Michael Roth83c84662013-05-10 17:46:09 -0500508 for (i = 0; i < 32; i++) {
509 *list = g_new0(uint16List, 1);
510 (*list)->value = i;
511 (*list)->next = NULL;
512 list = &(*list)->next;
513 }
514 break;
515 }
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100516 case USER_DEF_LIST_UNION_KIND_U32: {
Eric Blake32bafa82016-03-17 16:48:37 -0600517 uint32List **list = &cvalue->u.u32.data;
Michael Roth83c84662013-05-10 17:46:09 -0500518 for (i = 0; i < 32; i++) {
519 *list = g_new0(uint32List, 1);
520 (*list)->value = i;
521 (*list)->next = NULL;
522 list = &(*list)->next;
523 }
524 break;
525 }
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100526 case USER_DEF_LIST_UNION_KIND_U64: {
Eric Blake32bafa82016-03-17 16:48:37 -0600527 uint64List **list = &cvalue->u.u64.data;
Michael Roth83c84662013-05-10 17:46:09 -0500528 for (i = 0; i < 32; i++) {
529 *list = g_new0(uint64List, 1);
530 (*list)->value = i;
531 (*list)->next = NULL;
532 list = &(*list)->next;
533 }
534 break;
535 }
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100536 case USER_DEF_LIST_UNION_KIND_BOOLEAN: {
Eric Blake32bafa82016-03-17 16:48:37 -0600537 boolList **list = &cvalue->u.boolean.data;
Michael Roth83c84662013-05-10 17:46:09 -0500538 for (i = 0; i < 32; i++) {
539 *list = g_new0(boolList, 1);
Philippe Mathieu-Daudé9a6555e2017-07-18 03:10:04 -0300540 (*list)->value = QEMU_IS_ALIGNED(i, 3);
Michael Roth83c84662013-05-10 17:46:09 -0500541 (*list)->next = NULL;
542 list = &(*list)->next;
543 }
544 break;
545 }
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100546 case USER_DEF_LIST_UNION_KIND_STRING: {
Eric Blake32bafa82016-03-17 16:48:37 -0600547 strList **list = &cvalue->u.string.data;
Michael Roth83c84662013-05-10 17:46:09 -0500548 for (i = 0; i < 32; i++) {
549 *list = g_new0(strList, 1);
550 (*list)->value = g_strdup_printf("%d", i);
551 (*list)->next = NULL;
552 list = &(*list)->next;
553 }
554 break;
555 }
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100556 case USER_DEF_LIST_UNION_KIND_NUMBER: {
Eric Blake32bafa82016-03-17 16:48:37 -0600557 numberList **list = &cvalue->u.number.data;
Michael Roth83c84662013-05-10 17:46:09 -0500558 for (i = 0; i < 32; i++) {
559 *list = g_new0(numberList, 1);
560 (*list)->value = (double)i / 3;
561 (*list)->next = NULL;
562 list = &(*list)->next;
563 }
564 break;
565 }
566 default:
Stefan Weildfc6f862013-07-25 18:21:28 +0200567 g_assert_not_reached();
Michael Roth83c84662013-05-10 17:46:09 -0500568 }
569}
570
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100571static void check_list_union(QObject *qobj,
572 UserDefListUnionKind kind)
Michael Roth83c84662013-05-10 17:46:09 -0500573{
574 QDict *qdict;
575 QList *qlist;
576 int i;
577
Max Reitz7dc847e2018-02-24 16:40:29 +0100578 qdict = qobject_to(QDict, qobj);
Michael Roth83c84662013-05-10 17:46:09 -0500579 g_assert(qdict);
580 g_assert(qdict_haskey(qdict, "data"));
Max Reitz7dc847e2018-02-24 16:40:29 +0100581 qlist = qlist_copy(qobject_to(QList, qdict_get(qdict, "data")));
Michael Roth83c84662013-05-10 17:46:09 -0500582
583 switch (kind) {
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100584 case USER_DEF_LIST_UNION_KIND_U8:
585 case USER_DEF_LIST_UNION_KIND_U16:
586 case USER_DEF_LIST_UNION_KIND_U32:
587 case USER_DEF_LIST_UNION_KIND_U64:
Marc-André Lureau5923f852017-06-07 20:36:03 +0400588 for (i = 0; i < 32; i++) {
589 QObject *tmp;
590 QNum *qvalue;
591 uint64_t val;
592
593 tmp = qlist_peek(qlist);
594 g_assert(tmp);
Max Reitz7dc847e2018-02-24 16:40:29 +0100595 qvalue = qobject_to(QNum, tmp);
Marc-André Lureau5923f852017-06-07 20:36:03 +0400596 g_assert(qnum_get_try_uint(qvalue, &val));
597 g_assert_cmpint(val, ==, i);
Marc-André Lureaucb3e7f02018-04-19 17:01:43 +0200598 qobject_unref(qlist_pop(qlist));
Marc-André Lureau5923f852017-06-07 20:36:03 +0400599 }
600 break;
601
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100602 case USER_DEF_LIST_UNION_KIND_S8:
603 case USER_DEF_LIST_UNION_KIND_S16:
604 case USER_DEF_LIST_UNION_KIND_S32:
605 case USER_DEF_LIST_UNION_KIND_S64:
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400606 /*
607 * All integer elements in JSON arrays get stored into QNums
608 * when we convert to QObjects, so we can check them all in
609 * the same fashion, so simply fall through here.
Michael Roth83c84662013-05-10 17:46:09 -0500610 */
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100611 case USER_DEF_LIST_UNION_KIND_INTEGER:
Michael Roth83c84662013-05-10 17:46:09 -0500612 for (i = 0; i < 32; i++) {
613 QObject *tmp;
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400614 QNum *qvalue;
615 int64_t val;
616
Michael Roth83c84662013-05-10 17:46:09 -0500617 tmp = qlist_peek(qlist);
618 g_assert(tmp);
Max Reitz7dc847e2018-02-24 16:40:29 +0100619 qvalue = qobject_to(QNum, tmp);
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400620 g_assert(qnum_get_try_int(qvalue, &val));
621 g_assert_cmpint(val, ==, i);
Marc-André Lureaucb3e7f02018-04-19 17:01:43 +0200622 qobject_unref(qlist_pop(qlist));
Michael Roth83c84662013-05-10 17:46:09 -0500623 }
624 break;
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100625 case USER_DEF_LIST_UNION_KIND_BOOLEAN:
Michael Roth83c84662013-05-10 17:46:09 -0500626 for (i = 0; i < 32; i++) {
627 QObject *tmp;
628 QBool *qvalue;
629 tmp = qlist_peek(qlist);
630 g_assert(tmp);
Max Reitz7dc847e2018-02-24 16:40:29 +0100631 qvalue = qobject_to(QBool, tmp);
Eric Blakefc48ffc2015-05-15 16:24:59 -0600632 g_assert_cmpint(qbool_get_bool(qvalue), ==, i % 3 == 0);
Marc-André Lureaucb3e7f02018-04-19 17:01:43 +0200633 qobject_unref(qlist_pop(qlist));
Michael Roth83c84662013-05-10 17:46:09 -0500634 }
635 break;
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100636 case USER_DEF_LIST_UNION_KIND_STRING:
Michael Roth83c84662013-05-10 17:46:09 -0500637 for (i = 0; i < 32; i++) {
638 QObject *tmp;
639 QString *qvalue;
640 gchar str[8];
641 tmp = qlist_peek(qlist);
642 g_assert(tmp);
Max Reitz7dc847e2018-02-24 16:40:29 +0100643 qvalue = qobject_to(QString, tmp);
Michael Roth83c84662013-05-10 17:46:09 -0500644 sprintf(str, "%d", i);
645 g_assert_cmpstr(qstring_get_str(qvalue), ==, str);
Marc-André Lureaucb3e7f02018-04-19 17:01:43 +0200646 qobject_unref(qlist_pop(qlist));
Michael Roth83c84662013-05-10 17:46:09 -0500647 }
648 break;
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100649 case USER_DEF_LIST_UNION_KIND_NUMBER:
Michael Roth83c84662013-05-10 17:46:09 -0500650 for (i = 0; i < 32; i++) {
651 QObject *tmp;
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400652 QNum *qvalue;
Michael Roth83c84662013-05-10 17:46:09 -0500653 GString *double_expected = g_string_new("");
654 GString *double_actual = g_string_new("");
655
656 tmp = qlist_peek(qlist);
657 g_assert(tmp);
Max Reitz7dc847e2018-02-24 16:40:29 +0100658 qvalue = qobject_to(QNum, tmp);
Michael Roth83c84662013-05-10 17:46:09 -0500659 g_string_printf(double_expected, "%.6f", (double)i / 3);
Marc-André Lureau01b2ffc2017-06-07 20:35:58 +0400660 g_string_printf(double_actual, "%.6f", qnum_get_double(qvalue));
Michael Roth83c84662013-05-10 17:46:09 -0500661 g_assert_cmpstr(double_actual->str, ==, double_expected->str);
662
Marc-André Lureaucb3e7f02018-04-19 17:01:43 +0200663 qobject_unref(qlist_pop(qlist));
Michael Roth83c84662013-05-10 17:46:09 -0500664 g_string_free(double_expected, true);
665 g_string_free(double_actual, true);
666 }
667 break;
668 default:
Stefan Weildfc6f862013-07-25 18:21:28 +0200669 g_assert_not_reached();
Michael Roth83c84662013-05-10 17:46:09 -0500670 }
Marc-André Lureaucb3e7f02018-04-19 17:01:43 +0200671 qobject_unref(qlist);
Michael Roth83c84662013-05-10 17:46:09 -0500672}
673
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100674static void test_list_union(TestOutputVisitorData *data,
675 const void *unused,
676 UserDefListUnionKind kind)
Michael Roth83c84662013-05-10 17:46:09 -0500677{
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100678 UserDefListUnion *cvalue = g_new0(UserDefListUnion, 1);
Michael Roth83c84662013-05-10 17:46:09 -0500679 QObject *obj;
680
Eric Blakec363ace2015-10-26 16:34:53 -0600681 cvalue->type = kind;
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100682 init_list_union(cvalue);
Michael Roth83c84662013-05-10 17:46:09 -0500683
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100684 visit_type_UserDefListUnion(data->ov, NULL, &cvalue, &error_abort);
Michael Roth83c84662013-05-10 17:46:09 -0500685
Eric Blake23d17052016-06-09 10:48:42 -0600686 obj = visitor_get(data);
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100687 check_list_union(obj, cvalue->type);
688 qapi_free_UserDefListUnion(cvalue);
Michael Roth83c84662013-05-10 17:46:09 -0500689}
690
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100691static void test_visitor_out_list_union_int(TestOutputVisitorData *data,
692 const void *unused)
693{
694 test_list_union(data, unused, USER_DEF_LIST_UNION_KIND_INTEGER);
695}
696
697static void test_visitor_out_list_union_int8(TestOutputVisitorData *data,
Michael Roth83c84662013-05-10 17:46:09 -0500698 const void *unused)
699{
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100700 test_list_union(data, unused, USER_DEF_LIST_UNION_KIND_S8);
Michael Roth83c84662013-05-10 17:46:09 -0500701}
702
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100703static void test_visitor_out_list_union_int16(TestOutputVisitorData *data,
Michael Roth83c84662013-05-10 17:46:09 -0500704 const void *unused)
705{
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100706 test_list_union(data, unused, USER_DEF_LIST_UNION_KIND_S16);
Michael Roth83c84662013-05-10 17:46:09 -0500707}
708
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100709static void test_visitor_out_list_union_int32(TestOutputVisitorData *data,
Michael Roth83c84662013-05-10 17:46:09 -0500710 const void *unused)
711{
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100712 test_list_union(data, unused, USER_DEF_LIST_UNION_KIND_S32);
Michael Roth83c84662013-05-10 17:46:09 -0500713}
714
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100715static void test_visitor_out_list_union_int64(TestOutputVisitorData *data,
Michael Roth83c84662013-05-10 17:46:09 -0500716 const void *unused)
717{
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100718 test_list_union(data, unused, USER_DEF_LIST_UNION_KIND_S64);
Michael Roth83c84662013-05-10 17:46:09 -0500719}
720
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100721static void test_visitor_out_list_union_uint8(TestOutputVisitorData *data,
722 const void *unused)
Michael Roth83c84662013-05-10 17:46:09 -0500723{
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100724 test_list_union(data, unused, USER_DEF_LIST_UNION_KIND_U8);
725}
726
727static void test_visitor_out_list_union_uint16(TestOutputVisitorData *data,
728 const void *unused)
729{
730 test_list_union(data, unused, USER_DEF_LIST_UNION_KIND_U16);
731}
732
733static void test_visitor_out_list_union_uint32(TestOutputVisitorData *data,
734 const void *unused)
735{
736 test_list_union(data, unused, USER_DEF_LIST_UNION_KIND_U32);
737}
738
739static void test_visitor_out_list_union_uint64(TestOutputVisitorData *data,
740 const void *unused)
741{
742 test_list_union(data, unused, USER_DEF_LIST_UNION_KIND_U64);
743}
744
745static void test_visitor_out_list_union_bool(TestOutputVisitorData *data,
746 const void *unused)
747{
748 test_list_union(data, unused, USER_DEF_LIST_UNION_KIND_BOOLEAN);
749}
750
751static void test_visitor_out_list_union_str(TestOutputVisitorData *data,
752 const void *unused)
753{
754 test_list_union(data, unused, USER_DEF_LIST_UNION_KIND_STRING);
755}
756
757static void test_visitor_out_list_union_number(TestOutputVisitorData *data,
758 const void *unused)
759{
760 test_list_union(data, unused, USER_DEF_LIST_UNION_KIND_NUMBER);
Michael Roth83c84662013-05-10 17:46:09 -0500761}
762
Luiz Capitulinof294f822011-11-14 19:05:29 -0200763static void output_visitor_test_add(const char *testpath,
764 TestOutputVisitorData *data,
765 void (*test_func)(TestOutputVisitorData *data, const void *user_data))
766{
767 g_test_add(testpath, TestOutputVisitorData, data, visitor_output_setup,
768 test_func, visitor_output_teardown);
769}
770
771int main(int argc, char **argv)
772{
773 TestOutputVisitorData out_visitor_data;
774
775 g_test_init(&argc, &argv, NULL);
776
777 output_visitor_test_add("/visitor/output/int",
778 &out_visitor_data, test_visitor_out_int);
779 output_visitor_test_add("/visitor/output/bool",
780 &out_visitor_data, test_visitor_out_bool);
781 output_visitor_test_add("/visitor/output/number",
782 &out_visitor_data, test_visitor_out_number);
783 output_visitor_test_add("/visitor/output/string",
784 &out_visitor_data, test_visitor_out_string);
785 output_visitor_test_add("/visitor/output/no-string",
786 &out_visitor_data, test_visitor_out_no_string);
787 output_visitor_test_add("/visitor/output/enum",
788 &out_visitor_data, test_visitor_out_enum);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200789 output_visitor_test_add("/visitor/output/struct",
790 &out_visitor_data, test_visitor_out_struct);
791 output_visitor_test_add("/visitor/output/struct-nested",
792 &out_visitor_data, test_visitor_out_struct_nested);
793 output_visitor_test_add("/visitor/output/list",
794 &out_visitor_data, test_visitor_out_list);
Markus Armbruster28770e02015-09-16 13:06:24 +0200795 output_visitor_test_add("/visitor/output/any",
796 &out_visitor_data, test_visitor_out_any);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200797 output_visitor_test_add("/visitor/output/list-qapi-free",
798 &out_visitor_data, test_visitor_out_list_qapi_free);
Markus Armbruster2fc00432014-03-01 08:40:33 +0100799 output_visitor_test_add("/visitor/output/union-flat",
800 &out_visitor_data, test_visitor_out_union_flat);
Eric Blakeab045262015-05-04 09:05:11 -0600801 output_visitor_test_add("/visitor/output/alternate",
802 &out_visitor_data, test_visitor_out_alternate);
Eric Blake3df016f2016-04-28 15:45:23 -0600803 output_visitor_test_add("/visitor/output/null",
804 &out_visitor_data, test_visitor_out_null);
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100805 output_visitor_test_add("/visitor/output/list_union/int",
Eric Blake805017b2015-05-04 09:05:06 -0600806 &out_visitor_data,
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100807 test_visitor_out_list_union_int);
808 output_visitor_test_add("/visitor/output/list_union/int8",
Eric Blake805017b2015-05-04 09:05:06 -0600809 &out_visitor_data,
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100810 test_visitor_out_list_union_int8);
811 output_visitor_test_add("/visitor/output/list_union/int16",
Eric Blake805017b2015-05-04 09:05:06 -0600812 &out_visitor_data,
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100813 test_visitor_out_list_union_int16);
814 output_visitor_test_add("/visitor/output/list_union/int32",
Eric Blake805017b2015-05-04 09:05:06 -0600815 &out_visitor_data,
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100816 test_visitor_out_list_union_int32);
817 output_visitor_test_add("/visitor/output/list_union/int64",
Eric Blake805017b2015-05-04 09:05:06 -0600818 &out_visitor_data,
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100819 test_visitor_out_list_union_int64);
820 output_visitor_test_add("/visitor/output/list_union/uint8",
Eric Blake805017b2015-05-04 09:05:06 -0600821 &out_visitor_data,
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100822 test_visitor_out_list_union_uint8);
823 output_visitor_test_add("/visitor/output/list_union/uint16",
Eric Blake805017b2015-05-04 09:05:06 -0600824 &out_visitor_data,
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100825 test_visitor_out_list_union_uint16);
826 output_visitor_test_add("/visitor/output/list_union/uint32",
Eric Blake805017b2015-05-04 09:05:06 -0600827 &out_visitor_data,
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100828 test_visitor_out_list_union_uint32);
829 output_visitor_test_add("/visitor/output/list_union/uint64",
Eric Blake805017b2015-05-04 09:05:06 -0600830 &out_visitor_data,
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100831 test_visitor_out_list_union_uint64);
832 output_visitor_test_add("/visitor/output/list_union/bool",
Eric Blake805017b2015-05-04 09:05:06 -0600833 &out_visitor_data,
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100834 test_visitor_out_list_union_bool);
835 output_visitor_test_add("/visitor/output/list_union/string",
Eric Blake805017b2015-05-04 09:05:06 -0600836 &out_visitor_data,
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100837 test_visitor_out_list_union_str);
838 output_visitor_test_add("/visitor/output/list_union/number",
Eric Blake805017b2015-05-04 09:05:06 -0600839 &out_visitor_data,
Markus Armbrusterb359f4b2019-03-01 16:40:49 +0100840 test_visitor_out_list_union_number);
Luiz Capitulinof294f822011-11-14 19:05:29 -0200841
842 g_test_run();
843
844 return 0;
845}