1 #include <ccan/cdump/cdump.h>
2 /* Include the C files directly. */
3 #include <ccan/cdump/cdump.c>
4 #include <ccan/tap/tap.h>
8 struct cdump_definitions *defs;
9 const struct cdump_type *t, *p;
10 char *ctx = tal(NULL, char), *problems;
12 /* This is how many tests you plan to run */
15 defs = cdump_extract(ctx, "enum foo CDUMP(foo note) { BAR CDUMP(bar note) };", NULL);
17 ok1(tal_parent(defs) == ctx);
19 ok1(strmap_empty(&defs->structs));
20 ok1(strmap_empty(&defs->unions));
21 t = strmap_get(&defs->enums, "foo");
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"));
31 defs = cdump_extract(ctx, "enum foo { BAR CDUMP(bar note) = 7 };",
34 ok1(tal_parent(defs) == ctx);
37 ok1(strmap_empty(&defs->structs));
38 ok1(strmap_empty(&defs->unions));
39 t = strmap_get(&defs->enums, "foo");
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"));
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) };",
54 ok1(tal_parent(defs) == ctx);
57 ok1(strmap_empty(&defs->structs));
58 ok1(strmap_empty(&defs->unions));
59 t = strmap_get(&defs->enums, "foo");
61 ok1(t->kind == CDUMP_ENUM);
62 ok1(streq(t->name, "foo"));
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);
75 defs = cdump_extract(ctx, "struct foo CDUMP(foo note) { int x CDUMP(x note); };", &problems);
77 ok1(tal_parent(defs) == ctx);
80 ok1(strmap_empty(&defs->enums));
81 ok1(strmap_empty(&defs->unions));
82 t = strmap_get(&defs->structs, "foo");
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"));
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);
95 ok1(tal_parent(defs) == ctx);
98 ok1(strmap_empty(&defs->enums));
99 ok1(strmap_empty(&defs->unions));
100 t = strmap_get(&defs->structs, "foo");
102 ok1(t->kind == CDUMP_STRUCT);
103 ok1(streq(t->name, "foo"));
104 ok1(tal_count(t->u.members) == 3);
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"));
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);
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"));
124 ok1(p->kind == CDUMP_POINTER);
126 ok1(p->kind == CDUMP_POINTER);
128 ok1(p->kind == CDUMP_STRUCT);
129 ok1(streq(p->name, "unknown"));
130 ok1(p->u.members == NULL);
132 /* We don't put undefined structs into definition maps. */
133 ok1(!strmap_get(&defs->structs, "unknown"));
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"
143 "#endif", &problems);
145 ok1(tal_parent(defs) == ctx);
147 t = strmap_get(&defs->structs, "foo");
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"));
158 t = strmap_get(&defs->unions, "bar");
160 ok1(streq(t->note, "bar note"));
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);
174 /* This exits depending on whether all tests passed */
175 return exit_status();