// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #include #include #include #include "SimpleFixture.hpp" namespace rocRollerTest { class ComponentTest : public SimpleFixture { }; using namespace rocRoller::Component; struct TestArgument { bool classA = false; }; struct Interface { using Argument = std::shared_ptr; static const std::string Basename; virtual std::string name() = 0; }; const std::string Interface::Basename = "Interface"; static_assert(ComponentBase); struct AImpl : public Interface { using Base = Interface; static const std::string Name; static bool Match(Argument arg) { return arg->classA; } static std::shared_ptr Build(Argument arg) { if(!Match(arg)) return nullptr; return std::make_shared(); } virtual std::string name() override { return Name; } }; struct BImpl : public Interface { using Base = Interface; static const std::string Name; static bool Match(Argument arg) { return !arg->classA; } static std::shared_ptr Build(Argument arg) { if(!Match(arg)) return nullptr; return std::make_shared(); } virtual std::string name() override { return Name; } }; const std::string AImpl::Name = "AImpl"; const std::string BImpl::Name = "BImpl"; static_assert(Component); static_assert(Component); TEST_F(ComponentTest, Basic) { auto argA = std::make_shared(); auto argB = std::make_shared(); argA->classA = true; argB->classA = false; auto instA = Get(argA); EXPECT_EQ("AImpl", instA->name()); EXPECT_NE(nullptr, std::dynamic_pointer_cast(instA)); auto instB = Get(argB); EXPECT_EQ("BImpl", instB->name()); EXPECT_NE(nullptr, std::dynamic_pointer_cast(instB)); // Get() returns a cached instance associated with the argument. auto instA2 = Get(argA); EXPECT_EQ("AImpl", instA2->name()); EXPECT_EQ(instA, instA2); // GetNew() returns a new instance auto instA3 = GetNew(argA); EXPECT_EQ("AImpl", instA3->name()); EXPECT_NE(nullptr, std::dynamic_pointer_cast(instA3)); EXPECT_NE(instA, instA3); // Get() returns a cached instance associated with the argument. auto instB2 = Get(argB); EXPECT_EQ("BImpl", instB2->name()); EXPECT_EQ(instB, instB2); auto argB2 = std::make_shared(); argB2->classA = false; // New argument, new instance object auto instB3 = Get(argB2); EXPECT_EQ("BImpl", instB3->name()); EXPECT_NE(instB, instB3); } } template <> void rocRoller::Component::ComponentFactory::registerImplementations() { registerComponent(); registerComponent(); }