SerializeContextFixture.h 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AzCore/UnitTest/TestTypes.h>
  10. #include <AzCore/Memory/PoolAllocator.h>
  11. #include <AzCore/Serialization/SerializeContext.h>
  12. namespace UnitTest
  13. {
  14. // This fixture provides a functional serialize context and allocators.
  15. class SerializeContextFixture : public LeakDetectionFixture
  16. {
  17. protected:
  18. void SetUp() override
  19. {
  20. LeakDetectionFixture::SetUp();
  21. m_serializeContext = aznew AZ::SerializeContext(true, true);
  22. }
  23. void TearDown() override
  24. {
  25. delete m_serializeContext;
  26. m_serializeContext = nullptr;
  27. LeakDetectionFixture::TearDown();
  28. }
  29. protected:
  30. AZ::SerializeContext* m_serializeContext = nullptr;
  31. };
  32. /*
  33. * Scoped RAII class automatically invokes the supplied reflection functions and reflects them to the supplied SerializeContext
  34. * On Destruction the serialize context is set to remove reflection and the reflection functions are invoked to to unreflect
  35. * them from the SerializeContext
  36. */
  37. class ScopedSerializeContextReflector
  38. {
  39. public:
  40. using ReflectCallable = AZStd::function<void(AZ::SerializeContext*)>;
  41. ScopedSerializeContextReflector(AZ::SerializeContext& serializeContext, std::initializer_list<ReflectCallable> reflectFunctions)
  42. : m_serializeContext(serializeContext)
  43. , m_reflectFunctions(reflectFunctions)
  44. {
  45. bool isCurrentlyRemovingReflection = m_serializeContext.IsRemovingReflection();
  46. if (isCurrentlyRemovingReflection)
  47. {
  48. m_serializeContext.DisableRemoveReflection();
  49. }
  50. for (ReflectCallable& reflectFunction : m_reflectFunctions)
  51. {
  52. if (reflectFunction)
  53. {
  54. reflectFunction(&m_serializeContext);
  55. }
  56. }
  57. if (isCurrentlyRemovingReflection)
  58. {
  59. m_serializeContext.EnableRemoveReflection();
  60. }
  61. }
  62. ~ScopedSerializeContextReflector()
  63. {
  64. // Unreflects reflected functions in reverse order
  65. bool isCurrentlyRemovingReflection = m_serializeContext.IsRemovingReflection();
  66. if (!isCurrentlyRemovingReflection)
  67. {
  68. m_serializeContext.EnableRemoveReflection();
  69. }
  70. for (auto reflectFunctionIter = m_reflectFunctions.rbegin(); reflectFunctionIter != m_reflectFunctions.rend(); ++reflectFunctionIter)
  71. {
  72. ReflectCallable& reflectFunction = *reflectFunctionIter;
  73. if (reflectFunction)
  74. {
  75. reflectFunction(&m_serializeContext);
  76. }
  77. }
  78. if (!isCurrentlyRemovingReflection)
  79. {
  80. m_serializeContext.DisableRemoveReflection();
  81. }
  82. }
  83. private:
  84. AZ::SerializeContext& m_serializeContext;
  85. AZStd::vector<ReflectCallable> m_reflectFunctions;
  86. };
  87. }