/* * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV); using namespace AZ; using ::testing::NiceMock; class LyShineSystemTestComponent : public LyShine::LyShineSystemComponent { friend class LyShineEditorTest; }; class LyShineEditorTest : public ::testing::Test { protected: void SetUp() override { using namespace LyShine; m_priorEnv = gEnv; m_data = AZStd::make_unique(); memset(&m_data->m_stubEnv, 0, sizeof(SSystemGlobalEnvironment)); m_data->m_stubEnv.pSystem = &m_data->m_mockSystem; gEnv = &m_data->m_stubEnv; AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get(); auto projectPathKey = AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path"; AZ::IO::FixedMaxPath enginePath; registry->Get(enginePath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_EngineRootFolder); registry->Set(projectPathKey, (enginePath / "AutomatedTesting").Native()); AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry); m_app.Start(m_descriptor); // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash // in the unit tests. AZ::UserSettingsComponentRequestBus::Broadcast(&AZ::UserSettingsComponentRequests::DisableSaveOnFinalize); const AZStd::string engineRoot = AZ::Test::GetEngineRootPath(); AZ::IO::FileIOBase::GetInstance()->SetAlias("@engroot@", engineRoot.c_str()); AZ::IO::Path assetRoot(AZ::Utils::GetProjectPath()); assetRoot /= "Cache"; AZ::IO::FileIOBase::GetInstance()->SetAlias("@products@", assetRoot.c_str()); AZ::SerializeContext* context = nullptr; ComponentApplicationBus::BroadcastResult(context, &ComponentApplicationBus::Events::GetSerializeContext); ASSERT_NE(context, nullptr); m_componentDescriptors.push_back(AZStd::unique_ptr(LyShineSystemComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiCanvasAssetRefComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiCanvasProxyRefComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiCanvasOnMeshComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiCanvasComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiElementComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiTransform2dComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiImageComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiImageSequenceComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiTextComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiButtonComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiMarkupButtonComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiCheckboxComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiDraggableComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiDropTargetComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiDropdownComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiDropdownOptionComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiSliderComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiTextInputComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiScrollBoxComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiScrollBarComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiFaderComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiFlipbookAnimationComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiLayoutFitterComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiMaskComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiLayoutCellComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiLayoutColumnComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiLayoutRowComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiLayoutGridComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiTooltipComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiTooltipDisplayComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiDynamicLayoutComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiDynamicScrollBoxComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiSpawnerComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiRadioButtonComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiRadioButtonGroupComponent::CreateDescriptor())); m_componentDescriptors.push_back(AZStd::unique_ptr(UiParticleEmitterComponent::CreateDescriptor())); context->ClassDeprecate("SimpleAssetReference_MaterialAsset", "{B7B8ECC7-FF89-4A76-A50E-4C6CA2B6E6B4}", [](AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& rootElement) { AZStd::vector childNodeElements; for (int index = 0; index < rootElement.GetNumSubElements(); ++index) { childNodeElements.push_back(rootElement.GetSubElement(index)); } // Convert the rootElement now, the existing child DataElmentNodes are now removed rootElement.Convert>(context); for (AZ::SerializeContext::DataElementNode& childNodeElement : childNodeElements) { rootElement.AddElement(AZStd::move(childNodeElement)); } return true; }); context->ClassDeprecate("SimpleAssetReference_TextureAsset", "{68E92460-5C0C-4031-9620-6F1A08763243}", [](AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& rootElement) { AZStd::vector childNodeElements; for (int index = 0; index < rootElement.GetNumSubElements(); ++index) { childNodeElements.push_back(rootElement.GetSubElement(index)); } // Convert the rootElement now, the existing child DataElmentNodes are now removed rootElement.Convert>(context); for (AZ::SerializeContext::DataElementNode& childNodeElement : childNodeElements) { rootElement.AddElement(AZStd::move(childNodeElement)); } return true; }); AzFramework::SimpleAssetReference::Register(*context); AzFramework::SimpleAssetReference::Register(*context); for(const auto& descriptor : m_componentDescriptors) { descriptor->Reflect(context); } m_sysComponent = AZStd::make_unique(); m_sysComponent->Activate(); } void TearDown() override { m_componentDescriptors = {}; m_sysComponent->Deactivate(); m_sysComponent = nullptr; m_app.Stop(); m_data.reset(); gEnv = m_priorEnv; } AZStd::unique_ptr m_sysComponent; AzToolsFramework::ToolsApplication m_app; AZ::ComponentApplication::Descriptor m_descriptor; AZStd::vector> m_componentDescriptors; struct DataMembers { SSystemGlobalEnvironment m_stubEnv; NiceMock m_mockSystem; }; AZStd::unique_ptr m_data; SSystemGlobalEnvironment* m_priorEnv = nullptr; }; AZStd::string GetTestFileAliasedPath(AZStd::string_view fileName) { constexpr char testFileFolder[] = "@engroot@/Gems/LyShine/Code/Tests/"; return AZStd::string::format("%s%.*s", testFileFolder, aznumeric_cast(fileName.size()), fileName.data()); } AZStd::string GetTestFileFullPath(AZStd::string_view fileName) { AZStd::string aliasedPath = GetTestFileAliasedPath(fileName); char resolvedPath[AZ_MAX_PATH_LEN]; AZ::IO::FileIOBase::GetInstance()->ResolvePath(aliasedPath.c_str(), resolvedPath, AZ_MAX_PATH_LEN); return AZStd::string(resolvedPath); } bool OpenTestFile(AZStd::string_view fileName, AZ::IO::FileIOStream& fileStream) { AZStd::string aliasedPath = GetTestFileAliasedPath(fileName); return fileStream.Open(aliasedPath.c_str(), AZ::IO::OpenMode::ModeRead | AZ::IO::OpenMode::ModeBinary); } TEST_F(LyShineEditorTest, ProcessUiCanvas_ReturnsDependencyOnSpriteAndTexture) { using namespace LyShine; using namespace AssetBuilderSDK; UiCanvasBuilderWorker worker; AZStd::vector productDependencies; ProductPathDependencySet productPathDependencySet; UiSystemToolsInterface::CanvasAssetHandle* canvasAsset = nullptr; AZ::Entity* sourceCanvasEntity = nullptr; AZ::Entity exportCanvasEntity; AZ::IO::FileIOStream stream; ASSERT_TRUE(OpenTestFile("1ImageReference.uicanvas", stream)); ASSERT_TRUE(worker.ProcessUiCanvasAndGetDependencies(stream, productDependencies, productPathDependencySet, canvasAsset, sourceCanvasEntity, exportCanvasEntity)); ASSERT_EQ(productDependencies.size(), 0); ASSERT_THAT(productPathDependencySet, testing::UnorderedElementsAre( ProductPathDependency{ "textures/defaults/grey.dds", ProductPathDependencyType::ProductFile }, ProductPathDependency{ "textures/defaults/grey.sprite", ProductPathDependencyType::ProductFile } )); } TEST_F(LyShineEditorTest, FindLoadedCanvasByPathName_FT) { UiCanvasManager canvasManager; //find loaded canvas, should return invalid id AZ::EntityId entityId = canvasManager.FindLoadedCanvasByPathName("@engroot@/Gems/LyShine/Code/Tests/TestAssets/Canvases/empty.uicanvas", false); EXPECT_FALSE(entityId.IsValid()); //load a new canvas entityId = canvasManager.FindLoadedCanvasByPathName("@engroot@/Gems/LyShine/Code/Tests/TestAssets/Canvases/empty.uicanvas", true); EXPECT_TRUE(entityId.IsValid()); }