2 * QObject Output Visitor unit-tests.
4 * Copyright (C) 2011-2016 Red Hat Inc.
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.
13 #include "qemu/osdep.h"
15 #include "qemu-common.h"
16 #include "qapi/error.h"
17 #include "qapi/qobject-output-visitor.h"
18 #include "test-qapi-types.h"
19 #include "test-qapi-visit.h"
20 #include "qapi/qmp/types.h"
21 #include "qapi/qmp/qjson.h"
23 typedef struct TestOutputVisitorData {
26 } TestOutputVisitorData;
28 static void visitor_output_setup(TestOutputVisitorData *data,
31 data->ov = qobject_output_visitor_new(&data->obj);
35 static void visitor_output_teardown(TestOutputVisitorData *data,
40 qobject_decref(data->obj);
44 static QObject *visitor_get(TestOutputVisitorData *data)
46 visit_complete(data->ov, &data->obj);
51 static void visitor_reset(TestOutputVisitorData *data)
53 visitor_output_teardown(data, NULL);
54 visitor_output_setup(data, NULL);
57 static void test_visitor_out_int(TestOutputVisitorData *data,
63 visit_type_int(data->ov, NULL, &value, &error_abort);
65 qint = qobject_to_qint(visitor_get(data));
67 g_assert_cmpint(qint_get_int(qint), ==, value);
70 static void test_visitor_out_bool(TestOutputVisitorData *data,
76 visit_type_bool(data->ov, NULL, &value, &error_abort);
78 obj = visitor_get(data);
79 g_assert(qobject_type(obj) == QTYPE_QBOOL);
80 g_assert(qbool_get_bool(qobject_to_qbool(obj)) == value);
83 static void test_visitor_out_number(TestOutputVisitorData *data,
89 visit_type_number(data->ov, NULL, &value, &error_abort);
91 qfloat = qobject_to_qfloat(visitor_get(data));
93 g_assert(qfloat_get_double(qfloat) == value);
96 static void test_visitor_out_string(TestOutputVisitorData *data,
99 char *string = (char *) "Q E M U";
102 visit_type_str(data->ov, NULL, &string, &error_abort);
104 qstr = qobject_to_qstring(visitor_get(data));
106 g_assert_cmpstr(qstring_get_str(qstr), ==, string);
109 static void test_visitor_out_no_string(TestOutputVisitorData *data,
115 /* A null string should return "" */
116 visit_type_str(data->ov, NULL, &string, &error_abort);
118 qstr = qobject_to_qstring(visitor_get(data));
120 g_assert_cmpstr(qstring_get_str(qstr), ==, "");
123 static void test_visitor_out_enum(TestOutputVisitorData *data,
129 for (i = 0; i < ENUM_ONE__MAX; i++) {
130 visit_type_EnumOne(data->ov, "unused", &i, &error_abort);
132 qstr = qobject_to_qstring(visitor_get(data));
134 g_assert_cmpstr(qstring_get_str(qstr), ==, EnumOne_lookup[i]);
139 static void test_visitor_out_enum_errors(TestOutputVisitorData *data,
142 EnumOne i, bad_values[] = { ENUM_ONE__MAX, -1 };
145 for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) {
147 visit_type_EnumOne(data->ov, "unused", &bad_values[i], &err);
155 static void test_visitor_out_struct(TestOutputVisitorData *data,
158 TestStruct test_struct = { .integer = 42,
160 .string = (char *) "foo"};
161 TestStruct *p = &test_struct;
164 visit_type_TestStruct(data->ov, NULL, &p, &error_abort);
166 qdict = qobject_to_qdict(visitor_get(data));
168 g_assert_cmpint(qdict_size(qdict), ==, 3);
169 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 42);
170 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, false);
171 g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, "foo");
174 static void test_visitor_out_struct_nested(TestOutputVisitorData *data,
179 QDict *qdict, *dict1, *dict2, *dict3, *userdef;
180 const char *string = "user def string";
181 const char *strings[] = { "forty two", "forty three", "forty four",
184 ud2 = g_malloc0(sizeof(*ud2));
185 ud2->string0 = g_strdup(strings[0]);
187 ud2->dict1 = g_malloc0(sizeof(*ud2->dict1));
188 ud2->dict1->string1 = g_strdup(strings[1]);
190 ud2->dict1->dict2 = g_malloc0(sizeof(*ud2->dict1->dict2));
191 ud2->dict1->dict2->userdef = g_new0(UserDefOne, 1);
192 ud2->dict1->dict2->userdef->string = g_strdup(string);
193 ud2->dict1->dict2->userdef->integer = value;
194 ud2->dict1->dict2->string = g_strdup(strings[2]);
196 ud2->dict1->dict3 = g_malloc0(sizeof(*ud2->dict1->dict3));
197 ud2->dict1->has_dict3 = true;
198 ud2->dict1->dict3->userdef = g_new0(UserDefOne, 1);
199 ud2->dict1->dict3->userdef->string = g_strdup(string);
200 ud2->dict1->dict3->userdef->integer = value;
201 ud2->dict1->dict3->string = g_strdup(strings[3]);
203 visit_type_UserDefTwo(data->ov, "unused", &ud2, &error_abort);
205 qdict = qobject_to_qdict(visitor_get(data));
207 g_assert_cmpint(qdict_size(qdict), ==, 2);
208 g_assert_cmpstr(qdict_get_str(qdict, "string0"), ==, strings[0]);
210 dict1 = qdict_get_qdict(qdict, "dict1");
211 g_assert_cmpint(qdict_size(dict1), ==, 3);
212 g_assert_cmpstr(qdict_get_str(dict1, "string1"), ==, strings[1]);
214 dict2 = qdict_get_qdict(dict1, "dict2");
215 g_assert_cmpint(qdict_size(dict2), ==, 2);
216 g_assert_cmpstr(qdict_get_str(dict2, "string"), ==, strings[2]);
217 userdef = qdict_get_qdict(dict2, "userdef");
218 g_assert_cmpint(qdict_size(userdef), ==, 2);
219 g_assert_cmpint(qdict_get_int(userdef, "integer"), ==, value);
220 g_assert_cmpstr(qdict_get_str(userdef, "string"), ==, string);
222 dict3 = qdict_get_qdict(dict1, "dict3");
223 g_assert_cmpint(qdict_size(dict3), ==, 2);
224 g_assert_cmpstr(qdict_get_str(dict3, "string"), ==, strings[3]);
225 userdef = qdict_get_qdict(dict3, "userdef");
226 g_assert_cmpint(qdict_size(userdef), ==, 2);
227 g_assert_cmpint(qdict_get_int(userdef, "integer"), ==, value);
228 g_assert_cmpstr(qdict_get_str(userdef, "string"), ==, string);
230 qapi_free_UserDefTwo(ud2);
233 static void test_visitor_out_struct_errors(TestOutputVisitorData *data,
236 EnumOne bad_values[] = { ENUM_ONE__MAX, -1 };
242 for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) {
245 u.enum1 = bad_values[i];
246 visit_type_UserDefOne(data->ov, "unused", &pu, &err);
254 static void test_visitor_out_list(TestOutputVisitorData *data,
257 const char *value_str = "list value";
258 TestStructList *p, *head = NULL;
259 const int max_items = 10;
260 bool value_bool = true;
266 /* Build the list in reverse order... */
267 for (i = 0; i < max_items; i++) {
268 p = g_malloc0(sizeof(*p));
269 p->value = g_malloc0(sizeof(*p->value));
270 p->value->integer = value_int + (max_items - i - 1);
271 p->value->boolean = value_bool;
272 p->value->string = g_strdup(value_str);
278 visit_type_TestStructList(data->ov, NULL, &head, &error_abort);
280 qlist = qobject_to_qlist(visitor_get(data));
282 g_assert(!qlist_empty(qlist));
284 /* ...and ensure that the visitor sees it in order */
286 QLIST_FOREACH_ENTRY(qlist, entry) {
289 qdict = qobject_to_qdict(entry->value);
291 g_assert_cmpint(qdict_size(qdict), ==, 3);
292 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, value_int + i);
293 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, value_bool);
294 g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, value_str);
297 g_assert_cmpint(i, ==, max_items);
299 qapi_free_TestStructList(head);
302 static void test_visitor_out_list_qapi_free(TestOutputVisitorData *data,
305 UserDefTwoList *p, *head = NULL;
306 const char string[] = "foo bar";
307 int i, max_count = 1024;
309 for (i = 0; i < max_count; i++) {
310 p = g_malloc0(sizeof(*p));
311 p->value = g_malloc0(sizeof(*p->value));
313 p->value->string0 = g_strdup(string);
314 p->value->dict1 = g_new0(UserDefTwoDict, 1);
315 p->value->dict1->string1 = g_strdup(string);
316 p->value->dict1->dict2 = g_new0(UserDefTwoDictDict, 1);
317 p->value->dict1->dict2->userdef = g_new0(UserDefOne, 1);
318 p->value->dict1->dict2->userdef->string = g_strdup(string);
319 p->value->dict1->dict2->userdef->integer = 42;
320 p->value->dict1->dict2->string = g_strdup(string);
321 p->value->dict1->has_dict3 = false;
327 qapi_free_UserDefTwoList(head);
330 static void test_visitor_out_any(TestOutputVisitorData *data,
339 qobj = QOBJECT(qint_from_int(-42));
340 visit_type_any(data->ov, NULL, &qobj, &error_abort);
341 qint = qobject_to_qint(visitor_get(data));
343 g_assert_cmpint(qint_get_int(qint), ==, -42);
344 qobject_decref(qobj);
348 qdict_put(qdict, "integer", qint_from_int(-42));
349 qdict_put(qdict, "boolean", qbool_from_bool(true));
350 qdict_put(qdict, "string", qstring_from_str("foo"));
351 qobj = QOBJECT(qdict);
352 visit_type_any(data->ov, NULL, &qobj, &error_abort);
353 qobject_decref(qobj);
354 qdict = qobject_to_qdict(visitor_get(data));
356 qint = qobject_to_qint(qdict_get(qdict, "integer"));
358 g_assert_cmpint(qint_get_int(qint), ==, -42);
359 qobj = qdict_get(qdict, "boolean");
361 qbool = qobject_to_qbool(qobj);
363 g_assert(qbool_get_bool(qbool) == true);
364 qstring = qobject_to_qstring(qdict_get(qdict, "string"));
366 g_assert_cmpstr(qstring_get_str(qstring), ==, "foo");
369 static void test_visitor_out_union_flat(TestOutputVisitorData *data,
374 UserDefFlatUnion *tmp = g_malloc0(sizeof(UserDefFlatUnion));
375 tmp->enum1 = ENUM_ONE_VALUE1;
376 tmp->string = g_strdup("str");
378 tmp->u.value1.boolean = true;
380 visit_type_UserDefFlatUnion(data->ov, NULL, &tmp, &error_abort);
381 qdict = qobject_to_qdict(visitor_get(data));
383 g_assert_cmpstr(qdict_get_str(qdict, "enum1"), ==, "value1");
384 g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, "str");
385 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 41);
386 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, true);
388 qapi_free_UserDefFlatUnion(tmp);
391 static void test_visitor_out_alternate(TestOutputVisitorData *data,
394 UserDefAlternate *tmp;
399 tmp = g_new0(UserDefAlternate, 1);
400 tmp->type = QTYPE_QINT;
403 visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
404 qint = qobject_to_qint(visitor_get(data));
406 g_assert_cmpint(qint_get_int(qint), ==, 42);
408 qapi_free_UserDefAlternate(tmp);
411 tmp = g_new0(UserDefAlternate, 1);
412 tmp->type = QTYPE_QSTRING;
413 tmp->u.s = g_strdup("hello");
415 visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
416 qstr = qobject_to_qstring(visitor_get(data));
418 g_assert_cmpstr(qstring_get_str(qstr), ==, "hello");
420 qapi_free_UserDefAlternate(tmp);
423 tmp = g_new0(UserDefAlternate, 1);
424 tmp->type = QTYPE_QDICT;
425 tmp->u.udfu.integer = 1;
426 tmp->u.udfu.string = g_strdup("str");
427 tmp->u.udfu.enum1 = ENUM_ONE_VALUE1;
428 tmp->u.udfu.u.value1.boolean = true;
430 visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
431 qdict = qobject_to_qdict(visitor_get(data));
433 g_assert_cmpint(qdict_size(qdict), ==, 4);
434 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 1);
435 g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, "str");
436 g_assert_cmpstr(qdict_get_str(qdict, "enum1"), ==, "value1");
437 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, true);
439 qapi_free_UserDefAlternate(tmp);
442 static void test_visitor_out_null(TestOutputVisitorData *data,
448 visit_start_struct(data->ov, NULL, NULL, 0, &error_abort);
449 visit_type_null(data->ov, "a", &error_abort);
450 visit_check_struct(data->ov, &error_abort);
451 visit_end_struct(data->ov, NULL);
452 qdict = qobject_to_qdict(visitor_get(data));
454 g_assert_cmpint(qdict_size(qdict), ==, 1);
455 nil = qdict_get(qdict, "a");
457 g_assert(qobject_type(nil) == QTYPE_QNULL);
460 static void init_native_list(UserDefNativeListUnion *cvalue)
463 switch (cvalue->type) {
464 case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER: {
465 intList **list = &cvalue->u.integer.data;
466 for (i = 0; i < 32; i++) {
467 *list = g_new0(intList, 1);
469 (*list)->next = NULL;
470 list = &(*list)->next;
474 case USER_DEF_NATIVE_LIST_UNION_KIND_S8: {
475 int8List **list = &cvalue->u.s8.data;
476 for (i = 0; i < 32; i++) {
477 *list = g_new0(int8List, 1);
479 (*list)->next = NULL;
480 list = &(*list)->next;
484 case USER_DEF_NATIVE_LIST_UNION_KIND_S16: {
485 int16List **list = &cvalue->u.s16.data;
486 for (i = 0; i < 32; i++) {
487 *list = g_new0(int16List, 1);
489 (*list)->next = NULL;
490 list = &(*list)->next;
494 case USER_DEF_NATIVE_LIST_UNION_KIND_S32: {
495 int32List **list = &cvalue->u.s32.data;
496 for (i = 0; i < 32; i++) {
497 *list = g_new0(int32List, 1);
499 (*list)->next = NULL;
500 list = &(*list)->next;
504 case USER_DEF_NATIVE_LIST_UNION_KIND_S64: {
505 int64List **list = &cvalue->u.s64.data;
506 for (i = 0; i < 32; i++) {
507 *list = g_new0(int64List, 1);
509 (*list)->next = NULL;
510 list = &(*list)->next;
514 case USER_DEF_NATIVE_LIST_UNION_KIND_U8: {
515 uint8List **list = &cvalue->u.u8.data;
516 for (i = 0; i < 32; i++) {
517 *list = g_new0(uint8List, 1);
519 (*list)->next = NULL;
520 list = &(*list)->next;
524 case USER_DEF_NATIVE_LIST_UNION_KIND_U16: {
525 uint16List **list = &cvalue->u.u16.data;
526 for (i = 0; i < 32; i++) {
527 *list = g_new0(uint16List, 1);
529 (*list)->next = NULL;
530 list = &(*list)->next;
534 case USER_DEF_NATIVE_LIST_UNION_KIND_U32: {
535 uint32List **list = &cvalue->u.u32.data;
536 for (i = 0; i < 32; i++) {
537 *list = g_new0(uint32List, 1);
539 (*list)->next = NULL;
540 list = &(*list)->next;
544 case USER_DEF_NATIVE_LIST_UNION_KIND_U64: {
545 uint64List **list = &cvalue->u.u64.data;
546 for (i = 0; i < 32; i++) {
547 *list = g_new0(uint64List, 1);
549 (*list)->next = NULL;
550 list = &(*list)->next;
554 case USER_DEF_NATIVE_LIST_UNION_KIND_BOOLEAN: {
555 boolList **list = &cvalue->u.boolean.data;
556 for (i = 0; i < 32; i++) {
557 *list = g_new0(boolList, 1);
558 (*list)->value = (i % 3 == 0);
559 (*list)->next = NULL;
560 list = &(*list)->next;
564 case USER_DEF_NATIVE_LIST_UNION_KIND_STRING: {
565 strList **list = &cvalue->u.string.data;
566 for (i = 0; i < 32; i++) {
567 *list = g_new0(strList, 1);
568 (*list)->value = g_strdup_printf("%d", i);
569 (*list)->next = NULL;
570 list = &(*list)->next;
574 case USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER: {
575 numberList **list = &cvalue->u.number.data;
576 for (i = 0; i < 32; i++) {
577 *list = g_new0(numberList, 1);
578 (*list)->value = (double)i / 3;
579 (*list)->next = NULL;
580 list = &(*list)->next;
585 g_assert_not_reached();
589 static void check_native_list(QObject *qobj,
590 UserDefNativeListUnionKind kind)
596 qdict = qobject_to_qdict(qobj);
598 g_assert(qdict_haskey(qdict, "data"));
599 qlist = qlist_copy(qobject_to_qlist(qdict_get(qdict, "data")));
602 case USER_DEF_NATIVE_LIST_UNION_KIND_S8:
603 case USER_DEF_NATIVE_LIST_UNION_KIND_S16:
604 case USER_DEF_NATIVE_LIST_UNION_KIND_S32:
605 case USER_DEF_NATIVE_LIST_UNION_KIND_S64:
606 case USER_DEF_NATIVE_LIST_UNION_KIND_U8:
607 case USER_DEF_NATIVE_LIST_UNION_KIND_U16:
608 case USER_DEF_NATIVE_LIST_UNION_KIND_U32:
609 case USER_DEF_NATIVE_LIST_UNION_KIND_U64:
610 /* all integer elements in JSON arrays get stored into QInts when
611 * we convert to QObjects, so we can check them all in the same
612 * fashion, so simply fall through here
614 case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER:
615 for (i = 0; i < 32; i++) {
618 tmp = qlist_peek(qlist);
620 qvalue = qobject_to_qint(tmp);
621 g_assert_cmpint(qint_get_int(qvalue), ==, i);
622 qobject_decref(qlist_pop(qlist));
625 case USER_DEF_NATIVE_LIST_UNION_KIND_BOOLEAN:
626 for (i = 0; i < 32; i++) {
629 tmp = qlist_peek(qlist);
631 qvalue = qobject_to_qbool(tmp);
632 g_assert_cmpint(qbool_get_bool(qvalue), ==, i % 3 == 0);
633 qobject_decref(qlist_pop(qlist));
636 case USER_DEF_NATIVE_LIST_UNION_KIND_STRING:
637 for (i = 0; i < 32; i++) {
641 tmp = qlist_peek(qlist);
643 qvalue = qobject_to_qstring(tmp);
644 sprintf(str, "%d", i);
645 g_assert_cmpstr(qstring_get_str(qvalue), ==, str);
646 qobject_decref(qlist_pop(qlist));
649 case USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER:
650 for (i = 0; i < 32; i++) {
653 GString *double_expected = g_string_new("");
654 GString *double_actual = g_string_new("");
656 tmp = qlist_peek(qlist);
658 qvalue = qobject_to_qfloat(tmp);
659 g_string_printf(double_expected, "%.6f", (double)i / 3);
660 g_string_printf(double_actual, "%.6f", qfloat_get_double(qvalue));
661 g_assert_cmpstr(double_actual->str, ==, double_expected->str);
663 qobject_decref(qlist_pop(qlist));
664 g_string_free(double_expected, true);
665 g_string_free(double_actual, true);
669 g_assert_not_reached();
674 static void test_native_list(TestOutputVisitorData *data,
676 UserDefNativeListUnionKind kind)
678 UserDefNativeListUnion *cvalue = g_new0(UserDefNativeListUnion, 1);
682 init_native_list(cvalue);
684 visit_type_UserDefNativeListUnion(data->ov, NULL, &cvalue, &error_abort);
686 obj = visitor_get(data);
687 check_native_list(obj, cvalue->type);
688 qapi_free_UserDefNativeListUnion(cvalue);
691 static void test_visitor_out_native_list_int(TestOutputVisitorData *data,
694 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER);
697 static void test_visitor_out_native_list_int8(TestOutputVisitorData *data,
700 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_S8);
703 static void test_visitor_out_native_list_int16(TestOutputVisitorData *data,
706 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_S16);
709 static void test_visitor_out_native_list_int32(TestOutputVisitorData *data,
712 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_S32);
715 static void test_visitor_out_native_list_int64(TestOutputVisitorData *data,
718 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_S64);
721 static void test_visitor_out_native_list_uint8(TestOutputVisitorData *data,
724 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_U8);
727 static void test_visitor_out_native_list_uint16(TestOutputVisitorData *data,
730 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_U16);
733 static void test_visitor_out_native_list_uint32(TestOutputVisitorData *data,
736 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_U32);
739 static void test_visitor_out_native_list_uint64(TestOutputVisitorData *data,
742 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_U64);
745 static void test_visitor_out_native_list_bool(TestOutputVisitorData *data,
748 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_BOOLEAN);
751 static void test_visitor_out_native_list_str(TestOutputVisitorData *data,
754 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_STRING);
757 static void test_visitor_out_native_list_number(TestOutputVisitorData *data,
760 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER);
763 static void output_visitor_test_add(const char *testpath,
764 TestOutputVisitorData *data,
765 void (*test_func)(TestOutputVisitorData *data, const void *user_data))
767 g_test_add(testpath, TestOutputVisitorData, data, visitor_output_setup,
768 test_func, visitor_output_teardown);
771 int main(int argc, char **argv)
773 TestOutputVisitorData out_visitor_data;
775 g_test_init(&argc, &argv, NULL);
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);
789 output_visitor_test_add("/visitor/output/enum-errors",
790 &out_visitor_data, test_visitor_out_enum_errors);
791 output_visitor_test_add("/visitor/output/struct",
792 &out_visitor_data, test_visitor_out_struct);
793 output_visitor_test_add("/visitor/output/struct-nested",
794 &out_visitor_data, test_visitor_out_struct_nested);
795 output_visitor_test_add("/visitor/output/struct-errors",
796 &out_visitor_data, test_visitor_out_struct_errors);
797 output_visitor_test_add("/visitor/output/list",
798 &out_visitor_data, test_visitor_out_list);
799 output_visitor_test_add("/visitor/output/any",
800 &out_visitor_data, test_visitor_out_any);
801 output_visitor_test_add("/visitor/output/list-qapi-free",
802 &out_visitor_data, test_visitor_out_list_qapi_free);
803 output_visitor_test_add("/visitor/output/union-flat",
804 &out_visitor_data, test_visitor_out_union_flat);
805 output_visitor_test_add("/visitor/output/alternate",
806 &out_visitor_data, test_visitor_out_alternate);
807 output_visitor_test_add("/visitor/output/null",
808 &out_visitor_data, test_visitor_out_null);
809 output_visitor_test_add("/visitor/output/native_list/int",
811 test_visitor_out_native_list_int);
812 output_visitor_test_add("/visitor/output/native_list/int8",
814 test_visitor_out_native_list_int8);
815 output_visitor_test_add("/visitor/output/native_list/int16",
817 test_visitor_out_native_list_int16);
818 output_visitor_test_add("/visitor/output/native_list/int32",
820 test_visitor_out_native_list_int32);
821 output_visitor_test_add("/visitor/output/native_list/int64",
823 test_visitor_out_native_list_int64);
824 output_visitor_test_add("/visitor/output/native_list/uint8",
826 test_visitor_out_native_list_uint8);
827 output_visitor_test_add("/visitor/output/native_list/uint16",
829 test_visitor_out_native_list_uint16);
830 output_visitor_test_add("/visitor/output/native_list/uint32",
832 test_visitor_out_native_list_uint32);
833 output_visitor_test_add("/visitor/output/native_list/uint64",
835 test_visitor_out_native_list_uint64);
836 output_visitor_test_add("/visitor/output/native_list/bool",
838 test_visitor_out_native_list_bool);
839 output_visitor_test_add("/visitor/output/native_list/string",
841 test_visitor_out_native_list_str);
842 output_visitor_test_add("/visitor/output/native_list/number",
844 test_visitor_out_native_list_number);