You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/Atom/RPI/Code/Tests.Builders/PassBuilderTest.cpp

122 lines
4.3 KiB
C++

/*
* 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 <AzTest/AzTest.h>
#include <AssetBuilderSDK/AssetBuilderBusses.h>
#include <AssetBuilderSDK/AssetBuilderSDK.h>
#include <AzCore/Serialization/ObjectStream.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/Serialization/Utils.h>
#include <AzCore/std/smart_ptr/make_shared.h>
#include <AzCore/Serialization/Json/JsonUtils.h>
#include <Atom/RHI.Reflect/ReflectSystemComponent.h>
#include <Atom/RPI.Reflect/Pass/FullscreenTrianglePassData.h>
#include <Atom/RPI.Reflect/Pass/PassAsset.h>
#include <Atom/RPI.Reflect/Pass/PassTemplate.h>
#include <Pass/PassBuilder.h>
#include <Tests.Builders/BuilderTestFixture.h>
namespace UnitTest
{
using namespace AZ;
class PassBuilderTests
: public BuilderTestFixture
{
protected:
RPI::PassAssetHandler* m_assetHandler;
void SetUp() override
{
BuilderTestFixture::SetUp();
m_assetHandler = new RPI::PassAssetHandler();
m_assetHandler->m_serializeContext = m_context.get();
m_assetHandler->Register();
}
void TearDown() override
{
m_assetHandler->Unregister();
delete m_assetHandler;
BuilderTestFixture::TearDown();
}
template<typename T>
void SaveAssetToFile(T& data, const char* saveFileName)
{
Utils::SaveObjectToFile(saveFileName, AZ::DataStream::ST_XML, &data, T::TYPEINFO_Uuid(), m_context.get());
}
Data::Asset<Data::AssetData> LoadAssetFromFile(const char* assetFile)
{
Data::Asset<Data::AssetData> outAsset(m_assetHandler->CreateAsset(Data::AssetId(Uuid::CreateRandom(), 1), Data::AssetType()),
Data::AssetLoadBehavior::PreLoad);
AZ::u64 fileLength = 0;
AZ::IO::FileIOBase::GetInstance()->Size(assetFile, fileLength);
AZStd::shared_ptr<AZ::Data::AssetDataStream> stream = AZStd::make_shared<AZ::Data::AssetDataStream>();
stream->Open(assetFile, 0, fileLength);
stream->BlockUntilLoadComplete();
m_assetHandler->LoadAssetData(outAsset, stream, {});
return outAsset;
}
void SetPassTemplateForTestingOnly(RPI::PassAsset& passAsset, RPI::PassTemplate& passTemplate)
{
passAsset.SetPassTemplateForTestingOnly(passTemplate);
}
};
TEST_F(PassBuilderTests, ProcessJob)
{
// Basic test: test data before and after are same. Test data class doesn't have converter or asset reference.
AssetBuilderSDK::ProcessJobRequest request;
// Initial job request
const char* testAssetPath = "PassTestAsset.pass";
request.m_fullPath = testAssetPath;
request.m_tempDirPath = m_currentDir;
// Dummy pass template
RPI::PassTemplate passTemplate;
passTemplate.m_name = "TemplateTestName";
// Dummy pass data with random asset ID to test asset dependency
AZStd::shared_ptr<RPI::FullscreenTrianglePassData> passData = AZStd::make_shared<RPI::FullscreenTrianglePassData>();
passData->m_shaderAsset.m_assetId = Data::AssetId(Uuid::CreateRandom(), 1);
passTemplate.m_passData = passData;
// Create and write pass data
RPI::PassAsset passAsset;
SetPassTemplateForTestingOnly(passAsset, passTemplate);
JsonSerializationUtils::SaveObjectToFile(&passAsset, testAssetPath);
// Process job
RPI::PassBuilder builder;
AssetBuilderSDK::ProcessJobResponse response;
builder.ProcessJob(request, response);
// Verify job success
EXPECT_TRUE(response.m_resultCode == AssetBuilderSDK::ProcessJobResult_Success);
EXPECT_TRUE(response.m_outputProducts.size() == 1);
// Verify input and output names are the same
Data::Asset<Data::AssetData> readAsset = LoadAssetFromFile(response.m_outputProducts[0].m_productFileName.c_str());
RPI::PassAsset* readPassAsset = static_cast<RPI::PassAsset*>(readAsset.GetData());
EXPECT_TRUE(passTemplate.m_name == readPassAsset->GetPassTemplate()->m_name);
}
} // namespace UnitTests