blob: cc199654d4b864f995a0bb6c9f14d0e43c999a55 [file] [log] [blame]
brians343bc112013-02-10 01:53:46 +00001#include "aos/common/time.h"
2
3#include "gtest/gtest.h"
4
5#include "aos/common/macros.h"
Brian Silverman0534df62014-05-26 21:19:15 -07006#include "aos/common/util/death_test_log_implementation.h"
brians343bc112013-02-10 01:53:46 +00007
8namespace aos {
9namespace time {
10namespace testing {
11
12TEST(TimeTest, timespecConversions) {
13 timespec start{1234, 5678}; // NOLINT
14 Time time(start);
Brian Silvermanf7986142014-04-21 17:42:35 -070015 EXPECT_EQ(start.tv_sec, static_cast<time_t>(time.sec()));
brians343bc112013-02-10 01:53:46 +000016 EXPECT_EQ(start.tv_nsec, time.nsec());
17 timespec end = time.ToTimespec();
18 EXPECT_EQ(start.tv_sec, end.tv_sec);
19 EXPECT_EQ(start.tv_nsec, end.tv_nsec);
20}
21
brians57dd5822013-02-27 21:44:15 +000022TEST(TimeTest, timevalConversions) {
23 timeval start{1234, 5678}; // NOLINT
24 Time time(start);
brians652f7f72013-02-28 05:41:41 +000025 EXPECT_EQ(start.tv_sec, static_cast<long>(time.sec()));
brians57dd5822013-02-27 21:44:15 +000026 EXPECT_EQ(start.tv_usec, time.nsec() / Time::kNSecInUSec);
27 timeval end = time.ToTimeval();
28 EXPECT_EQ(start.tv_sec, end.tv_sec);
29 EXPECT_EQ(start.tv_usec, end.tv_usec);
30}
31
Brian Silverman0534df62014-05-26 21:19:15 -070032TEST(TimeDeathTest, ConstructorChecking) {
33 EXPECT_DEATH(
34 {
35 logging::AddImplementation(new util::DeathTestLogImplementation());
36 Time(0, -1);
37 },
38 ".*0 <= nsec\\(-1\\) < 10+ .*");
39 EXPECT_DEATH(
40 {
41 logging::AddImplementation(new util::DeathTestLogImplementation());
42 Time(0, Time::kNSecInSec);
43 },
44 ".*0 <= nsec\\(10+\\) < 10+ .*");
45}
46
brians343bc112013-02-10 01:53:46 +000047// It's kind of hard not to test Now and SleepFor at the same time.
48TEST(TimeTest, NowAndSleepFor) {
49 // without this, it tends to fail the first time (ends up sleeping for way
50 // longer than it should the second time, where it actually matters)
51 SleepFor(Time(0, Time::kNSecInSec / 10));
52 Time start = Time::Now();
Brian Silvermanaf784862014-05-13 08:14:55 -070053 static constexpr Time kSleepTime = Time(0, Time::kNSecInSec * 2 / 10);
54 SleepFor(kSleepTime);
55 Time difference = Time::Now() - start;
56 EXPECT_GE(difference, kSleepTime);
57 EXPECT_LT(difference, kSleepTime + Time(0, Time::kNSecInSec / 100));
brians343bc112013-02-10 01:53:46 +000058}
59
60TEST(TimeTest, AbsoluteSleep) {
61 Time start = Time::Now();
62 SleepFor(Time(0, Time::kNSecInSec / 10));
Brian Silvermanaf784862014-05-13 08:14:55 -070063 static constexpr Time kSleepTime = Time(0, Time::kNSecInSec * 2 / 10);
64 SleepUntil(start + kSleepTime);
65 Time difference = Time::Now() - start;
66 EXPECT_GE(difference, kSleepTime);
67 EXPECT_LT(difference, kSleepTime + Time(0, Time::kNSecInSec / 100));
brians343bc112013-02-10 01:53:46 +000068}
69
70TEST(TimeTest, Addition) {
71 Time t(54, 500);
72 EXPECT_EQ(MACRO_DARG(Time(54, 5500)), t + MACRO_DARG(Time(0, 5000)));
73 EXPECT_EQ(MACRO_DARG(Time(56, 500)), t + MACRO_DARG(Time(2, 0)));
74 EXPECT_EQ(MACRO_DARG(Time(57, 6500)), t + MACRO_DARG(Time(3, 6000)));
75 EXPECT_EQ(MACRO_DARG(Time(50, 300)),
76 t + MACRO_DARG(Time(-5, Time::kNSecInSec - 200)));
Brian Silverman6659bc32013-10-16 10:31:32 -070077 EXPECT_EQ(Time(-46, 500), t + Time(-100, 0));
78 EXPECT_EQ(Time(-47, Time::kNSecInSec - 500),
79 Time(-101, Time::kNSecInSec - 1000) + t);
brians343bc112013-02-10 01:53:46 +000080}
81TEST(TimeTest, Subtraction) {
82 Time t(54, 500);
83 EXPECT_EQ(MACRO_DARG(Time(54, 300)), t - MACRO_DARG(Time(0, 200)));
84 EXPECT_EQ(MACRO_DARG(Time(42, 500)), t - MACRO_DARG(Time(12, 0)));
85 EXPECT_EQ(MACRO_DARG(Time(50, 100)), t - MACRO_DARG(Time(4, 400)));
86 EXPECT_EQ(MACRO_DARG(Time(53, 600)),
87 t - MACRO_DARG(Time(0, Time::kNSecInSec - 100)));
88 EXPECT_EQ(MACRO_DARG(Time(55, 800)),
89 t - MACRO_DARG(Time(-2, Time::kNSecInSec - 300)));
Brian Silverman6659bc32013-10-16 10:31:32 -070090 EXPECT_EQ(Time(54, 5500), t - Time(-1, Time::kNSecInSec - 5000));
91 EXPECT_EQ(Time(-50, Time::kNSecInSec - 300),
92 Time(5, 200) - t);
brians343bc112013-02-10 01:53:46 +000093}
94
95TEST(TimeTest, Multiplication) {
96 Time t(54, Time::kNSecInSec / 3);
97 EXPECT_EQ(MACRO_DARG(Time(108, Time::kNSecInSec / 3 * 2)), t * 2);
98 EXPECT_EQ(MACRO_DARG(Time(271, Time::kNSecInSec / 3 * 2 - 1)), t * 5);
Brian Silverman6659bc32013-10-16 10:31:32 -070099 EXPECT_EQ(Time(-109, Time::kNSecInSec / 3 + 1), t * -2);
100 EXPECT_EQ(Time(-55, Time::kNSecInSec / 3 * 2 + 1), t * -1);
101 EXPECT_EQ(Time(-218, Time::kNSecInSec / 3 * 2 + 2), (t * -1) * 4);
brians343bc112013-02-10 01:53:46 +0000102}
Brian Silverman6659bc32013-10-16 10:31:32 -0700103TEST(TimeTest, DivisionByInt) {
104 EXPECT_EQ(Time(5, Time::kNSecInSec / 10 * 4 + 50), Time(54, 500) / 10);
105 EXPECT_EQ(Time(2, Time::kNSecInSec / 4 * 3),
106 Time(5, Time::kNSecInSec / 2) / 2);
107 EXPECT_EQ(Time(-3, Time::kNSecInSec / 4 * 3),
108 Time(-5, Time::kNSecInSec / 2) / 2);
109}
110TEST(TimeTest, DivisionByTime) {
111 EXPECT_DOUBLE_EQ(2, Time(10, 0) / Time(5, 0));
112 EXPECT_DOUBLE_EQ(9, Time(27, 0) / Time(3, 0));
113 EXPECT_DOUBLE_EQ(9.25, Time(37, 0) / Time(4, 0));
114 EXPECT_DOUBLE_EQ(5.25, Time(36, Time::kNSecInSec / 4 * 3) / Time(7, 0));
115 EXPECT_DOUBLE_EQ(-5.25, Time(-37, Time::kNSecInSec / 4) / Time(7, 0));
116 EXPECT_DOUBLE_EQ(-5.25, Time(36, Time::kNSecInSec / 4 * 3) / Time(-7, 0));
brians343bc112013-02-10 01:53:46 +0000117}
118
Brian Silverman0079a9d2013-10-24 15:57:35 -0700119TEST(TimeTest, Negation) {
120 EXPECT_EQ(Time(-5, 1234), -Time(4, Time::kNSecInSec - 1234));
121 EXPECT_EQ(Time(5, Time::kNSecInSec * 2 / 3 + 1),
122 -Time(-6, Time::kNSecInSec / 3));
123}
124
brians343bc112013-02-10 01:53:46 +0000125TEST(TimeTest, Comparisons) {
Brian Silverman6659bc32013-10-16 10:31:32 -0700126 EXPECT_TRUE(Time(971, 254) > Time(971, 253));
127 EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
128 EXPECT_TRUE(Time(971, 254) < Time(971, 255));
129 EXPECT_TRUE(Time(971, 254) <= Time(971, 255));
130 EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
131 EXPECT_TRUE(Time(971, 254) <= Time(971, 254));
132 EXPECT_TRUE(Time(971, 254) >= Time(971, 254));
133 EXPECT_TRUE(Time(972, 254) > Time(971, 254));
134 EXPECT_TRUE(Time(971, 254) < Time(972, 254));
135
136 EXPECT_TRUE(Time(-971, 254) > Time(-971, 253));
137 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
138 EXPECT_TRUE(Time(-971, 254) < Time(-971, 255));
139 EXPECT_TRUE(Time(-971, 254) <= Time(-971, 255));
140 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
141 EXPECT_TRUE(Time(-971, 254) <= Time(-971, 254));
142 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 254));
143 EXPECT_TRUE(Time(-972, 254) < Time(-971, 254));
144 EXPECT_TRUE(Time(-971, 254) > Time(-972, 254));
brians343bc112013-02-10 01:53:46 +0000145}
146
147TEST(TimeTest, Within) {
148 EXPECT_TRUE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 100)));
149 EXPECT_FALSE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 99)));
150 EXPECT_TRUE(MACRO_DARG(Time(5, 0).IsWithin(Time(4, Time::kNSecInSec - 200),
151 250)));
Brian Silverman6659bc32013-10-16 10:31:32 -0700152 EXPECT_TRUE(Time(-5, Time::kNSecInSec - 200).IsWithin(Time(-4, 0), 250));
153 EXPECT_TRUE(Time(-5, 200).IsWithin(Time(-5, 0), 250));
brians343bc112013-02-10 01:53:46 +0000154}
155
Brian Silverman6659bc32013-10-16 10:31:32 -0700156TEST(TimeTest, Modulus) {
brians343bc112013-02-10 01:53:46 +0000157 EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 10 * 2)),
158 MACRO_DARG(Time(50, 0) % (Time::kNSecInSec / 10 * 3)));
Brian Silverman6659bc32013-10-16 10:31:32 -0700159 EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
160 Time(-50, 0) % (Time::kNSecInSec / 10 * 3));
161 EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
162 Time(-50, 0) % (-Time::kNSecInSec / 10 * 3));
163 EXPECT_EQ(Time(0, Time::kNSecInSec / 10 * 2),
164 Time(50, 0) % (-Time::kNSecInSec / 10 * 3));
Brian Silverman0534df62014-05-26 21:19:15 -0700165 EXPECT_EQ(Time(1, Time::kNSecInSec / 10),
166 Time(60, Time::kNSecInSec / 10) % (Time::kNSecInSec / 10 * 12));
brians343bc112013-02-10 01:53:46 +0000167}
168
169TEST(TimeTest, InSeconds) {
170 EXPECT_EQ(MACRO_DARG(Time(2, Time::kNSecInSec / 100 * 55 - 1)),
171 Time::InSeconds(2.55));
Brian Silverman6659bc32013-10-16 10:31:32 -0700172 EXPECT_EQ(MACRO_DARG(Time(-3, Time::kNSecInSec / 100 * 45)),
173 Time::InSeconds(-2.55));
brians343bc112013-02-10 01:53:46 +0000174}
175
briansf0165ca2013-03-02 06:17:47 +0000176TEST(TimeTest, ToSeconds) {
Brian Silverman6659bc32013-10-16 10:31:32 -0700177 EXPECT_DOUBLE_EQ(13.23, Time::InSeconds(13.23).ToSeconds());
178 EXPECT_NEAR(-13.23, Time::InSeconds(-13.23).ToSeconds(),
179 1.0 / Time::kNSecInSec * 2);
briansf0165ca2013-03-02 06:17:47 +0000180}
181
brians343bc112013-02-10 01:53:46 +0000182TEST(TimeTest, InMS) {
183 Time t = Time::InMS(254971);
184 EXPECT_EQ(254, t.sec());
185 EXPECT_EQ(971000000, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700186
187 Time t2 = Time::InMS(-254971);
188 EXPECT_EQ(-255, t2.sec());
189 EXPECT_EQ(Time::kNSecInSec - 971000000, t2.nsec());
190}
191
192TEST(TimeTest, ToMSec) {
193 EXPECT_EQ(254971, Time(254, 971000000).ToMSec());
194 EXPECT_EQ(-254971, Time(-255, Time::kNSecInSec - 971000000).ToMSec());
brians343bc112013-02-10 01:53:46 +0000195}
196
197TEST(TimeTest, InNS) {
198 Time t = Time::InNS(static_cast<int64_t>(973254111971ll));
199 EXPECT_EQ(973, t.sec());
200 EXPECT_EQ(254111971, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700201
202 Time t2 = Time::InNS(static_cast<int64_t>(-973254111971ll));
203 EXPECT_EQ(-974, t2.sec());
204 EXPECT_EQ(Time::kNSecInSec - 254111971, t2.nsec());
brians343bc112013-02-10 01:53:46 +0000205}
206
207TEST(TimeTest, InUS) {
208 Time t = Time::InUS(254111971);
209 EXPECT_EQ(254, t.sec());
210 EXPECT_EQ(111971000, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700211
212 Time t2 = Time::InUS(-254111971);
213 EXPECT_EQ(-255, t2.sec());
214 EXPECT_EQ(Time::kNSecInSec - 111971000, t2.nsec());
brians343bc112013-02-10 01:53:46 +0000215}
216
Brian Silverman6659bc32013-10-16 10:31:32 -0700217TEST(TimeTest, ToUSec) {
218 EXPECT_EQ(254000971, Time(254, 971000).ToUSec());
219 EXPECT_EQ(-254000971, Time(-255, Time::kNSecInSec - 971000).ToUSec());
brians343bc112013-02-10 01:53:46 +0000220}
221
Brian Silverman3204dd82013-03-12 18:42:01 -0700222TEST(TimeTest, Abs) {
223 EXPECT_EQ(MACRO_DARG(Time(971, 1114)), MACRO_DARG(Time(971, 1114).abs()));
224 EXPECT_EQ(MACRO_DARG(Time(253, Time::kNSecInSec * 0.3)),
225 MACRO_DARG(Time(-254, Time::kNSecInSec * 0.7).abs()));
226 EXPECT_EQ(MACRO_DARG(-Time(-971, 973).ToNSec()),
227 MACRO_DARG(Time(970, Time::kNSecInSec - 973).ToNSec()));
228}
229
brians343bc112013-02-10 01:53:46 +0000230} // namespace testing
231} // namespace time
232} // namespace aos