minetest/src/unittest/test_eventmanager.cpp
Loïc Blot ce873108aa
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
2018-03-30 18:32:52 +02:00

112 lines
3.2 KiB
C++

/*
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);
}