#include #include class TestService1 : public MM::Services::Service { public: const char* name(void) override { return "TestService1"; } bool enable(MM::Engine&) override { return true; } void disable(MM::Engine&) override {} }; class TestService2 : public MM::Services::Service { public: const char* name(void) override { return "TestService2"; } bool enable(MM::Engine&) override { return true; } void disable(MM::Engine&) override {} }; class TestService2Derived : public TestService2 { public: const char* name(void) override { return "TestService2Derived"; } bool enable(MM::Engine&) override { return true; } void disable(MM::Engine&) override {} }; TEST(engine_service, add) { MM::Engine e; e.addService(); auto* tss = e.tryService(); ASSERT_NE(tss, nullptr); } TEST(engine_service, get_fail) { MM::Engine e; auto* tss = e.tryService(); ASSERT_EQ(tss, nullptr); } #ifndef NDEBUG TEST(engine_service, _fail) { MM::Engine e; e.addService(); ASSERT_DEATH({ e.addService(); // adding the same }, "failed"); //auto* tss = e.tryService(); //ASSERT_EQ(tss, nullptr); } #endif TEST(engine_service, add_int_en_dis) { MM::Engine e; { auto& tss = e.addService(); ASSERT_TRUE(tss.enable(e)); } { auto* tss = e.tryService(); ASSERT_NE(tss, nullptr); tss->disable(e); } } TEST(engine_service, add_en_dis) { MM::Engine e; e.addService(); ASSERT_TRUE(e.enableService()); { auto* tss = e.tryService(); ASSERT_NE(tss, nullptr); } e.disableService(); } TEST(engine_service, add_en_dis_mult) { MM::Engine e; e.addService(); ASSERT_TRUE(e.enableService()); e.addService(); ASSERT_TRUE(e.enableService()); { auto* tss = e.tryService(); ASSERT_NE(tss, nullptr); } { auto* tss = e.tryService(); ASSERT_NE(tss, nullptr); } e.disableService(); e.disableService(); } TEST(engine_service, provide) { MM::Engine e; e.addService(); ASSERT_TRUE(e.enableService()); bool r; // "mark" TestService2Derived as provider for TestService2 r = e.provide(); ASSERT_TRUE(r); // should not compile //r = e.provide(); //r = e.provide(); //r = e.provide(); { auto* tdss = e.tryService(); ASSERT_NE(tdss, nullptr); auto* iss = e.tryService(); ASSERT_NE(iss, nullptr); // they are the same (ptr) ASSERT_EQ(tdss, iss); } e.disableService(); } TEST(engine_service, type_ids) { MM::Engine e; auto tss1_id = e.type(); auto tss2_id = e.type(); auto tss2d_id = e.type(); ASSERT_NE(tss1_id, tss2_id); ASSERT_NE(tss1_id, tss2d_id); ASSERT_NE(tss2_id, tss2d_id); } TEST(engine_service, add_en_dis_mult_type_ids) { MM::Engine e; auto tss1_id = e.type(); auto tss2_id = e.type(); ASSERT_NE(tss1_id, tss2_id); e.addService(); ASSERT_TRUE(e.enableService(tss1_id)); e.addService(); ASSERT_TRUE(e.enableService(tss2_id)); { auto* tss1 = e.tryService(); ASSERT_NE(tss1, nullptr); auto* tss2 = e.tryService(); ASSERT_NE(tss2, nullptr); ASSERT_NE((void*)tss1, (void*)tss2); } e.disableService(tss1_id); e.disableService(); // mixin' } TEST(engine_service, provide_type_ids) { MM::Engine e; auto tss2_id = e.type(); auto tss2d_id = e.type(); e.addService(); ASSERT_TRUE(e.enableService(tss2d_id)); bool r; // "mark" TestService2Derived as provider for TestService2 r = e.provide(tss2_id, tss2d_id); ASSERT_TRUE(r); // typeid variant //r = e.provide(); ASSERT_TRUE(r); { auto* tdss = e.tryService(); ASSERT_NE(tdss, nullptr); auto* iss = e.tryService(); ASSERT_NE(iss, nullptr); // they are the same (ptr) ASSERT_EQ((void*)tdss, (void*)iss); } e.disableService(tss2d_id); } TEST(engine_service, run) { MM::Engine e; e.addService(); ASSERT_TRUE(e.enableService()); { auto* tss = e.tryService(); ASSERT_NE(tss, nullptr); } e.addFixedUpdate([](auto& e) { e.stop(); }); e.run(); e.disableService(); }