Statistics
| Branch: | Revision:

root / test-string-input-visitor.c @ 371c6489

History | View | Annotate | Download (5.2 kB)

1 2d7799f2 Paolo Bonzini
/*
2 2d7799f2 Paolo Bonzini
 * String Input Visitor unit-tests.
3 2d7799f2 Paolo Bonzini
 *
4 2d7799f2 Paolo Bonzini
 * Copyright (C) 2012 Red Hat Inc.
5 2d7799f2 Paolo Bonzini
 *
6 2d7799f2 Paolo Bonzini
 * Authors:
7 2d7799f2 Paolo Bonzini
 *  Paolo Bonzini <pbonzini@redhat.com> (based on test-qmp-input-visitor)
8 2d7799f2 Paolo Bonzini
 *
9 2d7799f2 Paolo Bonzini
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 2d7799f2 Paolo Bonzini
 * See the COPYING file in the top-level directory.
11 2d7799f2 Paolo Bonzini
 */
12 2d7799f2 Paolo Bonzini
13 2d7799f2 Paolo Bonzini
#include <glib.h>
14 2d7799f2 Paolo Bonzini
#include <stdarg.h>
15 2d7799f2 Paolo Bonzini
16 2d7799f2 Paolo Bonzini
#include "qapi/string-input-visitor.h"
17 2d7799f2 Paolo Bonzini
#include "test-qapi-types.h"
18 2d7799f2 Paolo Bonzini
#include "test-qapi-visit.h"
19 2d7799f2 Paolo Bonzini
#include "qemu-objects.h"
20 2d7799f2 Paolo Bonzini
21 2d7799f2 Paolo Bonzini
typedef struct TestInputVisitorData {
22 2d7799f2 Paolo Bonzini
    StringInputVisitor *siv;
23 2d7799f2 Paolo Bonzini
} TestInputVisitorData;
24 2d7799f2 Paolo Bonzini
25 2d7799f2 Paolo Bonzini
static void visitor_input_teardown(TestInputVisitorData *data,
26 2d7799f2 Paolo Bonzini
                                   const void *unused)
27 2d7799f2 Paolo Bonzini
{
28 2d7799f2 Paolo Bonzini
    if (data->siv) {
29 2d7799f2 Paolo Bonzini
        string_input_visitor_cleanup(data->siv);
30 2d7799f2 Paolo Bonzini
        data->siv = NULL;
31 2d7799f2 Paolo Bonzini
    }
32 2d7799f2 Paolo Bonzini
}
33 2d7799f2 Paolo Bonzini
34 2d7799f2 Paolo Bonzini
/* This is provided instead of a test setup function so that the JSON
35 2d7799f2 Paolo Bonzini
   string used by the tests are kept in the test functions (and not
36 2d7799f2 Paolo Bonzini
   int main()) */
37 2d7799f2 Paolo Bonzini
static
38 2d7799f2 Paolo Bonzini
Visitor *visitor_input_test_init(TestInputVisitorData *data,
39 2d7799f2 Paolo Bonzini
                                 const char *string)
40 2d7799f2 Paolo Bonzini
{
41 2d7799f2 Paolo Bonzini
    Visitor *v;
42 2d7799f2 Paolo Bonzini
43 2d7799f2 Paolo Bonzini
    data->siv = string_input_visitor_new(string);
44 2d7799f2 Paolo Bonzini
    g_assert(data->siv != NULL);
45 2d7799f2 Paolo Bonzini
46 2d7799f2 Paolo Bonzini
    v = string_input_get_visitor(data->siv);
47 2d7799f2 Paolo Bonzini
    g_assert(v != NULL);
48 2d7799f2 Paolo Bonzini
49 2d7799f2 Paolo Bonzini
    return v;
50 2d7799f2 Paolo Bonzini
}
51 2d7799f2 Paolo Bonzini
52 2d7799f2 Paolo Bonzini
static void test_visitor_in_int(TestInputVisitorData *data,
53 2d7799f2 Paolo Bonzini
                                const void *unused)
54 2d7799f2 Paolo Bonzini
{
55 2d7799f2 Paolo Bonzini
    int64_t res = 0, value = -42;
56 2d7799f2 Paolo Bonzini
    Error *errp = NULL;
57 2d7799f2 Paolo Bonzini
    Visitor *v;
58 2d7799f2 Paolo Bonzini
59 2d7799f2 Paolo Bonzini
    v = visitor_input_test_init(data, "-42");
60 2d7799f2 Paolo Bonzini
61 2d7799f2 Paolo Bonzini
    visit_type_int(v, &res, NULL, &errp);
62 2d7799f2 Paolo Bonzini
    g_assert(!error_is_set(&errp));
63 2d7799f2 Paolo Bonzini
    g_assert_cmpint(res, ==, value);
64 2d7799f2 Paolo Bonzini
}
65 2d7799f2 Paolo Bonzini
66 2d7799f2 Paolo Bonzini
static void test_visitor_in_bool(TestInputVisitorData *data,
67 2d7799f2 Paolo Bonzini
                                 const void *unused)
