aboutsummaryrefslogtreecommitdiff
path: root/tests/common/EventMap.cpp
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2020-08-29 22:03:22 +0200
committerGitHub <noreply@github.com>2020-08-29 22:03:22 +0200
commit8ce3635d39dbdd101ddf180a66c483162df99c04 (patch)
treee3ea530823bf22d00f99419c3492de718eff3e3d /tests/common/EventMap.cpp
parent2c3d3c31b22c958c135627009de6c4a1cf213aa9 (diff)
UnitTests: Cleanup + StringConvert/ChatCommand tests (PR #25353)
Diffstat (limited to 'tests/common/EventMap.cpp')
-rw-r--r--tests/common/EventMap.cpp386
1 files changed, 386 insertions, 0 deletions
diff --git a/tests/common/EventMap.cpp b/tests/common/EventMap.cpp
new file mode 100644
index 00000000000..1f3ff927fef
--- /dev/null
+++ b/tests/common/EventMap.cpp
@@ -0,0 +1,386 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 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 General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
+#include "tc_catch2.h"
+
+#include "EventMap.h"
+
+enum EVENTS
+{
+ EVENT_1 = 1,
+ EVENT_2 = 2,
+ EVENT_3 = 3
+};
+
+enum PHASES
+{
+ PHASE_1 = 1,
+ PHASE_2 = 2
+};
+
+enum GROUPS
+{
+ GROUP_1 = 1,
+ GROUP_2 = 2
+};
+
+TEST_CASE("Schedule an event", "[EventMap]")
+{
+ EventMap eventMap;
+
+ REQUIRE(eventMap.Empty());
+
+ eventMap.ScheduleEvent(EVENT_1, 1s);
+
+ REQUIRE_FALSE(eventMap.Empty());
+
+ SECTION("Event has not yet reached its delay")
+ {
+ eventMap.Update(100);
+ uint32 id = eventMap.ExecuteEvent();
+
+ REQUIRE(id == 0);
+ REQUIRE_FALSE(eventMap.Empty());
+ REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 900ms);
+ }
+
+ SECTION("Event has reached its delay")
+ {
+ eventMap.Update(1000);
+ uint32 id = eventMap.ExecuteEvent();
+
+ REQUIRE(id == EVENT_1);
+ REQUIRE(eventMap.Empty());
+ REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == Milliseconds::max());
+ }
+
+ SECTION("Event is past it's execution time")
+ {
+ eventMap.Update(2000);
+
+ REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == -1s);
+ }
+}
+
+TEST_CASE("Schedule existing event", "[EventMap]")
+{
+ EventMap eventMap;
+
+ SECTION("Same time")
+ {
+ eventMap.ScheduleEvent(EVENT_1, 1s);
+ eventMap.ScheduleEvent(EVENT_1, 1s);
+
+ eventMap.Update(1000);
+ uint32 id = eventMap.ExecuteEvent();
+ REQUIRE(id == EVENT_1);
+
+ id = eventMap.ExecuteEvent();
+ REQUIRE(id == EVENT_1);
+
+ REQUIRE(eventMap.Empty());
+ }
+
+ SECTION("Different time")
+ {
+ eventMap.ScheduleEvent(EVENT_1, 1s);
+ eventMap.ScheduleEvent(EVENT_1, 2s);
+
+ eventMap.Update(1000);
+ uint32 id = eventMap.ExecuteEvent();
+ REQUIRE(id == EVENT_1);
+
+ eventMap.Update(1000);
+ id = eventMap.ExecuteEvent();
+ REQUIRE(id == EVENT_1);
+
+ REQUIRE(eventMap.Empty());
+ }
+}
+
+TEST_CASE("Cancel a scheduled event", "[EventMap]")
+{
+ EventMap eventMap;
+
+ eventMap.ScheduleEvent(EVENT_1, 1s);
+ eventMap.ScheduleEvent(EVENT_2, 1s);
+
+ eventMap.CancelEvent(EVENT_1);
+ REQUIRE_FALSE(eventMap.Empty());
+
+ eventMap.Update(1000);
+ uint32 id = eventMap.ExecuteEvent();
+
+ REQUIRE(id == EVENT_2);
+ REQUIRE(eventMap.Empty());
+}
+
+TEST_CASE("Cancel non-existing event", "[EventMap]")
+{
+ EventMap eventMap;
+ REQUIRE(eventMap.Empty());
+
+ eventMap.CancelEvent(EVENT_1);
+ REQUIRE(eventMap.Empty());
+}
+
+TEST_CASE("Reschedule an event", "[EventMap]")
+{
+ EventMap eventMap;
+
+ eventMap.ScheduleEvent(EVENT_1, 1s);
+ eventMap.RescheduleEvent(EVENT_1, 2s);
+
+ eventMap.Update(1000);
+ uint32 id = eventMap.ExecuteEvent();
+
+ REQUIRE(id == 0);
+
+ eventMap.Update(1000);
+ id = eventMap.ExecuteEvent();
+
+ REQUIRE(id == EVENT_1);
+}
+
+TEST_CASE("Reschedule a non-scheduled event", "[EventMap]")
+{
+ EventMap eventMap;
+
+ eventMap.RescheduleEvent(EVENT_1, 2s);
+
+ eventMap.Update(1000);
+ uint32 id = eventMap.ExecuteEvent();
+
+ REQUIRE(id == 0);
+
+ eventMap.Update(1000);
+ id = eventMap.ExecuteEvent();
+
+ REQUIRE(id == EVENT_1);
+}
+
+TEST_CASE("Repeat an event (empty map)", "[EventMap]")
+{
+ EventMap eventMap;
+
+ eventMap.Repeat(1s);
+ eventMap.Update(1s);
+
+ uint32 id = eventMap.ExecuteEvent();
+ REQUIRE(id == 0);
+}
+
+TEST_CASE("Repeat an event (populated map)", "[EventMap]")
+{
+ EventMap eventMap;
+ eventMap.ScheduleEvent(EVENT_1, 1s);
+
+ SECTION("Scheduled event with delay not reached")
+ {
+ eventMap.Update(500ms);
+ eventMap.Repeat(1s);
+
+ uint32 id = eventMap.ExecuteEvent();
+ REQUIRE(id == 0);
+ }
+
+ SECTION("Scheduled event with delay not reached")
+ {
+ eventMap.Update(1s);
+ eventMap.Repeat(1s);
+
+ uint32 id = eventMap.ExecuteEvent();
+ REQUIRE(id == EVENT_1);
+ }
+}
+
+TEST_CASE("Schedule event with phase", "[EventMap]")
+{
+ EventMap eventMap;
+ REQUIRE(eventMap.Empty());
+
+ eventMap.ScheduleEvent(EVENT_1, 1s, 0, PHASE_1);
+ eventMap.ScheduleEvent(EVENT_2, 1s, 0, PHASE_2);
+
+ SECTION("In default phase. Execute all events.")
+ {
+ eventMap.Update(1000);
+
+ uint32 id = eventMap.ExecuteEvent();
+ REQUIRE(id == EVENT_1);
+ REQUIRE_FALSE(eventMap.Empty());
+
+ id = eventMap.ExecuteEvent();
+ REQUIRE(id == EVENT_2);
+ REQUIRE(eventMap.Empty());
+ }
+
+ SECTION("Execute only events of specified phase")
+ {
+ eventMap.SetPhase(PHASE_1);
+ eventMap.Update(1000);
+
+ uint32 id = eventMap.ExecuteEvent();
+ REQUIRE(id == EVENT_1);
+ REQUIRE_FALSE(eventMap.Empty());
+
+ id = eventMap.ExecuteEvent();
+ REQUIRE(id == 0);
+ REQUIRE(eventMap.Empty());
+ }
+
+ SECTION("Execute events from multiple phases (1)")
+ {
+ eventMap.AddPhase(PHASE_1);
+ eventMap.AddPhase(PHASE_2);
+ eventMap.Update(1000);
+
+ uint32 id = eventMap.ExecuteEvent();
+ REQUIRE(id == EVENT_1);
+ REQUIRE_FALSE(eventMap.Empty());
+
+ id = eventMap.ExecuteEvent();
+ REQUIRE(id == EVENT_2);
+ REQUIRE(eventMap.Empty());
+ }
+
+ SECTION("Execute events from multiple phases (2)")
+ {
+ eventMap.AddPhase(PHASE_1);
+ eventMap.Update(1000);
+
+ uint32 id = eventMap.ExecuteEvent();
+ REQUIRE(id == EVENT_1);
+ REQUIRE_FALSE(eventMap.Empty());
+
+ eventMap.RemovePhase(PHASE_2);
+ id = eventMap.ExecuteEvent();
+ REQUIRE(id == 0);
+ REQUIRE(eventMap.Empty());
+ }
+}
+
+TEST_CASE("Phase helper methods", "[EventMap]")
+{
+ EventMap eventMap;
+
+ eventMap.SetPhase(PHASE_1);
+ REQUIRE(eventMap.GetPhaseMask() == 0x1);
+ REQUIRE(eventMap.IsInPhase(PHASE_1));
+ REQUIRE_FALSE(eventMap.IsInPhase(PHASE_2));
+
+ eventMap.AddPhase(PHASE_2);
+ REQUIRE(eventMap.GetPhaseMask() == 0x3);
+ REQUIRE(eventMap.IsInPhase(PHASE_1));
+ REQUIRE(eventMap.IsInPhase(PHASE_2));
+
+ eventMap.RemovePhase(PHASE_1);
+ REQUIRE(eventMap.GetPhaseMask() == 0x2);
+ REQUIRE_FALSE(eventMap.IsInPhase(PHASE_1));
+ REQUIRE(eventMap.IsInPhase(PHASE_2));
+}
+
+TEST_CASE("Cancel event group", "[EventMap]")
+{
+ EventMap eventMap;
+ eventMap.ScheduleEvent(EVENT_2, 1s, GROUP_1);
+
+ SECTION("Only event in group")
+ {
+ eventMap.CancelEventGroup(GROUP_1);
+ REQUIRE(eventMap.Empty());
+ }
+
+ SECTION("Group with groupless event")
+ {
+ eventMap.ScheduleEvent(EVENT_1, 1s);
+
+ eventMap.CancelEventGroup(GROUP_1);
+ REQUIRE_FALSE(eventMap.Empty());
+ }
+
+ SECTION("Two groups")
+ {
+ eventMap.ScheduleEvent(EVENT_1, 1s);
+ eventMap.ScheduleEvent(EVENT_3, 1s, GROUP_2);
+
+ eventMap.CancelEventGroup(GROUP_1);
+ REQUIRE_FALSE(eventMap.Empty());
+
+ eventMap.CancelEventGroup(GROUP_2);
+ REQUIRE_FALSE(eventMap.Empty());
+ }
+}
+
+TEST_CASE("Delay all events", "[EventMap]")
+{
+ EventMap eventMap;
+ eventMap.ScheduleEvent(EVENT_1, 1s);
+
+ REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 1s);
+
+ SECTION("Without timer update")
+ {
+ eventMap.DelayEvents(1s);
+
+ // 1s (init) + 1s (delay) = 2s
+ REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 2s);
+ }
+
+ SECTION("With timer update smaller than delay")
+ {
+ eventMap.Update(500);
+ eventMap.DelayEvents(1s);
+
+ // 1s (init) + 1s (delay) - 500ms (tick) = 1500ms
+ REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 1500ms);
+ }
+
+ SECTION("With timer update larger than delay")
+ {
+ eventMap.Update(2000);
+ eventMap.DelayEvents(1s);
+
+ // 1s (init) + 1s (delay) - 2s (tick) = 0s
+ REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 0s);
+ }
+}
+
+TEST_CASE("Delay grouped events", "[EventMap]")
+{
+ EventMap eventMap;
+ eventMap.ScheduleEvent(EVENT_1, 1s, GROUP_1);
+ eventMap.ScheduleEvent(EVENT_2, 2s, GROUP_2);
+ eventMap.ScheduleEvent(EVENT_3, 6s);
+
+ eventMap.Update(2000);
+ eventMap.DelayEvents(3s, GROUP_1);
+
+ REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 2s);
+ REQUIRE(eventMap.GetTimeUntilEvent(EVENT_2) == 0s);
+ REQUIRE(eventMap.GetTimeUntilEvent(EVENT_3) == 4s);
+}
+
+TEST_CASE("Reset map", "[EventMap]")
+{
+ EventMap eventMap;
+ eventMap.ScheduleEvent(EVENT_1, 1s);
+ eventMap.Reset();
+
+ REQUIRE(eventMap.Empty());
+}