// // context_test.cpp // reflection-test // // Created by Sam Jaffe on 8/7/22. // Copyright © 2022 Sam Jaffe. All rights reserved. // #include "reflection/context.h" #include "xcode_gtest_helper.h" #include "reflection/reflection.h" namespace { struct Example { int a; int b; }; } namespace reflection { INSTANTIATE_REFLECTION(Example); } REFLECTION(Example) .bind("a", &Example::a) .bind("b", &Example::b); TEST(Context, CanWrap) { reflection::Context ctx{{"arg0", Example{.a = 0, .b = 1}}, {"arg1", Example{.a = 1, .b = 0}}}; EXPECT_NO_THROW(ctx.get("arg0")); EXPECT_NO_THROW(ctx.get("arg1")); EXPECT_THROW(ctx.get("example"), std::out_of_range); } TEST(Context, CanBuildFromObjects) { Example const arg0{.a = 0, .b = 1}; reflection::Context ctx{reflect(arg0)}; EXPECT_NO_THROW(ctx.get("arg0")); } TEST(Context, CanAccessChildren) { Example const arg0{.a = 0, .b = 1}; reflection::Context ctx{reflect(arg0)}; reflection::Object b = ctx.get("arg0").get("b"); EXPECT_THAT(int(b), 1); } TEST(Context, CanProvideMutableAccess) { Example arg0{.a = 0, .b = 1}; reflection::Context ctx{reflect(arg0)}; reflection::Object b = ctx.get("arg0").get("b"); EXPECT_NO_THROW(b = 2); EXPECT_THAT(arg0.b, 2); } TEST(Context, CanMutateWithPairCtor) { Example arg0{.a = 0, .b = 1}; reflection::Context ctx{{"arg0", arg0}}; reflection::Object b = ctx.get("arg0").get("b"); EXPECT_NO_THROW(b = 2); EXPECT_THAT(arg0.b, 2); }