aboutsummaryrefslogtreecommitdiff
path: root/src/unittest/test_eventmanager.cpp
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/test_eventmanager.cpp
parent2c490dddc037d7d1cf211bbf28309e31b0abdadd (diff)
downloadhax-minetest-server-ce873108aa91d19104f46c5acd3350385e7a4541.tar.gz
hax-minetest-server-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/test_eventmanager.cpp')
-rw-r--r--src/unittest/test_eventmanager.cpp112
1 files changed, 112 insertions, 0 deletions
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