helper.cpp 4.8 KB

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