context_test.cxx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. //
  2. // context_test.cpp
  3. // reflection-test
  4. //
  5. // Created by Sam Jaffe on 8/7/22.
  6. // Copyright © 2022 Sam Jaffe. All rights reserved.
  7. //
  8. #include "reflection/context.h"
  9. #include "xcode_gtest_helper.h"
  10. #include "reflection/reflection.h"
  11. namespace {
  12. struct Example {
  13. int a;
  14. int b;
  15. };
  16. }
  17. namespace reflection {
  18. INSTANTIATE_REFLECTION(Example);
  19. }
  20. REFLECTION(Example)
  21. .bind("a", &Example::a)
  22. .bind("b", &Example::b);
  23. TEST(Context, CanWrap) {
  24. reflection::Context ctx{{"arg0", Example{.a = 0, .b = 1}}, {"arg1", Example{.a = 1, .b = 0}}};
  25. EXPECT_NO_THROW(ctx.get("arg0"));
  26. EXPECT_NO_THROW(ctx.get("arg1"));
  27. EXPECT_THROW(ctx.get("example"), std::out_of_range);
  28. }
  29. TEST(Context, CanBuildFromObjects) {
  30. Example const arg0{.a = 0, .b = 1};
  31. reflection::Context ctx{reflect(arg0)};
  32. EXPECT_NO_THROW(ctx.get("arg0"));
  33. }
  34. TEST(Context, CanAccessChildren) {
  35. Example const arg0{.a = 0, .b = 1};
  36. reflection::Context ctx{reflect(arg0)};
  37. reflection::Object b = ctx.get("arg0").get("b");
  38. EXPECT_THAT(int(b), 1);
  39. }
  40. TEST(Context, CanProvideMutableAccess) {
  41. Example arg0{.a = 0, .b = 1};
  42. reflection::Context ctx{reflect(arg0)};
  43. reflection::Object b = ctx.get("arg0").get("b");
  44. EXPECT_NO_THROW(b = 2);
  45. EXPECT_THAT(arg0.b, 2);
  46. }
  47. TEST(Context, CanMutateWithPairCtor) {
  48. Example arg0{.a = 0, .b = 1};
  49. reflection::Context ctx{{"arg0", arg0}};
  50. reflection::Object b = ctx.get("arg0").get("b");
  51. EXPECT_NO_THROW(b = 2);
  52. EXPECT_THAT(arg0.b, 2);
  53. }