implement basic operations over class Time
[libi2ncommon] / test / test_timefunc.cpp
index c973a4f..6752042 100644 (file)
@@ -497,6 +497,430 @@ BOOST_AUTO_TEST_SUITE(Clock)
         BOOST_CHECK_EQUAL(t->err, 0);
     }
 
-BOOST_AUTO_TEST_SUITE_END()
+    BOOST_AUTO_TEST_CASE(initializer_zero)
+    {
+        I2n::clock::Time stundenull = I2n::clock::zero ();
+
+        BOOST_CHECK_EQUAL(stundenull.get_sec  (), 0);
+        BOOST_CHECK_EQUAL(stundenull.get_nsec (), 0);
+        BOOST_CHECK_EQUAL(stundenull.err, 0);
+    }
+
+    BOOST_AUTO_TEST_CASE(member_set_now)
+    {
+        I2n::clock::Time t;
+
+        BOOST_CHECK(t.set ());
+
+        BOOST_CHECK_NE(t.get_sec (), 0);
+    }
+
+    BOOST_AUTO_TEST_CASE(member_set_value)
+    {
+        I2n::clock::Time t;
+
+        t.set (42, 42);
+
+        BOOST_CHECK_EQUAL(t.get_sec  (), 42);
+        BOOST_CHECK_EQUAL(t.get_nsec (), 42);
+    }
+
+    BOOST_AUTO_TEST_CASE(member_set_value_type)
+    {
+        I2n::clock::Time t;
+
+        t.set (42, 42, I2n::clock::type::real, I2n::clock::type::exact);
+
+        BOOST_CHECK_EQUAL(t.get_sec  (), 42);
+        BOOST_CHECK_EQUAL(t.get_nsec (), 42);
+    }
+
+    BOOST_AUTO_TEST_CASE(member_add_parts)
+    {
+        I2n::clock::Time t;
+
+        t.set (42, 42);
+        t.add (2187, 2187);
+
+        BOOST_CHECK_EQUAL(t.get_sec  (), 2229);
+        BOOST_CHECK_EQUAL(t.get_nsec (), 2229);
+    }
+
+    BOOST_AUTO_TEST_CASE(member_sub_parts)
+    {
+        I2n::clock::Time t;
+
+        t.set (2, 0L);
+        t.subtract (1, 1L);
+
+        BOOST_CHECK_EQUAL(t.get_sec  (), 0);
+        BOOST_CHECK_EQUAL(t.get_nsec (), 999999999);
+    }
+
+    BOOST_AUTO_TEST_CASE(member_sub_Time)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+
+        t1.set (42, 42L);
+        t2.set (42,  0L);
+
+        t1.subtract (t2);
+
+        BOOST_CHECK_EQUAL(t1.get_sec  (),  0);
+        BOOST_CHECK_EQUAL(t1.get_nsec (), 42L);
+    }
+
+    BOOST_AUTO_TEST_CASE(member_diff)
+    {
+        static const time_t five = 5 * 365 * 24 * 3600;
+
+        I2n::clock::Time t1 (42, 1337);
+        I2n::clock::Time t2 = t1 + five;;
+        I2n::clock::Time t3 = t1 - five;;
+
+        BOOST_CHECK_EQUAL(t2, I2n::clock::Time ((time_t)42 + five, 1337));
+        BOOST_CHECK_EQUAL(t3, I2n::clock::Time ((time_t)42 - five, 1337));
+        BOOST_CHECK_EQUAL(t1.difference (t3), t3.difference (t1));
+        BOOST_CHECK_EQUAL(t3.difference (t3), t3.difference (t3));
+    }
+
+    BOOST_AUTO_TEST_CASE(op_copyassign)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+
+        BOOST_CHECK(t1.set ());
+
+        t2 = t1;
+
+        BOOST_CHECK_EQUAL(t1.get_sec  (), t2.get_sec  ());
+        BOOST_CHECK_EQUAL(t1.get_nsec (), t2.get_nsec ());
+    }
+
+    BOOST_AUTO_TEST_CASE(op_equal)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+
+        BOOST_CHECK(t1.set ());
+        t2 = t1;
+
+        BOOST_CHECK_EQUAL(t1, t2);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_add_Time)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+        I2n::clock::Time tsum;
+
+        t1.set (2187, 2187);
+        t2.set (1337, 1337);
+        tsum = t1 + t2;
+
+        BOOST_CHECK_EQUAL(tsum.get_sec  (), 3524);
+        BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_add_Time_carry)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+        I2n::clock::Time tsum;
+
+        t1.set (2187, 2187);
+        t2.set (1300, 37L * 1000 * 1000 * 1000 + 1337);
+
+        tsum = t1 + t2;
+
+        BOOST_CHECK_EQUAL(tsum.get_sec  (), 3524);
+        BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_add_time_t)
+    {
+        I2n::clock::Time t1 (2187, 2187);
+        time_t           t2 = 1337;
+        I2n::clock::Time tsum;
+
+        tsum = t1 + t2;
+
+        BOOST_CHECK_EQUAL(tsum.get_sec  (), 3524);
+        BOOST_CHECK_EQUAL(tsum.get_nsec (), 2187);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_add_time_t_external)
+    {
+        time_t           t1 = 1337;
+        I2n::clock::Time t2 (2187, 2187);
+        I2n::clock::Time tsum;
+
+        tsum = t1 + t2;
+
+        BOOST_CHECK_EQUAL(tsum.get_sec  (), 3524);
+        BOOST_CHECK_EQUAL(tsum.get_nsec (), 2187);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_incr_Time)
+    {
+        I2n::clock::Time t1 (2187, 2187);
+        I2n::clock::Time t2 (1337, 1337);
+
+        t1 += t2;
+
+        BOOST_CHECK_EQUAL(t1.get_sec  (), 3524);
+        BOOST_CHECK_EQUAL(t1.get_nsec (), 3524);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_incr_time_t)
+    {
+        I2n::clock::Time t1 (2187, 2187);
+        time_t           t2 = 1337;
+
+        t1 += t2;
+
+        BOOST_CHECK_EQUAL(t1.get_sec  (), 3524);
+        BOOST_CHECK_EQUAL(t1.get_nsec (), 2187);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_subtract_Time)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+        I2n::clock::Time tdiff;
+
+        t1.set (2187, 2187);
+        t2.set (1337, 1337);
+        tdiff = t1 - t2;
+
+        BOOST_CHECK_EQUAL(tdiff.get_sec  (), 850);
+        BOOST_CHECK_EQUAL(tdiff.get_nsec (), 850);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_subtract_time_t)
+    {
+        I2n::clock::Time t1 (2187, 2187);
+        time_t           t2 = 1337;
+        I2n::clock::Time tdiff;
+
+        tdiff = t1 - t2;
+
+        BOOST_CHECK_EQUAL(tdiff.get_sec  (), 850);
+        BOOST_CHECK_EQUAL(tdiff.get_nsec (), 2187);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_subtract_time_t_external)
+    {
+        time_t           t1 = 1337;
+        I2n::clock::Time t2 (2187, 2187);
+        I2n::clock::Time tdiff;
+
+        tdiff = t1 - t2;
+
+        BOOST_CHECK_EQUAL(tdiff.get_sec  (), -851);
+        BOOST_CHECK_EQUAL(tdiff.get_nsec (), 999997813);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_decr_Time)
+    {
+        I2n::clock::Time t1 (2187, 2187);
+        I2n::clock::Time t2 (1337, 1337);
+
+        t1 -= t2;
+
+        BOOST_CHECK_EQUAL(t1.get_sec  (), 850);
+        BOOST_CHECK_EQUAL(t1.get_nsec (), 850);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_decr_time_t)
+    {
+        I2n::clock::Time t1 (2187, 2187);
+        time_t           t2 = 1337;
+
+        t1 -= t2;
+
+        BOOST_CHECK_EQUAL(t1.get_sec  (), 850);
+        BOOST_CHECK_EQUAL(t1.get_nsec (), 2187);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_mult_scale)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+
+        t1.set (1, 1);
+        t2 = t1 * 42;
+
+        BOOST_CHECK_EQUAL(t2.get_sec  (), 42);
+        BOOST_CHECK_EQUAL(t2.get_nsec (), 42);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_mult_mutate)
+    {
+        I2n::clock::Time t1 (  42, 42);
+        I2n::clock::Time t2 (1337,  0);
+
+        t1 *=   2;
+        t2 *= -10;
+
+        BOOST_CHECK_EQUAL(t1.get_sec  (),     84);
+        BOOST_CHECK_EQUAL(t1.get_nsec (),     84);
+        BOOST_CHECK_EQUAL(t2.get_sec  (), -13370);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_mult_scale_carry)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+
+        t1.set (1, 500 * 1000 * 1000);
+        t2 = t1 * 3;
+
+        BOOST_CHECK_EQUAL(t2.get_sec  (),  4);
+        BOOST_CHECK_EQUAL(t2.get_nsec (),  500 * 1000 * 1000);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_equals)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+
+        t1.set (50, 50);
+        t2.set (50, 50);
+
+        BOOST_CHECK_EQUAL(t1, t2);
+    }
+
+    BOOST_AUTO_TEST_CASE(compare_equal)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+
+        t1.set (42, 42);
+        t2.set (42, 42);
+
+        BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), 0);
+    }
+
+    BOOST_AUTO_TEST_CASE(compare_equal_type)
+    {
+        I2n::clock::Time t1 (42, 42, I2n::clock::type::real);
+        I2n::clock::Time t2 (42, 42, I2n::clock::type::cpu);
+        I2n::clock::Time t3 (42,  0, I2n::clock::type::real);
+        I2n::clock::Time t4 (42, 42, I2n::clock::type::real);
+
+        BOOST_CHECK_NE(t1, t2);
+        BOOST_CHECK_NE(t1, t3);
+        BOOST_CHECK_EQUAL(t1, t4);
+    }
+
+    BOOST_AUTO_TEST_CASE(compare_ne_sec)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+
+        t1.set (  42, 42);
+        t2.set (1337, 42);
+
+        BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), -1);
+        BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1),  1);
+    }
+
+    BOOST_AUTO_TEST_CASE(compare_ne_nsec)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+
+        t1.set (42,   42);
+        t2.set (42, 1337);
+
+        BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), -1);
+        BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1),  1);
+    }
+
+    BOOST_AUTO_TEST_CASE(compare_ne_both)
+    {
+        I2n::clock::Time t1;
+        I2n::clock::Time t2;
+
+        t1.set (42, 2187);
+        t2.set (23, 1337);
+
+        BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2),  1);
+        BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), -1);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_ineq_sec)
+    {
+        I2n::clock::Time t1 (1337);
+        I2n::clock::Time t2 (2187);
+
+        BOOST_CHECK_LT(t1, t2);
+        BOOST_CHECK_GT(t2, t1);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_ineq_nsec)
+    {
+        I2n::clock::Time t1 (1337, 23);
+        I2n::clock::Time t2 (1337, 42);
+
+        BOOST_CHECK_LT(t1, t2);
+        BOOST_CHECK_GT(t2, t1);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_ineq_both)
+    {
+        I2n::clock::Time t1 (2187, 23);
+        I2n::clock::Time t2 (1337, 42);
+
+        BOOST_CHECK_LT(t2, t1);
+        BOOST_CHECK_GT(t1, t2);
+    }
+
+    BOOST_AUTO_TEST_CASE(op_eq_time_t)
+    {
+        boost::optional<I2n::clock::Time> t1  = I2n::clock::now ();
+        const time_t                      t2  = time (NULL); /* race here */
+
+        *t1 -= (time_t)42;
+
+        BOOST_CHECK_NE(*t1,  t2);
+        BOOST_CHECK_LT(*t1,  t2);
+        BOOST_CHECK_GT( t2, *t1);
+    }
+
+    BOOST_AUTO_TEST_CASE(containers_list)
+    {
+        std::list<I2n::clock::Time> ts;
+
+        ts.push_back (I2n::clock::zero ());
+        ts.push_back (I2n::clock::zero ());
+
+        BOOST_CHECK_EQUAL(ts.size (), 2);
+    }
+
+    BOOST_AUTO_TEST_CASE(containers_vec)
+    {
+        std::vector<I2n::clock::Time> ts;
+
+        ts.push_back (I2n::clock::zero ());
+        ts.push_back (I2n::clock::zero ());
+
+        BOOST_CHECK_EQUAL(ts.size (), 2);
+    }
+
+    BOOST_AUTO_TEST_CASE(containers_set)
+    {
+        std::set<I2n::clock::Time> ts;
+
+        ts.insert (I2n::clock::zero ());
+        ts.insert (I2n::clock::Time (42, 2187));
+        ts.insert (I2n::clock::zero ());
+
+        BOOST_CHECK_EQUAL(ts.size (), 2);
+    }
+
+BOOST_AUTO_TEST_SUITE_END() /* [Clock] */
 
 BOOST_AUTO_TEST_SUITE_END()