summaryrefslogtreecommitdiff
path: root/src/unittest
diff options
context:
space:
mode:
authorLoïc Blot <nerzhul@users.noreply.github.com>2018-03-30 18:32:52 +0200
committerGitHub <noreply@github.com>2018-03-30 18:32:52 +0200
commitce873108aa91d19104f46c5acd3350385e7a4541 (patch)
tree58672a3c803469de71c9ae270beb9a052ba5559a /src/unittest
parent2c490dddc037d7d1cf211bbf28309e31b0abdadd (diff)
downloadminetest-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.txt1
-rw-r--r--src/unittest/test.cpp2
-rw-r--r--src/unittest/test_eventmanager.cpp112
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