PageRenderTime 44ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/std_tests/check_std_c_rbtree.c

https://gitlab.com/rpdev/csync
C | 367 lines | 266 code | 96 blank | 5 comment | 11 complexity | db4ae6bd1d2dce3af80dc869fbb41ab3 MD5 | raw file
  1. #include <errno.h>
  2. #include <time.h>
  3. #include "torture.h"
  4. #include "std/c_alloc.h"
  5. #include "std/c_rbtree.h"
  6. typedef struct test_s {
  7. int key;
  8. int number;
  9. } test_t;
  10. static int data_cmp(const void *key, const void *data) {
  11. test_t *a, *b;
  12. a = (test_t *) key;
  13. b = (test_t *) data;
  14. if (a->key < b->key) {
  15. return -1;
  16. } else if (a->key > b->key) {
  17. return 1;
  18. }
  19. return 0;
  20. }
  21. static int key_cmp(const void *key, const void *data) {
  22. int a;
  23. test_t *b;
  24. a = POINTER_TO_INT(key);
  25. b = (test_t *) data;
  26. if (a < b->key) {
  27. return -1;
  28. } else if (a > b->key) {
  29. return 1;
  30. }
  31. return 0;
  32. }
  33. static int visitor(void *obj, void *data) {
  34. test_t *a;
  35. test_t *b;
  36. a = (test_t *) obj;
  37. b = (test_t *) data;
  38. if (a->key == b->key) {
  39. a->number = 42;
  40. }
  41. return 0;
  42. }
  43. static void destructor(void *data) {
  44. test_t *freedata = NULL;
  45. freedata = (test_t *) data;
  46. SAFE_FREE(freedata);
  47. }
  48. static void setup(void **state) {
  49. c_rbtree_t *tree = NULL;
  50. int rc;
  51. rc = c_rbtree_create(&tree, key_cmp, data_cmp);
  52. assert_int_equal(rc, 0);
  53. *state = tree;
  54. }
  55. static void setup_complete_tree(void **state) {
  56. c_rbtree_t *tree = NULL;
  57. int i = 0;
  58. int rc;
  59. rc = c_rbtree_create(&tree, key_cmp, data_cmp);
  60. assert_int_equal(rc, 0);
  61. for (i = 0; i < 100; i++) {
  62. test_t *testdata = NULL;
  63. testdata = c_malloc(sizeof(test_t));
  64. assert_non_null(testdata);
  65. testdata->key = i;
  66. rc = c_rbtree_insert(tree, (void *) testdata);
  67. assert_int_equal(rc, 0);
  68. }
  69. *state = tree;
  70. }
  71. static void teardown(void **state) {
  72. c_rbtree_t *tree = *state;
  73. c_rbtree_destroy(tree, destructor);
  74. c_rbtree_free(tree);
  75. *state = NULL;
  76. }
  77. static void check_c_rbtree_create_free(void **state)
  78. {
  79. c_rbtree_t *tree = NULL;
  80. int rc;
  81. (void) state; /* unused */
  82. rc = c_rbtree_create(&tree, key_cmp, data_cmp);
  83. assert_int_equal(rc, 0);
  84. assert_int_equal(tree->size, 0);
  85. rc = c_rbtree_free(tree);
  86. assert_int_equal(rc, 0);
  87. }
  88. static void check_c_rbtree_create_null(void **state)
  89. {
  90. c_rbtree_t *tree = NULL;
  91. int rc;
  92. (void) state; /* unused */
  93. rc = c_rbtree_create(NULL, key_cmp, data_cmp);
  94. assert_int_equal(rc, -1);
  95. rc = c_rbtree_create(&tree, NULL, data_cmp);
  96. assert_int_equal(rc, -1);
  97. rc = c_rbtree_create(&tree, key_cmp, NULL);
  98. assert_int_equal(rc, -1);
  99. }
  100. static void check_c_rbtree_free_null(void **state)
  101. {
  102. int rc;
  103. (void) state; /* unused */
  104. rc = c_rbtree_free(NULL);
  105. assert_int_equal(rc, -1);
  106. }
  107. static void check_c_rbtree_insert_delete(void **state)
  108. {
  109. c_rbtree_t *tree = NULL;
  110. c_rbnode_t *node = NULL;
  111. test_t *testdata = NULL;
  112. int rc;
  113. (void) state; /* unused */
  114. rc = c_rbtree_create(&tree, key_cmp, data_cmp);
  115. assert_int_equal(rc, 0);
  116. testdata = malloc(sizeof(test_t));
  117. testdata->key = 42;
  118. rc = c_rbtree_insert(tree, (void *) testdata);
  119. assert_int_equal(rc, 0);
  120. node = c_rbtree_head(tree);
  121. assert_non_null(node);
  122. testdata = c_rbtree_node_data(node);
  123. SAFE_FREE(testdata);
  124. rc = c_rbtree_node_delete(node);
  125. assert_int_equal(rc, 0);
  126. c_rbtree_free(tree);
  127. }
  128. static void check_c_rbtree_insert_random(void **state)
  129. {
  130. c_rbtree_t *tree = *state;
  131. int i = 0, rc;
  132. for (i = 0; i < 100; i++) {
  133. test_t *testdata = NULL;
  134. testdata = malloc(sizeof(test_t));
  135. assert_non_null(testdata);
  136. testdata->key = i;
  137. rc = c_rbtree_insert(tree, testdata);
  138. assert_int_equal(rc, 0);
  139. }
  140. rc = c_rbtree_check_sanity(tree);
  141. assert_int_equal(rc, 0);
  142. }
  143. static void check_c_rbtree_insert_duplicate(void **state)
  144. {
  145. c_rbtree_t *tree = *state;
  146. test_t *testdata;
  147. int rc;
  148. testdata = malloc(sizeof(test_t));
  149. assert_non_null(testdata);
  150. testdata->key = 42;
  151. rc = c_rbtree_insert(tree, (void *) testdata);
  152. assert_int_equal(rc, 0);
  153. /* add again */
  154. testdata = malloc(sizeof(test_t));
  155. assert_non_null(testdata);
  156. testdata->key = 42;
  157. /* check for duplicate */
  158. rc = c_rbtree_insert(tree, (void *) testdata);
  159. assert_int_equal(rc, 1);
  160. free(testdata);
  161. }
  162. static void check_c_rbtree_find(void **state)
  163. {
  164. c_rbtree_t *tree = *state;
  165. int rc, i = 42;
  166. c_rbnode_t *node;
  167. test_t *testdata;
  168. rc = c_rbtree_check_sanity(tree);
  169. assert_int_equal(rc, 0);
  170. /* find the node with the key 42 */
  171. node = c_rbtree_find(tree, (void *) &i);
  172. assert_non_null(node);
  173. testdata = (test_t *) c_rbtree_node_data(node);
  174. assert_int_equal(testdata->key, 42);
  175. }
  176. static void check_c_rbtree_delete(void **state)
  177. {
  178. c_rbtree_t *tree = *state;
  179. int rc, i = 42;
  180. c_rbnode_t *node = NULL;
  181. test_t *freedata = NULL;
  182. rc = c_rbtree_check_sanity(tree);
  183. assert_int_equal(rc, 0);
  184. node = c_rbtree_find(tree, (void *) &i);
  185. assert_non_null(node);
  186. freedata = (test_t *) c_rbtree_node_data(node);
  187. free(freedata);
  188. rc = c_rbtree_node_delete(node);
  189. assert_int_equal(rc, 0);
  190. rc = c_rbtree_check_sanity(tree);
  191. assert_int_equal(rc, 0);
  192. }
  193. static void check_c_rbtree_walk(void **state)
  194. {
  195. c_rbtree_t *tree = *state;
  196. int rc, i = 42;
  197. test_t *testdata;
  198. c_rbnode_t *node;
  199. rc = c_rbtree_check_sanity(tree);
  200. assert_int_equal(rc, 0);
  201. testdata = (test_t *) c_malloc(sizeof(test_t));
  202. testdata->key = 42;
  203. rc = c_rbtree_walk(tree, testdata, visitor);
  204. assert_int_equal(rc, 0);
  205. /* find the node with the key 42 */
  206. node = c_rbtree_find(tree, (void *) &i);
  207. assert_non_null(node);
  208. free(testdata);
  209. testdata = (test_t *) c_rbtree_node_data(node);
  210. assert_int_equal(testdata->number, 42);
  211. }
  212. static void check_c_rbtree_walk_null(void **state)
  213. {
  214. c_rbtree_t *tree = *state;
  215. int rc, i = 42;
  216. test_t *testdata;
  217. c_rbnode_t *node;
  218. rc = c_rbtree_check_sanity(tree);
  219. assert_int_equal(rc, 0);
  220. testdata = (test_t *) malloc(sizeof(test_t));
  221. testdata->key = 42;
  222. rc = c_rbtree_walk(NULL, testdata, visitor);
  223. assert_int_equal(rc, -1);
  224. assert_int_equal(errno, EINVAL);
  225. rc = c_rbtree_walk(tree, NULL, visitor);
  226. assert_int_equal(rc, -1);
  227. assert_int_equal(errno, EINVAL);
  228. rc = c_rbtree_walk(tree, testdata, NULL);
  229. assert_int_equal(rc, -1);
  230. assert_int_equal(errno, EINVAL);
  231. /* find the node with the key 42 */
  232. node = c_rbtree_find(tree, (void *) &i);
  233. assert_non_null(node);
  234. free(testdata);
  235. }
  236. static void check_c_rbtree_dup(void **state)
  237. {
  238. c_rbtree_t *tree = *state;
  239. c_rbtree_t *duptree = NULL;
  240. int rc = -1;
  241. duptree = c_rbtree_dup(tree);
  242. assert_non_null(duptree);
  243. rc = c_rbtree_check_sanity(duptree);
  244. assert_int_equal(rc, 0);
  245. c_rbtree_free(duptree);
  246. }
  247. #if 0
  248. static void check_c_rbtree_x)
  249. {
  250. int rc = -1;
  251. rc = c_rbtree_check_sanity(tree);
  252. fail_unless(rc == 0, "c_rbtree_check_sanity failed with return code %d", rc);
  253. }
  254. #endif
  255. int torture_run_tests(void)
  256. {
  257. const UnitTest tests[] = {
  258. unit_test(check_c_rbtree_create_free),
  259. unit_test(check_c_rbtree_create_null),
  260. unit_test(check_c_rbtree_free_null),
  261. unit_test(check_c_rbtree_insert_delete),
  262. unit_test_setup_teardown(check_c_rbtree_insert_random, setup, teardown),
  263. unit_test_setup_teardown(check_c_rbtree_insert_duplicate, setup, teardown),
  264. unit_test_setup_teardown(check_c_rbtree_find, setup_complete_tree, teardown),
  265. unit_test_setup_teardown(check_c_rbtree_delete, setup_complete_tree, teardown),
  266. unit_test_setup_teardown(check_c_rbtree_walk, setup_complete_tree, teardown),
  267. unit_test_setup_teardown(check_c_rbtree_walk_null, setup_complete_tree, teardown),
  268. unit_test_setup_teardown(check_c_rbtree_dup, setup_complete_tree, teardown),
  269. };
  270. return run_tests(tests);
  271. }