]> git.ozlabs.org Git - ccan-lca-2011.git/blobdiff - ccan/cdump/test/run-03-advanced-parse.c
cdump: features which weren't in genparser
[ccan-lca-2011.git] / ccan / cdump / test / run-03-advanced-parse.c
diff --git a/ccan/cdump/test/run-03-advanced-parse.c b/ccan/cdump/test/run-03-advanced-parse.c
new file mode 100644 (file)
index 0000000..7471d7d
--- /dev/null
@@ -0,0 +1,59 @@
+#include <ccan/cdump/cdump_parse.c>
+#include <ccan/tap/tap.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+static size_t diffoff(const char *a, const char *b)
+{
+       size_t i;
+
+       for (i = 0; a[i]; i++)
+               if (b[i] != a[i])
+                       break;
+       return i;
+}
+
+static char *read_file(const void *ctx, const char *fname)
+{
+       int fd = open(fname, O_RDONLY);
+       off_t len = lseek(fd, 0, SEEK_END);
+       char *ret = talloc_array(ctx, char, len + 1);
+       lseek(fd, 0, SEEK_SET);
+       read(fd, ret, len);
+       ret[len] = '\0';
+       close(fd);
+       return ret;
+}
+
+int main(int argc, char *argv[])
+{
+       char *ret, *decls, *defs;
+       char *toplevel = talloc_strdup(NULL, "toplevel");
+       char *header, *definitions, *declarations;
+
+       plan_tests(5);
+       header = read_file(toplevel, "test/test_header_advanced.h");
+       declarations = read_file(toplevel, "test/example_generated-advanced-decls.h");
+       definitions = read_file(toplevel, "test/example_generated-advanced-defs.h");
+
+       ret = cdump_parse(toplevel, header, &decls, &defs);
+       ok1(ret == NULL);
+       ok(streq(decls, declarations),
+          "Declarations differ at %zu: ...'%.*s' vs ...'%.*s'",
+          diffoff(decls, declarations),
+          30, decls + diffoff(decls, declarations),
+          30, declarations + diffoff(decls, declarations));
+       ok(streq(defs, definitions),
+          "Definitions differ at %zu: ...'%.*s' vs ...'%.*s'",
+          diffoff(defs, definitions),
+          30, defs + diffoff(defs, definitions),
+          30, definitions + diffoff(defs, definitions));
+
+       ok1(talloc_find_parent_byname(decls, "toplevel") == toplevel);
+       ok1(talloc_find_parent_byname(defs, "toplevel") == toplevel);
+
+       talloc_free(toplevel);
+       return exit_status();
+}