meta_conv.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <utility>
  2. #include <gtest/gtest.h>
  3. #include <entt/meta/factory.hpp>
  4. #include <entt/meta/meta.hpp>
  5. #include <entt/meta/node.hpp>
  6. #include <entt/meta/resolve.hpp>
  7. struct clazz_t {
  8. clazz_t() = default;
  9. operator int() const { return value; }
  10. int value;
  11. };
  12. double conv_to_double(const clazz_t &instance) {
  13. return instance.value * 2.;
  14. }
  15. struct MetaConv: ::testing::Test {
  16. void SetUp() override {
  17. using namespace entt::literals;
  18. entt::meta<clazz_t>()
  19. .type("clazz"_hs)
  20. .conv<int>()
  21. .conv<conv_to_double>();
  22. }
  23. void TearDown() override {
  24. entt::meta_reset();
  25. }
  26. };
  27. TEST_F(MetaConv, Functionalities) {
  28. auto any = entt::resolve<clazz_t>().construct();
  29. any.cast<clazz_t &>().value = 42;
  30. const auto as_int = std::as_const(any).allow_cast<int>();
  31. const auto as_double = std::as_const(any).allow_cast<double>();
  32. ASSERT_FALSE(any.allow_cast<char>());
  33. ASSERT_TRUE(as_int);
  34. ASSERT_TRUE(as_double);
  35. ASSERT_EQ(as_int.cast<int>(), any.cast<clazz_t &>().value);
  36. ASSERT_EQ(as_double.cast<double>(), conv_to_double(any.cast<clazz_t &>()));
  37. }
  38. TEST_F(MetaConv, ReRegistration) {
  39. SetUp();
  40. auto *node = entt::internal::meta_node<clazz_t>::resolve();
  41. ASSERT_NE(node->conv, nullptr);
  42. ASSERT_NE(node->conv->next, nullptr);
  43. ASSERT_EQ(node->conv->next->next, nullptr);
  44. }