diff options
author | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-11-26 16:49:45 +0200 |
---|---|---|
committer | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-12-01 11:49:01 +0200 |
commit | ff4783847486d414052803ea1a50f6806513967a (patch) | |
tree | 654b3c46e7eaa6cdff08b7bd649c97cd14a05d72 /test | |
parent | 9b36c19aeb4f05e11a496d67e7388a4df0820361 (diff) | |
download | qtlocation-mapboxgl-ff4783847486d414052803ea1a50f6806513967a.tar.gz |
[tests] Add utests for Timer
Diffstat (limited to 'test')
-rw-r--r-- | test/miscellaneous/timer.cpp | 179 | ||||
-rw-r--r-- | test/test.gypi | 1 |
2 files changed, 180 insertions, 0 deletions
diff --git a/test/miscellaneous/timer.cpp b/test/miscellaneous/timer.cpp new file mode 100644 index 0000000000..aaac4e2f8e --- /dev/null +++ b/test/miscellaneous/timer.cpp @@ -0,0 +1,179 @@ +#include <mbgl/util/chrono.hpp> +#include <mbgl/util/timer.hpp> +#include <mbgl/util/run_loop.hpp> + +#include <memory> + +#include "../fixtures/util.hpp" + +using namespace mbgl::util; + +TEST(Timer, Basic) { + RunLoop loop; + + Timer timer; + timer.unref(); + + auto callback = [&loop] { loop.stop(); }; + + auto interval = std::chrono::milliseconds(300); + auto expectedTotalTime = interval; + + auto first = mbgl::Clock::now(); + timer.start(interval, mbgl::Duration::zero(), callback); + + loop.run(); + + using namespace std::chrono; + auto totalTime = duration_cast<milliseconds>(mbgl::Clock::now() - first); + + // These are not high precision timers. Especially libuv uses + // cached time from the beginning of of the main loop iteration + // and it is very prone to fire earlier, which is, odd. + EXPECT_GE(totalTime, expectedTotalTime * 0.8); + EXPECT_LE(totalTime, expectedTotalTime * 1.2); +} + +TEST(Timer, Repeat) { + RunLoop loop; + + Timer timer; + timer.unref(); + + unsigned count = 10; + auto callback = [&] { + if (!--count) { + loop.stop(); + } + }; + + auto interval = std::chrono::milliseconds(50); + auto expectedTotalTime = interval * count; + + auto first = mbgl::Clock::now(); + timer.start(interval, interval, callback); + + loop.run(); + + using namespace std::chrono; + auto totalTime = duration_cast<milliseconds>(mbgl::Clock::now() - first); + + EXPECT_GE(totalTime, expectedTotalTime * 0.8); + EXPECT_LE(totalTime, expectedTotalTime * 1.2); +} + +TEST(Timer, Stop) { + RunLoop loop; + + Timer timer1; + timer1.unref(); + + Timer timer2; + timer2.unref(); + + auto interval1 = std::chrono::milliseconds(50); + auto interval2 = std::chrono::milliseconds(250); + auto expectedTotalTime = interval2; + + int count = 0; + + auto callback1 = [&] { + ++count; + timer1.stop(); + }; + + auto callback2 = [&] { + ++count; + loop.stop(); + }; + + auto first = mbgl::Clock::now(); + timer1.start(interval1, interval1, callback1); + timer2.start(interval2, mbgl::Duration::zero(), callback2); + + loop.run(); + + using namespace std::chrono; + auto totalTime = duration_cast<milliseconds>(mbgl::Clock::now() - first); + + EXPECT_EQ(count, 2); + + EXPECT_GE(totalTime, expectedTotalTime * 0.8); + EXPECT_LE(totalTime, expectedTotalTime * 1.2); +} + +TEST(Timer, DestroyShouldStop) { + RunLoop loop; + + auto timer1 = std::make_unique<Timer>(); + timer1->unref(); + + Timer timer2; + timer2.unref(); + + auto interval1 = std::chrono::milliseconds(50); + auto interval2 = std::chrono::milliseconds(250); + auto expectedTotalTime = interval2; + + int count = 0; + + auto callback1 = [&] { + ++count; + timer1.reset(); + }; + + auto callback2 = [&] { + ++count; + loop.stop(); + }; + + auto first = mbgl::Clock::now(); + timer1->start(interval1, interval1, callback1); + timer2.start(interval2, mbgl::Duration::zero(), callback2); + + loop.run(); + + using namespace std::chrono; + auto totalTime = duration_cast<milliseconds>(mbgl::Clock::now() - first); + + EXPECT_EQ(count, 2); + + EXPECT_GE(totalTime, expectedTotalTime * 0.8); + EXPECT_LE(totalTime, expectedTotalTime * 1.2); +} + +TEST(Timer, StartOverrides) { + RunLoop loop; + + Timer timer; + timer.unref(); + + auto interval1 = std::chrono::milliseconds(50); + auto interval2 = std::chrono::milliseconds(250); + auto expectedTotalTime = interval1 + interval2; + + int count = 0; + + auto callback2 = [&] { + ++count; + loop.stop(); + }; + + auto callback1 = [&] { + ++count; + timer.start(interval2, mbgl::Duration::zero(), callback2); + }; + + auto first = mbgl::Clock::now(); + timer.start(interval1, mbgl::Duration::zero(), callback1); + + loop.run(); + + using namespace std::chrono; + auto totalTime = duration_cast<milliseconds>(mbgl::Clock::now() - first); + + EXPECT_EQ(count, 2); + + EXPECT_GE(totalTime, expectedTotalTime * 0.8); + EXPECT_LE(totalTime, expectedTotalTime * 1.2); +} diff --git a/test/test.gypi b/test/test.gypi index 74996a2e13..a9fe316e60 100644 --- a/test/test.gypi +++ b/test/test.gypi @@ -62,6 +62,7 @@ 'miscellaneous/text_conversions.cpp', 'miscellaneous/thread.cpp', 'miscellaneous/tile.cpp', + 'miscellaneous/timer.cpp', 'miscellaneous/token.cpp', 'miscellaneous/transform.cpp', 'miscellaneous/work_queue.cpp', |