SpawnableRemoveEditorInfoTestFixture.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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. #include <Prefab/SpawnableRemoveEditorInfoTestFixture.h>
  9. #include <AzToolsFramework/Prefab/PrefabDomUtils.h>
  10. #include <AzToolsFramework/Prefab/Spawnable/PrefabDocument.h>
  11. #include <AzToolsFramework/ToolsComponents/EditorOnlyEntityComponent.h>
  12. #include <AzToolsFramework/ToolsComponents/EditorOnlyEntityComponentBus.h>
  13. #include <AzToolsFramework/ToolsComponents/TransformComponent.h>
  14. namespace UnitTest
  15. {
  16. TestExportRuntimeComponentWithCallback::TestExportRuntimeComponentWithCallback(bool returnPointerToSelf, bool exportHandled)
  17. : m_returnPointerToSelf(returnPointerToSelf)
  18. , m_exportHandled(exportHandled)
  19. {}
  20. void TestExportRuntimeComponentWithCallback::Reflect(AZ::ReflectContext* context)
  21. {
  22. if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  23. {
  24. serializeContext->Class<TestExportRuntimeComponentWithCallback, AZ::Component>()->Version(1)
  25. ->Field("ExportHandled", &TestExportRuntimeComponentWithCallback::m_exportHandled)
  26. ->Field("ReturnPointerToSelf", &TestExportRuntimeComponentWithCallback::m_returnPointerToSelf);
  27. if (AZ::EditContext* editContext = serializeContext->GetEditContext())
  28. {
  29. editContext->Class<TestExportRuntimeComponentWithCallback>(
  30. "Test Export Runtime Component", "Validate different options for exporting runtime components")
  31. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  32. ->Attribute(AZ::Edit::Attributes::RuntimeExportCallback, &TestExportRuntimeComponentWithCallback::ExportComponent)
  33. ;
  34. }
  35. }
  36. }
  37. AZ::ExportedComponent TestExportRuntimeComponentWithCallback::ExportComponent(AZ::Component* thisComponent, const AZ::PlatformTagSet& /*platformTags*/)
  38. {
  39. return AZ::ExportedComponent(m_returnPointerToSelf? thisComponent : nullptr, false, m_exportHandled);
  40. }
  41. void TestExportRuntimeComponentWithoutCallback::Reflect(AZ::ReflectContext* context)
  42. {
  43. auto* serialize = azrtti_cast<AZ::SerializeContext*>(context);
  44. if (serialize)
  45. {
  46. serialize->Class<TestExportRuntimeComponentWithoutCallback, AZ::Component>()
  47. ;
  48. }
  49. }
  50. TestExportEditorComponent::TestExportEditorComponent(
  51. TestExportEditorComponent::ExportComponentType exportType, bool exportHandled)
  52. : m_exportType(exportType)
  53. , m_exportHandled(exportHandled)
  54. {}
  55. void TestExportEditorComponent::Reflect(AZ::ReflectContext* context)
  56. {
  57. if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  58. {
  59. serializeContext->Class<TestExportEditorComponent, AzToolsFramework::Components::EditorComponentBase>()
  60. ->Version(1)
  61. ->Field("ExportHandled", &TestExportEditorComponent::m_exportHandled)
  62. ->Field("ExportType", &TestExportEditorComponent::m_exportType)
  63. ;
  64. if (AZ::EditContext* editContext = serializeContext->GetEditContext())
  65. {
  66. editContext->Class<TestExportEditorComponent>(
  67. "Test Export Editor Component", "Validate different options for exporting editor components")
  68. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  69. ->Attribute(AZ::Edit::Attributes::RuntimeExportCallback, &TestExportEditorComponent::ExportComponent)
  70. ;
  71. }
  72. }
  73. }
  74. AZ::ExportedComponent TestExportEditorComponent::ExportComponent(
  75. AZ::Component* thisComponent, const AZ::PlatformTagSet& /*platformTags*/)
  76. {
  77. switch (m_exportType)
  78. {
  79. case ExportComponentType::ExportEditorComponent:
  80. return AZ::ExportedComponent(thisComponent, false, m_exportHandled);
  81. case ExportComponentType::ExportRuntimeComponentWithCallBack:
  82. return AZ::ExportedComponent(aznew TestExportRuntimeComponentWithCallback(true, true), true, m_exportHandled);
  83. case ExportComponentType::ExportRuntimeComponentWithoutCallBack:
  84. return AZ::ExportedComponent(aznew TestExportRuntimeComponentWithoutCallback, true, m_exportHandled);
  85. case ExportComponentType::ExportNullComponent:
  86. return AZ::ExportedComponent(nullptr, false, m_exportHandled);
  87. default:
  88. return AZ::ExportedComponent();
  89. }
  90. }
  91. void TestExportEditorComponent::BuildGameEntity(AZ::Entity* gameEntity)
  92. {
  93. gameEntity->CreateComponent<TestExportRuntimeComponentWithCallback>(true, true);
  94. }
  95. void SpawnableRemoveEditorInfoTestFixture::SetUpEditorFixtureImpl()
  96. {
  97. auto* app = GetApplication();
  98. // Acquire the system entity
  99. AZ::Entity* systemEntity = app->FindEntity(AZ::SystemEntityId);
  100. EXPECT_TRUE(systemEntity);
  101. // Acquire the prefab system component to gain access to its APIs for testing
  102. m_prefabSystemComponent = systemEntity->FindComponent<AzToolsFramework::Prefab::PrefabSystemComponent>();
  103. EXPECT_TRUE(m_prefabSystemComponent);
  104. m_serializeContext = app->GetSerializeContext();
  105. EXPECT_TRUE(m_serializeContext);
  106. app->RegisterComponentDescriptor(TestExportRuntimeComponentWithCallback::CreateDescriptor());
  107. app->RegisterComponentDescriptor(TestExportRuntimeComponentWithoutCallback::CreateDescriptor());
  108. app->RegisterComponentDescriptor(TestExportEditorComponent::CreateDescriptor());
  109. }
  110. void SpawnableRemoveEditorInfoTestFixture::TearDownEditorFixtureImpl()
  111. {
  112. for (AZ::Entity* entity : m_runtimeEntities)
  113. {
  114. delete entity;
  115. }
  116. m_sourceEntities.clear();
  117. m_runtimeEntities.clear();
  118. }
  119. void SpawnableRemoveEditorInfoTestFixture::CreateSourceEntity(const char* name, bool editorOnly)
  120. {
  121. AZ::Entity* entity = aznew AZ::Entity(name);
  122. entity->CreateComponent<AzToolsFramework::Components::TransformComponent>();
  123. entity->CreateComponent<AzToolsFramework::Components::EditorOnlyEntityComponent>();
  124. m_sourceEntities.push_back(entity);
  125. entity->Init();
  126. EXPECT_EQ(AZ::Entity::State::Init, entity->GetState());
  127. entity->Activate();
  128. EXPECT_EQ(AZ::Entity::State::Active, entity->GetState());
  129. AzToolsFramework::EditorOnlyEntityComponentRequestBus::Event(
  130. entity->GetId(),
  131. &AzToolsFramework::EditorOnlyEntityComponentRequests::SetIsEditorOnlyEntity,
  132. editorOnly);
  133. }
  134. void SpawnableRemoveEditorInfoTestFixture::CreateSourceTestExportRuntimeEntity(
  135. const char* name, bool returnPointerToSelf, bool exportHandled)
  136. {
  137. AZ::Entity* entity = aznew AZ::Entity(name);
  138. entity->CreateComponent<AzToolsFramework::Components::TransformComponent>();
  139. entity->CreateComponent<TestExportRuntimeComponentWithCallback>(returnPointerToSelf, exportHandled);
  140. m_sourceEntities.push_back(entity);
  141. }
  142. void SpawnableRemoveEditorInfoTestFixture::CreateSourceTestExportEditorEntity(
  143. const char* name,
  144. TestExportEditorComponent::ExportComponentType exportType,
  145. bool exportHandled)
  146. {
  147. AZ::Entity* entity = aznew AZ::Entity(name);
  148. entity->CreateComponent<AzToolsFramework::Components::TransformComponent>();
  149. entity->CreateComponent<TestExportEditorComponent>(exportType, exportHandled);
  150. m_sourceEntities.push_back(entity);
  151. }
  152. AZ::Entity* SpawnableRemoveEditorInfoTestFixture::GetRuntimeEntity(const char* entityName)
  153. {
  154. for (AZ::Entity* entity : m_runtimeEntities)
  155. {
  156. const AZStd::string& name = entity->GetName();
  157. if (name == entityName)
  158. {
  159. return entity;
  160. }
  161. }
  162. return nullptr;
  163. }
  164. void SpawnableRemoveEditorInfoTestFixture::ConvertSourceEntitiesToPrefab()
  165. {
  166. AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> sourceInstance(
  167. m_prefabSystemComponent->CreatePrefab(m_sourceEntities, {}, "test/path"));
  168. ASSERT_TRUE(sourceInstance);
  169. auto& prefabTemplateDom = m_prefabSystemComponent->FindTemplateDom(sourceInstance->GetTemplateId());
  170. m_prefabDom.CopyFrom(prefabTemplateDom, m_prefabDom.GetAllocator());
  171. }
  172. void SpawnableRemoveEditorInfoTestFixture::ConvertRuntimePrefab(bool expectedResult)
  173. {
  174. ConvertSourceEntitiesToPrefab();
  175. AzToolsFramework::Prefab::PrefabConversionUtils::PrefabDocument prefab("Test");
  176. prefab.SetPrefabDom(m_prefabDom);
  177. const bool actualResult =
  178. m_editorInfoRemover.RemoveEditorInfo(prefab, m_serializeContext, m_prefabProcessorContext).IsSuccess();
  179. EXPECT_EQ(expectedResult, actualResult);
  180. prefab.GetInstance().DetachAllEntitiesInHierarchy(
  181. [this](AZStd::unique_ptr<AZ::Entity> entity)
  182. {
  183. m_runtimeEntities.emplace_back(entity.release());
  184. }
  185. );
  186. }
  187. }