/* SPDX-License-Identifier: Apache-2.0 */ #include "BLI_any.hh" #include "BLI_map.hh" #include "testing/testing.h" namespace blender::tests { TEST(any, DefaultConstructor) { Any<> a; EXPECT_FALSE(a.has_value()); } TEST(any, AssignInt) { Any<> a = 5; EXPECT_TRUE(a.has_value()); EXPECT_TRUE(a.is()); EXPECT_FALSE(a.is()); const int &value = a.get(); EXPECT_EQ(value, 5); a = 10; EXPECT_EQ(value, 10); Any<> b = a; EXPECT_TRUE(b.has_value()); EXPECT_EQ(b.get(), 10); Any<> c = std::move(a); EXPECT_TRUE(c); EXPECT_EQ(c.get(), 10); EXPECT_EQ(a.get(), 10); /* NOLINT: bugprone-use-after-move */ a.reset(); EXPECT_FALSE(a); } TEST(any, AssignMap) { Any<> a = Map(); EXPECT_TRUE(a.has_value()); EXPECT_TRUE((a.is>())); EXPECT_FALSE((a.is>())); Map &map = a.get>(); map.add(4, 2); EXPECT_EQ((a.get>().lookup(4)), 2); Any<> b = a; EXPECT_TRUE(b); EXPECT_EQ((b.get>().lookup(4)), 2); Any<> c = std::move(a); /* Test valid state after self assignment. Clang emits `-Wself-assign-overloaded` with `c=c;`. * And `pragma` suppression creates warnings on other compilers. */ c = static_cast(c); EXPECT_TRUE(c); EXPECT_EQ((c.get>().lookup(4)), 2); EXPECT_TRUE((a.get>().is_empty())); /* NOLINT: bugprone-use-after-move */ } TEST(any, AssignAny) { Any<> a = 5; Any<> b = std::string("hello"); Any<> c; Any<> z; EXPECT_FALSE(z.has_value()); z = a; EXPECT_TRUE(z.has_value()); EXPECT_EQ(z.get(), 5); z = b; EXPECT_EQ(z.get(), "hello"); z = c; EXPECT_FALSE(z.has_value()); z = Any(std::in_place_type>, a); EXPECT_FALSE(z.is()); EXPECT_TRUE(z.is>()); EXPECT_EQ(z.get>().get(), 5); } struct ExtraSizeInfo { size_t size; template static constexpr ExtraSizeInfo get() { return {sizeof(T)}; } }; TEST(any, ExtraInfo) { using MyAny = Any; MyAny a = 5; EXPECT_EQ(a.extra_info().size, sizeof(int)); a = std::string("hello"); EXPECT_EQ(a.extra_info().size, sizeof(std::string)); } } // namespace blender::tests