From 9c897e8727d90345c2db7f36f52ab678778db936 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Mon, 3 Nov 2025 14:54:51 +0800 Subject: Add TimerRegistry. --- test/base/CMakeLists.txt | 1 + test/base/TimerTest.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 test/base/TimerTest.cpp (limited to 'test/base') 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 +#include + +using cru::TimerRegistry; +using std::chrono::milliseconds; +using namespace std::chrono_literals; + +TEST_CASE("TimerRegistry Works", "[timer]") { + TimerRegistry 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::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::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); +} -- cgit v1.2.3