PrefabUndoAddEntityTestFixture.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/PrefabUndoAddEntityTestFixture.h>
  9. #include <AzCore/Component/TransformBus.h>
  10. #include <AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.h>
  11. #include <AzToolsFramework/ToolsComponents/TransformComponent.h>
  12. namespace UnitTest
  13. {
  14. EntityAlias PrefabUndoAddEntityTestFixture::CreateEntity(const AZStd::string& entityName,
  15. Instance& owningInstance)
  16. {
  17. AZ::Entity& containerEntity = owningInstance.GetContainerEntity()->get();
  18. if (!containerEntity.GetTransform())
  19. {
  20. const bool activated = containerEntity.GetState() == AZ::Entity::State::Active;
  21. if (activated)
  22. {
  23. containerEntity.Deactivate();
  24. }
  25. auto transform = aznew AzToolsFramework::Components::TransformComponent;
  26. containerEntity.AddComponent(transform);
  27. if (!activated)
  28. {
  29. containerEntity.Init();
  30. }
  31. containerEntity.Activate();
  32. }
  33. return CreateEntity(entityName, owningInstance, containerEntity);
  34. }
  35. EntityAlias PrefabUndoAddEntityTestFixture::CreateEntity(const AZStd::string& entityName,
  36. Instance& owningInstance, const EntityAlias& parentEntityAlias)
  37. {
  38. AZ::Entity& parentEntity = GetEntityFromOwningInstance(parentEntityAlias, owningInstance);
  39. return CreateEntity(entityName, owningInstance, parentEntity);
  40. }
  41. EntityAlias PrefabUndoAddEntityTestFixture::CreateEntity(const AZStd::string& entityName,
  42. Instance& owningInstance, const AZ::Entity& parentEntity)
  43. {
  44. EntityAlias newEntityAlias = Instance::GenerateEntityAlias();
  45. AliasPath newAbsoluteEntityPath = owningInstance.GetAbsoluteInstanceAliasPath();
  46. newAbsoluteEntityPath.Append(newEntityAlias);
  47. AZ::EntityId newEntityId = InstanceEntityIdMapper::GenerateEntityIdForAliasPath(newAbsoluteEntityPath);
  48. AZ::Entity* newEntity = aznew AZ::Entity(newEntityId, entityName.c_str());
  49. newEntity->Init();
  50. newEntity->Activate();
  51. AddRequiredEditorComponents({ newEntity->GetId() });
  52. owningInstance.AddEntity(*newEntity, newEntityAlias);
  53. AZ::TransformBus::Event(newEntityId, &AZ::TransformBus::Events::SetParent, parentEntity.GetId());
  54. return newEntityAlias;
  55. }
  56. PrefabUndoAddEntity PrefabUndoAddEntityTestFixture::CreatePrefabUndoAddEntityNode(
  57. const EntityAlias& newEntityAlias,
  58. Instance& focusedInstance,
  59. const AZStd::string& undoAddEntityOperationName,
  60. const EntityAlias& parentEntityAlias)
  61. {
  62. AZ::Entity& parentEntity = parentEntityAlias.empty()?
  63. focusedInstance.GetContainerEntity()->get() :
  64. GetEntityFromOwningInstance(parentEntityAlias, focusedInstance);
  65. AZ::Entity& newEntity = GetEntityFromOwningInstance(newEntityAlias, focusedInstance);
  66. PrefabUndoAddEntity undoAddEntityNode(undoAddEntityOperationName);
  67. undoAddEntityNode.Capture(parentEntity, newEntity, focusedInstance);
  68. return AZStd::move(undoAddEntityNode);
  69. }
  70. PrefabUndoAddEntityAsOverride PrefabUndoAddEntityTestFixture::CreatePrefabUndoAddEntityAsOverrideNode(
  71. const EntityAlias& newEntityAlias,
  72. Instance& owningInstance,
  73. Instance& focusedInstance,
  74. const AZStd::string& undoAddEntityOperationName,
  75. const EntityAlias& parentEntityAlias)
  76. {
  77. AZ::Entity& parentEntity = parentEntityAlias.empty() ?
  78. owningInstance.GetContainerEntity()->get() :
  79. GetEntityFromOwningInstance(parentEntityAlias, owningInstance);
  80. AZ::Entity& newEntity = GetEntityFromOwningInstance(newEntityAlias, owningInstance);
  81. PrefabUndoAddEntityAsOverride undoAddEntityNode(undoAddEntityOperationName);
  82. undoAddEntityNode.Capture(parentEntity, newEntity, owningInstance, focusedInstance);
  83. return AZStd::move(undoAddEntityNode);
  84. }
  85. void PrefabUndoAddEntityTestFixture::ValidateNewEntityUnderInstance(
  86. Instance& instance,
  87. const EntityAlias& newEntityAlias, const AZStd::string& newEntityName,
  88. size_t expectedEntityCount)
  89. {
  90. auto getContainerEntityRefResult = instance.GetContainerEntity();
  91. ASSERT_TRUE(getContainerEntityRefResult.has_value());
  92. auto& containerEntity = getContainerEntityRefResult->get();
  93. ValidateNewEntityUnderParentEntity(instance,
  94. containerEntity,
  95. newEntityAlias, newEntityName,
  96. expectedEntityCount);
  97. }
  98. void PrefabUndoAddEntityTestFixture::ValidateNewEntityUnderParentEntity(
  99. Instance& instance,
  100. const EntityAlias& parentEntityAlias, const AZStd::string& parentEntityName,
  101. const EntityAlias& newEntityAlias, const AZStd::string& newEntityName,
  102. size_t expectedEntityCount)
  103. {
  104. auto getParentEntityRefResult = instance.GetEntity(parentEntityAlias);
  105. ASSERT_TRUE(getParentEntityRefResult.has_value());
  106. AZ::Entity& parentEntity = getParentEntityRefResult->get();
  107. EXPECT_TRUE(parentEntity.GetName() == parentEntityName);
  108. ValidateNewEntityUnderParentEntity(
  109. instance, parentEntity, newEntityAlias, newEntityName, expectedEntityCount);
  110. }
  111. void PrefabUndoAddEntityTestFixture::ValidateNewEntityUnderParentEntity(
  112. Instance& instance,
  113. const AZ::Entity& parentEntity,
  114. const EntityAlias& newEntityAlias, const AZStd::string& newEntityName,
  115. size_t expectedEntityCount)
  116. {
  117. auto getNewEntityRefResult = instance.GetEntity(newEntityAlias);
  118. ASSERT_TRUE(getNewEntityRefResult.has_value());
  119. AZ::Entity& newEntity = getNewEntityRefResult->get();
  120. EXPECT_TRUE(newEntity.GetName() == newEntityName);
  121. AZ::EntityId parentEntityId;
  122. AZ::TransformBus::EventResult(parentEntityId, newEntity.GetId(), &AZ::TransformBus::Events::GetParentId);
  123. EXPECT_TRUE(parentEntityId == parentEntity.GetId());
  124. AZStd::vector<AZ::EntityId> entitiesUnderParentEntity;
  125. AZ::TransformBus::EventResult(entitiesUnderParentEntity, parentEntity.GetId(), &AZ::TransformBus::Events::GetChildren);
  126. const bool newEntityFound = AZStd::find(entitiesUnderParentEntity.begin(), entitiesUnderParentEntity.end(),
  127. newEntity.GetId()) != entitiesUnderParentEntity.end();
  128. EXPECT_TRUE(newEntityFound);
  129. EXPECT_EQ(instance.GetEntityAliasCount(), expectedEntityCount);
  130. }
  131. void PrefabUndoAddEntityTestFixture::ValidateNewEntityNotUnderInstance(
  132. Instance& instance,
  133. const EntityAlias& newEntityAlias,
  134. size_t expectedEntityCount)
  135. {
  136. auto getContainerEntityRefResult = instance.GetContainerEntity();
  137. ASSERT_TRUE(getContainerEntityRefResult.has_value());
  138. auto& containerEntity = getContainerEntityRefResult->get();
  139. ValidateNewEntityNotUnderParentEntity(instance, containerEntity, newEntityAlias, expectedEntityCount);
  140. }
  141. void PrefabUndoAddEntityTestFixture::ValidateNewEntityNotUnderParentEntity(
  142. Instance& instance,
  143. const EntityAlias& parentEntityAlias, const AZStd::string& parentEntityName,
  144. const EntityAlias& newEntityAlias,
  145. size_t expectedEntityCount)
  146. {
  147. auto getParentEntityRefResult = instance.GetEntity(parentEntityAlias);
  148. ASSERT_TRUE(getParentEntityRefResult.has_value());
  149. AZ::Entity& parentEntity = getParentEntityRefResult->get();
  150. EXPECT_TRUE(parentEntity.GetName() == parentEntityName);
  151. ValidateNewEntityNotUnderParentEntity(instance,
  152. parentEntity, newEntityAlias,
  153. expectedEntityCount);
  154. }
  155. void PrefabUndoAddEntityTestFixture::ValidateNewEntityNotUnderParentEntity(
  156. Instance& instance,
  157. const AZ::Entity& parentEntity,
  158. const EntityAlias& newEntityAlias,
  159. size_t expectedEntityCount)
  160. {
  161. auto getNewEntityRefResult = instance.GetEntity(newEntityAlias);
  162. ASSERT_FALSE(getNewEntityRefResult.has_value());
  163. AZStd::vector<AZ::EntityId> entitiesUnderParentEntity;
  164. AZ::TransformBus::EventResult(entitiesUnderParentEntity, parentEntity.GetId(), &AZ::TransformBus::Events::GetChildren);
  165. for (AZ::EntityId childEntityId : entitiesUnderParentEntity)
  166. {
  167. auto getChildEntityAliasResult = instance.GetEntityAlias(childEntityId);
  168. ASSERT_TRUE(getChildEntityAliasResult.has_value());
  169. EntityAlias& childEntityAlias = getChildEntityAliasResult->get();
  170. EXPECT_TRUE(childEntityAlias != newEntityAlias);
  171. }
  172. EXPECT_EQ(instance.GetEntityAliasCount(), expectedEntityCount);
  173. }
  174. AZ::Entity& PrefabUndoAddEntityTestFixture::GetEntityFromOwningInstance(const EntityAlias& entityAlias,
  175. Instance& owningInstance)
  176. {
  177. auto getEntityRefResult = owningInstance.GetEntity(entityAlias);
  178. AZ_Assert(getEntityRefResult.has_value(), "Entity not found in instance.");
  179. return getEntityRefResult->get();
  180. }
  181. }