]> git.ozlabs.org Git - ccan/blob - ccan/cdump/test/run-CDUMP.c
cdump: add CDUMP() support.
[ccan] / ccan / cdump / test / run-CDUMP.c
1 #include <ccan/cdump/cdump.h>
2 /* Include the C files directly. */
3 #include <ccan/cdump/cdump.c>
4 #include <ccan/tap/tap.h>
5
6 int main(void)
7 {
8         struct cdump_definitions *defs;
9         const struct cdump_type *t, *p;
10         char *ctx = tal(NULL, char), *problems;
11
12         /* This is how many tests you plan to run */
13         plan_tests(111);
14
15         defs = cdump_extract(ctx, "enum foo CDUMP(foo note) { BAR CDUMP(bar note) };", NULL);
16         ok1(defs);
17         ok1(tal_parent(defs) == ctx);
18
19         ok1(strmap_empty(&defs->structs));
20         ok1(strmap_empty(&defs->unions));
21         t = strmap_get(&defs->enums, "foo");
22         ok1(t);
23         ok1(t->kind == CDUMP_ENUM);
24         ok1(streq(t->note, "foo note"));
25         ok1(streq(t->name, "foo"));
26         ok1(tal_count(t->u.enum_vals) == 1);
27         ok1(streq(t->u.enum_vals[0].name, "BAR"));
28         ok1(!t->u.enum_vals[0].value);
29         ok1(streq(t->u.enum_vals[0].note, "bar note"));
30
31         defs = cdump_extract(ctx, "enum foo { BAR CDUMP(bar note) = 7 };",
32                              &problems);
33         ok1(defs);
34         ok1(tal_parent(defs) == ctx);
35         ok1(!problems);
36
37         ok1(strmap_empty(&defs->structs));
38         ok1(strmap_empty(&defs->unions));
39         t = strmap_get(&defs->enums, "foo");
40         ok1(t);
41         ok1(t->kind == CDUMP_ENUM);
42         ok1(streq(t->name, "foo"));
43         ok1(tal_count(t->u.enum_vals) == 1);
44         ok1(streq(t->u.enum_vals[0].name, "BAR"));
45         ok1(streq(t->u.enum_vals[0].value, "7"));
46         ok1(streq(t->u.enum_vals[0].note, "bar note"));
47
48         defs = cdump_extract(ctx, "enum foo {\n"
49                              "BAR CDUMP(bar note) = 7,\n"
50                              "BAZ CDUMP(baz note),\n"
51                              "FUZZ CDUMP(fuzz note) };",
52                              &problems);
53         ok1(defs);
54         ok1(tal_parent(defs) == ctx);
55         ok1(!problems);
56
57         ok1(strmap_empty(&defs->structs));
58         ok1(strmap_empty(&defs->unions));
59         t = strmap_get(&defs->enums, "foo");
60         ok1(t);
61         ok1(t->kind == CDUMP_ENUM);
62         ok1(streq(t->name, "foo"));
63         ok1(t->note == NULL);
64         ok1(tal_count(t->u.enum_vals) == 3);
65         ok1(streq(t->u.enum_vals[0].name, "BAR"));
66         ok1(streq(t->u.enum_vals[0].value, "7"));
67         ok1(streq(t->u.enum_vals[0].note, "bar note"));
68         ok1(streq(t->u.enum_vals[1].name, "BAZ"));
69         ok1(streq(t->u.enum_vals[1].note, "baz note"));
70         ok1(!t->u.enum_vals[1].value);
71         ok1(streq(t->u.enum_vals[2].name, "FUZZ"));
72         ok1(streq(t->u.enum_vals[2].note, "fuzz note"));
73         ok1(!t->u.enum_vals[2].value);
74
75         defs = cdump_extract(ctx, "struct foo CDUMP(foo note) { int x CDUMP(x note); };", &problems);
76         ok1(defs);
77         ok1(tal_parent(defs) == ctx);
78         ok1(!problems);
79
80         ok1(strmap_empty(&defs->enums));
81         ok1(strmap_empty(&defs->unions));
82         t = strmap_get(&defs->structs, "foo");
83         ok1(t);
84         ok1(t->kind == CDUMP_STRUCT);
85         ok1(streq(t->name, "foo"));
86         ok1(streq(t->note, "foo note"));
87         ok1(tal_count(t->u.members) == 1);
88         ok1(streq(t->u.members[0].name, "x"));
89         ok1(streq(t->u.members[0].note, "x note"));
90         ok1(t->u.members[0].type->kind == CDUMP_UNKNOWN);
91         ok1(streq(t->u.members[0].type->name, "int"));
92
93         defs = cdump_extract(ctx, "struct foo { int x[5<< 1] CDUMP(x note); struct foo *next CDUMP(next note); struct unknown **ptrs[10] CDUMP(ptrs note); };", &problems);
94         ok1(defs);
95         ok1(tal_parent(defs) == ctx);
96         ok1(!problems);
97
98         ok1(strmap_empty(&defs->enums));
99         ok1(strmap_empty(&defs->unions));
100         t = strmap_get(&defs->structs, "foo");
101         ok1(t);
102         ok1(t->kind == CDUMP_STRUCT);
103         ok1(streq(t->name, "foo"));
104         ok1(tal_count(t->u.members) == 3);
105
106         ok1(streq(t->u.members[0].name, "x"));
107         ok1(streq(t->u.members[0].note, "x note"));
108         ok1(t->u.members[0].type->kind == CDUMP_ARRAY);
109         ok1(streq(t->u.members[0].type->u.arr.size, "5<< 1"));
110         ok1(t->u.members[0].type->u.arr.type->kind == CDUMP_UNKNOWN);
111         ok1(streq(t->u.members[0].type->u.arr.type->name, "int"));
112
113         ok1(streq(t->u.members[1].name, "next"));
114         ok1(streq(t->u.members[1].note, "next note"));
115         ok1(t->u.members[1].type->kind == CDUMP_POINTER);
116         ok1(t->u.members[1].type->u.ptr == t);
117
118         ok1(streq(t->u.members[2].name, "ptrs"));
119         ok1(streq(t->u.members[2].note, "ptrs note"));
120         p = t->u.members[2].type;
121         ok1(p->kind == CDUMP_ARRAY);
122         ok1(streq(p->u.arr.size, "10"));
123         p = p->u.arr.type;
124         ok1(p->kind == CDUMP_POINTER);
125         p = p->u.ptr;
126         ok1(p->kind == CDUMP_POINTER);
127         p = p->u.ptr;
128         ok1(p->kind == CDUMP_STRUCT);
129         ok1(streq(p->name, "unknown"));
130         ok1(p->u.members == NULL);
131
132         /* We don't put undefined structs into definition maps. */
133         ok1(!strmap_get(&defs->structs, "unknown"));
134
135         /* unions and comments. */
136         defs = cdump_extract(ctx, "#if 0\n"
137                              "/* Normal comment */\n"
138                              "struct foo { int x[5 * 7/* Comment */]CDUMP(x note/*nocomment*/); };\n"
139                              "// One-line comment\n"
140                              "union bar CDUMP(bar note) { enum sometype x CDUMP(x note// Comment\n"
141                 "); union yun// Comment\n"
142                              "y;};\n"
143                              "#endif", &problems);
144         ok1(defs);
145         ok1(tal_parent(defs) == ctx);
146         ok1(!problems);
147         t = strmap_get(&defs->structs, "foo");
148         ok1(t);
149         ok1(t->note == NULL);
150         ok1(tal_count(t->u.members) == 1);
151         ok1(streq(t->u.members[0].name, "x"));
152         ok1(streq(t->u.members[0].note, "x note"));
153         ok1(t->u.members[0].type->kind == CDUMP_ARRAY);
154         ok1(streq(t->u.members[0].type->u.arr.size, "5 * 7"));
155         ok1(t->u.members[0].type->u.arr.type->kind == CDUMP_UNKNOWN);
156         ok1(streq(t->u.members[0].type->u.arr.type->name, "int"));
157
158         t = strmap_get(&defs->unions, "bar");
159         ok1(t);
160         ok1(streq(t->note, "bar note"));
161
162         ok1(tal_count(t->u.members) == 2);
163         ok1(streq(t->u.members[0].name, "x"));
164         ok1(streq(t->u.members[0].note, "x note"));
165         ok1(t->u.members[0].type->kind == CDUMP_ENUM);
166         ok1(streq(t->u.members[0].type->name, "sometype"));
167         ok1(!t->u.members[0].type->u.enum_vals);
168         ok1(streq(t->u.members[1].name, "y"));
169         ok1(t->u.members[1].note == NULL);
170         ok1(t->u.members[1].type->kind == CDUMP_UNION);
171         ok1(streq(t->u.members[1].type->name, "yun"));
172         ok1(!t->u.members[1].type->u.members);
173
174         /* This exits depending on whether all tests passed */
175         return exit_status();
176 }