copied everything over from 2012 and removed all of the actual robot code except the drivetrain stuff


git-svn-id: https://robotics.mvla.net/svn/frc971/2013/trunk/src@4078 f308d9b7-e957-4cde-b6ac-9a88185e7312
diff --git a/aos/common/time_test.cc b/aos/common/time_test.cc
new file mode 100644
index 0000000..6587759
--- /dev/null
+++ b/aos/common/time_test.cc
@@ -0,0 +1,132 @@
+#include "aos/common/time.h"
+
+#include "gtest/gtest.h"
+
+#include "aos/common/macros.h"
+
+namespace aos {
+namespace time {
+namespace testing {
+
+TEST(TimeTest, timespecConversions) {
+  timespec start{1234, 5678};  // NOLINT
+  Time time(start);
+  EXPECT_EQ(start.tv_sec, static_cast<signed time_t>(time.sec()));
+  EXPECT_EQ(start.tv_nsec, time.nsec());
+  timespec end = time.ToTimespec();
+  EXPECT_EQ(start.tv_sec, end.tv_sec);
+  EXPECT_EQ(start.tv_nsec, end.tv_nsec);
+}
+
+// It's kind of hard not to test Now and SleepFor at the same time.
+TEST(TimeTest, NowAndSleepFor) {
+  // without this, it tends to fail the first time (ends up sleeping for way
+  // longer than it should the second time, where it actually matters)
+  SleepFor(Time(0, Time::kNSecInSec / 10));
+  Time start = Time::Now();
+  SleepFor(Time(0, Time::kNSecInSec * 2 / 10));
+  EXPECT_TRUE(MACRO_DARG((Time::Now() - start)
+                         .IsWithin(Time(0, Time::kNSecInSec * 2 / 10),
+                                   Time::kNSecInSec / 1000)));
+}
+
+TEST(TimeTest, AbsoluteSleep) {
+  Time start = Time::Now();
+  SleepFor(Time(0, Time::kNSecInSec / 10));
+  SleepUntil((start + Time(0, Time::kNSecInSec * 2 / 10)));
+  EXPECT_TRUE(MACRO_DARG((Time::Now() - start)
+                         .IsWithin(Time(0, Time::kNSecInSec * 2 / 10),
+                                   Time::kNSecInSec / 1000)));
+}
+
+TEST(TimeTest, Addition) {
+  Time t(54, 500);
+  EXPECT_EQ(MACRO_DARG(Time(54, 5500)), t + MACRO_DARG(Time(0, 5000)));
+  EXPECT_EQ(MACRO_DARG(Time(56, 500)), t + MACRO_DARG(Time(2, 0)));
+  EXPECT_EQ(MACRO_DARG(Time(57, 6500)), t + MACRO_DARG(Time(3, 6000)));
+  EXPECT_EQ(MACRO_DARG(Time(50, 300)),
+            t + MACRO_DARG(Time(-5, Time::kNSecInSec - 200)));
+}
+TEST(TimeTest, Subtraction) {
+  Time t(54, 500);
+  EXPECT_EQ(MACRO_DARG(Time(54, 300)), t - MACRO_DARG(Time(0, 200)));
+  EXPECT_EQ(MACRO_DARG(Time(42, 500)), t - MACRO_DARG(Time(12, 0)));
+  EXPECT_EQ(MACRO_DARG(Time(50, 100)), t - MACRO_DARG(Time(4, 400)));
+  EXPECT_EQ(MACRO_DARG(Time(53, 600)),
+            t - MACRO_DARG(Time(0, Time::kNSecInSec - 100)));
+  EXPECT_EQ(MACRO_DARG(Time(55, 800)),
+            t - MACRO_DARG(Time(-2, Time::kNSecInSec - 300)));
+}
+
+TEST(TimeTest, Multiplication) {
+  Time t(54, Time::kNSecInSec / 3);
+  EXPECT_EQ(MACRO_DARG(Time(108, Time::kNSecInSec / 3 * 2)), t * 2);
+  EXPECT_EQ(MACRO_DARG(Time(271, Time::kNSecInSec / 3 * 2 - 1)), t * 5);
+}
+TEST(TimeTest, Division) {
+  EXPECT_EQ(MACRO_DARG(Time(5, Time::kNSecInSec / 10 * 4 + 50)),
+            MACRO_DARG(Time(54, 500)) / 10);
+}
+
+TEST(TimeTest, Comparisons) {
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) > Time(971, 253)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 253)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) < Time(971, 255)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) <= Time(971, 255)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 253)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) <= Time(971, 254)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) >= Time(971, 254)));
+  EXPECT_TRUE(MACRO_DARG(Time(972, 254) > Time(971, 254)));
+  EXPECT_TRUE(MACRO_DARG(Time(971, 254) < Time(972, 254)));
+}
+
+TEST(TimeTest, Within) {
+  EXPECT_TRUE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 100)));
+  EXPECT_FALSE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 99)));
+  EXPECT_TRUE(MACRO_DARG(Time(5, 0).IsWithin(Time(4, Time::kNSecInSec - 200),
+                                             250)));
+}
+
+TEST(TimeTest, Modulo) {
+  EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 10 * 2)),
+            MACRO_DARG(Time(50, 0) % (Time::kNSecInSec / 10 * 3)));
+}
+
+TEST(TimeTest, InSeconds) {
+  EXPECT_EQ(MACRO_DARG(Time(2, Time::kNSecInSec / 100 * 55 - 1)),
+            Time::InSeconds(2.55));
+}
+
+#ifdef __VXWORKS__
+TEST(TimeTest, ToTicks) {
+  EXPECT_EQ(sysClkRateGet() / 100,
+            MACRO_DARG(Time(0, Time::kNSecInSec / 100).ToTicks()));
+}
+#endif
+
+TEST(TimeTest, InMS) {
+  Time t = Time::InMS(254971);
+  EXPECT_EQ(254, t.sec());
+  EXPECT_EQ(971000000, t.nsec());
+}
+
+TEST(TimeTest, InNS) {
+  Time t = Time::InNS(static_cast<int64_t>(973254111971ll));
+  EXPECT_EQ(973, t.sec());
+  EXPECT_EQ(254111971, t.nsec());
+}
+
+TEST(TimeTest, InUS) {
+  Time t = Time::InUS(254111971);
+  EXPECT_EQ(254, t.sec());
+  EXPECT_EQ(111971000, t.nsec());
+}
+
+TEST(TimeTest, ToMSec) {
+  Time t(254, 971000000);
+  EXPECT_EQ(254971, t.ToMSec());
+}
+
+}  // namespace testing
+}  // namespace time
+}  // namespace aos