ScriptCanvasBuilderTests.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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 <AssetBuilderSDK/AssetBuilderSDK.h>
  9. #include <AssetBuilderSDK/SerializationDependencies.h>
  10. #include <AzCore/Asset/AssetManager.h>
  11. #include <AzCore/Asset/AssetSerializer.h>
  12. #include <AzCore/Component/Component.h>
  13. #include <AzCore/Memory/PoolAllocator.h>
  14. #include <AzCore/Serialization/SerializeContext.h>
  15. #include <AzCore/UnitTest/TestTypes.h>
  16. #include <AzFramework/Asset/GenericAssetHandler.h>
  17. #include <AzTest/AzTest.h>
  18. #include <Builder/ScriptCanvasBuilderWorker.h>
  19. #include <ScriptCanvas/Core/GraphData.h>
  20. #include <ScriptCanvas/Asset/RuntimeAsset.h>
  21. struct MockAsset
  22. : public AZ::Data::AssetData
  23. {
  24. AZ_CLASS_ALLOCATOR(MockAsset, AZ::SystemAllocator)
  25. AZ_RTTI(MockAsset, "{D1E5A5DA-89D3-4B1F-8194-3E84CA6991DF}", AZ::Data::AssetData);
  26. static void Reflect(AZ::ReflectContext* reflection)
  27. {
  28. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflection);
  29. if (serializeContext)
  30. {
  31. serializeContext->Class<MockAsset>()
  32. ->Field("value", &MockAsset::m_value);
  33. }
  34. }
  35. int m_value = 0;
  36. };
  37. struct MockAssetRefComponent
  38. : public AZ::Component
  39. {
  40. AZ_COMPONENT(MockAssetRefComponent, "{EE1F3C90-2301-483D-AE28-9381BBFE18FB}");
  41. static void Reflect(AZ::ReflectContext* reflection)
  42. {
  43. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflection);
  44. if (serializeContext)
  45. {
  46. serializeContext->Class<MockAssetRefComponent, AZ::Component>()
  47. ->Field("asset", &MockAssetRefComponent::m_asset);
  48. }
  49. }
  50. void Activate() override {}
  51. void Deactivate() override
  52. {
  53. m_asset->Release();
  54. }
  55. AZ::Data::Asset<MockAsset> m_asset;
  56. };
  57. class ScriptCanvasBuilderTests
  58. : public UnitTest::LeakDetectionFixture
  59. , public AZ::ComponentApplicationBus::Handler
  60. {
  61. protected:
  62. //////////////////////////////////////////////////////////////////////////
  63. // ComponentApplicationMessages
  64. AZ::ComponentApplication* GetApplication() override { return nullptr; }
  65. void RegisterComponentDescriptor(const AZ::ComponentDescriptor*) override { }
  66. void UnregisterComponentDescriptor(const AZ::ComponentDescriptor*) override { }
  67. void RegisterEntityAddedEventHandler(AZ::EntityAddedEvent::Handler&) override { }
  68. void RegisterEntityRemovedEventHandler(AZ::EntityRemovedEvent::Handler&) override { }
  69. void RegisterEntityActivatedEventHandler(AZ::EntityActivatedEvent::Handler&) override { }
  70. void RegisterEntityDeactivatedEventHandler(AZ::EntityDeactivatedEvent::Handler&) override { }
  71. void SignalEntityActivated(AZ::Entity*) override { }
  72. void SignalEntityDeactivated(AZ::Entity*) override { }
  73. bool AddEntity(AZ::Entity*) override { return true; }
  74. bool RemoveEntity(AZ::Entity*) override { return true; }
  75. bool DeleteEntity(const AZ::EntityId&) override { return true; }
  76. AZ::Entity* FindEntity(const AZ::EntityId&) override { return nullptr; }
  77. AZ::SerializeContext* GetSerializeContext() override { return m_serializeContext; }
  78. AZ::BehaviorContext* GetBehaviorContext() override { return nullptr; }
  79. AZ::JsonRegistrationContext* GetJsonRegistrationContext() override { return nullptr; }
  80. const char* GetEngineRoot() const override { return nullptr; }
  81. const char* GetExecutableFolder() const override { return nullptr; }
  82. void EnumerateEntities(const AZ::ComponentApplicationRequests::EntityCallback& /*callback*/) override {}
  83. void QueryApplicationType(AZ::ApplicationTypeQuery& /*appType*/) const override {}
  84. //////////////////////////////////////////////////////////////////////////
  85. void SetUp() override
  86. {
  87. UnitTest::LeakDetectionFixture::SetUp();
  88. m_serializeContext = aznew AZ::SerializeContext(true, true);
  89. AZ::ComponentApplicationBus::Handler::BusConnect();
  90. AZ::Interface<AZ::ComponentApplicationRequests>::Register(this);
  91. m_mockAssetDescriptor = MockAssetRefComponent::CreateDescriptor();
  92. MockAssetRefComponent::Reflect(m_serializeContext);
  93. MockAsset::Reflect(m_serializeContext);
  94. ScriptCanvas::RuntimeData::Reflect(m_serializeContext);
  95. ScriptCanvas::GraphData::Reflect(m_serializeContext);
  96. ScriptCanvas::VariableData::Reflect(m_serializeContext);
  97. AZ::Entity::Reflect(m_serializeContext);
  98. AZ::Data::AssetManager::Descriptor desc;
  99. AZ::Data::AssetManager::Create(desc);
  100. AZ::Data::AssetManager::Instance().RegisterHandler(aznew AzFramework::GenericAssetHandler<MockAsset>("Mock Asset", "Other", "mockasset"), AZ::AzTypeInfo<MockAsset>::Uuid());
  101. AZ::Data::AssetManager::Instance().RegisterHandler(aznew AzFramework::GenericAssetHandler<ScriptCanvas::RuntimeAsset>("ScriptCanvas::RuntimeAsset", "Other", "mockasset"), azrtti_typeid<ScriptCanvas::RuntimeAsset>());
  102. }
  103. void TearDown() override
  104. {
  105. AZ::Interface<AZ::ComponentApplicationRequests>::Unregister(this);
  106. AZ::ComponentApplicationBus::Handler::BusDisconnect();
  107. AZ::Data::AssetManager::Destroy();
  108. delete m_mockAssetDescriptor;
  109. delete m_serializeContext;
  110. UnitTest::LeakDetectionFixture::TearDown();
  111. }
  112. AZ::SerializeContext* m_serializeContext = nullptr;
  113. AZ::ComponentDescriptor* m_mockAssetDescriptor = nullptr;
  114. };
  115. // Just test for one case to verify the call to ScriptCanvasBuilder::Worker::GatherProductDependencies works.
  116. // SerializationDependencyTests handles testing other asset reference types.
  117. TEST_F(ScriptCanvasBuilderTests, ScriptCanvasWithAssetReference_GatherProductDependencies_DependencyFound)
  118. {
  119. MockAssetRefComponent* assetComponent = aznew MockAssetRefComponent;
  120. AZ::Data::AssetId testAssetId("{CAAC5458-0738-43F6-A2BD-4E315C64BFD3}", 71);
  121. assetComponent->m_asset = AZ::Data::AssetManager::Instance().CreateAsset<MockAsset>(testAssetId, AZ::Data::AssetLoadBehavior::Default);
  122. AZ::Entity* graphEntity = aznew AZ::Entity;
  123. graphEntity->AddComponent(assetComponent);
  124. ScriptCanvas::RuntimeData runtimeData;
  125. AZ::Data::Asset<ScriptCanvas::RuntimeAsset> runtimeAsset;
  126. runtimeAsset.Create(AZ::Uuid::CreateRandom());
  127. runtimeAsset.Get()->m_runtimeData = runtimeData;
  128. AZStd::vector<AssetBuilderSDK::ProductDependency> productDependencies;
  129. AssetBuilderSDK::ProductPathDependencySet productPathDependencySet;
  130. bool gatherResults = AssetBuilderSDK::GatherProductDependencies(*m_serializeContext, graphEntity, productDependencies, productPathDependencySet);
  131. delete graphEntity;
  132. ASSERT_TRUE(gatherResults);
  133. ASSERT_EQ(productDependencies.size(), 1);
  134. ASSERT_EQ(productDependencies[0].m_dependencyId, testAssetId);
  135. ASSERT_EQ(productPathDependencySet.size(), 0);
  136. }