blob: 6587759647e3da44bbc4622843e3a7dbd218a111 [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
21// It's kind of hard not to test Now and SleepFor at the same time.
22TEST(TimeTest, NowAndSleepFor) {
23 // without this, it tends to fail the first time (ends up sleeping for way
24 // longer than it should the second time, where it actually matters)
25 SleepFor(Time(0, Time::kNSecInSec / 10));
26 Time start = Time::Now();
27 SleepFor(Time(0, Time::kNSecInSec * 2 / 10));
28 EXPECT_TRUE(MACRO_DARG((Time::Now() - start)
29 .IsWithin(Time(0, Time::kNSecInSec * 2 / 10),
30 Time::kNSecInSec / 1000)));
31}
32
33TEST(TimeTest, AbsoluteSleep) {
34 Time start = Time::Now();
35 SleepFor(Time(0, Time::kNSecInSec / 10));
36 SleepUntil((start + Time(0, Time::kNSecInSec * 2 / 10)));
37 EXPECT_TRUE(MACRO_DARG((Time::Now() - start)
38 .IsWithin(Time(0, Time::kNSecInSec * 2 / 10),
39 Time::kNSecInSec / 1000)));
40}
41
42TEST(TimeTest, Addition) {
43 Time t(54, 500);
44 EXPECT_EQ(MACRO_DARG(Time(54, 5500)), t + MACRO_DARG(Time(0, 5000)));
45 EXPECT_EQ(MACRO_DARG(Time(56, 500)), t + MACRO_DARG(Time(2, 0)));
46 EXPECT_EQ(MACRO_DARG(Time(57, 6500)), t + MACRO_DARG(Time(3, 6000)));
47 EXPECT_EQ(MACRO_DARG(Time(50, 300)),
48 t + MACRO_DARG(Time(-5, Time::kNSecInSec - 200)));
49}
50TEST(TimeTest, Subtraction) {
51 Time t(54, 500);
52 EXPECT_EQ(MACRO_DARG(Time(54, 300)), t - MACRO_DARG(Time(0, 200)));
53 EXPECT_EQ(MACRO_DARG(Time(42, 500)), t - MACRO_DARG(Time(12, 0)));
54 EXPECT_EQ(MACRO_DARG(Time(50, 100)), t - MACRO_DARG(Time(4, 400)));
55 EXPECT_EQ(MACRO_DARG(Time(53, 600)),
56 t - MACRO_DARG(Time(0, Time::kNSecInSec - 100)));
57 EXPECT_EQ(MACRO_DARG(Time(55, 800)),
58 t - MACRO_DARG(Time(-2, Time::kNSecInSec - 300)));
59}
60
61TEST(TimeTest, Multiplication) {
62 Time t(54, Time::kNSecInSec / 3);
63 EXPECT_EQ(MACRO_DARG(Time(108, Time::kNSecInSec / 3 * 2)), t * 2);
64 EXPECT_EQ(MACRO_DARG(Time(271, Time::kNSecInSec / 3 * 2 - 1)), t * 5);
65}
66TEST(TimeTest, Division) {
67 EXPECT_EQ(MACRO_DARG(Time(5, Time::kNSecInSec / 10 * 4 + 50)),
68 MACRO_DARG(Time(54, 500)) / 10);
69}
70
71TEST(TimeTest, Comparisons) {
72 EXPECT_TRUE(MACRO_DARG(Time(971, 254) > Time(971, 253)));
73 EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 253)));
74 EXPECT_TRUE(MACRO_DARG(Time(971, 254) < Time(971, 255)));
75 EXPECT_TRUE(MACRO_DARG(Time(971, 254) <= Time(971, 255)));
76 EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 253)));
77 EXPECT_TRUE(MACRO_DARG(Time(971, 254) <= Time(971, 254)));
78 EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 254)));
79 EXPECT_TRUE(MACRO_DARG(Time(972, 254) > Time(971, 254)));
80 EXPECT_TRUE(MACRO_DARG(Time(971, 254) < Time(972, 254)));
81}
82
83TEST(TimeTest, Within) {
84 EXPECT_TRUE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 100)));
85 EXPECT_FALSE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 99)));
86 EXPECT_TRUE(MACRO_DARG(Time(5, 0).IsWithin(Time(4, Time::kNSecInSec - 200),
87 250)));
88}
89
90TEST(TimeTest, Modulo) {
91 EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 10 * 2)),
92 MACRO_DARG(Time(50, 0) % (Time::kNSecInSec / 10 * 3)));
93}
94
95TEST(TimeTest, InSeconds) {
96 EXPECT_EQ(MACRO_DARG(Time(2, Time::kNSecInSec / 100 * 55 - 1)),
97 Time::InSeconds(2.55));
98}
99
100#ifdef __VXWORKS__
101TEST(TimeTest, ToTicks) {
102 EXPECT_EQ(sysClkRateGet() / 100,
103 MACRO_DARG(Time(0, Time::kNSecInSec / 100).ToTicks()));
104}
105#endif
106
107TEST(TimeTest, InMS) {
108 Time t = Time::InMS(254971);
109 EXPECT_EQ(254, t.sec());
110 EXPECT_EQ(971000000, t.nsec());
111}
112
113TEST(TimeTest, InNS) {
114 Time t = Time::InNS(static_cast<int64_t>(973254111971ll));
115 EXPECT_EQ(973, t.sec());
116 EXPECT_EQ(254111971, t.nsec());
117}
118
119TEST(TimeTest, InUS) {
120 Time t = Time::InUS(254111971);
121 EXPECT_EQ(254, t.sec());
122 EXPECT_EQ(111971000, t.nsec());
123}
124
125TEST(TimeTest, ToMSec) {
126 Time t(254, 971000000);
127 EXPECT_EQ(254971, t.ToMSec());
128}
129
130} // namespace testing
131} // namespace time
132} // namespace aos