diff options
author | Loïc Blot <nerzhul@users.noreply.github.com> | 2018-03-30 18:32:52 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-30 18:32:52 +0200 |
commit | ce873108aa91d19104f46c5acd3350385e7a4541 (patch) | |
tree | 58672a3c803469de71c9ae270beb9a052ba5559a /src/unittest | |
parent | 2c490dddc037d7d1cf211bbf28309e31b0abdadd (diff) | |
download | minetest-ce873108aa91d19104f46c5acd3350385e7a4541.tar.gz minetest-ce873108aa91d19104f46c5acd3350385e7a4541.tar.bz2 minetest-ce873108aa91d19104f46c5acd3350385e7a4541.zip |
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
Diffstat (limited to 'src/unittest')
-rw-r--r-- | src/unittest/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/unittest/test.cpp | 2 | ||||
-rw-r--r-- | src/unittest/test_eventmanager.cpp | 112 |
3 files changed, 113 insertions, 2 deletions
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 <loic.blot@unix-experience.fr> + +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 <unordered_map> +#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<EventManagerTest> 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<EventManagerTest> 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 |