#define GTEST_LANG_CXX11 1 #include "gtest/gtest.h" #include "ccl/cclMeta.hpp" // helper classes struct Base { int32_t state{ 1337 }; virtual ~Base() = default; virtual int32_t overloadedFunc() const { return 42; } virtual int32_t overloadedFunc() { return 43; } }; struct Derived1 : Base { int32_t additionalState{ 42 }; int32_t overloadedFunc() const override { return 1337; } }; struct Derived2 : Base { std::string additionalState{ "str42" }; int32_t overloadedFunc() override { return 1337; } }; TEST(UTPropagateConst, AccessValue) { using ccl::meta::UniqueCPPtr; UniqueCPPtr intCP{ std::make_unique(42) }; const auto& constRef = intCP; EXPECT_EQ(intCP.operator*(), 42); EXPECT_EQ(constRef.operator*(), 42); EXPECT_EQ(intCP.get(), constRef.get()); EXPECT_EQ(intCP.operator->(), constRef.get()); EXPECT_EQ(static_cast(intCP), constRef.get()); EXPECT_EQ(static_cast(constRef), constRef.get()); } TEST(UTPropagateConst, Nullptr) { using ccl::meta::UniqueCPPtr; const UniqueCPPtr intPtr{}; EXPECT_TRUE(intPtr == nullptr); EXPECT_FALSE(intPtr != nullptr); EXPECT_EQ(intPtr, UniqueCPPtr(nullptr)); UniqueCPPtr notNull{ std::make_unique(42) }; EXPECT_FALSE(notNull == nullptr); EXPECT_TRUE(notNull != nullptr); notNull = nullptr; EXPECT_TRUE(notNull == nullptr); notNull = std::make_unique(0); EXPECT_FALSE(notNull == nullptr); } TEST(UTPropagateConst, PointerEquality) { using ccl::meta::UniqueCPPtr; UniqueCPPtr int1{ std::make_unique(42) }; UniqueCPPtr int2{ std::make_unique(42) }; UniqueCPPtr int3{ std::make_unique(1337) }; const auto& constRef1 = int1; const auto& constRef2 = int2; const auto& constRef3 = int3; EXPECT_EQ(int1, constRef1); EXPECT_NE(int1, int2); EXPECT_NE(int1, int3); EXPECT_NE(constRef1, int3); EXPECT_NE(constRef1, constRef3); EXPECT_NE(int1, constRef2); EXPECT_NE(constRef1, constRef2); } TEST(UTPropagateConst, Swap) { using ccl::meta::UniqueCPPtr; UniqueCPPtr int1{ std::make_unique(42) }; std::swap(int1, int1); EXPECT_EQ(*int1, 42); UniqueCPPtr int2{ std::make_unique(1337) }; std::swap(int1, int2); EXPECT_EQ(*int2, 42); EXPECT_EQ(*int1, 1337); } TEST(UTPropagateConst, Propagation) { using ccl::meta::UniqueCPPtr; UniqueCPPtr nonConstPtr{ std::make_unique() }; const auto& constRef = nonConstPtr; EXPECT_EQ(nonConstPtr->overloadedFunc(), 43); EXPECT_EQ(constRef->overloadedFunc(), 42); } TEST(UTPropagateConst, Polymorphism) { using ccl::meta::UniqueCPPtr; UniqueCPPtr basePtrToDerived1{}, basePtrToDerived2{}; basePtrToDerived1 = UniqueCPPtr{ std::make_unique() }; basePtrToDerived2 = UniqueCPPtr{ std::make_unique() }; ASSERT_FALSE(dynamic_cast(basePtrToDerived1.get()) == nullptr); EXPECT_TRUE(dynamic_cast(basePtrToDerived1.get()) == nullptr); EXPECT_EQ(dynamic_cast(basePtrToDerived1.get())->additionalState, 42); EXPECT_EQ(dynamic_cast(basePtrToDerived2.get())->additionalState, "str42"); const auto& constRef1 = basePtrToDerived1; EXPECT_EQ(basePtrToDerived1->overloadedFunc(), 43); EXPECT_EQ(constRef1->overloadedFunc(), 1337); const auto& constRef2 = basePtrToDerived2; EXPECT_EQ(basePtrToDerived2->overloadedFunc(), 1337); EXPECT_EQ(constRef2->overloadedFunc(), 42); }