| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /*
- * Copyright (c) 2006-2020, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2020-05-18 tyx first version.
- */
- #include <stdio.h>
- #include <string.h>
- #include <gtest/gtest.h>
- #include "cb_hashmap.h"
- #include "cb_hashfun.h"
- struct cb_hashmap_test_data
- {
- const char *key;
- cb_hashmap_item_t item;
- };
- static void cb_hashmap_test_data_init(struct cb_hashmap_test_data *data_array, cb_size_t size)
- {
- #define CB_HASHMAP_TEST_DATA_INIT(_i) \
- do { \
- if (size > _i) { \
- data_array[_i].key = "key"#_i; \
- cb_hashmap_item_init(&data_array[_i].item, data_array[_i].key); \
- } \
- } while (0)
- CB_HASHMAP_TEST_DATA_INIT(0);
- CB_HASHMAP_TEST_DATA_INIT(1);
- CB_HASHMAP_TEST_DATA_INIT(2);
- CB_HASHMAP_TEST_DATA_INIT(3);
- CB_HASHMAP_TEST_DATA_INIT(4);
- CB_HASHMAP_TEST_DATA_INIT(5);
- CB_HASHMAP_TEST_DATA_INIT(6);
- CB_HASHMAP_TEST_DATA_INIT(7);
- CB_HASHMAP_TEST_DATA_INIT(8);
- CB_HASHMAP_TEST_DATA_INIT(9);
- }
- static const struct cb_hashmap_ops _ops =
- {
- cb_hash_string,
- cb_hash_string_cmp,
- };
- TEST(testCase, cb_hashmap_test01)
- {
- cb_hashmap_t _hashmap;
- cb_hashmap_t *hashmap;
- struct cb_hashmap_table table[1];
- struct cb_hashmap_test_data data[1];
- cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
- hashmap = cb_hashmap_init(&_hashmap, table, CB_ARRAY_SIZE(table), &_ops);
- cb_hashmap_put(hashmap, &data[0].item);
- EXPECT_EQ(cb_hashmap_get(hashmap, data[0].key), &data[0].item);
- EXPECT_EQ(cb_hashmap_size(hashmap), 1);
- EXPECT_EQ(cb_hashmap_remove(hashmap, data[0].key), &data[0].item);
- EXPECT_EQ(cb_hashmap_size(hashmap), 0);
- EXPECT_EQ(cb_hashmap_get(hashmap, data[0].key), nullptr);
- cb_hashmap_remove_all(hashmap, nullptr);
- }
- TEST(testCase, cb_hashmap_test02)
- {
- cb_hashmap_t _hashmap;
- cb_hashmap_t *hashmap;
- struct cb_hashmap_table table[1];
- struct cb_hashmap_test_data data[2];
- cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
- hashmap = cb_hashmap_init(&_hashmap, table, CB_ARRAY_SIZE(table), &_ops);
- cb_hashmap_put(hashmap, &data[0].item);
- EXPECT_EQ(cb_hashmap_replace(hashmap, &data[0].item), &data[0].item);
- EXPECT_EQ(cb_hashmap_size(hashmap), 1);
- EXPECT_EQ(cb_hashmap_replace(hashmap, &data[1].item), nullptr);
- EXPECT_EQ(cb_hashmap_size(hashmap), 2);
- EXPECT_EQ(cb_hashmap_replace(hashmap, &data[1].item), &data[1].item);
- EXPECT_EQ(cb_hashmap_size(hashmap), 2);
- EXPECT_EQ(cb_hashmap_replace(hashmap, &data[0].item), &data[0].item);
- EXPECT_EQ(cb_hashmap_size(hashmap), 2);
- EXPECT_EQ(cb_hashmap_get(hashmap, data[0].key), &data[0].item);
- EXPECT_EQ(cb_hashmap_get(hashmap, data[1].key), &data[1].item);
- cb_hashmap_remove_all(hashmap, nullptr);
- }
- TEST(testCase, cb_hashmap_test03)
- {
- cb_hashmap_t _hashmap;
- cb_hashmap_t *hashmap;
- struct cb_hashmap_table table[2];
- struct cb_hashmap_test_data data[3];
- cb_hashmap_item_t *item;
- cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
- hashmap = cb_hashmap_init(&_hashmap, table, CB_ARRAY_SIZE(table), &_ops);
- cb_hashmap_put(hashmap, &data[0].item);
- EXPECT_EQ(cb_hashmap_size(hashmap), 1);
- cb_hashmap_put(hashmap, &data[0].item);
- cb_hashmap_put(hashmap, &data[0].item);
- EXPECT_EQ(cb_hashmap_size(hashmap), 1);
- cb_hashmap_put(hashmap, &data[1].item);
- cb_hashmap_put(hashmap, &data[2].item);
- EXPECT_EQ(cb_hashmap_size(hashmap), 3);
- cb_hashmap_iter_t iter = CB_HASHMAP_ITER_INIT(hashmap);
- while ((item = cb_hashmap_iterator(&iter)) != nullptr)
- {
- cb_hashmap_remove(hashmap, item->key);
- memset(item, 0, sizeof(*item));
- }
- EXPECT_EQ(cb_hashmap_size(hashmap), 0);
- cb_hashmap_remove_all(hashmap, nullptr);
- }
- static void hashmap_free_item(cb_hashmap_t *object, cb_hashmap_item_t *item)
- {
- (void)object;
- memset(item, 0, sizeof(*item));
- }
- TEST(testCase, cb_hashmap_test04)
- {
- cb_hashmap_t _hashmap, _hashmap1;
- cb_hashmap_t *hashmap, *hashmap1;
- struct cb_hashmap_table table[2], table1[4];
- struct cb_hashmap_test_data data[3];
- cb_hashmap_item_t *item;
- cb_hashmap_test_data_init(data, CB_ARRAY_SIZE(data));
- hashmap = cb_hashmap_init(&_hashmap, table, CB_ARRAY_SIZE(table), &_ops);
- cb_hashmap_put(hashmap, &data[0].item);
- EXPECT_EQ(cb_hashmap_size(hashmap), 1);
- cb_hashmap_put(hashmap, &data[1].item);
- EXPECT_EQ(cb_hashmap_size(hashmap), 2);
- cb_hashmap_put(hashmap, &data[2].item);
- EXPECT_EQ(cb_hashmap_size(hashmap), 3);
- hashmap1 = cb_hashmap_init(&_hashmap1, table1, CB_ARRAY_SIZE(table1), &_ops);
- cb_hashmap_iter_t iter, *iter_ptr;
- iter_ptr = cb_hashmap_iter_init(hashmap, &iter);
- while ((item = cb_hashmap_iterator(iter_ptr)) != nullptr)
- {
- cb_hashmap_remove(hashmap, item->key);
- cb_hashmap_put(hashmap1, item);
- }
- EXPECT_EQ(cb_hashmap_size(hashmap), 0);
- EXPECT_EQ(cb_hashmap_size(hashmap1), 3);
- cb_hashmap_remove_all(hashmap, hashmap_free_item);
- cb_hashmap_remove_all(hashmap1, hashmap_free_item);
- EXPECT_EQ(cb_hashmap_size(hashmap1), 0);
- }
|