]> git.ozlabs.org Git - ccan/blobdiff - ccan/dgraph/test/run.c
dgraph: new module for directed graphs.
[ccan] / ccan / dgraph / test / run.c
diff --git a/ccan/dgraph/test/run.c b/ccan/dgraph/test/run.c
new file mode 100644 (file)
index 0000000..b868c18
--- /dev/null
@@ -0,0 +1,116 @@
+#include <ccan/dgraph/dgraph.h>
+/* Include the C files directly. */
+#include <ccan/dgraph/dgraph.c>
+#include <ccan/tap/tap.h>
+
+static bool count_nodes(struct dgraph_node *n, unsigned int *count)
+{
+       (*count)++;
+       return true;
+}
+
+static bool stop_traverse(struct dgraph_node *n, unsigned int *count)
+{
+       if (--(*count) == 0)
+               return false;
+       return true;
+}
+
+int main(void)
+{
+       struct dgraph_node n1, n2, n3;
+       unsigned int count = 0;
+
+       /* This is how many tests you plan to run */
+       plan_tests(25);
+
+       dgraph_init_node(&n1);
+       count = 0;
+       dgraph_traverse_from(&n1, count_nodes, &count);
+       ok1(count == 0);
+       count = 0;
+       dgraph_traverse_to(&n1, count_nodes, &count);
+       ok1(count == 0);
+
+       dgraph_init_node(&n2);
+       dgraph_add_edge(&n1, &n2);
+       count = 0;
+       dgraph_traverse_from(&n1, count_nodes, &count);
+       ok1(count == 1);
+       count = 0;
+       dgraph_traverse_to(&n1, count_nodes, &count);
+       ok1(count == 0);
+       count = 0;
+       dgraph_traverse_from(&n2, count_nodes, &count);
+       ok1(count == 0);
+       count = 0;
+       dgraph_traverse_to(&n2, count_nodes, &count);
+       ok1(count == 1);
+
+       dgraph_init_node(&n3);
+       dgraph_add_edge(&n2, &n3);
+       count = 0;
+       dgraph_traverse_from(&n1, count_nodes, &count);
+       ok1(count == 2);
+       count = 0;
+       dgraph_traverse_to(&n1, count_nodes, &count);
+       ok1(count == 0);
+       count = 0;
+       dgraph_traverse_from(&n2, count_nodes, &count);
+       ok1(count == 1);
+       count = 0;
+       dgraph_traverse_to(&n2, count_nodes, &count);
+       ok1(count == 1);
+       count = 0;
+       dgraph_traverse_from(&n3, count_nodes, &count);
+       ok1(count == 0);
+       count = 0;
+       dgraph_traverse_to(&n3, count_nodes, &count);
+       ok1(count == 2);
+
+       /* Check stopping traverse. */
+       count = 1;
+       dgraph_traverse_from(&n1, stop_traverse, &count);
+       ok1(count == 0);
+       count = 2;
+       dgraph_traverse_from(&n1, stop_traverse, &count);
+       ok1(count == 0);
+       count = 3;
+       dgraph_traverse_from(&n1, stop_traverse, &count);
+       ok1(count == 1);
+
+       dgraph_clear_node(&n1);
+
+       count = 0;
+       dgraph_traverse_from(&n2, count_nodes, &count);
+       ok1(count == 1);
+       count = 0;
+       dgraph_traverse_to(&n2, count_nodes, &count);
+       ok1(count == 0);
+       count = 0;
+       dgraph_traverse_from(&n3, count_nodes, &count);
+       ok1(count == 0);
+       count = 0;
+       dgraph_traverse_to(&n3, count_nodes, &count);
+       ok1(count == 1);
+
+       ok1(dgraph_del_edge(&n2, &n3));
+       count = 0;
+       dgraph_traverse_from(&n2, count_nodes, &count);
+       ok1(count == 0);
+       count = 0;
+       dgraph_traverse_to(&n2, count_nodes, &count);
+       ok1(count == 0);
+       count = 0;
+       dgraph_traverse_from(&n3, count_nodes, &count);
+       ok1(count == 0);
+       count = 0;
+       dgraph_traverse_to(&n3, count_nodes, &count);
+       ok1(count == 0);
+
+       ok1(!dgraph_del_edge(&n2, &n3));
+       dgraph_clear_node(&n2);
+
+       /* This exits depending on whether all tests passed */
+       return exit_status();
+}