/* * 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::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 mapInt2String{}; for (int index = 0; index < static_cast(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(stringList.size()); ++index) { EXPECT_EQ(mapInt2String.getConstRef(index).valueOr(invalid), stringList[index]); } } TEST(FudHash, InsertMoveKeyCopyValue) { auto stringList{ Vector::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 mapString2Int{}; for (int index = 0; index < static_cast(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(stringList.size()); ++index) { const int invalid = -1; EXPECT_EQ(mapString2Int.getConstRef(stringList[index]).valueOr(invalid), index); } } TEST(FudHash, InsertCopyKeyMoveValue) { auto stringList{ Vector::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 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]); } } TEST(FudHash, InsertCopyKeyCopyValue) { auto stringList{ Vector::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 mapView2Int{}; for (int index = 0; index < static_cast(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(stringList.size()); ++index) { const int invalid = -1; EXPECT_EQ(mapView2Int.getConstRef(stringList[index]).valueOr(invalid), index); } } } // namespace fud