diff options
Diffstat (limited to 'tests/gtests/blenlib/BLI_map_test.cc')
-rw-r--r-- | tests/gtests/blenlib/BLI_map_test.cc | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/tests/gtests/blenlib/BLI_map_test.cc b/tests/gtests/blenlib/BLI_map_test.cc new file mode 100644 index 00000000000..a7711fb3985 --- /dev/null +++ b/tests/gtests/blenlib/BLI_map_test.cc @@ -0,0 +1,243 @@ +#include "testing/testing.h" +#include "BLI_map.h" +#include "BLI_set.h" + +using IntFloatMap = BLI::Map<int, float>; + +TEST(map, DefaultConstructor) +{ + IntFloatMap map; + EXPECT_EQ(map.size(), 0); +} + +TEST(map, AddIncreasesSize) +{ + IntFloatMap map; + EXPECT_EQ(map.size(), 0); + map.add(2, 5.0f); + EXPECT_EQ(map.size(), 1); + map.add(6, 2.0f); + EXPECT_EQ(map.size(), 2); +} + +TEST(map, Contains) +{ + IntFloatMap map; + EXPECT_FALSE(map.contains(4)); + map.add(5, 6.0f); + EXPECT_FALSE(map.contains(4)); + map.add(4, 2.0f); + EXPECT_TRUE(map.contains(4)); +} + +TEST(map, LookupExisting) +{ + IntFloatMap map; + map.add(2, 6.0f); + map.add(4, 1.0f); + EXPECT_EQ(map.lookup(2), 6.0f); + EXPECT_EQ(map.lookup(4), 1.0f); +} + +TEST(map, LookupNotExisting) +{ + IntFloatMap map; + map.add(2, 4.0f); + map.add(1, 1.0f); + EXPECT_EQ(map.lookup_ptr(0), nullptr); + EXPECT_EQ(map.lookup_ptr(5), nullptr); +} + +TEST(map, AddMany) +{ + IntFloatMap map; + for (int i = 0; i < 100; i++) { + map.add(i, i); + } +} + +TEST(map, PopItem) +{ + IntFloatMap map; + map.add(2, 3.0f); + map.add(1, 9.0f); + EXPECT_TRUE(map.contains(2)); + EXPECT_TRUE(map.contains(1)); + + EXPECT_EQ(map.pop(1), 9.0f); + EXPECT_TRUE(map.contains(2)); + EXPECT_FALSE(map.contains(1)); + + EXPECT_EQ(map.pop(2), 3.0f); + EXPECT_FALSE(map.contains(2)); + EXPECT_FALSE(map.contains(1)); +} + +TEST(map, PopItemMany) +{ + IntFloatMap map; + for (uint i = 0; i < 100; i++) { + map.add_new(i, i); + } + for (uint i = 25; i < 80; i++) { + EXPECT_EQ(map.pop(i), i); + } + for (uint i = 0; i < 100; i++) { + EXPECT_EQ(map.contains(i), i < 25 || i >= 80); + } +} + +TEST(map, ValueIterator) +{ + IntFloatMap map; + map.add(3, 5.0f); + map.add(1, 2.0f); + map.add(7, -2.0f); + + BLI::Set<float> values; + + uint iterations = 0; + for (float value : map.values()) { + values.add(value); + iterations++; + } + + EXPECT_EQ(iterations, 3); + EXPECT_TRUE(values.contains(5.0f)); + EXPECT_TRUE(values.contains(-2.0f)); + EXPECT_TRUE(values.contains(2.0f)); +} + +TEST(map, KeyIterator) +{ + IntFloatMap map; + map.add(6, 3.0f); + map.add(2, 4.0f); + map.add(1, 3.0f); + + BLI::Set<int> keys; + + uint iterations = 0; + for (int key : map.keys()) { + keys.add(key); + iterations++; + } + + EXPECT_EQ(iterations, 3); + EXPECT_TRUE(keys.contains(1)); + EXPECT_TRUE(keys.contains(2)); + EXPECT_TRUE(keys.contains(6)); +} + +TEST(map, ItemIterator) +{ + IntFloatMap map; + map.add(5, 3.0f); + map.add(2, 9.0f); + map.add(1, 0.0f); + + BLI::Set<int> keys; + BLI::Set<float> values; + + uint iterations = 0; + for (auto item : map.items()) { + keys.add(item.key); + values.add(item.value); + iterations++; + } + + EXPECT_EQ(iterations, 3); + EXPECT_TRUE(keys.contains(5)); + EXPECT_TRUE(keys.contains(2)); + EXPECT_TRUE(keys.contains(1)); + EXPECT_TRUE(values.contains(3.0f)); + EXPECT_TRUE(values.contains(9.0f)); + EXPECT_TRUE(values.contains(0.0f)); +} + +float return_42() +{ + return 42.0f; +} + +TEST(map, LookupOrAdd_SeparateFunction) +{ + IntFloatMap map; + EXPECT_EQ(map.lookup_or_add(0, return_42), 42.0f); + EXPECT_EQ(map.lookup(0), 42); +} + +TEST(map, LookupOrAdd_Lambdas) +{ + IntFloatMap map; + auto lambda1 = []() { return 11.0f; }; + EXPECT_EQ(map.lookup_or_add(0, lambda1), 11.0f); + auto lambda2 = []() { return 20.0f; }; + EXPECT_EQ(map.lookup_or_add(1, lambda2), 20.0f); + + EXPECT_EQ(map.lookup_or_add(0, lambda2), 11.0f); + EXPECT_EQ(map.lookup_or_add(1, lambda1), 20.0f); +} + +TEST(map, InsertOrModify) +{ + IntFloatMap map; + auto create_func = []() { return 10.0f; }; + auto modify_func = [](float &value) { value += 5; }; + EXPECT_TRUE(map.add_or_modify(1, create_func, modify_func)); + EXPECT_EQ(map.lookup(1), 10.0f); + EXPECT_FALSE(map.add_or_modify(1, create_func, modify_func)); + EXPECT_EQ(map.lookup(1), 15.0f); +} + +TEST(map, AddOverride) +{ + IntFloatMap map; + EXPECT_FALSE(map.contains(3)); + EXPECT_TRUE(map.add_override(3, 6.0f)); + EXPECT_EQ(map.lookup(3), 6.0f); + EXPECT_FALSE(map.add_override(3, 7.0f)); + EXPECT_EQ(map.lookup(3), 7.0f); + EXPECT_FALSE(map.add(3, 8.0f)); + EXPECT_EQ(map.lookup(3), 7.0f); +} + +TEST(map, MoveConstructorSmall) +{ + IntFloatMap map1; + map1.add(1, 2.0f); + map1.add(4, 1.0f); + IntFloatMap map2(std::move(map1)); + EXPECT_EQ(map2.size(), 2); + EXPECT_EQ(map2.lookup(1), 2.0f); + EXPECT_EQ(map2.lookup(4), 1.0f); + EXPECT_EQ(map1.size(), 0); + EXPECT_EQ(map1.lookup_ptr(4), nullptr); +} + +TEST(map, MoveConstructorLarge) +{ + IntFloatMap map1; + for (uint i = 0; i < 100; i++) { + map1.add_new(i, i); + } + IntFloatMap map2(std::move(map1)); + EXPECT_EQ(map2.size(), 100); + EXPECT_EQ(map2.lookup(1), 1.0f); + EXPECT_EQ(map2.lookup(4), 4.0f); + EXPECT_EQ(map1.size(), 0); + EXPECT_EQ(map1.lookup_ptr(4), nullptr); +} + +TEST(map, MoveAssignment) +{ + IntFloatMap map1; + map1.add(1, 2.0f); + map1.add(4, 1.0f); + IntFloatMap map2 = std::move(map1); + EXPECT_EQ(map2.size(), 2); + EXPECT_EQ(map2.lookup(1), 2.0f); + EXPECT_EQ(map2.lookup(4), 1.0f); + EXPECT_EQ(map1.size(), 0); + EXPECT_EQ(map1.lookup_ptr(4), nullptr); +} |