cb_hashmap_test.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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_hashmap.h"
  14. #include "cb_hashfun.h"
  15. struct cb_hashmap_test_data
  16. {
  17. const char *key;
  18. cb_hashmap_item_t item;
  19. };
  20. static void cb_hashmap_test_data_init(struct cb_hashmap_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_hashmap_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_hashmap_test01)
  46. {
  47. cb_hashmap_t _hashmap;
  48. cb_hashmap_t *hashmap;
  49. struct cb_hashmap_table table[1];
  50. struct cb_hashmap_test_data data[1];
  51. cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
  52. hashmap = cb_hashmap_init(&_hashmap, table, CB_ARRAY_SIZE(table), &_ops);
  53. cb_hashmap_put(hashmap, &data[0].item);
  54. EXPECT_EQ(cb_hashmap_get(hashmap, data[0].key), &data[0].item);
  55. EXPECT_EQ(cb_hashmap_size(hashmap), 1);
  56. EXPECT_EQ(cb_hashmap_remove(hashmap, data[0].key), &data[0].item);
  57. EXPECT_EQ(cb_hashmap_size(hashmap), 0);
  58. EXPECT_EQ(cb_hashmap_get(hashmap, data[0].key), nullptr);
  59. cb_hashmap_remove_all(hashmap, nullptr);
  60. }
  61. TEST(testCase, cb_hashmap_test02)
  62. {
  63. cb_hashmap_t _hashmap;
  64. cb_hashmap_t *hashmap;
  65. struct cb_hashmap_table table[1];
  66. struct cb_hashmap_test_data data[2];
  67. cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
  68. hashmap = cb_hashmap_init(&_hashmap, table, CB_ARRAY_SIZE(table), &_ops);
  69. cb_hashmap_put(hashmap, &data[0].item);
  70. EXPECT_EQ(cb_hashmap_replace(hashmap, &data[0].item), &data[0].item);
  71. EXPECT_EQ(cb_hashmap_size(hashmap), 1);
  72. EXPECT_EQ(cb_hashmap_replace(hashmap, &data[1].item), nullptr);
  73. EXPECT_EQ(cb_hashmap_size(hashmap), 2);
  74. EXPECT_EQ(cb_hashmap_replace(hashmap, &data[1].item), &data[1].item);
  75. EXPECT_EQ(cb_hashmap_size(hashmap), 2);
  76. EXPECT_EQ(cb_hashmap_replace(hashmap, &data[0].item), &data[0].item);
  77. EXPECT_EQ(cb_hashmap_size(hashmap), 2);
  78. EXPECT_EQ(cb_hashmap_get(hashmap, data[0].key), &data[0].item);
  79. EXPECT_EQ(cb_hashmap_get(hashmap, data[1].key), &data[1].item);
  80. cb_hashmap_remove_all(hashmap, nullptr);
  81. }
  82. TEST(testCase, cb_hashmap_test03)
  83. {
  84. cb_hashmap_t _hashmap;
  85. cb_hashmap_t *hashmap;
  86. struct cb_hashmap_table table[2];
  87. struct cb_hashmap_test_data data[3];
  88. cb_hashmap_item_t *item;
  89. cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
  90. hashmap = cb_hashmap_init(&_hashmap, table, CB_ARRAY_SIZE(table), &_ops);
  91. cb_hashmap_put(hashmap, &data[0].item);
  92. EXPECT_EQ(cb_hashmap_size(hashmap), 1);
  93. cb_hashmap_put(hashmap, &data[0].item);
  94. cb_hashmap_put(hashmap, &data[0].item);
  95. EXPECT_EQ(cb_hashmap_size(hashmap), 1);
  96. cb_hashmap_put(hashmap, &data[1].item);
  97. cb_hashmap_put(hashmap, &data[2].item);
  98. EXPECT_EQ(cb_hashmap_size(hashmap), 3);
  99. cb_hashmap_iter_t iter = CB_HASHMAP_ITER_INIT(hashmap);
  100. while ((item = cb_hashmap_iterator(&iter)) != nullptr)
  101. {
  102. cb_hashmap_remove(hashmap, item->key);
  103. memset(item, 0, sizeof(*item));
  104. }
  105. EXPECT_EQ(cb_hashmap_size(hashmap), 0);
  106. cb_hashmap_remove_all(hashmap, nullptr);
  107. }
  108. static void hashmap_free_item(cb_hashmap_t *object, cb_hashmap_item_t *item)
  109. {
  110. (void)object;
  111. memset(item, 0, sizeof(*item));
  112. }
  113. TEST(testCase, cb_hashmap_test04)
  114. {
  115. cb_hashmap_t _hashmap, _hashmap1;
  116. cb_hashmap_t *hashmap, *hashmap1;
  117. struct cb_hashmap_table table[2], table1[4];
  118. struct cb_hashmap_test_data data[3];
  119. cb_hashmap_item_t *item;
  120. cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
  121. hashmap = cb_hashmap_init(&_hashmap, table, CB_ARRAY_SIZE(table), &_ops);
  122. cb_hashmap_put(hashmap, &data[0].item);
  123. EXPECT_EQ(cb_hashmap_size(hashmap), 1);
  124. cb_hashmap_put(hashmap, &data[1].item);
  125. EXPECT_EQ(cb_hashmap_size(hashmap), 2);
  126. cb_hashmap_put(hashmap, &data[2].item);
  127. EXPECT_EQ(cb_hashmap_size(hashmap), 3);
  128. hashmap1 = cb_hashmap_init(&_hashmap1, table1, CB_ARRAY_SIZE(table1), &_ops);
  129. cb_hashmap_iter_t iter, *iter_ptr;
  130. iter_ptr = cb_hashmap_iter_init(hashmap, &iter);
  131. while ((item = cb_hashmap_iterator(iter_ptr)) != nullptr)
  132. {
  133. cb_hashmap_remove(hashmap, item->key);
  134. cb_hashmap_put(hashmap1, item);
  135. }
  136. EXPECT_EQ(cb_hashmap_size(hashmap), 0);
  137. EXPECT_EQ(cb_hashmap_size(hashmap1), 3);
  138. cb_hashmap_remove_all(hashmap, hashmap_free_item);
  139. cb_hashmap_remove_all(hashmap1, hashmap_free_item);
  140. EXPECT_EQ(cb_hashmap_size(hashmap1), 0);
  141. }