aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarbenium <carbenium@outlook.com>2020-07-25 17:59:34 +0200
committerPeter Keresztes Schmidt <carbenium@outlook.com>2020-07-26 23:20:11 +0200
commit4470b9122379dc846b322a441951a03913912b71 (patch)
tree308db08b04862d72c067ace4641c58b569982697
parente877f988d1c4e1361612f3d5c4ebe915f746aee5 (diff)
Core/EventMap: Unify semantics of DelayEvents
DelayEvents(Milliseconds delay) had different semantics than DelayEvents(Milliseconds delay, uint32 group). The first method delayed the events only in the case the internal timer already ticked at least for the amount of delay. In contrast the latter method delayed events regardless of the internal timer value. Use the latter semantics for DelayEvents(Milliseconds delay) as well which makes the outcome more predictable. Adapt tests accordingly.
-rw-r--r--src/common/Utilities/EventMap.cpp11
-rw-r--r--src/common/Utilities/EventMap.h2
-rw-r--r--tests/common/test-EventMap.cpp9
3 files changed, 17 insertions, 5 deletions
diff --git a/src/common/Utilities/EventMap.cpp b/src/common/Utilities/EventMap.cpp
index de3400b403f..8e09d21ed6d 100644
--- a/src/common/Utilities/EventMap.cpp
+++ b/src/common/Utilities/EventMap.cpp
@@ -94,7 +94,16 @@ uint32 EventMap::ExecuteEvent()
void EventMap::DelayEvents(Milliseconds delay)
{
- _time = delay < _time - _time.min() ? _time - delay : TimePoint::min();
+ if (Empty())
+ return;
+
+ EventStore delayed = std::move(_eventMap);
+ for (EventStore::iterator itr = delayed.begin(); itr != delayed.end();)
+ {
+ EventStore::node_type node = delayed.extract(itr++);
+ node.key() = node.key() + delay;
+ _eventMap.insert(_eventMap.end(), std::move(node));
+ }
}
void EventMap::DelayEvents(Milliseconds delay, uint32 group)
diff --git a/src/common/Utilities/EventMap.h b/src/common/Utilities/EventMap.h
index 37e4fcb0bfb..97916e711b9 100644
--- a/src/common/Utilities/EventMap.h
+++ b/src/common/Utilities/EventMap.h
@@ -179,7 +179,7 @@ public:
/**
* @name DelayEvents
- * @brief Delays all events. If delay is greater than or equal internal timer, delay will be 0.
+ * @brief Delays all events.
* @param delay Amount of delay as std::chrono type.
*/
void DelayEvents(Milliseconds delay);
diff --git a/tests/common/test-EventMap.cpp b/tests/common/test-EventMap.cpp
index 89d3c4d2bb2..9a28361d930 100644
--- a/tests/common/test-EventMap.cpp
+++ b/tests/common/test-EventMap.cpp
@@ -15,7 +15,9 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
#include "catch2/catch.hpp"
+
#include "EventMap.h"
enum EVENTS
@@ -282,8 +284,8 @@ TEST_CASE("Delay all events", "[EventMap]")
{
eventMap.DelayEvents(1s);
- // Timer hasn't ticked yet, so maximum delay is 0ms: 1s (init) + 0s (delay) = 1s
- REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 1s);
+ // 1s (init) + 1s (delay) = 2s
+ REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 2s);
}
SECTION("With timer update smaller than delay")
@@ -291,7 +293,8 @@ TEST_CASE("Delay all events", "[EventMap]")
eventMap.Update(500);
eventMap.DelayEvents(1s);
- REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 1s);
+ // 1s (init) + 1s (delay) - 500ms (tick) = 1500ms
+ REQUIRE(eventMap.GetTimeUntilEvent(EVENT_1) == 1500ms);
}
SECTION("With timer update larger than delay")