From 090af1b8097fecf6b09f3048811a44e11ece3242 Mon Sep 17 00:00:00 2001 From: Dominick Allen Date: Thu, 3 Apr 2025 06:07:34 -0500 Subject: Test hash map extract pair, fix bugs. --- test/test_hash_map.cpp | 194 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) (limited to 'test/test_hash_map.cpp') diff --git a/test/test_hash_map.cpp b/test/test_hash_map.cpp index 9f01766..e8842fa 100644 --- a/test/test_hash_map.cpp +++ b/test/test_hash_map.cpp @@ -155,6 +155,131 @@ TEST(FudHash, InsertCopyKeyCopyValue) } } +TEST(FudHash, UpdateMoveKeyMoveValue) +{ + auto stringList{testStrings()}; + HashMap mapInt2String{}; + for (int index = 0; index < static_cast(stringList.size()); ++index) { + auto updateStatus = mapInt2String.update(index * 1, String::from(stringList[index]).takeOkay()); + EXPECT_EQ(updateStatus, FudStatus::Success); + } + + EXPECT_EQ(mapInt2String.size(), stringList.size()); + EXPECT_GT(mapInt2String.capacity(), mapInt2String.size()); + + const String invalid{String::makeFromCString("Invalid").takeOkay()}; + for (int index = 0; index < static_cast(stringList.size()); ++index) { + EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), stringList[index]); + } + + for (int index = 0; index < static_cast(stringList.size()); ++index) { + auto updateStatus = mapInt2String.update( + index * 1, + String::from(stringList[stringList.size() - (index + 1)]).takeOkay()); + EXPECT_EQ(updateStatus, FudStatus::Success); + } + + EXPECT_EQ(mapInt2String.size(), stringList.size()); + EXPECT_GT(mapInt2String.capacity(), mapInt2String.size()); + + for (int index = 0; index < static_cast(stringList.size()); ++index) { + EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), stringList[stringList.size() - (index + 1)]); + } +} + +TEST(FudHash, UpdateMoveKeyCopyValue) +{ + auto stringList{testStrings()}; + HashMap mapString2Int{}; + for (int index = 0; index < static_cast(stringList.size()); ++index) { + auto updateStatus = mapString2Int.update(String::from(stringList[index]).takeOkay(), index); + EXPECT_EQ(updateStatus, FudStatus::Success); + } + + EXPECT_EQ(mapString2Int.size(), stringList.size()); + EXPECT_GT(mapString2Int.capacity(), mapString2Int.size()); + + for (int index = 0; index < static_cast(stringList.size()); ++index) { + const int invalid = -1; + EXPECT_EQ(mapString2Int.getConstRef(stringList[index]).valueOr(invalid), index); + } + + for (int index = 0; index < static_cast(stringList.size()); ++index) { + auto value = index * 2; + auto updateStatus = mapString2Int.update(String::from(stringList[index]).takeOkay(), value); + EXPECT_EQ(updateStatus, FudStatus::Success); + } + + for (int index = 0; index < static_cast(stringList.size()); ++index) { + const int invalid = -1; + EXPECT_EQ(mapString2Int.getConstRef(stringList[index]).valueOr(invalid), index * 2); + } +} + +TEST(FudHash, UpdateCopyKeyMoveValue) +{ + auto stringList{testStrings()}; + HashMap mapInt2String{}; + for (int index = 0; index < static_cast(stringList.size()); ++index) { + auto updateStatus = mapInt2String.update(index, String::from(stringList[index]).takeOkay()); + EXPECT_EQ(updateStatus, FudStatus::Success); + } + + EXPECT_EQ(mapInt2String.size(), stringList.size()); + EXPECT_GT(mapInt2String.capacity(), mapInt2String.size()); + + const String invalid{String::makeFromCString("Invalid").takeOkay()}; + for (int index = 0; index < static_cast(stringList.size()); ++index) { + EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), stringList[index]); + } + + for (int index = 0; index < static_cast(stringList.size()); ++index) { + auto updateStatus = mapInt2String.update( + index, + String::from(stringList[stringList.size() - (index + 1)]).takeOkay()); + EXPECT_EQ(updateStatus, FudStatus::Success); + } + + for (int index = 0; index < static_cast(stringList.size()); ++index) { + EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), stringList[stringList.size() - (index + 1)]); + } +} + +TEST(FudHash, UpdateCopyKeyCopyValue) +{ + auto stringViewList{testStringViews()}; + + HashMap mapView2Int{}; + for (int index = 0; index < static_cast(stringViewList.size()); ++index) { + EXPECT_FALSE(mapView2Int.contains(stringViewList[index])); + auto updateStatus = mapView2Int.update(stringViewList[index], index); + EXPECT_TRUE(mapView2Int.contains(stringViewList[index])); + EXPECT_EQ(updateStatus, FudStatus::Success); + } + + EXPECT_EQ(mapView2Int.size(), stringViewList.size()); + EXPECT_GT(mapView2Int.capacity(), mapView2Int.size()); + + for (int index = 0; index < static_cast(stringViewList.size()); ++index) { + const int invalid = -1; + EXPECT_EQ(mapView2Int.getConstRef(stringViewList[index]).valueOr(invalid), index); + } + + for (int index = 0; index < static_cast(stringViewList.size()); ++index) { + int updateValue = index * 2; + auto updateStatus = mapView2Int.update(stringViewList[index], updateValue); + EXPECT_EQ(updateStatus, FudStatus::Success); + } + + EXPECT_EQ(mapView2Int.size(), stringViewList.size()); + EXPECT_GT(mapView2Int.capacity(), mapView2Int.size()); + + for (int index = 0; index < static_cast(stringViewList.size()); ++index) { + const int invalid = -1; + EXPECT_EQ(mapView2Int.getConstRef(stringViewList[index]).valueOr(invalid), index * 2); + } +} + TEST(FudHash, RemoveKeyConstRef) { auto stringList{testStrings()}; @@ -173,7 +298,9 @@ TEST(FudHash, RemoveKeyConstRef) } for (const auto& entry : stringList) { + EXPECT_TRUE(mapString2Int.contains(entry)); EXPECT_EQ(mapString2Int.remove(entry), FudStatus::Success); + EXPECT_FALSE(mapString2Int.contains(entry)); } for (const auto& entry : stringList) { @@ -281,4 +408,71 @@ TEST(FudHash, ExtractMoveKey) } } +TEST(FudHash, ExtractPairConstKey) +{ + auto stringList{testStrings()}; + HashMap mapString2Int{}; + for (int index = 0; index < static_cast(stringList.size()); ++index) { + auto insertStatus = mapString2Int.insert(String::from(stringList[index]).takeOkay(), index); + EXPECT_EQ(insertStatus, FudStatus::Success); + } + + EXPECT_EQ(mapString2Int.size(), stringList.size()); + EXPECT_GT(mapString2Int.capacity(), mapString2Int.size()); + + for (int index = 0; index < static_cast(stringList.size()); ++index) { + const int invalid = -1; + EXPECT_EQ(mapString2Int.get(stringList[index]).valueOr(invalid), index); + } + + for (int index = 0; index < static_cast(stringList.size()); ++index) { + auto valueOpt{mapString2Int.extractPair(stringList[index])}; + ASSERT_TRUE(valueOpt.hasValue()); + EXPECT_EQ(valueOpt.value().m_key, stringList[index]); + EXPECT_EQ(valueOpt.value().m_value, index); + } + + for (const auto& entry : stringList) { + EXPECT_TRUE(mapString2Int.extract(entry).isNone()); + } + + for (const auto& entry : stringList) { + const int invalid = -1; + EXPECT_EQ(mapString2Int.get(entry).valueOr(invalid), invalid); + } +} + +TEST(FudHash, ExtractPairMoveKey) +{ + auto stringList{testStrings()}; + HashMap mapInt2String{}; + for (int index = 0; index < static_cast(stringList.size()); ++index) { + auto insertStatus = mapInt2String.insert(index, String::from(stringList[index]).takeOkay()); + EXPECT_EQ(insertStatus, FudStatus::Success); + } + + EXPECT_EQ(mapInt2String.size(), stringList.size()); + EXPECT_GT(mapInt2String.capacity(), mapInt2String.size()); + + const String invalid{String::makeFromCString("Invalid").takeOkay()}; + for (int index = 0; index < static_cast(stringList.size()); ++index) { + EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), stringList[index]); + } + + for (int index = 0; index < static_cast(stringList.size()); ++index) { + auto valueOpt{mapInt2String.extractPair(index * 1)}; + ASSERT_TRUE(valueOpt.hasValue()); + EXPECT_EQ(valueOpt.value().m_value, stringList[index]); + EXPECT_EQ(valueOpt.value().m_key, index); + } + + for (int index = 0; index < stringList.size(); ++index) { + EXPECT_TRUE(mapInt2String.extract(index * 1).isNone()); + } + + for (int index = 0; index < static_cast(stringList.size()); ++index) { + EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), invalid); + } +} + } // namespace fud -- cgit v1.2.3