meta_dtor.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include <gtest/gtest.h>
  2. #include <entt/meta/factory.hpp>
  3. #include <entt/meta/meta.hpp>
  4. #include <entt/meta/node.hpp>
  5. #include <entt/meta/resolve.hpp>
  6. struct clazz_t {
  7. clazz_t() {
  8. ++counter;
  9. }
  10. static void destroy_decr(clazz_t &) {
  11. --counter;
  12. }
  13. static void destroy_incr(clazz_t &) {
  14. ++counter;
  15. }
  16. inline static int counter = 0;
  17. };
  18. struct MetaDtor: ::testing::Test {
  19. static void StaticSetUp() {
  20. using namespace entt::literals;
  21. entt::meta<clazz_t>()
  22. .type("clazz"_hs)
  23. .dtor<&clazz_t::destroy_decr>();
  24. clazz_t::counter = 0;
  25. }
  26. void SetUp() override {
  27. StaticSetUp();
  28. }
  29. void TearDown() override {
  30. for(auto type: entt::resolve()) {
  31. type.reset();
  32. }
  33. }
  34. };
  35. TEST_F(MetaDtor, Functionalities) {
  36. ASSERT_EQ(clazz_t::counter, 0);
  37. auto any = entt::resolve<clazz_t>().construct();
  38. ASSERT_EQ(clazz_t::counter, 1);
  39. any.reset();
  40. ASSERT_EQ(clazz_t::counter, 0);
  41. }
  42. TEST_F(MetaDtor, ReRegistration) {
  43. MetaDtor::StaticSetUp();
  44. auto *node = entt::internal::meta_info<clazz_t>::resolve();
  45. ASSERT_NE(node->dtor, nullptr);
  46. entt::meta<clazz_t>().dtor<&clazz_t::destroy_incr>();
  47. entt::resolve<clazz_t>().construct().reset();
  48. ASSERT_EQ(clazz_t::counter, 2);
  49. }