mirror of
https://github.com/MadeOfJelly/MushMachine.git
synced 2025-08-23 07:56:40 +02:00
initial import, >900commits predate this
This commit is contained in:
16
framework/engine/test/CMakeLists.txt
Normal file
16
framework/engine/test/CMakeLists.txt
Normal 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)
|
||||
|
38
framework/engine/test/default_service_test.cpp
Normal file
38
framework/engine/test/default_service_test.cpp
Normal 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>();
|
||||
}
|
||||
|
61
framework/engine/test/run_test.cpp
Normal file
61
framework/engine/test/run_test.cpp
Normal 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);
|
||||
}
|
||||
|
228
framework/engine/test/service_system_test.cpp
Normal file
228
framework/engine/test/service_system_test.cpp
Normal 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>();
|
||||
}
|
||||
|
230
framework/engine/test/update_test.cpp
Normal file
230
framework/engine/test/update_test.cpp
Normal 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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user