#include #include class SimpleService { public: virtual ~SimpleService() = default; virtual std::string foo() = 0; SimpleService() = default; SimpleService(const SimpleService& other) = delete; SimpleService(SimpleService&& other) noexcept = delete; SimpleService& operator=(const SimpleService& other) = delete; SimpleService& operator=(SimpleService&& other) noexcept = delete; }; class FirstServiceImplementation final: public SimpleService { public: std::string foo() override { return "first"; } }; class SecondServiceImplementation final: public SimpleService { public: std::string foo() override { return "second"; } }; TEST(ServiceProvider, provideEmptyImplementation) { // Arrange Base::ServiceProvider serviceProvider; // Act auto implementation = serviceProvider.provide(); // Assert EXPECT_EQ(implementation, nullptr); } TEST(ServiceProvider, provideEmptyImplementationList) { // Arrange Base::ServiceProvider serviceProvider; // Act const auto implementations = serviceProvider.all(); // Assert EXPECT_EQ(implementations.size(), 0); } TEST(ServiceProvider, provideImplementation) { // Arrange Base::ServiceProvider serviceProvider; serviceProvider.registerImplementation(new FirstServiceImplementation); // Act auto implementation = serviceProvider.provide(); // Assert EXPECT_NE(implementation, nullptr); EXPECT_EQ(implementation->foo(), "first"); } TEST(ServiceProvider, provideLatestImplementation) { // Arrange Base::ServiceProvider serviceProvider; serviceProvider.registerImplementation(new FirstServiceImplementation); serviceProvider.registerImplementation(new SecondServiceImplementation); // Act auto implementation = serviceProvider.provide(); // Assert EXPECT_NE(implementation, nullptr); EXPECT_EQ(implementation->foo(), "second"); } TEST(ServiceProvider, provideAllImplementations) { // Arrange Base::ServiceProvider serviceProvider; serviceProvider.registerImplementation(new FirstServiceImplementation); serviceProvider.registerImplementation(new SecondServiceImplementation); // Act auto implementations = serviceProvider.all(); auto it = implementations.begin(); // Assert // Implementations should be available in order from the most recent one EXPECT_EQ((*it)->foo(), "second"); ++it; EXPECT_EQ((*it)->foo(), "first"); ++it; EXPECT_EQ(it, implementations.end()); }