68 2d7799f2 Paolo Bonzini
{
69 2d7799f2 Paolo Bonzini
    Error *errp = NULL;
70 2d7799f2 Paolo Bonzini
    bool res = false;
71 2d7799f2 Paolo Bonzini
    Visitor *v;
72 2d7799f2 Paolo Bonzini
73 2d7799f2 Paolo Bonzini
    v = visitor_input_test_init(data, "true");
74 2d7799f2 Paolo Bonzini
75 2d7799f2 Paolo Bonzini
    visit_type_bool(v, &res, NULL, &errp);
76 2d7799f2 Paolo Bonzini
    g_assert(!error_is_set(&errp));
77 2d7799f2 Paolo Bonzini
    g_assert_cmpint(res, ==, true);
78 2d7799f2 Paolo Bonzini
    visitor_input_teardown(data, unused);
79 2d7799f2 Paolo Bonzini
80 2d7799f2 Paolo Bonzini
    v = visitor_input_test_init(data, "yes");
81 2d7799f2 Paolo Bonzini
82 2d7799f2 Paolo Bonzini
    visit_type_bool(v, &res, NULL, &errp);
83 2d7799f2 Paolo Bonzini
    g_assert(!error_is_set(&errp));
84 2d7799f2 Paolo Bonzini
    g_assert_cmpint(res, ==, true);
85 2d7799f2 Paolo Bonzini
    visitor_input_teardown(data, unused);
86 2d7799f2 Paolo Bonzini
87 2d7799f2 Paolo Bonzini
    v = visitor_input_test_init(data, "on");
88 2d7799f2 Paolo Bonzini
89 2d7799f2 Paolo Bonzini
    visit_type_bool(v, &res, NULL, &errp);
90 2d7799f2 Paolo Bonzini
    g_assert(!error_is_set(&errp));
91 2d7799f2 Paolo Bonzini
    g_assert_cmpint(res, ==, true);
92 2d7799f2 Paolo Bonzini
    visitor_input_teardown(data, unused);
93 2d7799f2 Paolo Bonzini
94 2d7799f2 Paolo Bonzini
    v = visitor_input_test_init(data, "false");
95 2d7799f2 Paolo Bonzini
96 2d7799f2 Paolo Bonzini
    visit_type_bool(v, &res, NULL, &errp);
97 2d7799f2 Paolo Bonzini
    g_assert(!error_is_set(&errp));
98 2d7799f2 Paolo Bonzini
    g_assert_cmpint(res, ==, false);
99 2d7799f2 Paolo Bonzini
    visitor_input_teardown(data, unused);
100 2d7799f2 Paolo Bonzini
101 2d7799f2 Paolo Bonzini
    v = visitor_input_test_init(data, "no");
102 2d7799f2 Paolo Bonzini
103 2d7799f2 Paolo Bonzini
    visit_type_bool(v, &res, NULL, &errp);
104 2d7799f2 Paolo Bonzini
    g_assert(!error_is_set(&errp));
105 2d7799f2 Paolo Bonzini
    g_assert_cmpint(res, ==, false);
106 2d7799f2 Paolo Bonzini
    visitor_input_teardown(data, unused);
107 2d7799f2 Paolo Bonzini
108 2d7799f2 Paolo Bonzini
    v = visitor_input_test_init(data, "off");
109 2d7799f2 Paolo Bonzini
110 2d7799f2 Paolo Bonzini
    visit_type_bool(v, &res, NULL, &errp);
111 2d7799f2 Paolo Bonzini
    g_assert(!error_is_set(&errp));
112 2d7799f2 Paolo Bonzini
    g_assert_cmpint(res, ==, false);
113 2d7799f2 Paolo Bonzini
}
114 2d7799f2 Paolo Bonzini
115 2d7799f2 Paolo Bonzini
static void test_visitor_in_number(TestInputVisitorData *data,
116 2d7799f2 Paolo Bonzini
                                   const void *unused)
117 2d7799f2 Paolo Bonzini
{
118 2d7799f2 Paolo Bonzini
    double res = 0, value = 3.14;
119 2d7799f2 Paolo Bonzini
    Error *errp = NULL;
120 2d7799f2 Paolo Bonzini
    Visitor *v;
121 2d7799f2 Paolo Bonzini
122 2d7799f2 Paolo Bonzini
    v = visitor_input_test_init(data, "3.14");
123 2d7799f2 Paolo Bonzini
124 2d7799f2 Paolo Bonzini
    visit_type_number(v, &res, NULL, &errp);
125 2d7799f2 Paolo Bonzini
    g_assert(!error_is_set(&errp));
126 2d7799f2 Paolo Bonzini
    g_assert_cmpfloat(res, ==, value);
127 2d7799f2 Paolo Bonzini
}
128 2d7799f2 Paolo Bonzini
129 2d7799f2 Paolo Bonzini
static void test_visitor_in_string(TestInputVisitorData *data,
130 2d7799f2 Paolo Bonzini
                                   const void *unused)
