From: Rusty Russell Date: Tue, 7 Dec 2010 05:19:08 +0000 (+1030) Subject: rbtree: add tests (which currently fail) X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=8f2bfcd370a0e00605a7d84600847b150255c533;ds=inline rbtree: add tests (which currently fail) --- diff --git a/ccan/rbtree/test/run-many.c b/ccan/rbtree/test/run-many.c new file mode 100644 index 00000000..6474007f --- /dev/null +++ b/ccan/rbtree/test/run-many.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include + +#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(); +} diff --git a/ccan/rbtree/test/run.c b/ccan/rbtree/test/run.c index 67ffd72d..11d0ed78 100644 --- a/ccan/rbtree/test/run.c +++ b/ccan/rbtree/test/run.c @@ -1,23 +1,69 @@ #include #include +#include +#include + +static void *insert_callback(void *param, void *data) +{ + ok1(data == param); + return talloc_strdup(NULL, "insert_callback"); +} int main(void) { + trbt_tree_t *rb; + void *ctx = talloc_init("toplevel"); + char *data, *data2; + /* 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();