blob: e72e5bdeba012df3ddbddef946a47dd353691c19 [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)));
59}
60TEST(TimeTest, Subtraction) {
61 Time t(54, 500);
62 EXPECT_EQ(MACRO_DARG(Time(54, 300)), t - MACRO_DARG(Time(0, 200)));
63 EXPECT_EQ(MACRO_DARG(Time(42, 500)), t - MACRO_DARG(Time(12, 0)));
64 EXPECT_EQ(MACRO_DARG(Time(50, 100)), t - MACRO_DARG(Time(4, 400)));
65 EXPECT_EQ(MACRO_DARG(Time(53, 600)),
66 t - MACRO_DARG(Time(0, Time::kNSecInSec - 100)));
67 EXPECT_EQ(MACRO_DARG(Time(55, 800)),
68 t - MACRO_DARG(Time(-2, Time::kNSecInSec - 300)));
69}
70
71TEST(TimeTest, Multiplication) {
72 Time t(54, Time::kNSecInSec / 3);
73 EXPECT_EQ(MACRO_DARG(Time(108, Time::kNSecInSec / 3 * 2)), t * 2);
74 EXPECT_EQ(MACRO_DARG(Time(271, Time::kNSecInSec / 3 * 2 - 1)), t * 5);
75}
76TEST(TimeTest, Division) {
77 EXPECT_EQ(MACRO_DARG(Time(5, Time::kNSecInSec / 10 * 4 + 50)),
78 MACRO_DARG(Time(54, 500)) / 10);
79}
80
81TEST(TimeTest, Comparisons) {
82 EXPECT_TRUE(MACRO_DARG(Time(971, 254) > Time(971, 253)));
83 EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 253)));
84 EXPECT_TRUE(MACRO_DARG(Time(971, 254) < Time(971, 255)));
85 EXPECT_TRUE(MACRO_DARG(Time(971, 254) <= Time(971, 255)));
86 EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 253)));
87 EXPECT_TRUE(MACRO_DARG(Time(971, 254) <= Time(971, 254)));
88 EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 254)));
89 EXPECT_TRUE(MACRO_DARG(Time(972, 254) > Time(971, 254)));
90 EXPECT_TRUE(MACRO_DARG(Time(971, 254) < Time(972, 254)));
91}
92
93TEST(TimeTest, Within) {
94 EXPECT_TRUE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 100)));
95 EXPECT_FALSE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 99)));
96 EXPECT_TRUE(MACRO_DARG(Time(5, 0).IsWithin(Time(4, Time::kNSecInSec - 200),
97 250)));
98}
99
100TEST(TimeTest, Modulo) {
101 EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 10 * 2)),
102 MACRO_DARG(Time(50, 0) % (Time::kNSecInSec / 10 * 3)));
103}
104
105TEST(TimeTest, InSeconds) {
106 EXPECT_EQ(MACRO_DARG(Time(2, Time::kNSecInSec / 100 * 55 - 1)),
107 Time::InSeconds(2.55));
108}
109
briansf0165ca2013-03-02 06:17:47 +0000110TEST(TimeTest, ToSeconds) {
111 EXPECT_EQ(13.23, Time::InSeconds(13.23).ToSeconds());
112}
113
brians343bc112013-02-10 01:53:46 +0000114#ifdef __VXWORKS__
115TEST(TimeTest, ToTicks) {
116 EXPECT_EQ(sysClkRateGet() / 100,
117 MACRO_DARG(Time(0, Time::kNSecInSec / 100).ToTicks()));
118}
119#endif
120
121TEST(TimeTest, InMS) {
122 Time t = Time::InMS(254971);
123 EXPECT_EQ(254, t.sec());
124 EXPECT_EQ(971000000, t.nsec());
125}
126
127TEST(TimeTest, InNS) {
128 Time t = Time::InNS(static_cast<int64_t>(973254111971ll));
129 EXPECT_EQ(973, t.sec());
130 EXPECT_EQ(254111971, t.nsec());
131}
132
133TEST(TimeTest, InUS) {
134 Time t = Time::InUS(254111971);
135 EXPECT_EQ(254, t.sec());
136 EXPECT_EQ(111971000, t.nsec());
137}
138
139TEST(TimeTest, ToMSec) {
140 Time t(254, 971000000);
141 EXPECT_EQ(254971, t.ToMSec());
142}
143
144} // namespace testing
145} // namespace time
146} // namespace aos