/* file StructReflector.test.cpp * * author: Roland Conybeare, Aug 2022 */ #include "xo/reflect/Reflect.hpp" #include "xo/reflect/StructReflector.hpp" #include #define STRINGIFY(x) #x namespace xo { using xo::reflect::Reflect; using xo::reflect::TaggedPtr; using xo::reflect::StructReflector; using xo::reflect::Reflect; namespace ut { namespace { struct TestStruct0 {}; struct TestStruct1 {}; } TEST_CASE("struct-reflect-empty", "[reflect]") { StructReflector sr; REQUIRE(Reflect::is_reflected() == false); REQUIRE(Reflect::is_reflected() == true); TestStruct0 recd0; TaggedPtr tp = Reflect::make_tp(&recd0); REQUIRE(tp.address() == &recd0); REQUIRE(tp.td() == Reflect::require()); REQUIRE(tp.n_child() == 0); REQUIRE(tp.get_child(0).is_universal_null()); REQUIRE(tp.get_child(0).td() == nullptr); REQUIRE(tp.get_child(0).address() == nullptr); } /*TEST_CASE(struct-reflect-empty)*/ namespace { struct TestStructS1 { int x_; }; } TEST_CASE("struct-reflect-s1", "[reflect]") { StructReflector sr; REQUIRE(Reflect::is_reflected() == true); //sr.reflect_member(STRINGIFY(x_), &decltype(sr)::struct_t::x_); REFLECT_LITERAL_MEMBER(sr, x_); REQUIRE(!Reflect::require()->is_struct()); sr.require_complete(); REQUIRE(Reflect::require()->is_struct()); } /*TEST_CASE(struct-reflect-s1)*/ namespace { struct TestStructS2 { int x_; }; } TEST_CASE("struct-reflect-s2", "[reflect]") { StructReflector sr; REQUIRE(Reflect::is_reflected() == true); //sr.reflect_member(STRINGIFY(x_), &decltype(sr)::struct_t::x_); REFLECT_MEMBER(sr, x); REQUIRE(!Reflect::require()->is_struct()); sr.require_complete(); REQUIRE(Reflect::require()->is_struct()); TestStructS2 recd1{666}; TaggedPtr tp = Reflect::make_tp(&recd1); REQUIRE(tp.address() == &recd1); REQUIRE(tp.td() == Reflect::require()); REQUIRE(tp.n_child() == 1); REQUIRE(tp.get_child(0).td() == Reflect::require()); REQUIRE(tp.get_child(0).address() == &(recd1.x_)); REQUIRE(tp.get_child(1).is_universal_null()); } /*TEST_CASE(struct-reflect-s2)*/ namespace { struct TestStructS3 { int x_; char y_; double z_; }; } TEST_CASE("struct-reflect-s3", "[reflect]") { StructReflector sr; REQUIRE(Reflect::is_reflected() == true); REFLECT_MEMBER(sr, x); REFLECT_MEMBER(sr, y); REFLECT_MEMBER(sr, z); REQUIRE(!Reflect::require()->is_struct()); sr.require_complete(); REQUIRE(Reflect::require()->is_struct()); /* verify we can traverse reflected instances */ TestStructS3 recd1{666, 'Y', -1.234}; TaggedPtr tp = Reflect::make_tp(&recd1); REQUIRE(tp.address() == &recd1); REQUIRE(tp.td() == Reflect::require()); REQUIRE(tp.n_child() == 3); REQUIRE(tp.get_child(0).td() == Reflect::require()); REQUIRE(tp.get_child(0).address() == &(recd1.x_)); REQUIRE(tp.get_child(1).td() == Reflect::require()); REQUIRE(tp.get_child(1).address() == &(recd1.y_)); REQUIRE(tp.get_child(2).td() == Reflect::require()); REQUIRE(tp.get_child(2).address() == &(recd1.z_)); REQUIRE(tp.get_child(3).is_universal_null()); REQUIRE(tp.get_child(3).td() == nullptr); REQUIRE(tp.get_child(3).address() == nullptr); } /*TEST_CASE(struct-reflect-s3)*/ } /*namespace ut */ } /*namespace xo*/ /* end StructReflector.test.cpp */