PrefabBehaviorTests.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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 <PrefabBuilderTests.h>
  9. #include <PrefabGroup/IPrefabGroup.h>
  10. #include <PrefabGroup/PrefabGroup.h>
  11. #include <PrefabGroup/PrefabGroupBehavior.h>
  12. #include <AzTest/Utils.h>
  13. #include <Tests/AssetSystemMocks.h>
  14. #include <AzCore/Serialization/Json/JsonSystemComponent.h>
  15. #include <AzCore/Serialization/SerializeContext.h>
  16. #include <AzCore/std/smart_ptr/make_shared.h>
  17. #include <AzToolsFramework/Asset/AssetSystemComponent.h>
  18. #include <AzToolsFramework/Prefab/Procedural/ProceduralPrefabAsset.h>
  19. #include <SceneAPI/SceneCore/Containers/Scene.h>
  20. #include <SceneAPI/SceneCore/Events/CallProcessorBus.h>
  21. #include <SceneAPI/SceneCore/Events/ExportEventContext.h>
  22. #include <SceneAPI/SceneCore/Events/ExportProductList.h>
  23. #include <SceneAPI/SceneCore/SceneCoreStandaloneAllocator.h>
  24. #include <PrefabGroup/PrefabBehaviorTests.inl>
  25. namespace UnitTest
  26. {
  27. class PrefabBehaviorTests
  28. : public PrefabBuilderTests
  29. {
  30. public:
  31. static void SetUpTestCase()
  32. {
  33. // Allocator needed by SceneCore
  34. if (!AZ::AllocatorInstance<AZ::SystemAllocator>().IsReady())
  35. {
  36. AZ::AllocatorInstance<AZ::SystemAllocator>().Create();
  37. }
  38. AZ::SceneAPI::SceneCoreStandaloneAllocator::Initialize(AZ::Environment::GetInstance());
  39. }
  40. static void TearDownTestCase()
  41. {
  42. AZ::SceneAPI::SceneCoreStandaloneAllocator::TearDown();
  43. AZ::AllocatorInstance<AZ::SystemAllocator>().Destroy();
  44. }
  45. void SetUp() override
  46. {
  47. PrefabBuilderTests::SetUp();
  48. m_prefabGroupBehavior = AZStd::make_unique<AZ::SceneAPI::Behaviors::PrefabGroupBehavior>();
  49. m_prefabGroupBehavior->Activate();
  50. // Mocking the asset system replacing the AssetSystem::AssetSystemComponent
  51. AZ::Entity* systemEntity = m_app.FindEntity(AZ::SystemEntityId);
  52. systemEntity->FindComponent<AzToolsFramework::AssetSystem::AssetSystemComponent>()->Deactivate();
  53. using namespace testing;
  54. ON_CALL(m_assetSystemRequestMock, GetSourceInfoBySourcePath(_, _, _)).WillByDefault([](auto* path, auto& info, auto&)
  55. {
  56. return PrefabBehaviorTests::OnGetSourceInfoBySourcePath(path, info);
  57. });
  58. m_assetSystemRequestMock.BusConnect();
  59. }
  60. void TearDown() override
  61. {
  62. m_assetSystemRequestMock.BusDisconnect();
  63. m_prefabGroupBehavior->Deactivate();
  64. m_prefabGroupBehavior.reset();
  65. PrefabBuilderTests::TearDown();
  66. }
  67. static bool OnGetSourceInfoBySourcePath(AZStd::string_view sourcePath, AZ::Data::AssetInfo& assetInfo)
  68. {
  69. if (sourcePath == AZStd::string_view("mock"))
  70. {
  71. assetInfo.m_assetId = AZ::Uuid::CreateRandom();
  72. assetInfo.m_assetType = azrtti_typeid<AZ::Prefab::ProceduralPrefabAsset>();
  73. assetInfo.m_relativePath = "mock/path";
  74. assetInfo.m_sizeBytes = 0;
  75. }
  76. return true;
  77. }
  78. struct TestPreExportEventContext
  79. {
  80. TestPreExportEventContext()
  81. : m_scene("test_context")
  82. {
  83. using namespace AZ::SceneAPI::Events;
  84. m_preExportEventContext = AZStd::make_unique<PreExportEventContext>(m_productList, m_outputDirectory, m_scene, "mock");
  85. }
  86. void SetOutputDirectory(AZStd::string outputDirectory)
  87. {
  88. using namespace AZ::SceneAPI::Events;
  89. m_outputDirectory = AZStd::move(outputDirectory);
  90. m_preExportEventContext = AZStd::make_unique<PreExportEventContext>(m_productList, m_outputDirectory, m_scene, "mock");
  91. }
  92. AZStd::unique_ptr<AZ::SceneAPI::Events::PreExportEventContext> m_preExportEventContext;
  93. AZ::SceneAPI::Events::ExportProductList m_productList;
  94. AZStd::string m_outputDirectory;
  95. AZ::SceneAPI::Containers::Scene m_scene;
  96. };
  97. AZStd::unique_ptr<AZ::SceneAPI::Behaviors::PrefabGroupBehavior> m_prefabGroupBehavior;
  98. testing::NiceMock<UnitTests::MockAssetSystemRequest> m_assetSystemRequestMock;
  99. };
  100. TEST_F(PrefabBehaviorTests, PrefabBehavior_EmptyContextIgnored_Works)
  101. {
  102. auto context = TestPreExportEventContext{};
  103. auto result = AZ::SceneAPI::Events::ProcessingResult::Failure;
  104. AZ::SceneAPI::Events::CallProcessorBus::BroadcastResult(
  105. result,
  106. &AZ::SceneAPI::Events::CallProcessorBus::Events::Process,
  107. context.m_preExportEventContext.get());
  108. EXPECT_EQ(result, AZ::SceneAPI::Events::ProcessingResult::Ignored);
  109. }
  110. TEST_F(PrefabBehaviorTests, PrefabBehavior_SimplePrefab_Works)
  111. {
  112. auto context = TestPreExportEventContext{};
  113. // check for the file at <temp_directory>/mock/fake_prefab.procprefab
  114. AZ::Test::ScopedAutoTempDirectory tempDir;
  115. context.SetOutputDirectory(tempDir.GetDirectory());
  116. auto jsonOutcome = AZ::JsonSerializationUtils::ReadJsonString(Data::jsonPrefab);
  117. ASSERT_TRUE(jsonOutcome);
  118. auto prefabGroup = AZStd::make_shared<AZ::SceneAPI::SceneData::PrefabGroup>();
  119. prefabGroup.get()->SetId(AZ::Uuid::CreateRandom());
  120. prefabGroup.get()->SetName("fake_prefab");
  121. prefabGroup.get()->SetPrefabDom(AZStd::move(jsonOutcome.GetValue()));
  122. context.m_scene.GetManifest().AddEntry(prefabGroup);
  123. context.m_scene.SetSource("mock", AZ::Uuid::CreateRandom());
  124. auto result = AZ::SceneAPI::Events::ProcessingResult::Failure;
  125. AZ::SceneAPI::Events::CallProcessorBus::BroadcastResult(
  126. result,
  127. &AZ::SceneAPI::Events::CallProcessorBus::Events::Process,
  128. context.m_preExportEventContext.get());
  129. EXPECT_EQ(result, AZ::SceneAPI::Events::ProcessingResult::Success);
  130. AZStd::string pathStr;
  131. AzFramework::StringFunc::Path::ConstructFull(tempDir.GetDirectory(), "mock/fake_prefab.procprefab", pathStr, true);
  132. if (!AZ::IO::SystemFile::Exists(pathStr.c_str()))
  133. {
  134. AZ_Warning("testing", false, "The product asset (%s) is missing", pathStr.c_str());
  135. }
  136. }
  137. }