| #include "utils/lite_rtti.hpp" | |
| #include <catch.hpp> | |
| using namespace rive; | |
| TEST_CASE("lite rtti behaves correctly", "[lite_rtti]") | |
| { | |
| class A : public enable_lite_rtti<A> | |
| {}; | |
| A a; | |
| CHECK(lite_type_id<A>() == lite_type_id<A>()); | |
| CHECK(lite_type_id<const A>() == lite_type_id<A>()); | |
| CHECK(lite_type_id<const A>() == a.liteTypeID()); | |
| class B : public lite_rtti_override<A, B> | |
| {}; | |
| B b; | |
| CHECK(lite_type_id<B>() != lite_type_id<A>()); | |
| CHECK(b.liteTypeID() != a.liteTypeID()); | |
| CHECK(b.liteTypeID() == lite_type_id<const B>()); | |
| class C : public lite_rtti_override<B, C> | |
| {}; | |
| const C c; | |
| CHECK(lite_type_id<C>() != lite_type_id<A>()); | |
| CHECK(lite_type_id<C>() != lite_type_id<B>()); | |
| CHECK(c.liteTypeID() != a.liteTypeID()); | |
| CHECK(c.liteTypeID() != b.liteTypeID()); | |
| CHECK(c.liteTypeID() == lite_type_id<C>()); | |
| A* pA = &a; | |
| A* pA_b = &b; | |
| const A* pA_c = &c; | |
| CHECK(lite_rtti_cast<B*>(pA) == nullptr); | |
| CHECK(lite_rtti_cast<const C*>(pA) == nullptr); | |
| CHECK(lite_rtti_cast<const B*>(pA_b) == &b); | |
| CHECK(lite_rtti_cast<C*>(pA_b) == nullptr); | |
| CHECK(lite_rtti_cast<const B*>(pA_c) == nullptr); | |
| CHECK(lite_rtti_cast<C*>(const_cast<A*>(pA_c)) == &c); | |
| const B* pB_c = &c; | |
| CHECK(lite_rtti_cast<B*>(const_cast<B*>(pB_c)) == nullptr); | |
| CHECK(lite_rtti_cast<const C*>(pB_c) == &c); | |
| A* nil = nullptr; | |
| CHECK(lite_rtti_cast<B*>(nil) == nullptr); | |
| CHECK(lite_rtti_cast<const C*>(nil) == nullptr); | |
| // Check constructor arguments. | |
| struct D : public enable_lite_rtti<D> | |
| { | |
| D() = delete; | |
| D(float x_, int y_) : x(x_), y(y_) {} | |
| float x; | |
| int y; | |
| }; | |
| struct E : public lite_rtti_override<D, E> | |
| { | |
| E(float x_, int y_) : lite_rtti_override(x_, y_) {} | |
| }; | |
| D* pD_e = new E(4.5f, 6); | |
| E* pE = lite_rtti_cast<E*>(pD_e); | |
| CHECK(pD_e->liteTypeID() == lite_type_id<const E>()); | |
| REQUIRE(pE != nullptr); | |
| CHECK(pE->x == 4.5f); | |
| CHECK(pE->y == 6); | |
| delete pD_e; | |
| // Check rcp | |
| class F : public RefCnt<F>, public enable_lite_rtti<F> | |
| {}; | |
| class G : public lite_rtti_override<F, G> | |
| {}; | |
| class H : public lite_rtti_override<F, H> | |
| {}; | |
| rcp<F> pF_g = make_rcp<G>(); | |
| rcp<G> pG = lite_rtti_rcp_cast<G>(pF_g); | |
| rcp<H> pH = lite_rtti_rcp_cast<H>(pF_g); | |
| CHECK(pG != nullptr); | |
| CHECK(pH == nullptr); | |
| } |