meta_range.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <type_traits>
  2. #include <gtest/gtest.h>
  3. #include <entt/core/hashed_string.hpp>
  4. #include <entt/core/type_info.hpp>
  5. #include <entt/locator/locator.hpp>
  6. #include <entt/meta/factory.hpp>
  7. #include <entt/meta/meta.hpp>
  8. #include <entt/meta/range.hpp>
  9. #include <entt/meta/resolve.hpp>
  10. struct MetaRange: ::testing::Test {
  11. void SetUp() override {
  12. using namespace entt::literals;
  13. entt::meta<int>().type("int"_hs).data<42>("answer"_hs);
  14. }
  15. void TearDown() override {
  16. entt::meta_reset();
  17. }
  18. };
  19. TEST_F(MetaRange, EmptyRange) {
  20. entt::meta_reset();
  21. auto range = entt::resolve();
  22. ASSERT_EQ(range.begin(), range.end());
  23. }
  24. TEST_F(MetaRange, Iterator) {
  25. using namespace entt::literals;
  26. using iterator = typename decltype(entt::resolve())::iterator;
  27. static_assert(std::is_same_v<iterator::value_type, std::pair<entt::id_type, entt::meta_type>>);
  28. static_assert(std::is_same_v<iterator::pointer, entt::input_iterator_pointer<std::pair<entt::id_type, entt::meta_type>>>);
  29. static_assert(std::is_same_v<iterator::reference, std::pair<entt::id_type, entt::meta_type>>);
  30. auto range = entt::resolve();
  31. iterator end{range.begin()};
  32. iterator begin{};
  33. begin = range.end();
  34. std::swap(begin, end);
  35. ASSERT_EQ(begin, range.begin());
  36. ASSERT_EQ(end, range.end());
  37. ASSERT_NE(begin, end);
  38. ASSERT_EQ(begin++, range.begin());
  39. ASSERT_EQ(begin--, range.end());
  40. ASSERT_EQ(begin + 1, range.end());
  41. ASSERT_EQ(end - 1, range.begin());
  42. ASSERT_EQ(++begin, range.end());
  43. ASSERT_EQ(--begin, range.begin());
  44. ASSERT_EQ(begin += 1, range.end());
  45. ASSERT_EQ(begin -= 1, range.begin());
  46. ASSERT_EQ(begin + (end - begin), range.end());
  47. ASSERT_EQ(begin - (begin - end), range.end());
  48. ASSERT_EQ(end - (end - begin), range.begin());
  49. ASSERT_EQ(end + (begin - end), range.begin());
  50. ASSERT_EQ(begin[0u].first, range.begin()->first);
  51. ASSERT_EQ(begin[0u].second, (*range.begin()).second);
  52. ASSERT_LT(begin, end);
  53. ASSERT_LE(begin, range.begin());
  54. ASSERT_GT(end, begin);
  55. ASSERT_GE(end, range.end());
  56. entt::meta<double>().type("double"_hs);
  57. range = entt::resolve();
  58. begin = range.begin();
  59. ASSERT_EQ(begin[0u].first, entt::resolve<int>().info().hash());
  60. ASSERT_EQ(begin[1u].second, entt::resolve("double"_hs));
  61. }
  62. TEST_F(MetaRange, DirectValue) {
  63. using namespace entt::literals;
  64. auto type = entt::resolve<int>();
  65. auto range = type.data();
  66. ASSERT_NE(range.cbegin(), range.cend());
  67. for(auto &&[id, data]: range) {
  68. ASSERT_EQ(id, "answer"_hs);
  69. ASSERT_EQ(data.get({}).cast<int>(), 42);
  70. }
  71. }