SpawnableCreateTests.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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/PrefabTestFixture.h>
  9. #include <AzCore/std/containers/unordered_set.h>
  10. #include <AzToolsFramework/Prefab/Spawnable/SpawnableUtils.h>
  11. namespace UnitTest
  12. {
  13. using SpawnableCreateTest = PrefabTestFixture;
  14. TEST_F(SpawnableCreateTest, SpawnableCreate_NoNestingPrefabDom_CreateSucceeds)
  15. {
  16. AZStd::vector<AZ::Entity*> entitiesCreated;
  17. AZStd::unordered_set<AZStd::string> expectedEntityNameSet;
  18. const int normalEntityCount = 3;
  19. for (int i = 0; i < normalEntityCount; i++)
  20. {
  21. entitiesCreated.push_back(CreateEntity(AZStd::string::format("Entity_%i", i).c_str()));
  22. expectedEntityNameSet.insert(entitiesCreated.back()->GetName());
  23. }
  24. AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> instance(
  25. m_prefabSystemComponent->CreatePrefab(entitiesCreated, {}, "test/path"));
  26. ASSERT_TRUE(instance);
  27. ASSERT_TRUE(instance->HasContainerEntity());
  28. auto& containerEntity = instance->GetContainerEntity()->get();
  29. expectedEntityNameSet.insert(containerEntity.GetName());
  30. //Create Spawnable
  31. auto& prefabDom = m_prefabSystemComponent->FindTemplateDom(instance->GetTemplateId());
  32. AzFramework::Spawnable spawnable;
  33. AzToolsFramework::Prefab::SpawnableUtils::CreateSpawnable(spawnable, prefabDom);
  34. EXPECT_EQ(spawnable.GetEntities().size() - 1, normalEntityCount); // 1 for container entity
  35. const auto& spawnableEntities = spawnable.GetEntities();
  36. AZStd::unordered_set<AZStd::string> actualEntityNameSet;
  37. for (const auto& spawnableEntity : spawnableEntities)
  38. {
  39. actualEntityNameSet.insert(spawnableEntity->GetName());
  40. }
  41. EXPECT_EQ(expectedEntityNameSet, actualEntityNameSet);
  42. }
  43. TEST_F(SpawnableCreateTest, SpawnableCreate_TripleNestingPrefabDom_CreateSucceeds)
  44. {
  45. AZStd::vector<AZ::Entity*> entitiesCreated;
  46. AZStd::unordered_set<AZStd::string> expectedEntityNameSet;
  47. const int normalEntityCount = 3;
  48. for (int i = 0; i < normalEntityCount; i++)
  49. {
  50. entitiesCreated.push_back(CreateEntity(AZStd::string::format("Entity_%i", i).c_str()));
  51. expectedEntityNameSet.insert(entitiesCreated.back()->GetName());
  52. }
  53. // Build a 3 level deep nested Template
  54. AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> firstInstance(
  55. m_prefabSystemComponent->CreatePrefab({ entitiesCreated[0] }, {}, "test/path1"));
  56. ASSERT_TRUE(firstInstance);
  57. ASSERT_TRUE(firstInstance->HasContainerEntity());
  58. expectedEntityNameSet.insert(firstInstance->GetContainerEntity()->get().GetName());
  59. AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> secondInstance(
  60. m_prefabSystemComponent->CreatePrefab({ entitiesCreated[1] }, MakeInstanceList(AZStd::move(firstInstance)), "test/path2"));
  61. ASSERT_TRUE(secondInstance);
  62. ASSERT_TRUE(secondInstance->HasContainerEntity());
  63. expectedEntityNameSet.insert(secondInstance->GetContainerEntity()->get().GetName());
  64. AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> thirdInstance(
  65. m_prefabSystemComponent->CreatePrefab({ entitiesCreated[2] }, MakeInstanceList(AZStd::move(secondInstance)), "test/path3"));
  66. ASSERT_TRUE(thirdInstance);
  67. ASSERT_TRUE(thirdInstance->HasContainerEntity());
  68. expectedEntityNameSet.insert(thirdInstance->GetContainerEntity()->get().GetName());
  69. //Create Spawnable
  70. auto& prefabDom = m_prefabSystemComponent->FindTemplateDom(thirdInstance->GetTemplateId());
  71. AzFramework::Spawnable spawnable;
  72. AzToolsFramework::Prefab::SpawnableUtils::CreateSpawnable(spawnable, prefabDom);
  73. EXPECT_EQ(spawnable.GetEntities().size(), normalEntityCount + 3); // +1 for each container entity
  74. const auto& spawnableEntities = spawnable.GetEntities();
  75. AZStd::unordered_set<AZStd::string> actualEntityNameSet;
  76. for (const auto& spawnableEntity : spawnableEntities)
  77. {
  78. actualEntityNameSet.insert(spawnableEntity->GetName());
  79. }
  80. EXPECT_EQ(actualEntityNameSet, expectedEntityNameSet);
  81. }
  82. }