aboutsummaryrefslogtreecommitdiff
path: root/test/base
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-03 14:54:51 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-03 15:29:07 +0800
commit9c897e8727d90345c2db7f36f52ab678778db936 (patch)
treee4eeb7454677a40603785cab77061aaaf6f7c66e /test/base
parent95d061e4fca2f7903ac903a2426cb5ad30c737f7 (diff)
downloadcru-9c897e8727d90345c2db7f36f52ab678778db936.tar.gz
cru-9c897e8727d90345c2db7f36f52ab678778db936.tar.bz2
cru-9c897e8727d90345c2db7f36f52ab678778db936.zip
Add TimerRegistry.
Diffstat (limited to 'test/base')
-rw-r--r--test/base/CMakeLists.txt1
-rw-r--r--test/base/TimerTest.cpp43
2 files changed, 44 insertions, 0 deletions
diff --git a/test/base/CMakeLists.txt b/test/base/CMakeLists.txt
index b008e1b3..39895c3e 100644
--- a/test/base/CMakeLists.txt
+++ b/test/base/CMakeLists.txt
@@ -5,6 +5,7 @@ add_executable(CruBaseTest
SelfResolvableTest.cpp
StringUtilTest.cpp
SubProcessTest.cpp
+ TimerTest.cpp
)
target_link_libraries(CruBaseTest PRIVATE CruBase CruTestBase)
diff --git a/test/base/TimerTest.cpp b/test/base/TimerTest.cpp
new file mode 100644
index 00000000..ca42f01f
--- /dev/null
+++ b/test/base/TimerTest.cpp
@@ -0,0 +1,43 @@
+#include "cru/base/Timer.h"
+
+#include <catch2/catch_test_macros.hpp>
+#include <chrono>
+
+using cru::TimerRegistry;
+using std::chrono::milliseconds;
+using namespace std::chrono_literals;
+
+TEST_CASE("TimerRegistry Works", "[timer]") {
+ TimerRegistry<int> registry;
+
+ REQUIRE_THROWS(registry.Add(1, -1ms, false));
+ REQUIRE_THROWS(registry.Add(1, 0ms, true));
+
+ auto mock_now = std::chrono::steady_clock::now();
+
+ auto timer1 = registry.Add(1, 50ms, false, mock_now);
+ auto timer2 = registry.Add(2, 100ms, false, mock_now);
+ auto timer3 = registry.Add(3, 60ms, true, mock_now);
+ auto timer4 = registry.Add(4, 100ms, true, mock_now);
+
+ mock_now += 20ms;
+ REQUIRE(registry.Update(mock_now) == std::nullopt);
+ REQUIRE(registry.NextTimeout(mock_now) == 30ms);
+
+ mock_now += 30ms;
+ REQUIRE(registry.Update(mock_now) ==
+ TimerRegistry<int>::UpdateResult{timer1, 1});
+ REQUIRE(registry.Update(mock_now) == std::nullopt);
+ REQUIRE(registry.NextTimeout(mock_now) == 10ms);
+
+ mock_now += 20ms;
+ REQUIRE(registry.Update(mock_now) ==
+ TimerRegistry<int>::UpdateResult{timer3, 3});
+ REQUIRE(registry.Update(mock_now) == std::nullopt);
+ REQUIRE(registry.NextTimeout(mock_now) == 30ms);
+
+ mock_now += 200ms;
+ int count = 0;
+ while (registry.Update(mock_now)) { count++;}
+ REQUIRE(count == 6);
+}