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/System/FeatureProcessorFactoryTest...

131 lines
7.0 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 <Common/RPITestFixture.h>
#include <Common/TestFeatureProcessors.h>
namespace UnitTest
{
using namespace AZ;
using namespace AZ::RPI;
class FeatureProcessorFactoryTests
: public RPITestFixture
{
protected:
void SetUp() override
{
RPITestFixture::SetUp();
TestFeatureProcessor1::Reflect(GetSerializeContext());
TestFeatureProcessor2::Reflect(GetSerializeContext());
TestFeatureProcessorImplementation::Reflect(GetSerializeContext());
TestFeatureProcessorImplementation2::Reflect(GetSerializeContext());
FeatureProcessorFactory::Get()->RegisterFeatureProcessor<TestFeatureProcessor1>();
FeatureProcessorFactory::Get()->RegisterFeatureProcessor<TestFeatureProcessor2>();
FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface<TestFeatureProcessorImplementation, TestFeatureProcessorInterface>();
FeatureProcessorFactory::Get()->RegisterFeatureProcessorWithInterface<TestFeatureProcessorImplementation2, TestFeatureProcessorInterface>();
}
void TearDown() override
{
FeatureProcessorFactory::Get()->UnregisterFeatureProcessor<TestFeatureProcessor1>();
FeatureProcessorFactory::Get()->UnregisterFeatureProcessor<TestFeatureProcessor2>();
FeatureProcessorFactory::Get()->UnregisterFeatureProcessor<TestFeatureProcessorImplementation>();
FeatureProcessorFactory::Get()->UnregisterFeatureProcessor<TestFeatureProcessorImplementation2>();
RPITestFixture::TearDown();
}
};
TEST_F(FeatureProcessorFactoryTests, GetFeatureProcessorTypeId_MultipleFeatureProcessorsRegistered_ReturnsCorrectTypeId)
{
AZ::TypeId testFeatureProcessor1Id = FeatureProcessorFactory::Get()->GetFeatureProcessorTypeId(FeatureProcessorId{ "TestFeatureProcessor1" });
EXPECT_EQ(testFeatureProcessor1Id, TestFeatureProcessor1::RTTI_Type());
AZ::TypeId testFeatureProcessor2Id = FeatureProcessorFactory::Get()->GetFeatureProcessorTypeId(FeatureProcessorId{ "TestFeatureProcessor2" });
EXPECT_EQ(testFeatureProcessor2Id, TestFeatureProcessor2::RTTI_Type());
AZ::TypeId testFeatureProcessorImplementationId = FeatureProcessorFactory::Get()->GetFeatureProcessorTypeId(FeatureProcessorId{ "TestFeatureProcessorImplementation" });
EXPECT_EQ(testFeatureProcessorImplementationId, TestFeatureProcessorImplementation::RTTI_Type());
AZ::TypeId testFeatureProcessorImplementation2Id = FeatureProcessorFactory::Get()->GetFeatureProcessorTypeId(FeatureProcessorId{ "TestFeatureProcessorImplementation2" });
EXPECT_EQ(testFeatureProcessorImplementation2Id, TestFeatureProcessorImplementation2::RTTI_Type());
}
TEST_F(FeatureProcessorFactoryTests, GetFeatureProcessorInterfaceTypeId_FeatureProcessorHasInterface_ReturnsCorrectTypeId)
{
AZ::TypeId testFeatureProcessorInterfaceId = FeatureProcessorFactory::Get()->GetFeatureProcessorInterfaceTypeId(FeatureProcessorId{ "TestFeatureProcessorImplementation" });
EXPECT_EQ(testFeatureProcessorInterfaceId, TestFeatureProcessorInterface::RTTI_Type());
AZ::TypeId testFeatureProcessorInterfaceId2 = FeatureProcessorFactory::Get()->GetFeatureProcessorInterfaceTypeId(FeatureProcessorId{ "TestFeatureProcessorImplementation2" });
EXPECT_EQ(testFeatureProcessorInterfaceId2, TestFeatureProcessorInterface::RTTI_Type());
EXPECT_EQ(testFeatureProcessorInterfaceId, testFeatureProcessorInterfaceId2);
}
TEST_F(FeatureProcessorFactoryTests, GetFeatureProcessorInterfaceTypeId_FeatureProcessorDoesNotHaveInterface_ReturnsNullTypeId)
{
AZ::TypeId testFeatureProcessor1InterfaceId = FeatureProcessorFactory::Get()->GetFeatureProcessorInterfaceTypeId(FeatureProcessorId{ "TestFeatureProcessor1" });
EXPECT_EQ(testFeatureProcessor1InterfaceId, TypeId::CreateNull());
AZ::TypeId testFeatureProcessor2InterfaceId = FeatureProcessorFactory::Get()->GetFeatureProcessorInterfaceTypeId(FeatureProcessorId{ "TestFeatureProcessor2" });
EXPECT_EQ(testFeatureProcessor2InterfaceId, TypeId::CreateNull());
}
//
// Two implementations of the same interface
//
TEST_F(FeatureProcessorFactoryTests, CreateFeatureProcessor_MultipleImplmentationsOfTheSameInterface_CreatesBothFeatureProcessors)
{
FeatureProcessorPtr implementation1 = FeatureProcessorFactory::Get()->CreateFeatureProcessor(FeatureProcessorId{ TestFeatureProcessorImplementation::RTTI_TypeName() });
FeatureProcessorPtr implementation2 = FeatureProcessorFactory::Get()->CreateFeatureProcessor(FeatureProcessorId{ TestFeatureProcessorImplementation2::RTTI_TypeName() });
EXPECT_TRUE(implementation1 != nullptr);
EXPECT_TRUE(implementation2 != nullptr);
EXPECT_NE(implementation1, implementation2);
}
TEST_F(FeatureProcessorFactoryTests, UnregisterFeatureProcessor_MultipleImplmentationsOfTheSameInterface_OnlyTestFeatureProcessorImplementationIsUnregistered)
{
FeatureProcessorFactory::Get()->UnregisterFeatureProcessor<TestFeatureProcessorImplementation>();
// TestFeatureProcessorImplementation can no longer be created because it has been unregistered
FeatureProcessorPtr implementation1 = FeatureProcessorFactory::Get()->CreateFeatureProcessor(FeatureProcessorId{ TestFeatureProcessorImplementation::RTTI_TypeName() });
FeatureProcessorPtr implementation2 = FeatureProcessorFactory::Get()->CreateFeatureProcessor(FeatureProcessorId{ TestFeatureProcessorImplementation2::RTTI_TypeName() });
EXPECT_TRUE(implementation1 == nullptr);
EXPECT_TRUE(implementation2 != nullptr);
}
TEST_F(FeatureProcessorFactoryTests, UnregisterFeatureProcessor_MultipleImplmentationsOfTheSameInterface_OnlyTestFeatureProcessorImplementation2IsUnregistered)
{
FeatureProcessorFactory::Get()->UnregisterFeatureProcessor<TestFeatureProcessorImplementation2>();
// TestFeatureProcessorImplementation can no longer be created because it has been unregistered
FeatureProcessorPtr implementation1 = FeatureProcessorFactory::Get()->CreateFeatureProcessor(FeatureProcessorId{ TestFeatureProcessorImplementation::RTTI_TypeName() });
FeatureProcessorPtr implementation2 = FeatureProcessorFactory::Get()->CreateFeatureProcessor(FeatureProcessorId{ TestFeatureProcessorImplementation2::RTTI_TypeName() });
EXPECT_TRUE(implementation1 != nullptr);
EXPECT_TRUE(implementation2 == nullptr);
}
//
// Invalid cases
//
TEST_F(FeatureProcessorFactoryTests, CreateFeatureProcessor_ByInterfaceName_FailsToCreate)
{
EXPECT_TRUE(AZ::RPI::FeatureProcessorFactory::Get()->CreateFeatureProcessor(FeatureProcessorId{ TestFeatureProcessorInterface::RTTI_TypeName() }) == nullptr);
}
// Get typeid from interface
}