summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/test_hash_map.cpp194
1 files changed, 194 insertions, 0 deletions
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<int, String> mapInt2String{};
+ for (int index = 0; index < static_cast<int>(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<int>(stringList.size()); ++index) {
+ EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), stringList[index]);
+ }
+
+ for (int index = 0; index < static_cast<int>(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<int>(stringList.size()); ++index) {
+ EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), stringList[stringList.size() - (index + 1)]);
+ }
+}
+
+TEST(FudHash, UpdateMoveKeyCopyValue)
+{
+ auto stringList{testStrings()};
+ HashMap<String, int> mapString2Int{};
+ for (int index = 0; index < static_cast<int>(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<int>(stringList.size()); ++index) {
+ const int invalid = -1;
+ EXPECT_EQ(mapString2Int.getConstRef(stringList[index]).valueOr(invalid), index);
+ }
+
+ for (int index = 0; index < static_cast<int>(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<int>(stringList.size()); ++index) {
+ const int invalid = -1;
+ EXPECT_EQ(mapString2Int.getConstRef(stringList[index]).valueOr(invalid), index * 2);
+ }
+}
+
+TEST(FudHash, UpdateCopyKeyMoveValue)
+{
+ auto stringList{testStrings()};
+ HashMap<int, String> mapInt2String{};
+ for (int index = 0; index < static_cast<int>(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<int>(stringList.size()); ++index) {
+ EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), stringList[index]);
+ }
+
+ for (int index = 0; index < static_cast<int>(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<int>(stringList.size()); ++index) {
+ EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), stringList[stringList.size() - (index + 1)]);
+ }
+}
+
+TEST(FudHash, UpdateCopyKeyCopyValue)
+{
+ auto stringViewList{testStringViews()};
+
+ HashMap<StringView, int> mapView2Int{};
+ for (int index = 0; index < static_cast<int>(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<int>(stringViewList.size()); ++index) {
+ const int invalid = -1;
+ EXPECT_EQ(mapView2Int.getConstRef(stringViewList[index]).valueOr(invalid), index);
+ }
+
+ for (int index = 0; index < static_cast<int>(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<int>(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<String, int> mapString2Int{};
+ for (int index = 0; index < static_cast<int>(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<int>(stringList.size()); ++index) {
+ const int invalid = -1;
+ EXPECT_EQ(mapString2Int.get(stringList[index]).valueOr(invalid), index);
+ }
+
+ for (int index = 0; index < static_cast<int>(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<int, String> mapInt2String{};
+ for (int index = 0; index < static_cast<int>(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<int>(stringList.size()); ++index) {
+ EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), stringList[index]);
+ }
+
+ for (int index = 0; index < static_cast<int>(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<int>(stringList.size()); ++index) {
+ EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), invalid);
+ }
+}
+
} // namespace fud