#include #include "uvco/loop/loop.h" #include "uvco/promise/multipromise.h" #include "uvco/promise/promise.h" #include "uvco/timer.h" #include "test_util.h" #include #include namespace { using namespace uvco; TEST(TimerTest, simpleWait) { bool ran = false; auto setup = [&](const Loop &loop) -> Promise { co_await sleep(loop, 1); ran = true; }; run_loop(setup); EXPECT_TRUE(ran); } TEST(TimerTest, tickerTest) { constexpr static uint64_t count = 3; uint64_t counter = 0; auto setup = [&](const Loop &loop) -> Promise { auto ticker = tick(loop, 1, count); MultiPromise tickerProm = ticker->ticker(); while (true) { std::optional got = co_await tickerProm; if (got) { EXPECT_EQ(*got, counter); ++counter; } else { break; } } ticker->close(); }; run_loop(setup); EXPECT_EQ(counter, count); } TEST(TimerTest, infiniteTickerTest) { constexpr static uint64_t count = 3; uint64_t counter = 0; auto setup = [&](const Loop &loop) -> Promise { auto ticker = tick(loop, 1, 0); MultiPromise tickerProm = ticker->ticker(); for (counter = 0; counter < count; ++counter) { EXPECT_EQ(counter, *(co_await tickerProm)); } ticker->close(); }; run_loop(setup); EXPECT_EQ(counter, count); } TEST(TimerTest, finiteTickerTest) { constexpr static uint64_t stopAfter = 3; uint64_t counter = 0; auto setup = [&](const Loop &loop) -> Promise { auto ticker = tick(loop, 1, stopAfter); MultiPromise tickerProm = ticker->ticker(); for (counter = 0; counter < stopAfter; ++counter) { EXPECT_EQ(counter, *(co_await tickerProm)); } ticker->close(); }; run_loop(setup); EXPECT_EQ(counter, stopAfter); } TEST(TimerTest, finiteTickerIncompleteTest) { constexpr static uint64_t count = 10; constexpr static uint64_t stopAfter = count - 1; uint64_t counter = 0; auto setup = [&](const Loop &loop) -> Promise { auto ticker = tick(loop, 1, count); MultiPromise tickerProm = ticker->ticker(); for (counter = 0; counter < stopAfter; ++counter) { EXPECT_EQ(counter, *(co_await tickerProm)); } }; run_loop(setup); EXPECT_EQ(counter, stopAfter); } } // namespace