xref: /qemu/tests/unit/check-qlist.c (revision 7cebff0d)
1 /*
2  * QList unit-tests.
3  *
4  * Copyright (C) 2009 Red Hat Inc.
5  *
6  * Authors:
7  *  Luiz Capitulino <lcapitulino@redhat.com>
8  *
9  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
10  * See the COPYING.LIB file in the top-level directory.
11  */
12 #include "qemu/osdep.h"
13 
14 #include "qapi/qmp/qnum.h"
15 #include "qapi/qmp/qlist.h"
16 
17 /*
18  * Public Interface test-cases
19  *
20  * (with some violations to access 'private' data)
21  */
22 
23 static void qlist_new_test(void)
24 {
25     QList *qlist;
26 
27     qlist = qlist_new();
28     g_assert(qlist != NULL);
29     g_assert(qlist->base.refcnt == 1);
30     g_assert(qobject_type(QOBJECT(qlist)) == QTYPE_QLIST);
31 
32     qobject_unref(qlist);
33 }
34 
35 static void qlist_append_test(void)
36 {
37     QNum *qi;
38     QList *qlist;
39     QListEntry *entry;
40 
41     qi = qnum_from_int(42);
42 
43     qlist = qlist_new();
44     qlist_append(qlist, qi);
45 
46     entry = QTAILQ_FIRST(&qlist->head);
47     g_assert(entry != NULL);
48     g_assert(entry->value == QOBJECT(qi));
49 
50     qobject_unref(qlist);
51 }
52 
53 static void qobject_to_qlist_test(void)
54 {
55     QList *qlist;
56 
57     qlist = qlist_new();
58 
59     g_assert(qobject_to(QList, QOBJECT(qlist)) == qlist);
60 
61     qobject_unref(qlist);
62 }
63 
64 static void qlist_iter_test(void)
65 {
66     const int iter_max = 42;
67     int i;
68     QList *qlist;
69     QListEntry *entry;
70     QNum *qi;
71     int64_t val;
72 
73     qlist = qlist_new();
74 
75     for (i = 0; i < iter_max; i++)
76         qlist_append_int(qlist, i);
77 
78     i = 0;
79     QLIST_FOREACH_ENTRY(qlist, entry) {
80         qi = qobject_to(QNum, qlist_entry_obj(entry));
81         g_assert(qi != NULL);
82 
83         g_assert(qnum_get_try_int(qi, &val));
84         g_assert_cmpint(val, ==, i);
85         i++;
86     }
87 
88     g_assert(i == iter_max);
89 
90     qobject_unref(qlist);
91 }
92 
93 int main(int argc, char **argv)
94 {
95     g_test_init(&argc, &argv, NULL);
96 
97     g_test_add_func("/public/new", qlist_new_test);
98     g_test_add_func("/public/append", qlist_append_test);
99     g_test_add_func("/public/to_qlist", qobject_to_qlist_test);
100     g_test_add_func("/public/iter", qlist_iter_test);
101 
102     return g_test_run();
103 }
104