// Copyright 2013 Krzysztof Czainski // Copyright 2013 Vicente J. Botet Escriba // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) /* * @file chrono_rounding.cpp * * @since 2013-11-22 * @author Krzysztof Czainski <1czajnik@gmail.com> */ #include #include #include #include #include #include using namespace boost::chrono; void test_floor() { BOOST_TEST_EQ( seconds(-2), floor( milliseconds(-2000) ) ); BOOST_TEST_EQ( seconds(-2), floor( milliseconds(-1999) ) ); BOOST_TEST_EQ( seconds(-2), floor( milliseconds(-1001) ) ); BOOST_TEST_EQ( seconds(-1), floor( milliseconds(-1000) ) ); BOOST_TEST_EQ( seconds(-1), floor( milliseconds(-999) ) ); BOOST_TEST_EQ( seconds(-1), floor( milliseconds(-1) ) ); BOOST_TEST_EQ( seconds(0), floor( milliseconds(0) ) ); BOOST_TEST_EQ( seconds(0), floor( milliseconds(1) ) ); BOOST_TEST_EQ( seconds(0), floor( milliseconds(999) ) ); BOOST_TEST_EQ( seconds(1), floor( milliseconds(1000) ) ); BOOST_TEST_EQ( seconds(1), floor( milliseconds(1001) ) ); BOOST_TEST_EQ( seconds(1), floor( milliseconds(1999) ) ); BOOST_TEST_EQ( seconds(2), floor( milliseconds(2000) ) ); { // check that int32 isn't overflowed in intermediate calculations: typedef duration sec32; typedef duration< boost::int32_t, boost::ratio<999,1000> > sec32_m1ms; BOOST_TEST_EQ( sec32(-999000000), floor( sec32_m1ms(-1000000000) ) ); BOOST_TEST_EQ( sec32( 999000000), floor( sec32_m1ms( 1000000000) ) ); } } void test_ceil() { BOOST_TEST_EQ( seconds(-2), ceil( milliseconds(-2000) ) ); BOOST_TEST_EQ( seconds(-1), ceil( milliseconds(-1999) ) ); BOOST_TEST_EQ( seconds(-1), ceil( milliseconds(-1001) ) ); BOOST_TEST_EQ( seconds(-1), ceil( milliseconds(-1000) ) ); BOOST_TEST_EQ( seconds(0), ceil( milliseconds(-999) ) ); BOOST_TEST_EQ( seconds(0), ceil( milliseconds(-1) ) ); BOOST_TEST_EQ( seconds(0), ceil( milliseconds(0) ) ); BOOST_TEST_EQ( seconds(1), ceil( milliseconds(1) ) ); BOOST_TEST_EQ( seconds(1), ceil( milliseconds(999) ) ); BOOST_TEST_EQ( seconds(1), ceil( milliseconds(1000) ) ); BOOST_TEST_EQ( seconds(2), ceil( milliseconds(1001) ) ); BOOST_TEST_EQ( seconds(2), ceil( milliseconds(1999) ) ); BOOST_TEST_EQ( seconds(2), ceil( milliseconds(2000) ) ); { // check that int32 isn't overflowed in intermediate calculations: typedef duration sec32; typedef duration< boost::int32_t, boost::ratio<999,1000> > sec32_m1ms; BOOST_TEST_EQ( sec32(-999000000), ceil( sec32_m1ms(-1000000000) ) ); BOOST_TEST_EQ( sec32( 999000000), ceil( sec32_m1ms( 1000000000) ) ); } } void test_round() { // to even on tie BOOST_TEST_EQ( seconds(-2), round( milliseconds(-2000) ) ); BOOST_TEST_EQ( seconds(-2), round( milliseconds(-1500) ) ); BOOST_TEST_EQ( seconds(-1), round( milliseconds(-1499) ) ); BOOST_TEST_EQ( seconds(-1), round( milliseconds(-1000) ) ); BOOST_TEST_EQ( seconds(0), round( milliseconds(-500) ) ); BOOST_TEST_EQ( seconds(0), round( milliseconds(-499) ) ); BOOST_TEST_EQ( seconds(0), round( milliseconds(0) ) ); BOOST_TEST_EQ( seconds(0), round( milliseconds(499) ) ); BOOST_TEST_EQ( seconds(0), round( milliseconds(500) ) ); BOOST_TEST_EQ( seconds(1), round( milliseconds(1000) ) ); BOOST_TEST_EQ( seconds(1), round( milliseconds(1499) ) ); BOOST_TEST_EQ( seconds(2), round( milliseconds(1500) ) ); BOOST_TEST_EQ( seconds(2), round( milliseconds(2000) ) ); { // check that int32 isn't overflowed in intermediate calculations: typedef duration sec32; typedef duration< boost::int32_t, boost::ratio<999,1000> > sec32_m1ms; BOOST_TEST_EQ( sec32(-999000000), round( sec32_m1ms(-1000000000) ) ); BOOST_TEST_EQ( sec32( 999000000), round( sec32_m1ms( 1000000000) ) ); } } int main() { test_floor(); test_ceil(); test_round(); return boost::report_errors(); }