| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you under the Apache License, Version 2.0 (the | |
| * "License"); you may not use this file except in compliance | |
| * with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, | |
| * software distributed under the License is distributed on an | |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| * KIND, either express or implied. See the License for the | |
| * specific language governing permissions and limitations | |
| * under the License. | |
| */ | |
| #include "paimon/common/utils/linked_hash_map.h" | |
| #include <cstdint> | |
| #include <string> | |
| #include "gtest/gtest.h" | |
| namespace paimon::test { | |
| TEST(LinkedHashMapTest, TestCopy) { | |
| LinkedHashMap<int32_t, std::string> hash_map; | |
| hash_map.insert(3, "c"); | |
| hash_map.insert(1, "a"); | |
| hash_map.insert(2, "b"); | |
| ASSERT_EQ(hash_map.size(), 3); | |
| LinkedHashMap<int32_t, std::string> hash_map_2; | |
| hash_map_2 = hash_map; | |
| ASSERT_EQ(hash_map_2, hash_map); | |
| LinkedHashMap<int32_t, std::string> hash_map_3(hash_map); | |
| ASSERT_EQ(hash_map_3, hash_map); | |
| auto check = [](const LinkedHashMap<int32_t, std::string>& hash_map) { | |
| std::vector<std::pair<int32_t, std::string>> expected = {{3, "c"}, {1, "a"}, {2, "b"}}; | |
| std::vector<std::pair<int32_t, std::string>> result; | |
| for (const auto& iter : hash_map) { | |
| result.push_back(iter); | |
| } | |
| ASSERT_EQ(result, expected); | |
| ASSERT_EQ(std::unordered_set<int32_t>({3, 1, 2}), hash_map.key_set()); | |
| ASSERT_EQ(std::vector<int32_t>({3, 1, 2}), hash_map.key_vec()); | |
| }; | |
| check(hash_map); | |
| check(hash_map_2); | |
| check(hash_map_3); | |
| } | |
| TEST(LinkedHashMapTest, TestInsert) { | |
| LinkedHashMap<int32_t, std::string> hash_map; | |
| hash_map.insert(3, "c"); | |
| hash_map.insert(1, "a"); | |
| hash_map.insert(2, "b"); | |
| ASSERT_EQ(hash_map.size(), 3); | |
| // test key exist | |
| auto iter = hash_map.find(1); | |
| ASSERT_TRUE(iter != hash_map.end()); | |
| ASSERT_EQ(iter->first, 1); | |
| ASSERT_EQ(iter->second, "a"); | |
| // insert the same key (will not modify) | |
| hash_map.insert(1, "bb"); | |
| iter = hash_map.find(1); | |
| ASSERT_TRUE(iter != hash_map.end()); | |
| ASSERT_EQ(iter->first, 1); | |
| ASSERT_EQ(iter->second, "a"); | |
| // test iterator | |
| std::vector<std::pair<int32_t, std::string>> expected = {{3, "c"}, {1, "a"}, {2, "b"}}; | |
| std::vector<std::pair<int32_t, std::string>> result; | |
| for (const auto& iter2 : hash_map) { | |
| result.push_back(iter2); | |
| } | |
| ASSERT_EQ(result, expected); | |
| ASSERT_EQ(std::unordered_set<int32_t>({3, 1, 2}), hash_map.key_set()); | |
| ASSERT_EQ(std::vector<int32_t>({3, 1, 2}), hash_map.key_vec()); | |
| } | |
| TEST(LinkedHashMapTest, TestErase) { | |
| LinkedHashMap<int32_t, std::string> hash_map; | |
| hash_map.insert(3, "c"); | |
| hash_map.insert(1, "a"); | |
| hash_map.insert(2, "b"); | |
| ASSERT_EQ(hash_map.size(), 3); | |
| auto iter = hash_map.erase(1); | |
| ASSERT_TRUE(iter != hash_map.end()); | |
| ASSERT_EQ(iter->first, 2); | |
| ASSERT_EQ(iter->second, "b"); | |
| ASSERT_EQ(hash_map.size(), 2); | |
| iter = hash_map.erase(1); | |
| ASSERT_TRUE(iter == hash_map.end()); | |
| iter = hash_map.erase(2); | |
| ASSERT_TRUE(iter == hash_map.end()); | |
| ASSERT_EQ(hash_map.size(), 1); | |
| } | |
| TEST(LinkedHashMapTest, TestSimple) { | |
| LinkedHashMap<int32_t, std::string> hash_map; | |
| hash_map.insert_or_assign(3, "c"); | |
| hash_map.insert_or_assign(1, "a"); | |
| hash_map.insert_or_assign(2, "b"); | |
| ASSERT_EQ(hash_map.size(), 3); | |
| // test key exist | |
| auto iter = hash_map.find(1); | |
| ASSERT_TRUE(iter != hash_map.end()); | |
| ASSERT_EQ(iter->first, 1); | |
| ASSERT_EQ(iter->second, "a"); | |
| // test key not exist | |
| iter = hash_map.find(100); | |
| ASSERT_TRUE(iter == hash_map.end()); | |
| // test insert the same key with insert_or_assign() | |
| hash_map.insert_or_assign(1, "aa"); | |
| ASSERT_EQ(hash_map.size(), 3); | |
| iter = hash_map.find(1); | |
| ASSERT_TRUE(iter != hash_map.end()); | |
| ASSERT_EQ(iter->first, 1); | |
| ASSERT_EQ(iter->second, "aa"); | |
| iter = hash_map.find(2); | |
| ASSERT_TRUE(iter != hash_map.end()); | |
| ASSERT_EQ(iter->first, 2); | |
| ASSERT_EQ(iter->second, "b"); | |
| hash_map.insert_or_assign(0, "d"); | |
| ASSERT_EQ(hash_map.size(), 4); | |
| iter = hash_map.find(0); | |
| ASSERT_TRUE(iter != hash_map.end()); | |
| ASSERT_EQ(iter->first, 0); | |
| ASSERT_EQ(iter->second, "d"); | |
| // test iterator | |
| std::vector<std::pair<int32_t, std::string>> expected = { | |
| {3, "c"}, {1, "aa"}, {2, "b"}, {0, "d"}}; | |
| std::vector<std::pair<int32_t, std::string>> result; | |
| for (const auto& iter2 : hash_map) { | |
| result.push_back(iter2); | |
| } | |
| ASSERT_EQ(result, expected); | |
| ASSERT_EQ(std::unordered_set<int32_t>({3, 1, 2, 0}), hash_map.key_set()); | |
| ASSERT_EQ(std::vector<int32_t>({3, 1, 2, 0}), hash_map.key_vec()); | |
| } | |
| TEST(LinkedHashMapTest, TestOperator) { | |
| LinkedHashMap<int32_t, std::string> hash_map; | |
| hash_map[10] = "abc"; | |
| ASSERT_EQ(hash_map.size(), 1); | |
| // test key 10 exist | |
| auto iter = hash_map.find(10); | |
| ASSERT_TRUE(iter != hash_map.end()); | |
| ASSERT_EQ(iter->first, 10); | |
| ASSERT_EQ(iter->second, "abc"); | |
| // test key not exist | |
| iter = hash_map.find(100); | |
| ASSERT_TRUE(iter == hash_map.end()); | |
| hash_map[20] = "aaa"; | |
| ASSERT_EQ(hash_map.size(), 2); | |
| // test key 20 exist | |
| iter = hash_map.find(20); | |
| ASSERT_TRUE(iter != hash_map.end()); | |
| ASSERT_EQ(iter->first, 20); | |
| ASSERT_EQ(iter->second, "aaa"); | |
| hash_map[10] = "bbb"; | |
| ASSERT_EQ(hash_map.size(), 2); | |
| iter = hash_map.find(10); | |
| ASSERT_TRUE(iter != hash_map.end()); | |
| ASSERT_EQ(iter->first, 10); | |
| ASSERT_EQ(iter->second, "bbb"); | |
| auto non_exist = hash_map[30]; | |
| ASSERT_EQ(non_exist, ""); | |
| ASSERT_EQ(hash_map.size(), 3); | |
| ASSERT_EQ(std::unordered_set<int32_t>({10, 20, 30}), hash_map.key_set()); | |
| ASSERT_EQ(std::vector<int32_t>({10, 20, 30}), hash_map.key_vec()); | |
| } | |
| TEST(LinkedHashMapTest, TestEqual) { | |
| LinkedHashMap<int32_t, std::string> hash_map1; | |
| hash_map1.insert(3, "c"); | |
| hash_map1.insert(1, "a"); | |
| hash_map1.insert(2, "b"); | |
| ASSERT_EQ(hash_map1, hash_map1); | |
| LinkedHashMap<int32_t, std::string> hash_map2; | |
| hash_map2[3] = "c"; | |
| hash_map2[1] = "a"; | |
| hash_map2[2] = "b"; | |
| ASSERT_EQ(hash_map1, hash_map2); | |
| LinkedHashMap<int32_t, std::string> hash_map3; | |
| hash_map3[1] = "a"; | |
| hash_map3[2] = "b"; | |
| hash_map3[3] = "c"; | |
| ASSERT_NE(hash_map1, hash_map3); | |
| LinkedHashMap<int32_t, std::string> hash_map4; | |
| hash_map4[3] = "c"; | |
| hash_map4[1] = "a"; | |
| hash_map4[2] = "b"; | |
| hash_map4[4] = "d"; | |
| ASSERT_NE(hash_map1, hash_map4); | |
| } | |
| } // namespace paimon::test |