summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorThiago Marcos P. Santos <thiago@mapbox.com>2015-11-26 16:49:45 +0200
committerThiago Marcos P. Santos <thiago@mapbox.com>2015-12-01 11:49:01 +0200
commitff4783847486d414052803ea1a50f6806513967a (patch)
tree654b3c46e7eaa6cdff08b7bd649c97cd14a05d72 /test
parent9b36c19aeb4f05e11a496d67e7388a4df0820361 (diff)
downloadqtlocation-mapboxgl-ff4783847486d414052803ea1a50f6806513967a.tar.gz
[tests] Add utests for Timer
Diffstat (limited to 'test')
-rw-r--r--test/miscellaneous/timer.cpp179
-rw-r--r--test/test.gypi1
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',