cb_skiplist_test.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include <gtest/gtest.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "cb_skiplist.h"
  5. struct cb_skiplist_test_node
  6. {
  7. cb_skiplist_node_t parent;
  8. int value;
  9. };
  10. static int cb_skiplist_test_cmp(const cb_skiplist_node_t *v1, const cb_skiplist_node_t *v2)
  11. {
  12. struct cb_skiplist_test_node *t1 = cb_container_of(v1, struct cb_skiplist_test_node, parent);
  13. struct cb_skiplist_test_node *t2 = cb_container_of(v2, struct cb_skiplist_test_node, parent);
  14. return t1->value - t2->value;
  15. }
  16. TEST(testCase, cb_skiplist_test01)
  17. {
  18. struct cb_skiplist_test_node node_tab[16];
  19. cb_skiplist_t skl;
  20. unsigned int i;
  21. EXPECT_EQ(cb_skiplist_init(&skl, 0, cb_skiplist_test_cmp), &skl);
  22. EXPECT_EQ(!!cb_skiplist_isempty(&skl), 1);
  23. for (i = 0; i < CB_ARRAY_SIZE(node_tab); i++)
  24. {
  25. node_tab[i].value = i;
  26. EXPECT_EQ(cb_skiplist_node_init(&node_tab[i].parent), &node_tab[i].parent);
  27. EXPECT_EQ(cb_skiplist_insert(&skl, &node_tab[i].parent), &node_tab[i].parent);
  28. EXPECT_EQ(!!cb_skiplist_isempty(&skl), 0);
  29. EXPECT_EQ(cb_skiplist_first(&skl), &node_tab[0].parent);
  30. }
  31. }
  32. TEST(testCase, cb_skiplist_test02)
  33. {
  34. struct cb_skiplist_test_node node_tab[16];
  35. cb_skiplist_t skl;
  36. unsigned int i;
  37. EXPECT_EQ(cb_skiplist_init(&skl, 1, cb_skiplist_test_cmp), &skl);
  38. EXPECT_EQ(!!cb_skiplist_isempty(&skl), 1);
  39. for (i = 0; i < CB_ARRAY_SIZE(node_tab); i++)
  40. {
  41. node_tab[i].value = i;
  42. EXPECT_EQ(cb_skiplist_node_init(&node_tab[i].parent), &node_tab[i].parent);
  43. EXPECT_EQ(cb_skiplist_insert(&skl, &node_tab[i].parent), &node_tab[i].parent);
  44. EXPECT_EQ(!!cb_skiplist_isempty(&skl), 0);
  45. EXPECT_EQ(cb_skiplist_first(&skl), &node_tab[i].parent);
  46. }
  47. }
  48. TEST(testCase, cb_skiplist_test03)
  49. {
  50. struct cb_skiplist_test_node node_tab[16];
  51. cb_skiplist_t skl;
  52. unsigned int i, j;
  53. cb_skiplist_init(&skl, 0, cb_skiplist_test_cmp);
  54. for (i = 0; i < CB_ARRAY_SIZE(node_tab); i++)
  55. {
  56. cb_skiplist_node_init(&node_tab[i].parent);
  57. node_tab[i].value = i;
  58. cb_skiplist_insert(&skl, &node_tab[i].parent);
  59. j = 0;
  60. cb_skiplist_for_each(item, &skl)
  61. {
  62. struct cb_skiplist_test_node *t = cb_container_of(item, struct cb_skiplist_test_node, parent);
  63. EXPECT_EQ(t->value, j);
  64. j += 1;
  65. }
  66. }
  67. }
  68. TEST(testCase, cb_skiplist_test04)
  69. {
  70. struct cb_skiplist_test_node node_tab[16];
  71. cb_skiplist_t skl;
  72. unsigned int i, j;
  73. cb_skiplist_init(&skl, 1, cb_skiplist_test_cmp);
  74. for (i = 0; i < CB_ARRAY_SIZE(node_tab); i++)
  75. {
  76. cb_skiplist_node_init(&node_tab[i].parent);
  77. node_tab[i].value = i;
  78. cb_skiplist_insert(&skl, &node_tab[i].parent);
  79. j = i;
  80. cb_skiplist_for_each(item, &skl)
  81. {
  82. struct cb_skiplist_test_node *t = cb_container_of(item, struct cb_skiplist_test_node, parent);
  83. EXPECT_EQ(t->value, j);
  84. j -= 1;
  85. }
  86. }
  87. }
  88. TEST(testCase, cb_skiplist_test05)
  89. {
  90. cb_skiplist_t skl;
  91. struct cb_skiplist_test_node *node;
  92. cb_skiplist_node_t *t;
  93. unsigned int i, cnt = 512;
  94. int prev_value;
  95. cb_skiplist_init(&skl, 0, cb_skiplist_test_cmp);
  96. for (i = 0; i < cnt; i++)
  97. {
  98. node = (struct cb_skiplist_test_node *)malloc(sizeof(struct cb_skiplist_test_node));
  99. if (node)
  100. {
  101. cb_skiplist_node_init(&node->parent);
  102. node->value = rand() % 1000;
  103. cb_skiplist_insert(&skl, &node->parent);
  104. }
  105. }
  106. for (i = 0; cb_skiplist_isempty(&skl) == 0; i++)
  107. {
  108. t = cb_skiplist_first(&skl);
  109. t = cb_skiplist_remove(t);
  110. node = cb_container_of(t, struct cb_skiplist_test_node, parent);
  111. if (i == 0)
  112. {
  113. prev_value = node->value;
  114. }
  115. else
  116. {
  117. EXPECT_GE(node->value, prev_value);
  118. prev_value = node->value;
  119. }
  120. memset(node, 0xff, sizeof(struct cb_skiplist_test_node));
  121. free(node);
  122. }
  123. EXPECT_EQ(i, cnt);
  124. }
  125. TEST(testCase, cb_skiplist_test06)
  126. {
  127. cb_skiplist_t skl;
  128. struct cb_skiplist_test_node *node;
  129. unsigned int i, cnt = 512;
  130. int prev_value;
  131. cb_skiplist_init(&skl, 1, cb_skiplist_test_cmp);
  132. for (i = 0; i < cnt; i++)
  133. {
  134. node = (struct cb_skiplist_test_node *)malloc(sizeof(struct cb_skiplist_test_node));
  135. if (node)
  136. {
  137. cb_skiplist_node_init(&node->parent);
  138. node->value = rand() % 1000;
  139. cb_skiplist_insert(&skl, &node->parent);
  140. }
  141. }
  142. i = 0;
  143. cb_skiplist_for_each(t, &skl)
  144. {
  145. t = cb_skiplist_first(&skl);
  146. t = cb_skiplist_remove(t);
  147. node = cb_container_of(t, struct cb_skiplist_test_node, parent);
  148. if (i == 0)
  149. {
  150. prev_value = node->value;
  151. }
  152. else
  153. {
  154. EXPECT_LE(node->value, prev_value);
  155. prev_value = node->value;
  156. }
  157. memset(node, 0xff, sizeof(struct cb_skiplist_test_node));
  158. free(node);
  159. i ++;
  160. }
  161. EXPECT_EQ(i, cnt);
  162. }