blob: af6db05a709aff2a7e974492d78d1c9cb110d72d [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"
6
7namespace aos {
8namespace time {
9namespace testing {
10
11TEST(TimeTest, timespecConversions) {
12 timespec start{1234, 5678}; // NOLINT
13 Time time(start);
Brian Silvermanf7986142014-04-21 17:42:35 -070014 EXPECT_EQ(start.tv_sec, static_cast<time_t>(time.sec()));
brians343bc112013-02-10 01:53:46 +000015 EXPECT_EQ(start.tv_nsec, time.nsec());
16 timespec end = time.ToTimespec();
17 EXPECT_EQ(start.tv_sec, end.tv_sec);
18 EXPECT_EQ(start.tv_nsec, end.tv_nsec);
19}
20
brians57dd5822013-02-27 21:44:15 +000021TEST(TimeTest, timevalConversions) {
22 timeval start{1234, 5678}; // NOLINT
23 Time time(start);
brians652f7f72013-02-28 05:41:41 +000024 EXPECT_EQ(start.tv_sec, static_cast<long>(time.sec()));
brians57dd5822013-02-27 21:44:15 +000025 EXPECT_EQ(start.tv_usec, time.nsec() / Time::kNSecInUSec);
26 timeval end = time.ToTimeval();
27 EXPECT_EQ(start.tv_sec, end.tv_sec);
28 EXPECT_EQ(start.tv_usec, end.tv_usec);
29}
30
brians343bc112013-02-10 01:53:46 +000031// It's kind of hard not to test Now and SleepFor at the same time.
32TEST(TimeTest, NowAndSleepFor) {
33 // without this, it tends to fail the first time (ends up sleeping for way
34 // longer than it should the second time, where it actually matters)
35 SleepFor(Time(0, Time::kNSecInSec / 10));
36 Time start = Time::Now();
Brian Silvermanaf784862014-05-13 08:14:55 -070037 static constexpr Time kSleepTime = Time(0, Time::kNSecInSec * 2 / 10);
38 SleepFor(kSleepTime);
39 Time difference = Time::Now() - start;
40 EXPECT_GE(difference, kSleepTime);
41 EXPECT_LT(difference, kSleepTime + Time(0, Time::kNSecInSec / 100));
brians343bc112013-02-10 01:53:46 +000042}
43
44TEST(TimeTest, AbsoluteSleep) {
45 Time start = Time::Now();
46 SleepFor(Time(0, Time::kNSecInSec / 10));
Brian Silvermanaf784862014-05-13 08:14:55 -070047 static constexpr Time kSleepTime = Time(0, Time::kNSecInSec * 2 / 10);
48 SleepUntil(start + kSleepTime);
49 Time difference = Time::Now() - start;
50 EXPECT_GE(difference, kSleepTime);
51 EXPECT_LT(difference, kSleepTime + Time(0, Time::kNSecInSec / 100));
brians343bc112013-02-10 01:53:46 +000052}
53
54TEST(TimeTest, Addition) {
55 Time t(54, 500);
56 EXPECT_EQ(MACRO_DARG(Time(54, 5500)), t + MACRO_DARG(Time(0, 5000)));
57 EXPECT_EQ(MACRO_DARG(Time(56, 500)), t + MACRO_DARG(Time(2, 0)));
58 EXPECT_EQ(MACRO_DARG(Time(57, 6500)), t + MACRO_DARG(Time(3, 6000)));
59 EXPECT_EQ(MACRO_DARG(Time(50, 300)),
60 t + MACRO_DARG(Time(-5, Time::kNSecInSec - 200)));
Brian Silverman6659bc32013-10-16 10:31:32 -070061 EXPECT_EQ(Time(-46, 500), t + Time(-100, 0));
62 EXPECT_EQ(Time(-47, Time::kNSecInSec - 500),
63 Time(-101, Time::kNSecInSec - 1000) + t);
brians343bc112013-02-10 01:53:46 +000064}
65TEST(TimeTest, Subtraction) {
66 Time t(54, 500);
67 EXPECT_EQ(MACRO_DARG(Time(54, 300)), t - MACRO_DARG(Time(0, 200)));
68 EXPECT_EQ(MACRO_DARG(Time(42, 500)), t - MACRO_DARG(Time(12, 0)));
69 EXPECT_EQ(MACRO_DARG(Time(50, 100)), t - MACRO_DARG(Time(4, 400)));
70 EXPECT_EQ(MACRO_DARG(Time(53, 600)),
71 t - MACRO_DARG(Time(0, Time::kNSecInSec - 100)));
72 EXPECT_EQ(MACRO_DARG(Time(55, 800)),
73 t - MACRO_DARG(Time(-2, Time::kNSecInSec - 300)));
Brian Silverman6659bc32013-10-16 10:31:32 -070074 EXPECT_EQ(Time(54, 5500), t - Time(-1, Time::kNSecInSec - 5000));
75 EXPECT_EQ(Time(-50, Time::kNSecInSec - 300),
76 Time(5, 200) - t);
brians343bc112013-02-10 01:53:46 +000077}
78
79TEST(TimeTest, Multiplication) {
80 Time t(54, Time::kNSecInSec / 3);
81 EXPECT_EQ(MACRO_DARG(Time(108, Time::kNSecInSec / 3 * 2)), t * 2);
82 EXPECT_EQ(MACRO_DARG(Time(271, Time::kNSecInSec / 3 * 2 - 1)), t * 5);
Brian Silverman6659bc32013-10-16 10:31:32 -070083 EXPECT_EQ(Time(-109, Time::kNSecInSec / 3 + 1), t * -2);
84 EXPECT_EQ(Time(-55, Time::kNSecInSec / 3 * 2 + 1), t * -1);
85 EXPECT_EQ(Time(-218, Time::kNSecInSec / 3 * 2 + 2), (t * -1) * 4);
brians343bc112013-02-10 01:53:46 +000086}
Brian Silverman6659bc32013-10-16 10:31:32 -070087TEST(TimeTest, DivisionByInt) {
88 EXPECT_EQ(Time(5, Time::kNSecInSec / 10 * 4 + 50), Time(54, 500) / 10);
89 EXPECT_EQ(Time(2, Time::kNSecInSec / 4 * 3),
90 Time(5, Time::kNSecInSec / 2) / 2);
91 EXPECT_EQ(Time(-3, Time::kNSecInSec / 4 * 3),
92 Time(-5, Time::kNSecInSec / 2) / 2);
93}
94TEST(TimeTest, DivisionByTime) {
95 EXPECT_DOUBLE_EQ(2, Time(10, 0) / Time(5, 0));
96 EXPECT_DOUBLE_EQ(9, Time(27, 0) / Time(3, 0));
97 EXPECT_DOUBLE_EQ(9.25, Time(37, 0) / Time(4, 0));
98 EXPECT_DOUBLE_EQ(5.25, Time(36, Time::kNSecInSec / 4 * 3) / Time(7, 0));
99 EXPECT_DOUBLE_EQ(-5.25, Time(-37, Time::kNSecInSec / 4) / Time(7, 0));
100 EXPECT_DOUBLE_EQ(-5.25, Time(36, Time::kNSecInSec / 4 * 3) / Time(-7, 0));
brians343bc112013-02-10 01:53:46 +0000101}
102
Brian Silverman0079a9d2013-10-24 15:57:35 -0700103TEST(TimeTest, Negation) {
104 EXPECT_EQ(Time(-5, 1234), -Time(4, Time::kNSecInSec - 1234));
105 EXPECT_EQ(Time(5, Time::kNSecInSec * 2 / 3 + 1),
106 -Time(-6, Time::kNSecInSec / 3));
107}
108
brians343bc112013-02-10 01:53:46 +0000109TEST(TimeTest, Comparisons) {
Brian Silverman6659bc32013-10-16 10:31:32 -0700110 EXPECT_TRUE(Time(971, 254) > Time(971, 253));
111 EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
112 EXPECT_TRUE(Time(971, 254) < Time(971, 255));
113 EXPECT_TRUE(Time(971, 254) <= Time(971, 255));
114 EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
115 EXPECT_TRUE(Time(971, 254) <= Time(971, 254));
116 EXPECT_TRUE(Time(971, 254) >= Time(971, 254));
117 EXPECT_TRUE(Time(972, 254) > Time(971, 254));
118 EXPECT_TRUE(Time(971, 254) < Time(972, 254));
119
120 EXPECT_TRUE(Time(-971, 254) > Time(-971, 253));
121 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
122 EXPECT_TRUE(Time(-971, 254) < Time(-971, 255));
123 EXPECT_TRUE(Time(-971, 254) <= Time(-971, 255));
124 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
125 EXPECT_TRUE(Time(-971, 254) <= Time(-971, 254));
126 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 254));
127 EXPECT_TRUE(Time(-972, 254) < Time(-971, 254));
128 EXPECT_TRUE(Time(-971, 254) > Time(-972, 254));
brians343bc112013-02-10 01:53:46 +0000129}
130
131TEST(TimeTest, Within) {
132 EXPECT_TRUE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 100)));
133 EXPECT_FALSE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 99)));
134 EXPECT_TRUE(MACRO_DARG(Time(5, 0).IsWithin(Time(4, Time::kNSecInSec - 200),
135 250)));
Brian Silverman6659bc32013-10-16 10:31:32 -0700136 EXPECT_TRUE(Time(-5, Time::kNSecInSec - 200).IsWithin(Time(-4, 0), 250));
137 EXPECT_TRUE(Time(-5, 200).IsWithin(Time(-5, 0), 250));
brians343bc112013-02-10 01:53:46 +0000138}
139
Brian Silverman6659bc32013-10-16 10:31:32 -0700140TEST(TimeTest, Modulus) {
brians343bc112013-02-10 01:53:46 +0000141 EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 10 * 2)),
142 MACRO_DARG(Time(50, 0) % (Time::kNSecInSec / 10 * 3)));
Brian Silverman6659bc32013-10-16 10:31:32 -0700143 EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
144 Time(-50, 0) % (Time::kNSecInSec / 10 * 3));
145 EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
146 Time(-50, 0) % (-Time::kNSecInSec / 10 * 3));
147 EXPECT_EQ(Time(0, Time::kNSecInSec / 10 * 2),
148 Time(50, 0) % (-Time::kNSecInSec / 10 * 3));
brians343bc112013-02-10 01:53:46 +0000149}
150
Brian Silverman6659bc32013-10-16 10:31:32 -0700151// TODO(brians): Finish tests for negatives from here on.
brians343bc112013-02-10 01:53:46 +0000152TEST(TimeTest, InSeconds) {
153 EXPECT_EQ(MACRO_DARG(Time(2, Time::kNSecInSec / 100 * 55 - 1)),
154 Time::InSeconds(2.55));
Brian Silverman6659bc32013-10-16 10:31:32 -0700155 EXPECT_EQ(MACRO_DARG(Time(-3, Time::kNSecInSec / 100 * 45)),
156 Time::InSeconds(-2.55));
brians343bc112013-02-10 01:53:46 +0000157}
158
briansf0165ca2013-03-02 06:17:47 +0000159TEST(TimeTest, ToSeconds) {
Brian Silverman6659bc32013-10-16 10:31:32 -0700160 EXPECT_DOUBLE_EQ(13.23, Time::InSeconds(13.23).ToSeconds());
161 EXPECT_NEAR(-13.23, Time::InSeconds(-13.23).ToSeconds(),
162 1.0 / Time::kNSecInSec * 2);
briansf0165ca2013-03-02 06:17:47 +0000163}
164
brians343bc112013-02-10 01:53:46 +0000165TEST(TimeTest, InMS) {
166 Time t = Time::InMS(254971);
167 EXPECT_EQ(254, t.sec());
168 EXPECT_EQ(971000000, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700169
170 Time t2 = Time::InMS(-254971);
171 EXPECT_EQ(-255, t2.sec());
172 EXPECT_EQ(Time::kNSecInSec - 971000000, t2.nsec());
173}
174
175TEST(TimeTest, ToMSec) {
176 EXPECT_EQ(254971, Time(254, 971000000).ToMSec());
177 EXPECT_EQ(-254971, Time(-255, Time::kNSecInSec - 971000000).ToMSec());
brians343bc112013-02-10 01:53:46 +0000178}
179
180TEST(TimeTest, InNS) {
181 Time t = Time::InNS(static_cast<int64_t>(973254111971ll));
182 EXPECT_EQ(973, t.sec());
183 EXPECT_EQ(254111971, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700184
185 Time t2 = Time::InNS(static_cast<int64_t>(-973254111971ll));
186 EXPECT_EQ(-974, t2.sec());
187 EXPECT_EQ(Time::kNSecInSec - 254111971, t2.nsec());
brians343bc112013-02-10 01:53:46 +0000188}
189
190TEST(TimeTest, InUS) {
191 Time t = Time::InUS(254111971);
192 EXPECT_EQ(254, t.sec());
193 EXPECT_EQ(111971000, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700194
195 Time t2 = Time::InUS(-254111971);
196 EXPECT_EQ(-255, t2.sec());
197 EXPECT_EQ(Time::kNSecInSec - 111971000, t2.nsec());
brians343bc112013-02-10 01:53:46 +0000198}
199
Brian Silverman6659bc32013-10-16 10:31:32 -0700200TEST(TimeTest, ToUSec) {
201 EXPECT_EQ(254000971, Time(254, 971000).ToUSec());
202 EXPECT_EQ(-254000971, Time(-255, Time::kNSecInSec - 971000).ToUSec());
brians343bc112013-02-10 01:53:46 +0000203}
204
Brian Silverman3204dd82013-03-12 18:42:01 -0700205TEST(TimeTest, Abs) {
206 EXPECT_EQ(MACRO_DARG(Time(971, 1114)), MACRO_DARG(Time(971, 1114).abs()));
207 EXPECT_EQ(MACRO_DARG(Time(253, Time::kNSecInSec * 0.3)),
208 MACRO_DARG(Time(-254, Time::kNSecInSec * 0.7).abs()));
209 EXPECT_EQ(MACRO_DARG(-Time(-971, 973).ToNSec()),
210 MACRO_DARG(Time(970, Time::kNSecInSec - 973).ToNSec()));
211}
212
brians343bc112013-02-10 01:53:46 +0000213} // namespace testing
214} // namespace time
215} // namespace aos