rbtree: add tests (which currently fail)
authorRusty Russell <rusty@rustcorp.com.au>
Tue, 7 Dec 2010 05:19:08 +0000 (15:49 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Tue, 7 Dec 2010 05:19:08 +0000 (15:49 +1030)
ccan/rbtree/test/run-many.c [new file with mode: 0644]
ccan/rbtree/test/run.c

diff --git a/ccan/rbtree/test/run-many.c b/ccan/rbtree/test/run-many.c
new file mode 100644 (file)
index 0000000..6474007
--- /dev/null
@@ -0,0 +1,89 @@
+#include <ccan/rbtree/rbtree.c>
+#include <ccan/tap/tap.h>
+#include <ccan/talloc/talloc.h>
+#include <string.h>
+#include <stdbool.h>
+
+#define NUM_ELEMS 10000
+
+static bool lookup_all(trbt_tree_t *rb, bool exist)
+{
+       unsigned int i;
+
+       for (i = 0; i < NUM_ELEMS; i++) {
+               int *p = trbt_lookup32(rb, i);
+               if (p) {
+                       if (!exist)
+                               return false;
+                       if (*p != i)
+                               return false;
+               } else
+                       if (exist)
+                               return false;
+       }
+       return true;
+}
+
+static bool insert_all(trbt_tree_t *rb, bool exist)
+{
+       unsigned int i;
+
+       for (i = 0; i < NUM_ELEMS; i++) {
+               int *p = trbt_insert32(rb, i, talloc_memdup(rb, &i, sizeof(i)));
+               if (p) {
+                       if (!exist)
+                               return false;
+                       if (*p != i)
+                               return false;
+               } else
+                       if (exist)
+                               return false;
+       }
+       return true;
+}
+
+static void delete_all(trbt_tree_t *rb)
+{
+       unsigned int i;
+
+       for (i = 0; i < NUM_ELEMS; i++) {
+               trbt_delete32(rb, i);
+       }
+}
+
+int main(void)
+{
+       trbt_tree_t *rb;
+       void *ctx = talloc_init("toplevel");
+       unsigned int i;
+
+       plan_tests(7);
+
+       rb = trbt_create(ctx, 0);
+       ok1(rb);
+
+       /* None should be there. */
+       ok1(lookup_all(rb, false));
+
+       /* Insert, none should be there previously. */
+       ok1(insert_all(rb, false));
+
+       /* All there now. */
+       ok1(lookup_all(rb, true));
+
+       /* Replace all. */
+       ok1(insert_all(rb, true));
+
+       /* Delete all. */
+       delete_all(rb);
+
+       /* One more time... */
+       ok1(lookup_all(rb, false));
+       ok1(insert_all(rb, false));
+
+       /* All are children of rb, so this is clean. */
+       talloc_free(rb);
+
+       /* This exits depending on whether all tests passed */
+       return exit_status();
+}
index 67ffd72d3df2cb0a481ab3a8dba17a869ec9a261..11d0ed78b015f03b252986ab4ea4cead5cde7ae9 100644 (file)
@@ -1,23 +1,69 @@
 #include <ccan/rbtree/rbtree.c>
 #include <ccan/tap/tap.h>
 #include <ccan/rbtree/rbtree.c>
 #include <ccan/tap/tap.h>
+#include <ccan/talloc/talloc.h>
+#include <string.h>
+
+static void *insert_callback(void *param, void *data)
+{
+       ok1(data == param);
+       return talloc_strdup(NULL, "insert_callback");
+}
 
 int main(void)
 {
 
 int main(void)
 {
+       trbt_tree_t *rb;
+       void *ctx = talloc_init("toplevel");
+       char *data, *data2;
+
        /* This is how many tests you plan to run */
        /* This is how many tests you plan to run */
-       plan_tests(3);
-
-       /* Simple thing we expect to succeed */
-       ok1(some_test())
-       /* Same, with an explicit description of the test. */
-       ok(some_test(), "%s with no args should return 1", "some_test")
-       /* How to print out messages for debugging. */
-       diag("Address of some_test is %p", &some_test)
-       /* Conditional tests must be explicitly skipped. */
-#if HAVE_SOME_FEATURE
-       ok1(test_some_feature())
-#else
-       skip(1, "Don't have SOME_FEATURE")
-#endif
+       plan_tests(18);
+
+       rb = trbt_create(ctx, 0);
+       ok1(rb);
+       ok1(talloc_is_parent(rb, ctx));
+
+       /* Failed lookup. */
+       ok1(trbt_lookup32(rb, 0) == NULL);
+       ok1(trbt_lookup32(rb, -1) == NULL);
+
+       /* Insert, should steal node onto data. */
+       data = talloc_strdup(NULL, "data");
+       ok1(trbt_insert32(rb, 0, data) == NULL);
+       ok1(trbt_lookup32(rb, 0) == data);
+       ok1(trbt_lookup32(rb, -1) == NULL);
+
+       /* Thus, freeing the data will delete the node. */
+       talloc_free(data);
+       ok1(trbt_lookup32(rb, 0) == NULL);
+
+       /* Try again. */
+       data = talloc_strdup(NULL, "data");
+       ok1(trbt_insert32(rb, 0, data) == NULL);
+
+       /* Another insert should return old one. */
+       data2 = talloc_strdup(NULL, "data2");
+       ok1(trbt_insert32(rb, 0, data2) == data);
+       ok1(trbt_lookup32(rb, 0) == data2);
+
+       /* Freeing old data has no effect. */
+       talloc_free(data);
+       ok1(trbt_lookup32(rb, 0) == data2);
+
+       /* Insert with callback on non-existing. */
+       trbt_insert32_callback(rb, 1, insert_callback, NULL);
+       ok1(strcmp(trbt_lookup32(rb, 1), "insert_callback") == 0);
+       /* Insert with callback on existing. */
+       trbt_insert32_callback(rb, 0, insert_callback, data2);
+       ok1(strcmp(trbt_lookup32(rb, 0), "insert_callback") == 0);
+
+       /* Delete. */
+       trbt_delete32(rb, 1);
+       ok1(trbt_lookup32(rb, 1) == NULL);
+       ok1(trbt_lookup32(rb, 0));
+
+       /* This should free everything. */
+       talloc_free(trbt_lookup32(rb, 0));
+       talloc_free(rb);
 
        /* This exits depending on whether all tests passed */
        return exit_status();
 
        /* This exits depending on whether all tests passed */
        return exit_status();