blob: 3f53de3d037b63b11ef253c1435a286d7af5670c [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);
14 EXPECT_EQ(start.tv_sec, static_cast<signed time_t>(time.sec()));
15 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
101TEST(TimeTest, Comparisons) {
Brian Silverman6659bc32013-10-16 10:31:32 -0700102 EXPECT_TRUE(Time(971, 254) > Time(971, 253));
103 EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
104 EXPECT_TRUE(Time(971, 254) < Time(971, 255));
105 EXPECT_TRUE(Time(971, 254) <= Time(971, 255));
106 EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
107 EXPECT_TRUE(Time(971, 254) <= Time(971, 254));
108 EXPECT_TRUE(Time(971, 254) >= Time(971, 254));
109 EXPECT_TRUE(Time(972, 254) > Time(971, 254));
110 EXPECT_TRUE(Time(971, 254) < Time(972, 254));
111
112 EXPECT_TRUE(Time(-971, 254) > Time(-971, 253));
113 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
114 EXPECT_TRUE(Time(-971, 254) < Time(-971, 255));
115 EXPECT_TRUE(Time(-971, 254) <= Time(-971, 255));
116 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
117 EXPECT_TRUE(Time(-971, 254) <= Time(-971, 254));
118 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 254));
119 EXPECT_TRUE(Time(-972, 254) < Time(-971, 254));
120 EXPECT_TRUE(Time(-971, 254) > Time(-972, 254));
brians343bc112013-02-10 01:53:46 +0000121}
122
123TEST(TimeTest, Within) {
124 EXPECT_TRUE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 100)));
125 EXPECT_FALSE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 99)));
126 EXPECT_TRUE(MACRO_DARG(Time(5, 0).IsWithin(Time(4, Time::kNSecInSec - 200),
127 250)));
Brian Silverman6659bc32013-10-16 10:31:32 -0700128 EXPECT_TRUE(Time(-5, Time::kNSecInSec - 200).IsWithin(Time(-4, 0), 250));
129 EXPECT_TRUE(Time(-5, 200).IsWithin(Time(-5, 0), 250));
brians343bc112013-02-10 01:53:46 +0000130}
131
Brian Silverman6659bc32013-10-16 10:31:32 -0700132TEST(TimeTest, Modulus) {
brians343bc112013-02-10 01:53:46 +0000133 EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 10 * 2)),
134 MACRO_DARG(Time(50, 0) % (Time::kNSecInSec / 10 * 3)));
Brian Silverman6659bc32013-10-16 10:31:32 -0700135 EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
136 Time(-50, 0) % (Time::kNSecInSec / 10 * 3));
137 EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
138 Time(-50, 0) % (-Time::kNSecInSec / 10 * 3));
139 EXPECT_EQ(Time(0, Time::kNSecInSec / 10 * 2),
140 Time(50, 0) % (-Time::kNSecInSec / 10 * 3));
brians343bc112013-02-10 01:53:46 +0000141}
142
Brian Silverman6659bc32013-10-16 10:31:32 -0700143// TODO(brians): Finish tests for negatives from here on.
brians343bc112013-02-10 01:53:46 +0000144TEST(TimeTest, InSeconds) {
145 EXPECT_EQ(MACRO_DARG(Time(2, Time::kNSecInSec / 100 * 55 - 1)),
146 Time::InSeconds(2.55));
Brian Silverman6659bc32013-10-16 10:31:32 -0700147 EXPECT_EQ(MACRO_DARG(Time(-3, Time::kNSecInSec / 100 * 45)),
148 Time::InSeconds(-2.55));
brians343bc112013-02-10 01:53:46 +0000149}
150
briansf0165ca2013-03-02 06:17:47 +0000151TEST(TimeTest, ToSeconds) {
Brian Silverman6659bc32013-10-16 10:31:32 -0700152 EXPECT_DOUBLE_EQ(13.23, Time::InSeconds(13.23).ToSeconds());
153 EXPECT_NEAR(-13.23, Time::InSeconds(-13.23).ToSeconds(),
154 1.0 / Time::kNSecInSec * 2);
briansf0165ca2013-03-02 06:17:47 +0000155}
156
brians343bc112013-02-10 01:53:46 +0000157TEST(TimeTest, InMS) {
158 Time t = Time::InMS(254971);
159 EXPECT_EQ(254, t.sec());
160 EXPECT_EQ(971000000, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700161
162 Time t2 = Time::InMS(-254971);
163 EXPECT_EQ(-255, t2.sec());
164 EXPECT_EQ(Time::kNSecInSec - 971000000, t2.nsec());
165}
166
167TEST(TimeTest, ToMSec) {
168 EXPECT_EQ(254971, Time(254, 971000000).ToMSec());
169 EXPECT_EQ(-254971, Time(-255, Time::kNSecInSec - 971000000).ToMSec());
brians343bc112013-02-10 01:53:46 +0000170}
171
172TEST(TimeTest, InNS) {
173 Time t = Time::InNS(static_cast<int64_t>(973254111971ll));
174 EXPECT_EQ(973, t.sec());
175 EXPECT_EQ(254111971, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700176
177 Time t2 = Time::InNS(static_cast<int64_t>(-973254111971ll));
178 EXPECT_EQ(-974, t2.sec());
179 EXPECT_EQ(Time::kNSecInSec - 254111971, t2.nsec());
brians343bc112013-02-10 01:53:46 +0000180}
181
182TEST(TimeTest, InUS) {
183 Time t = Time::InUS(254111971);
184 EXPECT_EQ(254, t.sec());
185 EXPECT_EQ(111971000, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700186
187 Time t2 = Time::InUS(-254111971);
188 EXPECT_EQ(-255, t2.sec());
189 EXPECT_EQ(Time::kNSecInSec - 111971000, t2.nsec());
brians343bc112013-02-10 01:53:46 +0000190}
191
Brian Silverman6659bc32013-10-16 10:31:32 -0700192TEST(TimeTest, ToUSec) {
193 EXPECT_EQ(254000971, Time(254, 971000).ToUSec());
194 EXPECT_EQ(-254000971, Time(-255, Time::kNSecInSec - 971000).ToUSec());
brians343bc112013-02-10 01:53:46 +0000195}
196
Brian Silverman3204dd82013-03-12 18:42:01 -0700197TEST(TimeTest, Abs) {
198 EXPECT_EQ(MACRO_DARG(Time(971, 1114)), MACRO_DARG(Time(971, 1114).abs()));
199 EXPECT_EQ(MACRO_DARG(Time(253, Time::kNSecInSec * 0.3)),
200 MACRO_DARG(Time(-254, Time::kNSecInSec * 0.7).abs()));
201 EXPECT_EQ(MACRO_DARG(-Time(-971, 973).ToNSec()),
202 MACRO_DARG(Time(970, Time::kNSecInSec - 973).ToNSec()));
203}
204
brians343bc112013-02-10 01:53:46 +0000205} // namespace testing
206} // namespace time
207} // namespace aos