cb_linkedhashmap_test.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /*
  2. * Copyright (c) 2006-2020, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-05-18 tyx first version.
  9. */
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <gtest/gtest.h>
  13. #include "cb_linkedhashmap.h"
  14. #include "cb_hashfun.h"
  15. struct cb_linkedhashmap_test_data
  16. {
  17. const char *key;
  18. cb_linkedhashmap_item_t item;
  19. };
  20. static void cb_hashmap_test_data_init(struct cb_linkedhashmap_test_data *data_array, cb_size_t size)
  21. {
  22. #define CB_HASHMAP_TEST_DATA_INIT(_i) \
  23. do { \
  24. if (size > _i) { \
  25. data_array[_i].key = "key"#_i; \
  26. cb_linkedhashmap_item_init(&data_array[_i].item, data_array[_i].key); \
  27. } \
  28. } while (0)
  29. CB_HASHMAP_TEST_DATA_INIT(0);
  30. CB_HASHMAP_TEST_DATA_INIT(1);
  31. CB_HASHMAP_TEST_DATA_INIT(2);
  32. CB_HASHMAP_TEST_DATA_INIT(3);
  33. CB_HASHMAP_TEST_DATA_INIT(4);
  34. CB_HASHMAP_TEST_DATA_INIT(5);
  35. CB_HASHMAP_TEST_DATA_INIT(6);
  36. CB_HASHMAP_TEST_DATA_INIT(7);
  37. CB_HASHMAP_TEST_DATA_INIT(8);
  38. CB_HASHMAP_TEST_DATA_INIT(9);
  39. }
  40. static const struct cb_hashmap_ops _ops =
  41. {
  42. cb_hash_string,
  43. cb_hash_string_cmp,
  44. };
  45. TEST(testCase, cb_linkedhashmap_test01)
  46. {
  47. cb_linkedhashmap_t *linkedhashmap, _linkedhashmap;
  48. struct cb_hashmap_table table[1];
  49. struct cb_linkedhashmap_test_data data[2];
  50. cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
  51. linkedhashmap = cb_linkedhashmap_init(&_linkedhashmap, table, CB_ARRAY_SIZE(table), &_ops);
  52. cb_linkedhashmap_push(linkedhashmap, &data[0].item);
  53. EXPECT_EQ(cb_linkedhashmap_pop(linkedhashmap), &data[0].item);
  54. EXPECT_EQ(cb_linkedhashmap_pop(linkedhashmap), nullptr);
  55. cb_linkedhashmap_push(linkedhashmap, &data[0].item);
  56. EXPECT_EQ(cb_linkedhashmap_size(linkedhashmap), 1);
  57. cb_linkedhashmap_push(linkedhashmap, &data[0].item);
  58. cb_linkedhashmap_push(linkedhashmap, &data[0].item);
  59. EXPECT_EQ(cb_linkedhashmap_size(linkedhashmap), 1);
  60. EXPECT_EQ(cb_linkedhashmap_peak(linkedhashmap), &data[0].item);
  61. EXPECT_EQ(cb_linkedhashmap_pop(linkedhashmap), &data[0].item);
  62. EXPECT_EQ(cb_linkedhashmap_peak(linkedhashmap), nullptr);
  63. EXPECT_EQ(cb_linkedhashmap_pop(linkedhashmap), nullptr);
  64. EXPECT_EQ(cb_linkedhashmap_size(linkedhashmap), 0);
  65. cb_linkedhashmap_remove_all(linkedhashmap, nullptr);
  66. }
  67. TEST(testCase, cb_linkedhashmap_test02)
  68. {
  69. cb_linkedhashmap_t *linkedhashmap, _linkedhashmap;
  70. struct cb_hashmap_table table[2];
  71. struct cb_linkedhashmap_test_data data[2];
  72. cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
  73. linkedhashmap = cb_linkedhashmap_init(&_linkedhashmap, table, CB_ARRAY_SIZE(table), &_ops);
  74. cb_linkedhashmap_push(linkedhashmap, &data[0].item);
  75. EXPECT_EQ(cb_linkedhashmap_peak(linkedhashmap), &data[0].item);
  76. cb_linkedhashmap_push(linkedhashmap, &data[1].item);
  77. EXPECT_EQ(cb_linkedhashmap_size(linkedhashmap), 2);
  78. EXPECT_EQ(cb_linkedhashmap_peak(linkedhashmap), &data[0].item);
  79. EXPECT_EQ(cb_linkedhashmap_top(linkedhashmap, data[1].key), &data[1].item);
  80. EXPECT_EQ(cb_linkedhashmap_peak(linkedhashmap), &data[1].item);
  81. EXPECT_EQ(cb_linkedhashmap_top(linkedhashmap, data[1].key), &data[1].item);
  82. EXPECT_EQ(cb_linkedhashmap_peak(linkedhashmap), &data[1].item);
  83. EXPECT_EQ(cb_linkedhashmap_top(linkedhashmap, data[0].key), &data[0].item);
  84. EXPECT_EQ(cb_linkedhashmap_peak(linkedhashmap), &data[0].item);
  85. EXPECT_EQ(cb_linkedhashmap_size(linkedhashmap), 2);
  86. cb_linkedhashmap_remove_all(linkedhashmap, nullptr);
  87. EXPECT_EQ(cb_linkedhashmap_size(linkedhashmap), 0);
  88. }
  89. TEST(testCase, cb_linkedhashmap_test03)
  90. {
  91. cb_linkedhashmap_t *linkedhashmap, _linkedhashmap;
  92. struct cb_hashmap_table table[2];
  93. struct cb_linkedhashmap_test_data data[3];
  94. cb_linkedhashmap_item_t *item;
  95. cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
  96. linkedhashmap = cb_linkedhashmap_init(&_linkedhashmap, table, CB_ARRAY_SIZE(table), &_ops);
  97. cb_linkedhashmap_push(linkedhashmap, &data[0].item);
  98. cb_linkedhashmap_push(linkedhashmap, &data[1].item);
  99. cb_linkedhashmap_push(linkedhashmap, &data[2].item);
  100. cb_linkedhashmap_iter_t iter = CB_LINKEDHASHMAP_ITER_INIT(linkedhashmap);
  101. while ((item = cb_linkedhashmap_iterator(&iter)) != nullptr)
  102. {
  103. cb_linkedhashmap_item_remove(item);
  104. memset(item, 0, sizeof(*item));
  105. }
  106. EXPECT_EQ(cb_linkedhashmap_size(linkedhashmap), 0);
  107. cb_linkedhashmap_remove_all(linkedhashmap, nullptr);
  108. EXPECT_EQ(cb_linkedhashmap_size(linkedhashmap), 0);
  109. }
  110. TEST(testCase, cb_linkedhashmap_test04)
  111. {
  112. cb_linkedhashmap_t *linkedhashmap, _linkedhashmap;
  113. struct cb_hashmap_table table[2];
  114. struct cb_linkedhashmap_test_data data[3];
  115. cb_linkedhashmap_item_t *item;
  116. cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
  117. linkedhashmap = cb_linkedhashmap_init(&_linkedhashmap, table, CB_ARRAY_SIZE(table), &_ops);
  118. cb_linkedhashmap_push(linkedhashmap, &data[0].item);
  119. cb_linkedhashmap_push(linkedhashmap, &data[1].item);
  120. cb_linkedhashmap_push(linkedhashmap, &data[2].item);
  121. item = cb_linkedhashmap_peak(linkedhashmap);
  122. EXPECT_EQ(item, &data[0].item);
  123. EXPECT_EQ(cb_linkedhashmap_get(linkedhashmap, cb_linkedhashmap_item_key(item)), item);
  124. EXPECT_EQ(cb_linkedhashmap_remove(linkedhashmap, cb_linkedhashmap_item_key(item)), item);
  125. EXPECT_EQ(cb_linkedhashmap_peak(linkedhashmap), &data[1].item);
  126. cb_linkedhashmap_remove_all(linkedhashmap, nullptr);
  127. EXPECT_EQ(cb_linkedhashmap_size(linkedhashmap), 0);
  128. }
  129. static void linkedhashmap_free_item(cb_linkedhashmap_t *object, cb_linkedhashmap_item_t *item)
  130. {
  131. (void)object;
  132. memset(item, 0, sizeof(*item));
  133. }
  134. TEST(testCase, cb_linkedhashmap_test05)
  135. {
  136. cb_linkedhashmap_t *linkedhashmap0, _linkedhashmap0;
  137. cb_linkedhashmap_t *linkedhashmap1, _linkedhashmap1;
  138. struct cb_hashmap_table table0[2], table1[4];
  139. struct cb_linkedhashmap_test_data data[3];
  140. cb_linkedhashmap_item_t *item;
  141. cb_linkedhashmap_iter_t iter;
  142. cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
  143. linkedhashmap0 = cb_linkedhashmap_init(&_linkedhashmap0, table0, CB_ARRAY_SIZE(table0), &_ops);
  144. cb_linkedhashmap_push(linkedhashmap0, &data[0].item);
  145. cb_linkedhashmap_push(linkedhashmap0, &data[1].item);
  146. cb_linkedhashmap_push(linkedhashmap0, &data[2].item);
  147. linkedhashmap1 = cb_linkedhashmap_init(&_linkedhashmap1, table1, CB_ARRAY_SIZE(table1), &_ops);
  148. cb_linkedhashmap_iterator_init(linkedhashmap0, &iter);
  149. while ((item = cb_linkedhashmap_iterator(&iter)) != nullptr)
  150. {
  151. cb_linkedhashmap_item_remove(item);
  152. cb_linkedhashmap_push(linkedhashmap1, item);
  153. }
  154. EXPECT_EQ(cb_linkedhashmap_size(linkedhashmap0), 0);
  155. EXPECT_EQ(cb_linkedhashmap_size(linkedhashmap1), 3);
  156. cb_linkedhashmap_remove_all(linkedhashmap1, linkedhashmap_free_item);
  157. EXPECT_EQ(cb_linkedhashmap_size(linkedhashmap1), 0);
  158. }