helper.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include <gtest/gtest.h>
  2. #include <entt/entity/entity.hpp>
  3. #include <entt/entity/helper.hpp>
  4. #include <entt/entity/registry.hpp>
  5. struct clazz {
  6. void func(entt::registry &, entt::entity curr) {
  7. entt = curr;
  8. }
  9. entt::entity entt{entt::null};
  10. };
  11. struct stable_type {
  12. static constexpr auto in_place_delete = true;
  13. int value;
  14. };
  15. void sigh_callback(int &value) {
  16. ++value;
  17. }
  18. TEST(Helper, AsView) {
  19. entt::registry registry;
  20. const entt::registry cregistry;
  21. ([](entt::view<entt::get_t<int>>) {})(entt::as_view{registry});
  22. ([](entt::view<entt::get_t<char, double>, entt::exclude_t<int>>) {})(entt::as_view{registry});
  23. ([](entt::view<entt::get_t<const char, double>, entt::exclude_t<const int>>) {})(entt::as_view{registry});
  24. ([](entt::view<entt::get_t<const char, const double>, entt::exclude_t<const int>>) {})(entt::as_view{cregistry});
  25. }
  26. TEST(Helper, AsGroup) {
  27. entt::registry registry;
  28. const entt::registry cregistry;
  29. ([](entt::group<entt::owned_t<double>, entt::get_t<char>, entt::exclude_t<int>>) {})(entt::as_group{registry});
  30. ([](entt::group<entt::owned_t<double>, entt::get_t<const char>, entt::exclude_t<const int>>) {})(entt::as_group{registry});
  31. ([](entt::group<entt::owned_t<const double>, entt::get_t<const char>, entt::exclude_t<const int>>) {})(entt::as_group{cregistry});
  32. }
  33. TEST(Helper, Invoke) {
  34. entt::registry registry;
  35. const auto entity = registry.create();
  36. registry.on_construct<clazz>().connect<entt::invoke<&clazz::func>>();
  37. registry.emplace<clazz>(entity);
  38. ASSERT_EQ(entity, registry.get<clazz>(entity).entt);
  39. }
  40. TEST(Helper, ToEntity) {
  41. entt::registry registry;
  42. const entt::entity null = entt::null;
  43. constexpr auto page_size = entt::storage_type_t<int>::traits_type::page_size;
  44. const int value = 42;
  45. ASSERT_EQ(entt::to_entity(registry, 42), null);
  46. ASSERT_EQ(entt::to_entity(registry, value), null);
  47. const auto entity = registry.create();
  48. auto &&storage = registry.storage<int>();
  49. storage.emplace(entity);
  50. while(storage.size() < (page_size - 1u)) {
  51. storage.emplace(registry.create(), value);
  52. }
  53. const auto other = registry.create();
  54. const auto next = registry.create();
  55. registry.emplace<int>(other);
  56. registry.emplace<int>(next);
  57. ASSERT_EQ(entt::to_entity(registry, registry.get<int>(entity)), entity);
  58. ASSERT_EQ(entt::to_entity(registry, registry.get<int>(other)), other);
  59. ASSERT_EQ(entt::to_entity(registry, registry.get<int>(next)), next);
  60. ASSERT_EQ(&registry.get<int>(entity) + page_size - 1u, &registry.get<int>(other));
  61. registry.destroy(other);
  62. ASSERT_EQ(entt::to_entity(registry, registry.get<int>(entity)), entity);
  63. ASSERT_EQ(entt::to_entity(registry, registry.get<int>(next)), next);
  64. ASSERT_EQ(&registry.get<int>(entity) + page_size - 1u, &registry.get<int>(next));
  65. ASSERT_EQ(entt::to_entity(registry, 42), null);
  66. ASSERT_EQ(entt::to_entity(registry, value), null);
  67. }
  68. TEST(Helper, ToEntityStableType) {
  69. entt::registry registry;
  70. const entt::entity null = entt::null;
  71. constexpr auto page_size = entt::storage_type_t<stable_type>::traits_type::page_size;
  72. const stable_type value{42};
  73. ASSERT_EQ(entt::to_entity(registry, stable_type{42}), null);
  74. ASSERT_EQ(entt::to_entity(registry, value), null);
  75. const auto entity = registry.create();
  76. auto &&storage = registry.storage<stable_type>();
  77. registry.emplace<stable_type>(entity);
  78. while(storage.size() < (page_size - 2u)) {
  79. storage.emplace(registry.create(), value);
  80. }
  81. const auto other = registry.create();
  82. const auto next = registry.create();
  83. registry.emplace<stable_type>(other);
  84. registry.emplace<stable_type>(next);
  85. ASSERT_EQ(entt::to_entity(registry, registry.get<stable_type>(entity)), entity);
  86. ASSERT_EQ(entt::to_entity(registry, registry.get<stable_type>(other)), other);
  87. ASSERT_EQ(entt::to_entity(registry, registry.get<stable_type>(next)), next);
  88. ASSERT_EQ(&registry.get<stable_type>(entity) + page_size - 2u, &registry.get<stable_type>(other));
  89. registry.destroy(other);
  90. ASSERT_EQ(entt::to_entity(registry, registry.get<stable_type>(entity)), entity);
  91. ASSERT_EQ(entt::to_entity(registry, registry.get<stable_type>(next)), next);
  92. ASSERT_EQ(&registry.get<stable_type>(entity) + page_size - 1u, &registry.get<stable_type>(next));
  93. ASSERT_EQ(entt::to_entity(registry, stable_type{42}), null);
  94. ASSERT_EQ(entt::to_entity(registry, value), null);
  95. }
  96. TEST(Helper, SighHelper) {
  97. entt::registry registry{};
  98. const auto entt = registry.create();
  99. entt::sigh_helper helper{registry};
  100. int counter{};
  101. ASSERT_EQ(&helper.registry(), &registry);
  102. helper.with<int>()
  103. .on_construct<&sigh_callback>(counter)
  104. .on_update<&sigh_callback>(counter)
  105. .on_destroy<&sigh_callback>(counter);
  106. ASSERT_EQ(counter, 0);
  107. registry.emplace<int>(entt, 42);
  108. registry.replace<int>(entt, 0);
  109. registry.erase<int>(entt);
  110. ASSERT_EQ(counter, 3);
  111. }