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:
parent
2c490dddc0
commit
ce873108aa
15 changed files with 249 additions and 185 deletions
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
112
src/unittest/test_eventmanager.cpp
Normal file
112
src/unittest/test_eventmanager.cpp
Normal 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);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue