blob: c073e9e06955a1f25801767d20948d902fe70fd0 [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();
37 SleepFor(Time(0, Time::kNSecInSec * 2 / 10));
38 EXPECT_TRUE(MACRO_DARG((Time::Now() - start)
39 .IsWithin(Time(0, Time::kNSecInSec * 2 / 10),
40 Time::kNSecInSec / 1000)));
41}
42
43TEST(TimeTest, AbsoluteSleep) {
44 Time start = Time::Now();
45 SleepFor(Time(0, Time::kNSecInSec / 10));
46 SleepUntil((start + Time(0, Time::kNSecInSec * 2 / 10)));
47 EXPECT_TRUE(MACRO_DARG((Time::Now() - start)
48 .IsWithin(Time(0, Time::kNSecInSec * 2 / 10),
49 Time::kNSecInSec / 1000)));
50}
51
52TEST(TimeTest, Addition) {
53 Time t(54, 500);
54 EXPECT_EQ(MACRO_DARG(Time(54, 5500)), t + MACRO_DARG(Time(0, 5000)));
55 EXPECT_EQ(MACRO_DARG(Time(56, 500)), t + MACRO_DARG(Time(2, 0)));
56 EXPECT_EQ(MACRO_DARG(Time(57, 6500)), t + MACRO_DARG(Time(3, 6000)));
57 EXPECT_EQ(MACRO_DARG(Time(50, 300)),
58 t + MACRO_DARG(Time(-5, Time::kNSecInSec - 200)));
Brian Silverman6659bc32013-10-16 10:31:32 -070059 EXPECT_EQ(Time(-46, 500), t + Time(-100, 0));
60 EXPECT_EQ(Time(-47, Time::kNSecInSec - 500),
61 Time(-101, Time::kNSecInSec - 1000) + t);
brians343bc112013-02-10 01:53:46 +000062}
63TEST(TimeTest, Subtraction) {
64 Time t(54, 500);
65 EXPECT_EQ(MACRO_DARG(Time(54, 300)), t - MACRO_DARG(Time(0, 200)));
66 EXPECT_EQ(MACRO_DARG(Time(42, 500)), t - MACRO_DARG(Time(12, 0)));
67 EXPECT_EQ(MACRO_DARG(Time(50, 100)), t - MACRO_DARG(Time(4, 400)));
68 EXPECT_EQ(MACRO_DARG(Time(53, 600)),
69 t - MACRO_DARG(Time(0, Time::kNSecInSec - 100)));
70 EXPECT_EQ(MACRO_DARG(Time(55, 800)),
71 t - MACRO_DARG(Time(-2, Time::kNSecInSec - 300)));
Brian Silverman6659bc32013-10-16 10:31:32 -070072 EXPECT_EQ(Time(54, 5500), t - Time(-1, Time::kNSecInSec - 5000));
73 EXPECT_EQ(Time(-50, Time::kNSecInSec - 300),
74 Time(5, 200) - t);
brians343bc112013-02-10 01:53:46 +000075}
76
77TEST(TimeTest, Multiplication) {
78 Time t(54, Time::kNSecInSec / 3);
79 EXPECT_EQ(MACRO_DARG(Time(108, Time::kNSecInSec / 3 * 2)), t * 2);
80 EXPECT_EQ(MACRO_DARG(Time(271, Time::kNSecInSec / 3 * 2 - 1)), t * 5);
Brian Silverman6659bc32013-10-16 10:31:32 -070081 EXPECT_EQ(Time(-109, Time::kNSecInSec / 3 + 1), t * -2);
82 EXPECT_EQ(Time(-55, Time::kNSecInSec / 3 * 2 + 1), t * -1);
83 EXPECT_EQ(Time(-218, Time::kNSecInSec / 3 * 2 + 2), (t * -1) * 4);
brians343bc112013-02-10 01:53:46 +000084}
Brian Silverman6659bc32013-10-16 10:31:32 -070085TEST(TimeTest, DivisionByInt) {
86 EXPECT_EQ(Time(5, Time::kNSecInSec / 10 * 4 + 50), Time(54, 500) / 10);
87 EXPECT_EQ(Time(2, Time::kNSecInSec / 4 * 3),
88 Time(5, Time::kNSecInSec / 2) / 2);
89 EXPECT_EQ(Time(-3, Time::kNSecInSec / 4 * 3),
90 Time(-5, Time::kNSecInSec / 2) / 2);
91}
92TEST(TimeTest, DivisionByTime) {
93 EXPECT_DOUBLE_EQ(2, Time(10, 0) / Time(5, 0));
94 EXPECT_DOUBLE_EQ(9, Time(27, 0) / Time(3, 0));
95 EXPECT_DOUBLE_EQ(9.25, Time(37, 0) / Time(4, 0));
96 EXPECT_DOUBLE_EQ(5.25, Time(36, Time::kNSecInSec / 4 * 3) / Time(7, 0));
97 EXPECT_DOUBLE_EQ(-5.25, Time(-37, Time::kNSecInSec / 4) / Time(7, 0));
98 EXPECT_DOUBLE_EQ(-5.25, Time(36, Time::kNSecInSec / 4 * 3) / Time(-7, 0));
brians343bc112013-02-10 01:53:46 +000099}
100
Brian Silverman0079a9d2013-10-24 15:57:35 -0700101TEST(TimeTest, Negation) {
102 EXPECT_EQ(Time(-5, 1234), -Time(4, Time::kNSecInSec - 1234));
103 EXPECT_EQ(Time(5, Time::kNSecInSec * 2 / 3 + 1),
104 -Time(-6, Time::kNSecInSec / 3));
105}
106
brians343bc112013-02-10 01:53:46 +0000107TEST(TimeTest, Comparisons) {
Brian Silverman6659bc32013-10-16 10:31:32 -0700108 EXPECT_TRUE(Time(971, 254) > Time(971, 253));
109 EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
110 EXPECT_TRUE(Time(971, 254) < Time(971, 255));
111 EXPECT_TRUE(Time(971, 254) <= Time(971, 255));
112 EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
113 EXPECT_TRUE(Time(971, 254) <= Time(971, 254));
114 EXPECT_TRUE(Time(971, 254) >= Time(971, 254));
115 EXPECT_TRUE(Time(972, 254) > Time(971, 254));
116 EXPECT_TRUE(Time(971, 254) < Time(972, 254));
117
118 EXPECT_TRUE(Time(-971, 254) > Time(-971, 253));
119 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
120 EXPECT_TRUE(Time(-971, 254) < Time(-971, 255));
121 EXPECT_TRUE(Time(-971, 254) <= Time(-971, 255));
122 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
123 EXPECT_TRUE(Time(-971, 254) <= Time(-971, 254));
124 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 254));
125 EXPECT_TRUE(Time(-972, 254) < Time(-971, 254));
126 EXPECT_TRUE(Time(-971, 254) > Time(-972, 254));
brians343bc112013-02-10 01:53:46 +0000127}
128
129TEST(TimeTest, Within) {
130 EXPECT_TRUE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 100)));
131 EXPECT_FALSE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 99)));
132 EXPECT_TRUE(MACRO_DARG(Time(5, 0).IsWithin(Time(4, Time::kNSecInSec - 200),
133 250)));
Brian Silverman6659bc32013-10-16 10:31:32 -0700134 EXPECT_TRUE(Time(-5, Time::kNSecInSec - 200).IsWithin(Time(-4, 0), 250));
135 EXPECT_TRUE(Time(-5, 200).IsWithin(Time(-5, 0), 250));
brians343bc112013-02-10 01:53:46 +0000136}
137
Brian Silverman6659bc32013-10-16 10:31:32 -0700138TEST(TimeTest, Modulus) {
brians343bc112013-02-10 01:53:46 +0000139 EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 10 * 2)),
140 MACRO_DARG(Time(50, 0) % (Time::kNSecInSec / 10 * 3)));
Brian Silverman6659bc32013-10-16 10:31:32 -0700141 EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
142 Time(-50, 0) % (Time::kNSecInSec / 10 * 3));
143 EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
144 Time(-50, 0) % (-Time::kNSecInSec / 10 * 3));
145 EXPECT_EQ(Time(0, Time::kNSecInSec / 10 * 2),
146 Time(50, 0) % (-Time::kNSecInSec / 10 * 3));
brians343bc112013-02-10 01:53:46 +0000147}
148
Brian Silverman6659bc32013-10-16 10:31:32 -0700149// TODO(brians): Finish tests for negatives from here on.
brians343bc112013-02-10 01:53:46 +0000150TEST(TimeTest, InSeconds) {
151 EXPECT_EQ(MACRO_DARG(Time(2, Time::kNSecInSec / 100 * 55 - 1)),
152 Time::InSeconds(2.55));
Brian Silverman6659bc32013-10-16 10:31:32 -0700153 EXPECT_EQ(MACRO_DARG(Time(-3, Time::kNSecInSec / 100 * 45)),
154 Time::InSeconds(-2.55));
brians343bc112013-02-10 01:53:46 +0000155}
156
briansf0165ca2013-03-02 06:17:47 +0000157TEST(TimeTest, ToSeconds) {
Brian Silverman6659bc32013-10-16 10:31:32 -0700158 EXPECT_DOUBLE_EQ(13.23, Time::InSeconds(13.23).ToSeconds());
159 EXPECT_NEAR(-13.23, Time::InSeconds(-13.23).ToSeconds(),
160 1.0 / Time::kNSecInSec * 2);
briansf0165ca2013-03-02 06:17:47 +0000161}
162
brians343bc112013-02-10 01:53:46 +0000163TEST(TimeTest, InMS) {
164 Time t = Time::InMS(254971);
165 EXPECT_EQ(254, t.sec());
166 EXPECT_EQ(971000000, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700167
168 Time t2 = Time::InMS(-254971);
169 EXPECT_EQ(-255, t2.sec());
170 EXPECT_EQ(Time::kNSecInSec - 971000000, t2.nsec());
171}
172
173TEST(TimeTest, ToMSec) {
174 EXPECT_EQ(254971, Time(254, 971000000).ToMSec());
175 EXPECT_EQ(-254971, Time(-255, Time::kNSecInSec - 971000000).ToMSec());
brians343bc112013-02-10 01:53:46 +0000176}
177
178TEST(TimeTest, InNS) {
179 Time t = Time::InNS(static_cast<int64_t>(973254111971ll));
180 EXPECT_EQ(973, t.sec());
181 EXPECT_EQ(254111971, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700182
183 Time t2 = Time::InNS(static_cast<int64_t>(-973254111971ll));
184 EXPECT_EQ(-974, t2.sec());
185 EXPECT_EQ(Time::kNSecInSec - 254111971, t2.nsec());
brians343bc112013-02-10 01:53:46 +0000186}
187
188TEST(TimeTest, InUS) {
189 Time t = Time::InUS(254111971);
190 EXPECT_EQ(254, t.sec());
191 EXPECT_EQ(111971000, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700192
193 Time t2 = Time::InUS(-254111971);
194 EXPECT_EQ(-255, t2.sec());
195 EXPECT_EQ(Time::kNSecInSec - 111971000, t2.nsec());
brians343bc112013-02-10 01:53:46 +0000196}
197
Brian Silverman6659bc32013-10-16 10:31:32 -0700198TEST(TimeTest, ToUSec) {
199 EXPECT_EQ(254000971, Time(254, 971000).ToUSec());
200 EXPECT_EQ(-254000971, Time(-255, Time::kNSecInSec - 971000).ToUSec());
brians343bc112013-02-10 01:53:46 +0000201}
202
Brian Silverman3204dd82013-03-12 18:42:01 -0700203TEST(TimeTest, Abs) {
204 EXPECT_EQ(MACRO_DARG(Time(971, 1114)), MACRO_DARG(Time(971, 1114).abs()));
205 EXPECT_EQ(MACRO_DARG(Time(253, Time::kNSecInSec * 0.3)),
206 MACRO_DARG(Time(-254, Time::kNSecInSec * 0.7).abs()));
207 EXPECT_EQ(MACRO_DARG(-Time(-971, 973).ToNSec()),
208 MACRO_DARG(Time(970, Time::kNSecInSec - 973).ToNSec()));
209}
210
brians343bc112013-02-10 01:53:46 +0000211} // namespace testing
212} // namespace time
213} // namespace aos