From ce873108aa91d19104f46c5acd3350385e7a4541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Fri, 30 Mar 2018 18:32:52 +0200 Subject: Client eventmanager refactor (#7179) * Drop EventManager from GameDef & do some client cleanups * EventManager is only used by Client. Don't expose it on Server & GameDef for nothing * Drop Client::event() in favor of direct calls to getEventManager * Cleanup some event put from new + put to put(new) * MtEvent: add Type(u8) enum * This will enhance event performance & ensure stricter type * Drop MtEvent::checkIs (unused) * clang-tidy reported fixes * Code style * Move event_manager.h to the client directory as it's only used by client Add EventManager unittests + switch to unordered_map as order is not important here Drop a unused function --- src/unittest/CMakeLists.txt | 1 + src/unittest/test.cpp | 2 - src/unittest/test_eventmanager.cpp | 112 +++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 src/unittest/test_eventmanager.cpp (limited to 'src/unittest') diff --git a/src/unittest/CMakeLists.txt b/src/unittest/CMakeLists.txt index aca736f3e..733eabae3 100644 --- a/src/unittest/CMakeLists.txt +++ b/src/unittest/CMakeLists.txt @@ -31,6 +31,7 @@ set (UNITTEST_SRCS PARENT_SCOPE) set (UNITTEST_CLIENT_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/test_eventmanager.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_gameui.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_keycode.cpp PARENT_SCOPE) diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index 18215a947..7a0ef16b1 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -51,7 +51,6 @@ public: ITextureSource *getTextureSource() { return m_texturesrc; } IShaderSource *getShaderSource() { return m_shadersrc; } ISoundManager *getSoundManager() { return m_soundmgr; } - MtEventManager *getEventManager() { return m_eventmgr; } scene::ISceneManager *getSceneManager() { return m_scenemgr; } IRollbackManager *getRollbackManager() { return m_rollbackmgr; } EmergeManager *getEmergeManager() { return m_emergemgr; } @@ -86,7 +85,6 @@ private: ITextureSource *m_texturesrc = nullptr; IShaderSource *m_shadersrc = nullptr; ISoundManager *m_soundmgr = nullptr; - MtEventManager *m_eventmgr = nullptr; scene::ISceneManager *m_scenemgr = nullptr; IRollbackManager *m_rollbackmgr = nullptr; EmergeManager *m_emergemgr = nullptr; diff --git a/src/unittest/test_eventmanager.cpp b/src/unittest/test_eventmanager.cpp new file mode 100644 index 000000000..bb0e59336 --- /dev/null +++ b/src/unittest/test_eventmanager.cpp @@ -0,0 +1,112 @@ +/* +Minetest +Copyright (C) 2018 nerzhul, Loic BLOT + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include +#include "test.h" +#include "client/event_manager.h" + +class TestEventManager : public TestBase +{ +public: + TestEventManager() { TestManager::registerTestModule(this); } + const char *getName() override { return "TestEventManager"; } + + void runTests(IGameDef *gamedef) override; + + void testRegister(); + void testDeregister(); + void testRealEvent(); + void testRealEventAfterDereg(); +}; + +// EventManager test class +class EventManagerTest : public EventManager +{ +public: + static void eventTest(MtEvent *e, void *data) + { + UASSERT(e->getType() >= 0); + UASSERT(e->getType() < MtEvent::TYPE_MAX); + EventManagerTest *emt = (EventManagerTest *)data; + emt->m_test_value = e->getType(); + } + + u64 getTestValue() const { return m_test_value; } + void resetValue() { m_test_value = 0; } + +private: + u64 m_test_value = 0; +}; + +static TestEventManager g_test_instance; + +void TestEventManager::runTests(IGameDef *gamedef) +{ + TEST(testRegister); + TEST(testDeregister); + TEST(testRealEvent); + TEST(testRealEventAfterDereg); +} + +void TestEventManager::testRegister() +{ + EventManager ev; + ev.reg(MtEvent::PLAYER_DAMAGE, nullptr, nullptr); + ev.reg(MtEvent::PLAYER_DAMAGE, nullptr, nullptr); +} + +void TestEventManager::testDeregister() +{ + EventManager ev; + ev.dereg(MtEvent::NODE_DUG, nullptr, nullptr); + ev.reg(MtEvent::PLAYER_DAMAGE, nullptr, nullptr); + ev.dereg(MtEvent::PLAYER_DAMAGE, nullptr, nullptr); +} + +void TestEventManager::testRealEvent() +{ + EventManager ev; + std::unique_ptr emt(new EventManagerTest()); + ev.reg(MtEvent::PLAYER_REGAIN_GROUND, EventManagerTest::eventTest, emt.get()); + + // Put event & verify event value + ev.put(new SimpleTriggerEvent(MtEvent::PLAYER_REGAIN_GROUND)); + UASSERT(emt->getTestValue() == MtEvent::PLAYER_REGAIN_GROUND); +} + +void TestEventManager::testRealEventAfterDereg() +{ + EventManager ev; + std::unique_ptr emt(new EventManagerTest()); + ev.reg(MtEvent::PLAYER_REGAIN_GROUND, EventManagerTest::eventTest, emt.get()); + + // Put event & verify event value + ev.put(new SimpleTriggerEvent(MtEvent::PLAYER_REGAIN_GROUND)); + UASSERT(emt->getTestValue() == MtEvent::PLAYER_REGAIN_GROUND); + + // Reset internal value + emt->resetValue(); + + // Remove the registered event + ev.dereg(MtEvent::PLAYER_REGAIN_GROUND, EventManagerTest::eventTest, emt.get()); + + // Push the new event & ensure we target the default value + ev.put(new SimpleTriggerEvent(MtEvent::PLAYER_REGAIN_GROUND)); + UASSERT(emt->getTestValue() == 0); +} \ No newline at end of file -- cgit v1.2.3