diff options
Diffstat (limited to 'test/test_hash_map.cpp')
-rw-r--r-- | test/test_hash_map.cpp | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/test/test_hash_map.cpp b/test/test_hash_map.cpp new file mode 100644 index 0000000..00c4693 --- /dev/null +++ b/test/test_hash_map.cpp @@ -0,0 +1,146 @@ +/* + * libfud + * Copyright 2025 Dominick Allen + * + * Licensed 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 "fud_hash_map.hpp" +#include "fud_string.hpp" +#include "fud_vector.hpp" +// #include "test_common.hpp" + +#include "gtest/gtest.h" + +namespace fud { + +TEST(FudHash, InsertMoveKeyMoveValue) +{ + auto stringList{ + Vector<String>::from( + NullOpt, + String::makeFromCString("foo").takeOkay(), + String::makeFromCString("bar").takeOkay(), + String::makeFromCString("baz").takeOkay(), + String::makeFromCString("qux").takeOkay(), + String::makeFromCString("Tom").takeOkay(), + String::makeFromCString("Dick").takeOkay(), + String::makeFromCString("Harry").takeOkay(), + String::makeFromCString("Alice").takeOkay(), + String::makeFromCString("Bob").takeOkay()) + .takeOkay()}; + HashMap<int, String> mapInt2String{}; + for (int index = 0; index < static_cast<int>(stringList.size()); ++index) { + auto insertStatus = mapInt2String.insert(index * 1, 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]); + } +} + +TEST(FudHash, InsertMoveKeyCopyValue) +{ + auto stringList{ + Vector<String>::from( + NullOpt, + String::makeFromCString("foo").takeOkay(), + String::makeFromCString("bar").takeOkay(), + String::makeFromCString("baz").takeOkay(), + String::makeFromCString("qux").takeOkay(), + String::makeFromCString("Tom").takeOkay(), + String::makeFromCString("Dick").takeOkay(), + String::makeFromCString("Harry").takeOkay(), + String::makeFromCString("Alice").takeOkay(), + String::makeFromCString("Bob").takeOkay()) + .takeOkay()}; + 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 * 1); + 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.getConstRef(stringList[index]).valueOr(invalid), index); + } +} + +TEST(FudHash, InsertCopyKeyMoveValue) +{ + auto stringList{ + Vector<String>::from( + NullOpt, + String::makeFromCString("foo").takeOkay(), + String::makeFromCString("bar").takeOkay(), + String::makeFromCString("baz").takeOkay(), + String::makeFromCString("qux").takeOkay(), + String::makeFromCString("Tom").takeOkay(), + String::makeFromCString("Dick").takeOkay(), + String::makeFromCString("Harry").takeOkay(), + String::makeFromCString("Alice").takeOkay(), + String::makeFromCString("Bob").takeOkay()) + .takeOkay()}; + 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]); + } +} + +TEST(FudHash, InsertCopyKeyCopyValue) +{ + auto stringList{ + Vector<StringView>::from( + NullOpt, + StringView::makeFromCString("foo"), + StringView::makeFromCString("bar"), + StringView::makeFromCString("baz"), + StringView::makeFromCString("qux"), + StringView::makeFromCString("Tom"), + StringView::makeFromCString("Dick"), + StringView::makeFromCString("Harry"), + StringView::makeFromCString("Alice"), + StringView::makeFromCString("Bob")) + .takeOkay()}; + HashMap<StringView, int> mapView2Int{}; + for (int index = 0; index < static_cast<int>(stringList.size()); ++index) { + auto insertStatus = mapView2Int.insert(stringList[index], index); + EXPECT_EQ(insertStatus, FudStatus::Success); + } + + EXPECT_EQ(mapView2Int.size(), stringList.size()); + EXPECT_GT(mapView2Int.capacity(), mapView2Int.size()); + + for (int index = 0; index < static_cast<int>(stringList.size()); ++index) { + const int invalid = -1; + EXPECT_EQ(mapView2Int.getConstRef(stringList[index]).valueOr(invalid), index); + } +} + +} // namespace fud |