Files
biboumi/tests/timed_events.cpp
T
Florent Le Coz 3c1889fbd0 Use Catch for our test suite
`make check` is also added to compile and run the tests
Catch is fetched with cmake automatically into the build directory when needed
2015-10-29 02:32:57 +01:00

63 lines
2.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "catch.hpp"
#include <utils/timed_events.hpp>
/**
* Let Catch know how to display std::chrono::duration values
*/
namespace Catch
{
template<typename Rep, typename Period> struct StringMaker<std::chrono::duration<Rep, Period>>
{
static std::string convert(const std::chrono::duration<Rep, Period>& value)
{
return std::to_string(std::chrono::duration_cast<std::chrono::milliseconds>(value).count()) + "ms";
}
};
}
/**
* TODO, use a mock clock instead of relying on the real time with a sleep:
* it’s unreliable on heavy load.
*/
#include <thread>
TEST_CASE("Test timed event expiration")
{
SECTION("Check what happens when there is no events")
{
CHECK(TimedEventsManager::instance().get_timeout() == utils::no_timeout);
CHECK(TimedEventsManager::instance().execute_expired_events() == 0);
}
// Add a single event
TimedEventsManager::instance().add_event(TimedEvent(std::chrono::steady_clock::now() + 50ms, [](){}));
// The event should not yet be expired
CHECK(TimedEventsManager::instance().get_timeout() > 0ms);
CHECK(TimedEventsManager::instance().execute_expired_events() == 0);
std::chrono::milliseconds timoute = TimedEventsManager::instance().get_timeout();
INFO("Sleeping for " << timoute.count() << "ms");
std::this_thread::sleep_for(timoute);
// Event is now expired
CHECK(TimedEventsManager::instance().execute_expired_events() == 1);
CHECK(TimedEventsManager::instance().get_timeout() == utils::no_timeout);
}
TEST_CASE("Test timed event cancellation")
{
auto now = std::chrono::steady_clock::now();
TimedEventsManager::instance().add_event(TimedEvent(now + 100ms, [](){ }, "un"));
TimedEventsManager::instance().add_event(TimedEvent(now + 200ms, [](){ }, "deux"));
TimedEventsManager::instance().add_event(TimedEvent(now + 300ms, [](){ }, "deux"));
CHECK(TimedEventsManager::instance().get_timeout() > 0ms);
CHECK(TimedEventsManager::instance().size() == 3);
CHECK(TimedEventsManager::instance().cancel("un") == 1);
CHECK(TimedEventsManager::instance().size() == 2);
CHECK(TimedEventsManager::instance().cancel("deux") == 2);
CHECK(TimedEventsManager::instance().get_timeout() == utils::no_timeout);
}