test-bitree.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include "ktest.h"
  2. #include <ktest/ktest_utils.h>
  3. #include <common/unistd.h>
  4. #include <common/kprint.h>
  5. #include <common/bitree.h>
  6. #include <common/errno.h>
  7. #include <mm/slab.h>
  8. struct test_value_t
  9. {
  10. uint64_t tv;
  11. };
  12. static int compare(void *a, void *b)
  13. {
  14. if (((struct test_value_t *)a)->tv > ((struct test_value_t *)b)->tv)
  15. return 1;
  16. else if (((struct test_value_t *)a)->tv == ((struct test_value_t *)b)->tv)
  17. return 0;
  18. else
  19. return -1;
  20. }
  21. static int release(void *value)
  22. {
  23. // kdebug("release");
  24. }
  25. /**
  26. * @brief 测试创建二叉树
  27. *
  28. * @return int
  29. */
  30. static long ktest_bitree_case1(uint64_t arg0, uint64_t arg1)
  31. {
  32. int val;
  33. // ========== 测试创建树
  34. struct test_value_t *tv1 = (struct test_value_t *)kmalloc(sizeof(struct test_value_t), 0);
  35. tv1->tv = 20;
  36. struct bt_node_t *rn = bt_create_node(NULL, NULL, NULL, tv1);
  37. assert(rn != NULL);
  38. assert((int64_t)rn != (-EINVAL));
  39. assert(rn->value == tv1);
  40. struct bt_root_t *tree = bt_create_tree(rn, compare, release);
  41. assert(tree != NULL);
  42. assert(tree->bt_node == rn);
  43. assert(tree->cmp == compare);
  44. assert(tree->release == release);
  45. assert(tree->size == 1);
  46. // ========= 向树中插入数据10、30
  47. struct test_value_t *tv2 = (struct test_value_t *)kmalloc(sizeof(struct test_value_t), 0);
  48. assert(tv2 != NULL);
  49. tv2->tv = 10;
  50. {
  51. int last_size = tree->size;
  52. val = bt_insert(tree, tv2);
  53. assert(val == 0);
  54. assert(last_size + 1 == tree->size);
  55. }
  56. struct test_value_t *tv3 = (struct test_value_t *)kmalloc(sizeof(struct test_value_t), 0);
  57. assert(tv3 != NULL);
  58. tv3->tv = 30;
  59. {
  60. int last_size = tree->size;
  61. val = bt_insert(tree, tv3);
  62. assert(val == 0);
  63. assert(last_size + 1 == tree->size);
  64. }
  65. // 检测树的形状
  66. assert(((struct test_value_t *)tree->bt_node->left->value)->tv == tv2->tv);
  67. assert(((struct test_value_t *)tree->bt_node->right->value)->tv == tv3->tv);
  68. // ========= 查询结点
  69. // 查询值为tv2的结点
  70. struct bt_node_t *node2;
  71. assert(bt_query(tree, tv2, (uint64_t*)(&node2)) == 0);
  72. assert(node2 != NULL);
  73. assert(node2->value == tv2);
  74. // ========= 插入第4个结点:15
  75. struct test_value_t *tv4 = (struct test_value_t *)kmalloc(sizeof(struct test_value_t), 0);
  76. assert(tv4 != NULL);
  77. tv4->tv = 15;
  78. {
  79. int last_size = tree->size;
  80. val = bt_insert(tree, tv4);
  81. assert(val == 0);
  82. assert(last_size + 1 == tree->size);
  83. }
  84. assert(((struct test_value_t *)node2->right->value)->tv == tv4->tv);
  85. // ======= 查询不存在的值
  86. struct bt_node_t *node_not_exists;
  87. struct test_value_t *tv_not_exists = (struct test_value_t *)kmalloc(sizeof(struct test_value_t), 0);
  88. assert(tv_not_exists != NULL);
  89. tv_not_exists->tv = 100;
  90. assert(bt_query(tree, tv_not_exists, (uint64_t*)(&node_not_exists)) == -1);
  91. // kdebug("node_not_exists.val=%d", ((struct test_value_t*)node_not_exists->value)->tv);
  92. assert(node_not_exists == NULL);
  93. // 删除根节点
  94. assert(bt_delete(tree, rn->value) == 0);
  95. assert(((struct test_value_t *)tree->bt_node->value)->tv != 20);
  96. assert(tree->bt_node->right == NULL);
  97. // 删除树
  98. assert(bt_destroy_tree(tree) == 0);
  99. return 0;
  100. }
  101. static ktest_case_table kt_bitree_func_table[] = {
  102. ktest_bitree_case1,
  103. };
  104. uint64_t ktest_test_bitree(uint64_t arg)
  105. {
  106. kTEST("Testing bitree...");
  107. for (int i = 0; i < sizeof(kt_bitree_func_table) / sizeof(ktest_case_table); ++i)
  108. {
  109. kTEST("Testing case %d", i);
  110. kt_bitree_func_table[i](0, 0);
  111. }
  112. kTEST("bitree Test done.");
  113. return 0;
  114. }