1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-07-02 16:38:41 +00:00

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
This commit is contained in:
Loïc Blot 2018-03-30 18:32:52 +02:00 committed by GitHub
parent 2c490dddc0
commit ce873108aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 249 additions and 185 deletions

View file

@ -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)

View file

@ -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;

View file

@ -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);
}