initial import, >900commits predate this

This commit is contained in:
2020-09-29 13:47:50 +02:00
commit e74154ccee
352 changed files with 108120 additions and 0 deletions

View File

@@ -0,0 +1,16 @@
add_executable(engine_test
update_test.cpp
run_test.cpp
service_system_test.cpp
default_service_test.cpp
)
target_include_directories(engine_test PRIVATE ".")
target_link_libraries(engine_test
engine
gtest_main
)
add_test(NAME engine_test COMMAND engine_test)

View File

@@ -0,0 +1,38 @@
#include <gtest/gtest.h>
#include <mm/engine.hpp>
#include <mm/services/default_service.hpp>
TEST(engine_default_service_system, add_en_dis) {
MM::Engine e;
e.addService<MM::Services::DefaultService>();
ASSERT_TRUE(e.enableService<MM::Services::DefaultService>());
{
auto* dss = e.tryService<MM::Services::DefaultService>();
ASSERT_NE(dss, nullptr);
}
e.disableService<MM::Services::DefaultService>();
}
TEST(engine_default_service_system, tick) {
MM::Engine e;
e.addService<MM::Services::DefaultService>();
ASSERT_TRUE(e.enableService<MM::Services::DefaultService>());
e.update();
e.fixedUpdate();
{
auto* dss = e.tryService<MM::Services::DefaultService>();
ASSERT_NE(dss, nullptr);
}
e.disableService<MM::Services::DefaultService>();
}

View File

@@ -0,0 +1,61 @@
#include <gtest/gtest.h>
#include <mm/engine.hpp>
TEST(engine_run, test_run) {
MM::Engine engine;
bool run = false;
auto test_fun = [&run](auto& e) {
run = true;
e.stop();
};
auto handle = engine.addFixedUpdate(test_fun);
ASSERT_NE(handle.lock(), nullptr);
handle.lock()->priority = 1;
ASSERT_FALSE(run);
engine.run();
ASSERT_TRUE(run);
engine.removeFixedUpdate(handle);
}
TEST(engine_run, test_mult_run) {
MM::Engine engine;
bool run = false;
unsigned int fu_count = 0;
unsigned int u_count = 0;
const unsigned int f_to_do = 4;
auto test_f_fun = [&](auto& e) {
run = true;
fu_count++;
if (fu_count >= f_to_do)
e.stop();
};
auto handle_f = engine.addFixedUpdate(test_f_fun);
ASSERT_NE(handle_f.lock(), nullptr);
handle_f.lock()->priority = 1;
auto handle = engine.addUpdate([&u_count](auto&) { u_count++; });
ASSERT_NE(handle_f.lock(), nullptr);
handle.lock()->priority = 1;
ASSERT_FALSE(run);
engine.run();
ASSERT_TRUE(run);
EXPECT_GT(u_count, f_to_do) << "expected more update runs than fixed update runs...";
std::cout << "while performing " << f_to_do << " fixed updates, the engine did " << u_count << " updates.\n";
engine.removeFixedUpdate(handle_f);
}

View File