131 2d7799f2 Paolo Bonzini
{
132 2d7799f2 Paolo Bonzini
    char *res = NULL, *value = (char *) "Q E M U";
133 2d7799f2 Paolo Bonzini
    Error *errp = NULL;
134 2d7799f2 Paolo Bonzini
    Visitor *v;
135 2d7799f2 Paolo Bonzini
136 2d7799f2 Paolo Bonzini
    v = visitor_input_test_init(data, value);
137 2d7799f2 Paolo Bonzini
138 2d7799f2 Paolo Bonzini
    visit_type_str(v, &res, NULL, &errp);
139 2d7799f2 Paolo Bonzini
    g_assert(!error_is_set(&errp));
140 2d7799f2 Paolo Bonzini
    g_assert_cmpstr(res, ==, value);
141 2d7799f2 Paolo Bonzini
142 2d7799f2 Paolo Bonzini
    g_free(res);
143 2d7799f2 Paolo Bonzini
}
144 2d7799f2 Paolo Bonzini
145 2d7799f2 Paolo Bonzini
static void test_visitor_in_enum(TestInputVisitorData *data,
146 2d7799f2 Paolo Bonzini
                                 const void *unused)
147 2d7799f2 Paolo Bonzini
{
148 2d7799f2 Paolo Bonzini
    Error *errp = NULL;
149 2d7799f2 Paolo Bonzini
    Visitor *v;
150 2d7799f2 Paolo Bonzini
    EnumOne i;
151 2d7799f2 Paolo Bonzini
152 2d7799f2 Paolo Bonzini
    for (i = 0; EnumOne_lookup[i]; i++) {
153 2d7799f2 Paolo Bonzini
        EnumOne res = -1;
154 2d7799f2 Paolo Bonzini
155 2d7799f2 Paolo Bonzini
        v = visitor_input_test_init(data, EnumOne_lookup[i]);
156 2d7799f2 Paolo Bonzini
157 2d7799f2 Paolo Bonzini
        visit_type_EnumOne(v, &res, NULL, &errp);
158 2d7799f2 Paolo Bonzini
        g_assert(!error_is_set(&errp));
159 2d7799f2 Paolo Bonzini
        g_assert_cmpint(i, ==, res);
160 2d7799f2 Paolo Bonzini
161 2d7799f2 Paolo Bonzini
        visitor_input_teardown(data, NULL);
162 2d7799f2 Paolo Bonzini
    }
163 2d7799f2 Paolo Bonzini
164 2d7799f2 Paolo Bonzini
    data->siv = NULL;
165 2d7799f2 Paolo Bonzini
}
166 2d7799f2 Paolo Bonzini
167 2d7799f2 Paolo Bonzini
static void input_visitor_test_add(const char *testpath,
168 2d7799f2 Paolo Bonzini
                                   TestInputVisitorData *data,
169 2d7799f2 Paolo Bonzini
                                   void (*test_func)(TestInputVisitorData *data, const void *user_data))
170 2d7799f2 Paolo Bonzini
{
171 2d7799f2 Paolo Bonzini
    g_test_add(testpath, TestInputVisitorData, data, NULL, test_func,
172 2d7799f2 Paolo Bonzini
               visitor_input_teardown);
173 2d7799f2 Paolo Bonzini
}
174 2d7799f2 Paolo Bonzini
175 2d7799f2 Paolo Bonzini
int main(int argc, char **argv)
176 2d7799f2 Paolo Bonzini
{
177 2d7799f2 Paolo Bonzini
    TestInputVisitorData in_visitor_data;
178 2d7799f2 Paolo Bonzini
179 2d7799f2 Paolo Bonzini
    g_test_init(&argc, &argv, NULL);
180 2d7799f2 Paolo Bonzini
181 2d7799f2 Paolo Bonzini
    input_visitor_test_add("/string-visitor/input/int",
182 2d7799f2 Paolo Bonzini
                           &in_visitor_data, test_visitor_in_int);
183 2d7799f2 Paolo Bonzini
    input_visitor_test_add("/string-visitor/input/bool",
184 2d7799f2 Paolo Bonzini
                           &in_visitor_data, test_visitor_in_bool);
185 2d7799f2 Paolo Bonzini
    input_visitor_test_add("/string-visitor/input/number",
186 2d7799f2 Paolo Bonzini
                           &in_visitor_data, test_visitor_in_number);
187 2d7799f2 Paolo Bonzini
    input_visitor_test_add("/string-visitor/input/string",
188 2d7799f2 Paolo Bonzini
                            &in_visitor_data, test_visitor_in_string);
189 2d7799f2 Paolo Bonzini
    input_visitor_test_add("/string-visitor/input/enum",
190 2d7799f2 Paolo Bonzini
                            &in_visitor_data, test_visitor_in_enum);
191 2d7799f2 Paolo Bonzini
192 2d7799f2 Paolo Bonzini
    g_test_run();
193 2d7799f2 Paolo Bonzini
194 2d7799f2 Paolo Bonzini
    return 0;
195 2d7799f2 Paolo Bonzini
}