From 8c658601530e8f08ba98d22e27030139f0daab62 Mon Sep 17 00:00:00 2001 From: Samsonium Date: Sat, 3 Oct 2026 15:24:21 +0300 Subject: [PATCH] feat: impl lifecycle with tests --- CMakeLists.txt | 15 +++++- include/engine/core/engine.hpp | 20 +++---- include/engine/core/engine_module_api.hpp | 17 +++--- src/engine/core/engine.cpp | 9 +++- tests/engine/lifecycle_test.cpp | 64 +++++++++++++++++++++++ 5 files changed, 107 insertions(+), 18 deletions(-) create mode 100644 tests/engine/lifecycle_test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 86dffa8..64689e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,16 +30,25 @@ add_executable(engine_test src/engine/core/engine.cpp src/engine/core/engine_db_provider.cpp ) +add_executable(lifecycle_test + tests/engine/lifecycle_test.cpp + src/engine/core/engine.cpp + src/engine/core/engine_db_provider.cpp +) target_include_directories(event_bus_test PUBLIC "${CMAKE_SOURCE_DIR}/include") target_link_libraries(event_bus_test PRIVATE SQLite::SQLite3) -target_include_directories(db_provider_test PUBLIC "${CMAKE_SOURCE_DIR}/include") +target_include_directories(db_provider_test PUBLIC + "${CMAKE_SOURCE_DIR}/include") target_link_libraries(db_provider_test PRIVATE SQLite::SQLite3) target_include_directories(engine_test PUBLIC "${CMAKE_SOURCE_DIR}/include") target_link_libraries(engine_test PRIVATE SQLite::SQLite3) +target_include_directories(lifecycle_test PUBLIC "${CMAKE_SOURCE_DIR}/include") +target_link_libraries(lifecycle_test PRIVATE SQLite::SQLite3) + add_test( NAME "Event Bus" COMMAND event_bus_test @@ -52,3 +61,7 @@ add_test( NAME "Engine" COMMAND engine_test ) +add_test( + NAME "Lifecycle" + COMMAND lifecycle_test +) diff --git a/include/engine/core/engine.hpp b/include/engine/core/engine.hpp index bd6e794..0e194da 100644 --- a/include/engine/core/engine.hpp +++ b/include/engine/core/engine.hpp @@ -8,41 +8,43 @@ #include #include -/// Magic Srolls engine core +/// Ядро движка Magic Srolls class MscEngine : public IMscEngineModuleAPI { private: - /// @brief Loaded modules list + /// @brief Загруженные модули std::vector> _modules; - /// @brief Common event bus + /// @brief Общая событийная шина движка MscEventBus _bus; - /// @brief Is engine running rn + /// @brief Флаг работы движка bool _isRunning = false; - /// @brief Last update time + /// @brief Время последнего тика clock::time_point _lastUpdate; public: - /// Actual version + /// @brief Номер ревизии static uint16_t REV; MscEngine(std::vector> modules); + ~MscEngine() = default; - /// @brief Start engine + /// @brief Запустить движок void start(); - /// @brief Stop engine + /// @brief Остановить движок void stop(); MscEventBus &getBus() override; std::unordered_map getLoadedModules() const override; - MscEngineModule &getModule(const std::string &name) override; + std::shared_ptr &getModule(const std::string &name) override; std::unique_ptr createDBProvider() override; std::unique_ptr createDBProvider(const std::string &filepath) override; + void requestStop() override; }; #endif // __MCS_ENGINE_HPP__ diff --git a/include/engine/core/engine_module_api.hpp b/include/engine/core/engine_module_api.hpp index 0a734ea..b7a2cc0 100644 --- a/include/engine/core/engine_module_api.hpp +++ b/include/engine/core/engine_module_api.hpp @@ -10,6 +10,7 @@ class MscEngineModule; +/// @brief Публичный API движка для модулей class IMscEngineModuleAPI { public: @@ -17,22 +18,26 @@ public: virtual ~IMscEngineModuleAPI() = default; - /// @brief Get access to engine event bus + /// @brief Получить доступ к событийной шине virtual MscEventBus &getBus() = 0; - /// @brief Get access to loaded module list + /// @brief Получить список загруженных модулей virtual std::unordered_map getLoadedModules() const = 0; - /// @brief Access module by its name - virtual MscEngineModule &getModule(const std::string &name) = 0; + /// @brief Получить прямой доступ к модулю + virtual std::shared_ptr & + getModule(const std::string &name) = 0; - /// @brief Create database provider with in-memory database + /// @brief Создать провайдер БД с хранением в памяти virtual std::unique_ptr createDBProvider() = 0; - /// @brief Create database provider with file database + /// @brief Создать провайдер БД с указанным файлом virtual std::unique_ptr createDBProvider(const std::string &filepath) = 0; + + /// @brief Запросить остановку движка + virtual void requestStop() = 0; }; #endif // __MSC_ENGINE_MODULE_API_HPP__ diff --git a/src/engine/core/engine.cpp b/src/engine/core/engine.cpp index 7010fff..927ae43 100644 --- a/src/engine/core/engine.cpp +++ b/src/engine/core/engine.cpp @@ -132,12 +132,12 @@ MscEngine::getLoadedModules() const return result; } -MscEngineModule &MscEngine::getModule(const std::string &name) +std::shared_ptr &MscEngine::getModule(const std::string &name) { for (auto &module : _modules) { if (module.get()->getName() == name) - return *module.get(); + return module; } throw std::runtime_error("Module not found: " + name); @@ -153,3 +153,8 @@ MscEngine::createDBProvider(const std::string &filepath) { return std::make_unique(filepath); } + +void MscEngine::requestStop() +{ + this->stop(); // TODO: заменить на флаг +} diff --git a/tests/engine/lifecycle_test.cpp b/tests/engine/lifecycle_test.cpp new file mode 100644 index 0000000..d12916c --- /dev/null +++ b/tests/engine/lifecycle_test.cpp @@ -0,0 +1,64 @@ +#include "engine/core/engine.hpp" +#include "engine/core/engine_module.hpp" +#include "engine/utils/rev_range.hpp" +#include +#include +#include +#include +#include + +bool onInitWasCalled = false; +bool onStartWasCalled = false; +bool onUpdateWasCalled = false; +bool onStopWasCalled = false; + +class TestModule : public MscEngineModule +{ +public: + std::string getName() const override { return "test_mod"; } + std::uint16_t getRev() const override { return 1; } + const std::unordered_map & + getDependencies() const override + { + static const std::unordered_map deps{}; + return deps; + } + + void onInitialize(IMscEngineModuleAPI &engine) override + { + onInitWasCalled = true; + } + + void onStart(IMscEngineModuleAPI &engine) override + { + onStartWasCalled = true; + } + + void onUpdate(IMscEngineModuleAPI &engine, + IMscEngineModuleAPI::clock::duration dt) override + { + onUpdateWasCalled = true; + engine.requestStop(); + } + + void onStop(IMscEngineModuleAPI &engine) override { onStopWasCalled = true; } + + void onDestory(IMscEngineModuleAPI &engine) override {} +}; + +void testStates() +{ + MscEngine engine({std::make_shared()}); + engine.start(); + + assert(onInitWasCalled); + assert(onStartWasCalled); + assert(onUpdateWasCalled); + assert(onStopWasCalled); +} + +int main() +{ + testStates(); + return 0; +}