comparison tests/js-elapsedtimer/main.cpp @ 108:af84dd3d585b

Irccd: try to fix errors in timer tests, #486
author David Demelier <markand@malikania.fr>
date Wed, 27 Apr 2016 13:07:21 +0200
parents 1125d90b3b44
children 1ed760f6e0c6
comparison
equal deleted inserted replaced
107:57a47f76c5e4 108:af84dd3d585b
24 #include <irccd/js-elapsed-timer.hpp> 24 #include <irccd/js-elapsed-timer.hpp>
25 25
26 using namespace irccd; 26 using namespace irccd;
27 using namespace std::chrono_literals; 27 using namespace std::chrono_literals;
28 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 { 29 class TestElapsedTimer : public testing::Test {
35 protected: 30 protected:
36 duk::Context m_context; 31 duk::Context m_context;
37 32
38 TestElapsedTimer() 33 TestElapsedTimer()
39 { 34 {
40 loadJsIrccd(m_context); 35 loadJsIrccd(m_context);
41 loadJsElapsedTimer(m_context); 36 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 } 37 }
49 }; 38 };
50 39
51 TEST_F(TestElapsedTimer, standard) 40 TEST_F(TestElapsedTimer, standard)
52 { 41 {
57 std::this_thread::sleep_for(300ms); 46 std::this_thread::sleep_for(300ms);
58 47
59 if (duk::pevalString(m_context, "result = timer.elapsed();") != 0) 48 if (duk::pevalString(m_context, "result = timer.elapsed();") != 0)
60 throw duk::error(m_context, -1); 49 throw duk::error(m_context, -1);
61 50
62 assertRange(duk::getGlobal<int>(m_context, "result"), 300); 51 ASSERT_GE(duk::getGlobal<int>(m_context, "result"), 250);
52 ASSERT_LE(duk::getGlobal<int>(m_context, "result"), 350);
63 } catch (const std::exception &ex) { 53 } catch (const std::exception &ex) {
64 FAIL() << ex.what(); 54 FAIL() << ex.what();
65 } 55 }
66 } 56 }
67 57
74 std::this_thread::sleep_for(300ms); 64 std::this_thread::sleep_for(300ms);
75 65
76 if (duk::pevalString(m_context, "timer.reset(); result = timer.elapsed();") != 0) 66 if (duk::pevalString(m_context, "timer.reset(); result = timer.elapsed();") != 0)
77 throw duk::error(m_context, -1); 67 throw duk::error(m_context, -1);
78 68
79 assertRange(duk::getGlobal<int>(m_context, "result"), 0); 69 ASSERT_LE(duk::getGlobal<int>(m_context, "result"), 100);
80 } catch (const std::exception &ex) {
81 FAIL() << ex.what();
82 }
83 }
84
85 TEST_F(TestElapsedTimer, pause)
86 {
87 try {
88 if (duk::pevalString(m_context, "timer = new Irccd.ElapsedTimer();") != 0)
89 throw duk::error(m_context, -1);
90
91 /*
92 * Simulate a pause in the game like this:
93 *
94 * start pause restart elapsed
95 * | 10ms |.5ms.| 6ms |
96 *
97 * Since the game was paused, the 5ms must not be totalized.
98 */
99 std::this_thread::sleep_for(10ms);
100
101 if (duk::pevalString(m_context, "timer.pause();") != 0)
102 throw duk::error(m_context, -1);
103
104 std::this_thread::sleep_for(5ms);
105
106 if (duk::pevalString(m_context, "timer.restart();") != 0)
107 throw duk::error(m_context, -1);
108
109 std::this_thread::sleep_for(6ms);
110
111 if (duk::pevalString(m_context, "result = timer.elapsed()") != 0)
112 throw duk::error(m_context, -1);
113
114 assertRange(duk::getGlobal<int>(m_context, "result"), 16);
115 } catch (const std::exception &ex) {
116 FAIL() << ex.what();
117 }
118 }
119
120 TEST_F(TestElapsedTimer, doublecheck)
121 {
122 try {
123 if (duk::pevalString(m_context, "timer = new Irccd.ElapsedTimer();") != 0)
124 throw duk::error(m_context, -1);
125
126 std::this_thread::sleep_for(50ms);
127
128 if (duk::pevalString(m_context, "result = timer.elapsed()") != 0)
129 throw duk::error(m_context, -1);
130
131 std::this_thread::sleep_for(50ms);
132
133 if (duk::pevalString(m_context, "result = timer.elapsed()") != 0)
134 throw duk::error(m_context, -1);
135
136 assertRange(duk::getGlobal<int>(m_context, "result"), 100);
137 } catch (const std::exception &ex) { 70 } catch (const std::exception &ex) {
138 FAIL() << ex.what(); 71 FAIL() << ex.what();
139 } 72 }
140 } 73 }
141 74