@@ -0,0 +1,228 @@
#include <gtest/gtest.h>
#include <mm/engine.hpp>
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<TestService1>();
auto* tss = e.tryService<TestService1>();
ASSERT_NE(tss, nullptr);
}
TEST(engine_service, get_fail) {
MM::Engine e;
auto* tss = e.tryService<TestService1>();
ASSERT_EQ(tss, nullptr);
}
#ifndef NDEBUG
TEST(engine_service, _fail) {
MM::Engine e;
e.addService<TestService1>();
ASSERT_DEATH({
e.addService<TestService1>(); // adding the same
}, "failed");
//auto* tss = e.tryService<TestService1>();
//ASSERT_EQ(tss, nullptr);
}
#endif
TEST(engine_service, add_int_en_dis) {
MM::Engine e;
{
auto& tss = e.addService<TestService1>();
ASSERT_TRUE(tss.enable(e));
}
{
auto* tss = e.tryService<TestService1>();
ASSERT_NE(tss, nullptr);
tss->disable(e);
}
}
TEST(engine_service, add_en_dis) {
MM::Engine e;
e.addService<TestService1>();
ASSERT_TRUE(e.enableService<TestService1>());
{
auto* tss = e.tryService<TestService1>();
ASSERT_NE(tss, nullptr);
}
e.disableService<TestService1>();
}
TEST(engine_service, add_en_dis_mult) {
MM::Engine e;
e.addService<TestService1>();
ASSERT_TRUE(e.enableService<TestService1>());
e.addService<TestService2>();
ASSERT_TRUE(e.enableService<TestService2>());
{
auto* tss = e.tryService<TestService1>();
ASSERT_NE(tss, nullptr);
}
{
auto* tss = e.tryService<TestService2>();
ASSERT_NE(tss, nullptr);
}
e.disableService<TestService1>();
e.disableService<TestService2>();
}
TEST(engine_service, provide) {
MM::Engine e;
e.addService<TestService2Derived>();
ASSERT_TRUE(e.enableService<TestService2Derived>());
bool r;
// "mark" TestService2Derived as provider for TestService2
r = e.provide<TestService2, TestService2Derived>(); ASSERT_TRUE(r);
// should not compile
//r = e.provide<TestService2Derived, TestService2>();
//r = e.provide<TestService2, TestService2>();
//r = e.provide<TestService2Derived, TestService2Derived>();
{
auto* tdss = e.tryService<TestService2Derived>();
ASSERT_NE(tdss, nullptr);
auto* iss = e.tryService<TestService2>();
ASSERT_NE(iss, nullptr);
// they are the same (ptr)
ASSERT_EQ(tdss, iss);
}
e.disableService<TestService2Derived>();
}
TEST(engine_service, type_ids) {
MM::Engine e;
auto tss1_id = e.type<TestService1>();
auto tss2_id = e.type<TestService2>();
auto tss2d_id = e.type<TestService2Derived>();
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<TestService1>();
auto tss2_id = e.type<TestService2>();
ASSERT_NE(tss1_id, tss2_id);
e.addService<TestService1>();
ASSERT_TRUE(e.enableService(tss1_id));
e.addService<TestService2>();
ASSERT_TRUE(e.enableService(tss2_id));
{
auto* tss1 = e.tryService<TestService1>();
ASSERT_NE(tss1, nullptr);
auto* tss2 = e.tryService<TestService2>();
ASSERT_NE(tss2, nullptr);
ASSERT_NE((void*)tss1, (void*)tss2);
}
e.disableService(tss1_id);
e.disableService<TestService2>(); // mixin'
}
TEST(engine_service, provide_type_ids) {
MM::Engine e;
auto tss2_id = e.type<TestService2>();
auto tss2d_id = e.type<TestService2Derived>();
e.addService<TestService2Derived>();
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<TestService2, TestService2Derived>(); ASSERT_TRUE(r);
{
auto* tdss = e.tryService<TestService2Derived>();
ASSERT_NE(tdss, nullptr);
auto* iss = e.tryService<TestService2>();
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<TestService1>();
ASSERT_TRUE(e.enableService<TestService1>());
{
auto* tss = e.tryService<TestService1>();
ASSERT_NE(tss, nullptr);
}
e.addFixedUpdate([](auto& e) { e.stop(); });
e.run();
e.disableService<TestService1>();
}

View File

@@ -0,0 +1,230 @@
#include <gtest/gtest.h>
#include <mm/engine.hpp>
TEST(engine_fixed_update, empty_add_rm) {
MM::Engine engine;
auto test_fun = [](auto&) {};
auto handle = engine.addFixedUpdate(test_fun);
ASSERT_NE(handle.lock(), nullptr);
handle.lock()->priority = 1;
engine.removeFixedUpdate(handle);
}
TEST(engine_update, empty_add_rm) {
MM::Engine engine;
auto test_fun = [](auto&) {};
auto handle = engine.addUpdate(test_fun);
ASSERT_NE(handle.lock(), nullptr);
handle.lock()->priority = 1;
engine.removeUpdate(handle);
}
TEST(engine_fixed_update, empty_run) {
MM::Engine engine;
auto test_fun = [](auto&) {};
auto handle = engine.addFixedUpdate(test_fun);
ASSERT_NE(handle.lock(), nullptr);
handle.lock()->priority = 1;
engine.fixedUpdate(); // single update
engine.removeFixedUpdate(handle);
}
TEST(engine_update, empty_run) {
MM::Engine engine;
auto test_fun = [](auto&) {};
auto handle = engine.addUpdate(test_fun);
ASSERT_NE(handle.lock(), nullptr);
handle.lock()->priority = 1;
engine.update();
engine.removeUpdate(handle);
}
TEST(engine_fixed_update, test_run) {
MM::Engine engine;
bool run = false;
auto test_fun = [&run](auto&) { run = true; };
auto handle = engine.addFixedUpdate(test_fun);
ASSERT_NE(handle.lock(), nullptr);
handle.lock()->priority = 1;
ASSERT_FALSE(run);
engine.fixedUpdate(); // single update
ASSERT_TRUE(run);
engine.removeFixedUpdate(handle);
}
TEST(engine_update, test_run) {
MM::Engine engine;
bool run = false;
auto test_fun = [&run](auto&) { run = true; };
auto handle = engine.addUpdate(test_fun);
ASSERT_NE(handle.lock(), nullptr);
handle.lock()->priority = 1;
ASSERT_FALSE(run);
engine.update();
ASSERT_TRUE(run);
engine.removeUpdate(handle);
}
TEST(engine_fixed_update, test_order_run) {
MM::Engine engine;
bool run1 = false;
bool run2 = false;
auto test_fun1 = [&](auto&) {
ASSERT_FALSE(run2);
run1 = true;
};
auto test_fun2 = [&](auto&) {
ASSERT_TRUE(run1);
run2 = true;
};
auto handle1 = engine.addFixedUpdate(test_fun1);
ASSERT_NE(handle1.lock(), nullptr);
handle1.lock()->priority = 1;
auto handle2 = engine.addFixedUpdate(test_fun2);
ASSERT_NE(handle2.lock(), nullptr);
handle2.lock()->priority = 0;
ASSERT_FALSE(run1);
ASSERT_FALSE(run2);
engine.fixedUpdate(); // single update
ASSERT_TRUE(run1);
ASSERT_TRUE(run2);
engine.removeFixedUpdate(handle1);
engine.removeFixedUpdate(handle2);
}
TEST(engine_fixed_update, test_order_rev_run) {
MM::Engine engine;
bool run1 = false;
bool run2 = false;
auto test_fun1 = [&](auto&) {
ASSERT_TRUE(run2);
run1 = true;
};
auto test_fun2 = [&](auto&) {
ASSERT_FALSE(run1);
run2 = true;
};
auto handle1 = engine.addFixedUpdate(test_fun1);
ASSERT_NE(handle1.lock(), nullptr);
handle1.lock()->priority = 0;
auto handle2 = engine.addFixedUpdate(test_fun2);
ASSERT_NE(handle2.lock(), nullptr);
handle2.lock()->priority = 1;
ASSERT_FALSE(run1);
ASSERT_FALSE(run2);
engine.fixedUpdate(); // single update
ASSERT_TRUE(run1);
ASSERT_TRUE(run2);
engine.removeFixedUpdate(handle1);
engine.removeFixedUpdate(handle2);
}
TEST(engine_update, test_order_run) {
MM::Engine engine;
bool run1 = false;
bool run2 = false;
auto test_fun1 = [&](auto&) {
ASSERT_FALSE(run2);
run1 = true;
};
auto test_fun2 = [&](auto&) {
ASSERT_TRUE(run1);
run2 = true;
};
auto handle1 = engine.addUpdate(test_fun1);
ASSERT_NE(handle1.lock(), nullptr);
handle1.lock()->priority = 1;
auto handle2 = engine.addUpdate(test_fun2);
ASSERT_NE(handle2.lock(), nullptr);
handle2.lock()->priority = 0;
ASSERT_FALSE(run1);
ASSERT_FALSE(run2);
engine.update(); // single update
ASSERT_TRUE(run1);
ASSERT_TRUE(run2);
engine.removeUpdate(handle1);
engine.removeUpdate(handle2);
}
TEST(engine_update, test_order_rev_run) {
MM::Engine engine;
bool run1 = false;
bool run2 = false;
auto test_fun1 = [&](auto&) {
ASSERT_TRUE(run2);
run1 = true;
};
auto test_fun2 = [&](auto&) {
ASSERT_FALSE(run1);
run2 = true;
};
auto handle1 = engine.addUpdate(test_fun1);
ASSERT_NE(handle1.lock(), nullptr);
handle1.lock()->priority = 0;
auto handle2 = engine.addUpdate(test_fun2);
ASSERT_NE(handle2.lock(), nullptr);
handle2.lock()->priority = 1;
ASSERT_FALSE(run1);
ASSERT_FALSE(run2);
engine.update(); // single update
ASSERT_TRUE(run1);
ASSERT_TRUE(run2);
engine.removeUpdate(handle1);
engine.removeUpdate(handle2);
}