0
|
1 /* |
|
2 * main.cpp -- test Irccd.ElapsedTimer API |
|
3 * |
|
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> |
|
5 * |
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
|
7 * purpose with or without fee is hereby granted, provided that the above |
|
8 * copyright notice and this permission notice appear in all copies. |
|
9 * |
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
17 */ |
|
18 |
|
19 #include <gtest/gtest.h> |
|
20 |
|
21 #include <thread> |
|
22 |
|
23 #include <js-irccd.h> |
|
24 #include <js-elapsed-timer.h> |
|
25 |
|
26 using namespace irccd; |
|
27 using namespace std::chrono_literals; |
|
28 |
|
29 /* |
|
30 * For all tests, we tolerate 30 ms because some systems have bigger lags. |
|
31 */ |
|
32 static constexpr int margin = 30; |
|
33 |
|
34 class TestElapsedTimer : public testing::Test { |
|
35 protected: |
|
36 js::Context m_context; |
|
37 |
|
38 TestElapsedTimer() |
|
39 { |
|
40 loadJsIrccd(m_context); |
|
41 loadJsElapsedTimer(m_context); |
|
42 } |
|
43 |
|
44 inline void assertRange(int value, int expected) const noexcept |
|
45 { |
|
46 if (value < (expected - margin) || value > (expected + margin)) |
|
47 FAIL() << value << " is bigger than [" << (expected - margin) << ", " << (expected + margin) << "]"; |
|
48 } |
|
49 }; |
|
50 |
|
51 TEST_F(TestElapsedTimer, standard) |
|
52 { |
|
53 m_context.peval(js::Script{"timer = new Irccd.ElapsedTimer();"}); |
|
54 |
|
55 std::this_thread::sleep_for(300ms); |
|
56 |
|
57 m_context.peval(js::Script{"result = timer.elapsed();"}); |
|
58 assertRange(m_context.getGlobal<int>("result"), 300); |
|
59 } |
|
60 |
|
61 TEST_F(TestElapsedTimer, reset) |
|
62 { |
|
63 m_context.peval(js::Script{"timer = new Irccd.ElapsedTimer();"}); |
|
64 |
|
65 std::this_thread::sleep_for(300ms); |
|
66 |
|
67 m_context.peval(js::Script{"timer.reset(); result = timer.elapsed();"}); |
|
68 assertRange(m_context.getGlobal<int>("result"), 0); |
|
69 } |
|
70 |
|
71 TEST_F(TestElapsedTimer, pause) |
|
72 { |
|
73 m_context.peval(js::Script{"timer = new Irccd.ElapsedTimer();"}); |
|
74 |
|
75 /* |
|
76 * Simulate a pause in the game like this: |
|
77 * |
|
78 * start pause restart elapsed |
|
79 * | 10ms |.5ms.| 6ms | |
|
80 * |
|
81 * Since the game was paused, the 5ms must not be totalized. |
|
82 */ |
|
83 std::this_thread::sleep_for(10ms); |
|
84 |
|
85 m_context.peval(js::Script{"timer.pause();"}); |
|
86 |
|
87 std::this_thread::sleep_for(5ms); |
|
88 |
|
89 m_context.peval(js::Script{"timer.restart();"}); |
|
90 |
|
91 std::this_thread::sleep_for(6ms); |
|
92 |
|
93 m_context.peval(js::Script{"result = timer.elapsed()"}); |
|
94 assertRange(m_context.getGlobal<int>("result"), 16); |
|
95 } |
|
96 |
|
97 TEST_F(TestElapsedTimer, doublecheck) |
|
98 { |
|
99 m_context.peval(js::Script{"timer = new Irccd.ElapsedTimer();"}); |
|
100 |
|
101 std::this_thread::sleep_for(50ms); |
|
102 |
|
103 m_context.peval(js::Script{"result = timer.elapsed()"}); |
|
104 |
|
105 std::this_thread::sleep_for(50ms); |
|
106 |
|
107 m_context.peval(js::Script{"result = timer.elapsed()"}); |
|
108 assertRange(m_context.getGlobal<int>("result"), 100); |
|
109 } |
|
110 |
|
111 int main(int argc, char **argv) |
|
112 { |
|
113 testing::InitGoogleTest(&argc, argv); |
|
114 |
|
115 return RUN_ALL_TESTS(); |
|
116 } |