Руслан Урядинский / libuavcan

Dependents:   UAVCAN UAVCAN_Subscriber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers time.cpp Source File

time.cpp

00001 /*
00002  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
00003  */
00004 
00005 #include <gtest/gtest.h>
00006 #include <uavcan/time.hpp>
00007 #include <uavcan/Timestamp.hpp>
00008 
00009 
00010 TEST(Time, Monotonic)
00011 {
00012     using uavcan::MonotonicDuration;
00013     using uavcan::MonotonicTime;
00014 
00015     MonotonicTime m1;
00016     MonotonicTime m2 = MonotonicTime::fromMSec(1);
00017     MonotonicDuration md1 = m2 - m1;  // 1000
00018     MonotonicDuration md2 = m1 - m2;  // -1000
00019 
00020     ASSERT_EQ(0, m1.toUSec());
00021     ASSERT_EQ(1000, m2.toUSec());
00022     ASSERT_EQ(1000, md1.toUSec());
00023     ASSERT_EQ(-1000, md2.toUSec());
00024 
00025     ASSERT_LT(m1, m2);
00026     ASSERT_LE(m1, m2);
00027     ASSERT_NE(m1, m2);
00028     ASSERT_TRUE(m1.isZero());
00029     ASSERT_FALSE(m2.isZero());
00030 
00031     ASSERT_GT(md1, md2);
00032     ASSERT_GE(md1, md2);
00033     ASSERT_NE(md1, md2);
00034     ASSERT_FALSE(md1.isZero());
00035     ASSERT_TRUE(md1.isPositive());
00036     ASSERT_TRUE(md2.isNegative());
00037 
00038     ASSERT_EQ(0, (md1 + md2).toUSec());
00039     ASSERT_EQ(2000, (md1 - md2).toUSec());
00040 
00041     md1 *= 2;                      // 2000
00042     ASSERT_EQ(2000, md1.toUSec());
00043 
00044     md2 += md1;                    // md2 = -1000 + 2000
00045     ASSERT_EQ(1000, md2.toUSec());
00046 
00047     ASSERT_EQ(-1000, (-md2).toUSec());
00048 
00049     /*
00050      * To string
00051      */
00052     ASSERT_EQ("0.000000", m1.toString());
00053     ASSERT_EQ("0.001000", m2.toString());
00054 
00055     ASSERT_EQ("0.002000", md1.toString());
00056     ASSERT_EQ("-0.001000", (-md2).toString());
00057 
00058     ASSERT_EQ("1001.000001", MonotonicTime::fromUSec(1001000001).toString());
00059     ASSERT_EQ("-1001.000001", MonotonicDuration::fromUSec(-1001000001).toString());
00060 }
00061 
00062 
00063 TEST(Time, Utc)
00064 {
00065     using uavcan::UtcDuration;
00066     using uavcan::UtcTime;
00067     using uavcan::Timestamp;
00068 
00069     Timestamp ts;
00070     ts.usec = 9000;
00071 
00072     UtcTime u1(ts);
00073     ASSERT_EQ(9000, u1.toUSec());
00074 
00075     ts.usec *= 2;
00076     u1 = ts;
00077     ASSERT_EQ(18000, u1.toUSec());
00078 
00079     ts = UtcTime::fromUSec(12345678900);
00080     ASSERT_EQ(12345678900, ts.usec);
00081 
00082     /*
00083      * To string
00084      */
00085     ASSERT_EQ("0.018000", u1.toString());
00086     ASSERT_EQ("12345.678900", UtcTime(ts).toString());
00087 }
00088 
00089 
00090 TEST(Time, Overflow)
00091 {
00092     using uavcan::MonotonicDuration;
00093     using uavcan::MonotonicTime;
00094 
00095     MonotonicTime max_4 = MonotonicTime::fromUSec(MonotonicTime::getMax().toUSec() / 4);
00096     MonotonicDuration max_4_duration = max_4 - MonotonicTime();
00097 
00098     std::cout << max_4 << std::endl;
00099     ASSERT_EQ(max_4_duration.toUSec(), max_4.toUSec());
00100 
00101     MonotonicTime max = (((max_4 + max_4_duration) + max_4_duration) + max_4_duration) + max_4_duration;
00102     ASSERT_EQ(max, MonotonicTime::getMax()); // Must not overflow
00103 
00104     MonotonicTime min;
00105     min -= max_4_duration;
00106     ASSERT_EQ(min, MonotonicTime()); // Must not underflow
00107 }