123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include <PrefabBuilderTests.h>
- #include <PrefabGroup/IPrefabGroup.h>
- #include <PrefabGroup/PrefabGroup.h>
- #include <PrefabGroup/PrefabGroupBehavior.h>
- #include <AzTest/Utils.h>
- #include <Tests/AssetSystemMocks.h>
- #include <AzCore/Serialization/Json/JsonSystemComponent.h>
- #include <AzCore/Serialization/SerializeContext.h>
- #include <AzCore/std/smart_ptr/make_shared.h>
- #include <AzToolsFramework/Asset/AssetSystemComponent.h>
- #include <AzToolsFramework/Prefab/Procedural/ProceduralPrefabAsset.h>
- #include <SceneAPI/SceneCore/Containers/Scene.h>
- #include <SceneAPI/SceneCore/Events/CallProcessorBus.h>
- #include <SceneAPI/SceneCore/Events/ExportEventContext.h>
- #include <SceneAPI/SceneCore/Events/ExportProductList.h>
- #include <SceneAPI/SceneCore/SceneCoreStandaloneAllocator.h>
- #include <PrefabGroup/PrefabBehaviorTests.inl>
- namespace UnitTest
- {
- class PrefabBehaviorTests
- : public PrefabBuilderTests
- {
- public:
- static void SetUpTestCase()
- {
- // Allocator needed by SceneCore
- if (!AZ::AllocatorInstance<AZ::SystemAllocator>().IsReady())
- {
- AZ::AllocatorInstance<AZ::SystemAllocator>().Create();
- }
- AZ::SceneAPI::SceneCoreStandaloneAllocator::Initialize(AZ::Environment::GetInstance());
- }
- static void TearDownTestCase()
- {
- AZ::SceneAPI::SceneCoreStandaloneAllocator::TearDown();
- AZ::AllocatorInstance<AZ::SystemAllocator>().Destroy();
- }
- void SetUp() override
- {
- PrefabBuilderTests::SetUp();
- m_prefabGroupBehavior = AZStd::make_unique<AZ::SceneAPI::Behaviors::PrefabGroupBehavior>();
- m_prefabGroupBehavior->Activate();
- // Mocking the asset system replacing the AssetSystem::AssetSystemComponent
- AZ::Entity* systemEntity = m_app.FindEntity(AZ::SystemEntityId);
- systemEntity->FindComponent<AzToolsFramework::AssetSystem::AssetSystemComponent>()->Deactivate();
- using namespace testing;
- ON_CALL(m_assetSystemRequestMock, GetSourceInfoBySourcePath(_, _, _)).WillByDefault([](auto* path, auto& info, auto&)
- {
- return PrefabBehaviorTests::OnGetSourceInfoBySourcePath(path, info);
- });
- m_assetSystemRequestMock.BusConnect();
- }
- void TearDown() override
- {
- m_assetSystemRequestMock.BusDisconnect();
- m_prefabGroupBehavior->Deactivate();
- m_prefabGroupBehavior.reset();
- PrefabBuilderTests::TearDown();
- }
- static bool OnGetSourceInfoBySourcePath(AZStd::string_view sourcePath, AZ::Data::AssetInfo& assetInfo)
- {
- if (sourcePath == AZStd::string_view("mock"))
- {
- assetInfo.m_assetId = AZ::Uuid::CreateRandom();
- assetInfo.m_assetType = azrtti_typeid<AZ::Prefab::ProceduralPrefabAsset>();
- assetInfo.m_relativePath = "mock/path";
- assetInfo.m_sizeBytes = 0;
- }
- return true;
- }
- struct TestPreExportEventContext
- {
- TestPreExportEventContext()
- : m_scene("test_context")
- {
- using namespace AZ::SceneAPI::Events;
- m_preExportEventContext = AZStd::make_unique<PreExportEventContext>(m_productList, m_outputDirectory, m_scene, "mock");
- }
- void SetOutputDirectory(AZStd::string outputDirectory)
- {
- using namespace AZ::SceneAPI::Events;
- m_outputDirectory = AZStd::move(outputDirectory);
- m_preExportEventContext = AZStd::make_unique<PreExportEventContext>(m_productList, m_outputDirectory, m_scene, "mock");
- }
- AZStd::unique_ptr<AZ::SceneAPI::Events::PreExportEventContext> m_preExportEventContext;
- AZ::SceneAPI::Events::ExportProductList m_productList;
- AZStd::string m_outputDirectory;
- AZ::SceneAPI::Containers::Scene m_scene;
- };
- AZStd::unique_ptr<AZ::SceneAPI::Behaviors::PrefabGroupBehavior> m_prefabGroupBehavior;
- testing::NiceMock<UnitTests::MockAssetSystemRequest> m_assetSystemRequestMock;
- };
- TEST_F(PrefabBehaviorTests, PrefabBehavior_EmptyContextIgnored_Works)
- {
- auto context = TestPreExportEventContext{};
- auto result = AZ::SceneAPI::Events::ProcessingResult::Failure;
- AZ::SceneAPI::Events::CallProcessorBus::BroadcastResult(
- result,
- &AZ::SceneAPI::Events::CallProcessorBus::Events::Process,
- context.m_preExportEventContext.get());
- EXPECT_EQ(result, AZ::SceneAPI::Events::ProcessingResult::Ignored);
- }
- TEST_F(PrefabBehaviorTests, PrefabBehavior_SimplePrefab_Works)
- {
- auto context = TestPreExportEventContext{};
- // check for the file at <temp_directory>/mock/fake_prefab.procprefab
- AZ::Test::ScopedAutoTempDirectory tempDir;
- context.SetOutputDirectory(tempDir.GetDirectory());
- auto jsonOutcome = AZ::JsonSerializationUtils::ReadJsonString(Data::jsonPrefab);
- ASSERT_TRUE(jsonOutcome);
- auto prefabGroup = AZStd::make_shared<AZ::SceneAPI::SceneData::PrefabGroup>();
- prefabGroup.get()->SetId(AZ::Uuid::CreateRandom());
- prefabGroup.get()->SetName("fake_prefab");
- prefabGroup.get()->SetPrefabDom(AZStd::move(jsonOutcome.GetValue()));
- context.m_scene.GetManifest().AddEntry(prefabGroup);
- context.m_scene.SetSource("mock", AZ::Uuid::CreateRandom());
- auto result = AZ::SceneAPI::Events::ProcessingResult::Failure;
- AZ::SceneAPI::Events::CallProcessorBus::BroadcastResult(
- result,
- &AZ::SceneAPI::Events::CallProcessorBus::Events::Process,
- context.m_preExportEventContext.get());
- EXPECT_EQ(result, AZ::SceneAPI::Events::ProcessingResult::Success);
- AZStd::string pathStr;
- AzFramework::StringFunc::Path::ConstructFull(tempDir.GetDirectory(), "mock/fake_prefab.procprefab", pathStr, true);
- if (!AZ::IO::SystemFile::Exists(pathStr.c_str()))
- {
- AZ_Warning("testing", false, "The product asset (%s) is missing", pathStr.c_str());
- }
- }
- }
|