summaryrefslogtreecommitdiff
path: root/test/test_hash_map.cpp
diff options
context:
space:
mode:
authorDominick Allen <djallen@librehumanitas.org>2025-03-30 23:08:43 -0500
committerDominick Allen <djallen@librehumanitas.org>2025-03-30 23:08:43 -0500
commitcb9fa588ba8144fcdd52ba4b83d69d93fb18066f (patch)
tree214574ca68c1551ec76e7fbb9e0263793180231d /test/test_hash_map.cpp
parent1d357adfa19725ee69fb267a363f1fd217b1272f (diff)
Add hash map.
Diffstat (limited to 'test/test_hash_map.cpp')
-rw-r--r--test/test_hash_map.cpp146
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