diff options
| author | Paul Buetow <pbuetow@mimecast.com> | 2018-03-06 20:07:58 +0000 |
|---|---|---|
| committer | Paul Buetow <pbuetow@mimecast.com> | 2018-03-06 20:07:58 +0000 |
| commit | fd779da9cfd81db6bf1d01404149235d7dd3e9df (patch) | |
| tree | 2fd4ef782c83c720fda3d1abeb2b4cb7a833405d | |
| parent | 2ea7e9cca347e4051b650c138055a005ec6f1815 (diff) | |
add unit tests to btree data structure and add callback function support
| -rw-r--r-- | ioriot/src/datas/btree.c | 97 | ||||
| -rw-r--r-- | ioriot/src/datas/btree.h | 3 | ||||
| -rw-r--r-- | ioriot/src/utests.c | 12 |
3 files changed, 81 insertions, 31 deletions
diff --git a/ioriot/src/datas/btree.c b/ioriot/src/datas/btree.c index da5da48..b150066 100644 --- a/ioriot/src/datas/btree.c +++ b/ioriot/src/datas/btree.c @@ -39,18 +39,17 @@ void btree_destroy2(btree_s* b) int btree_insert(btree_s* b, int key, void *data) { - int ret = 1; + int ret = 0; if (b->root == NULL) { b->root = btreelem_new(key, data); - ret = 0; + ret = 1; } else { ret = btreelem_insert_r(b->root, key, data); } - if (ret == 0) { + if (ret == 0) b->size++; - } return ret; } @@ -68,23 +67,28 @@ void btree_print(btree_s* b) btreelem_print_r(b->root, 0); } +void btree_run_cb2(btree_s* b, void (*cb)(void *data, void *data2)) +{ + btreelem_run_cb2_r(b->root, cb); +} + btreelem_s* btreelem_new(int key, void *data) { btreelem_s *e = Malloc(btreelem_s); + *e = (btreelem_s) { .key = key, .data = data, .left = NULL, .right = NULL }; + return e; } void btreelem_destroy_r(btreelem_s* e) { - if (e->left) { + if (e->left) btreelem_destroy_r(e->left); - } - if (e->right) { + if (e->right) btreelem_destroy_r(e->right); - } free(e); } @@ -103,26 +107,24 @@ void btreelem_destroy_r2(btreelem_s* e) int btreelem_insert_r(btreelem_s* e, int key, void *data) { - int ret = 0; + int ret = 1; if (e->key == key) { - ret = 1; + ret = 0; } else if (e->key > key) { - if (e->left == NULL) { + if (e->left == NULL) e->left = btreelem_new(key, data); - } else { + else ret = btreelem_insert_r(e->left, key, data); - } } else { - if (e->right == NULL) { + if (e->right == NULL) e->right = btreelem_new(key, data); - } else { + else ret = btreelem_insert_r(e->right, key, data); - } } return ret; @@ -132,20 +134,17 @@ void* btreelem_get_r(btreelem_s* e, int key) { void *data = NULL; - if (e->key == key) { + if (e->key == key) data = e->data; - } else if (e->key > key) { - if (e->left) { + if (e->left) data = btreelem_get_r(e->left, key); - } } else { - if (e->right) { + if (e->right) data = btreelem_get_r(e->right, key); - } } return data; @@ -153,17 +152,57 @@ void* btreelem_get_r(btreelem_s* e, int key) void btreelem_print_r(btreelem_s* e, int depth) { - for (int i = 0; i < depth; ++i) { + if (!e) + return; + + for (int i = 0; i < depth; ++i) Out(" "); - } - Put("%d\n", e->key); + Put("key:%d data:%ld\n", e->key, (long) e->data); - if (e->left) { + if (e->left) btreelem_print_r(e->left, depth); - } - if (e->right) { + if (e->right) btreelem_print_r(e->right, depth+1); - } } +void btreelem_run_cb2_r(btreelem_s* e, void (*cb)(void *data, void *data2)) +{ + if (!e) + return; + + cb((void*)(long)e->key, e->data); + + if (e->left) + btreelem_run_cb2_r(e->left, cb); + + if (e->right) + btreelem_run_cb2_r(e->right, cb); +} + +void btree_test(void) +{ + btree_s *b = btree_new(); + void* somedata = (void*)b; + + assert(1 == btree_insert(b, 1, (void*)1)); + assert(1 == btree_insert(b, 2, (void*)2)); + assert(1 == btree_insert(b, 3, (void*)3)); + assert(1 == (long)btree_get(b, 1)); + + assert(1 == btree_insert(b, 1234, somedata)); + assert(1 == btree_insert(b, 13, somedata)); + assert(1 == btree_insert(b, 666, somedata)); + assert(0 == btree_insert(b, 13, somedata)); + + assert(NULL != btree_get(b, 666)); + assert(NULL == btree_get(b, 777)); + + assert(0 == btree_insert(b, 666, somedata)); + assert(1 == btree_insert(b, 42, (void*)42)); + assert(42 == (long)btree_get(b, 42)); + + btree_print(b); + + btree_destroy(b); +} diff --git a/ioriot/src/datas/btree.h b/ioriot/src/datas/btree.h index 55da560..acc5477 100644 --- a/ioriot/src/datas/btree.h +++ b/ioriot/src/datas/btree.h @@ -41,6 +41,8 @@ void btree_destroy2(btree_s *b); int btree_insert(btree_s *b, int key, void *data); void* btree_get(btree_s *b, int key); void btree_print(btree_s *b); +void btree_run_cb2(btree_s* b, void (*cb)(void *data, void *data2)); +void btree_test(void); btreelem_s* btreelem_new(int key, void *data); void btreelem_destroy_r(btreelem_s *e); @@ -48,5 +50,6 @@ void btreelem_destroy_r2(btreelem_s *e); int btreelem_insert_r(btreelem_s *e, int key, void *data); void* btreelem_get_r(btreelem_s *e, int key); void btreelem_print_r(btreelem_s *e, int depth); +void btreelem_run_cb2_r(btreelem_s* e, void (*cb)(void *data, void *data2)); #endif // BTREE_H diff --git a/ioriot/src/utests.c b/ioriot/src/utests.c index 7cc4959..0fc53c3 100644 --- a/ioriot/src/utests.c +++ b/ioriot/src/utests.c @@ -15,15 +15,20 @@ #include "utests.h" #include "datas/amap.h" +#include "datas/btree.h" #include "datas/hmap.h" #include "datas/list.h" +#include "datas/ranges.h" #include "datas/rbuffer.h" #include "utils/utils.h" void utests_run() { - fprintf(stderr, "Running utils_test()\n"); - utils_test(); + fprintf(stderr, "Running btree_test()\n"); + btree_test(); + + fprintf(stderr, "Running ranges_test()\n"); + ranges_test(); fprintf(stderr, "Running amap_test()\n"); amap_test(); @@ -37,5 +42,8 @@ void utests_run() fprintf(stderr, "Running rbuffer_test()\n"); rbuffer_test(); + fprintf(stderr, "Running utils_test()\n"); + utils_test(); + fprintf(stderr, "Great success, run all unit tests without any errors!\n"); } |
