1 | // Copyright 2013 Krzysztof Czainski
|
---|
2 | // Distributed under the Boost Software License, Version 1.0.
|
---|
3 | // (See accompanying file LICENSE_1_0.txt or copy at
|
---|
4 | // http://www.boost.org/LICENSE_1_0.txt)
|
---|
5 |
|
---|
6 | /*
|
---|
7 | * @file chrono_rounding.cpp
|
---|
8 | *
|
---|
9 | * @since 2013-11-22
|
---|
10 | * @author Krzysztof Czainski <1czajnik@gmail.com>
|
---|
11 | */
|
---|
12 |
|
---|
13 | #include <boost/chrono/ceil.hpp>
|
---|
14 | #include <boost/chrono/floor.hpp>
|
---|
15 | #include <boost/chrono/round.hpp>
|
---|
16 |
|
---|
17 | #include <boost/chrono/chrono_io.hpp>
|
---|
18 | #define BOOST_TEST_MAIN "Boost.Chrono.rounding tests"
|
---|
19 | #include <boost/test/included/unit_test.hpp>
|
---|
20 |
|
---|
21 | BOOST_AUTO_TEST_SUITE( boost_chrono_rounding_ )
|
---|
22 |
|
---|
23 | using namespace boost::chrono;
|
---|
24 |
|
---|
25 | BOOST_AUTO_TEST_CASE( floor_ )
|
---|
26 | {
|
---|
27 | BOOST_CHECK_EQUAL( seconds(-2), floor<seconds>( milliseconds(-2000) ) );
|
---|
28 | BOOST_CHECK_EQUAL( seconds(-2), floor<seconds>( milliseconds(-1999) ) );
|
---|
29 | BOOST_CHECK_EQUAL( seconds(-2), floor<seconds>( milliseconds(-1001) ) );
|
---|
30 | BOOST_CHECK_EQUAL( seconds(-1), floor<seconds>( milliseconds(-1000) ) );
|
---|
31 | BOOST_CHECK_EQUAL( seconds(-1), floor<seconds>( milliseconds(-999) ) );
|
---|
32 | BOOST_CHECK_EQUAL( seconds(-1), floor<seconds>( milliseconds(-1) ) );
|
---|
33 | BOOST_CHECK_EQUAL( seconds(0), floor<seconds>( milliseconds(0) ) );
|
---|
34 | BOOST_CHECK_EQUAL( seconds(0), floor<seconds>( milliseconds(1) ) );
|
---|
35 | BOOST_CHECK_EQUAL( seconds(0), floor<seconds>( milliseconds(999) ) );
|
---|
36 | BOOST_CHECK_EQUAL( seconds(1), floor<seconds>( milliseconds(1000) ) );
|
---|
37 | BOOST_CHECK_EQUAL( seconds(1), floor<seconds>( milliseconds(1001) ) );
|
---|
38 | BOOST_CHECK_EQUAL( seconds(1), floor<seconds>( milliseconds(1999) ) );
|
---|
39 | BOOST_CHECK_EQUAL( seconds(2), floor<seconds>( milliseconds(2000) ) );
|
---|
40 | }
|
---|
41 |
|
---|
42 | BOOST_AUTO_TEST_CASE( ceil_ )
|
---|
43 | {
|
---|
44 | BOOST_CHECK_EQUAL( seconds(-2), ceil<seconds>( milliseconds(-2000) ) );
|
---|
45 | BOOST_CHECK_EQUAL( seconds(-1), ceil<seconds>( milliseconds(-1999) ) );
|
---|
46 | BOOST_CHECK_EQUAL( seconds(-1), ceil<seconds>( milliseconds(-1001) ) );
|
---|
47 | BOOST_CHECK_EQUAL( seconds(-1), ceil<seconds>( milliseconds(-1000) ) );
|
---|
48 | BOOST_CHECK_EQUAL( seconds(0), ceil<seconds>( milliseconds(-999) ) );
|
---|
49 | BOOST_CHECK_EQUAL( seconds(0), ceil<seconds>( milliseconds(-1) ) );
|
---|
50 | BOOST_CHECK_EQUAL( seconds(0), ceil<seconds>( milliseconds(0) ) );
|
---|
51 | BOOST_CHECK_EQUAL( seconds(1), ceil<seconds>( milliseconds(1) ) );
|
---|
52 | BOOST_CHECK_EQUAL( seconds(1), ceil<seconds>( milliseconds(999) ) );
|
---|
53 | BOOST_CHECK_EQUAL( seconds(1), ceil<seconds>( milliseconds(1000) ) );
|
---|
54 | BOOST_CHECK_EQUAL( seconds(2), ceil<seconds>( milliseconds(1001) ) );
|
---|
55 | BOOST_CHECK_EQUAL( seconds(2), ceil<seconds>( milliseconds(1999) ) );
|
---|
56 | BOOST_CHECK_EQUAL( seconds(2), ceil<seconds>( milliseconds(2000) ) );
|
---|
57 | }
|
---|
58 |
|
---|
59 | BOOST_AUTO_TEST_CASE( round_ )
|
---|
60 | {
|
---|
61 | // to even on tie
|
---|
62 | BOOST_CHECK_EQUAL( seconds(-2), round<seconds>( milliseconds(-2000) ) );
|
---|
63 | BOOST_CHECK_EQUAL( seconds(-2), round<seconds>( milliseconds(-1500) ) );
|
---|
64 | BOOST_CHECK_EQUAL( seconds(-1), round<seconds>( milliseconds(-1499) ) );
|
---|
65 | BOOST_CHECK_EQUAL( seconds(-1), round<seconds>( milliseconds(-1000) ) );
|
---|
66 | BOOST_CHECK_EQUAL( seconds(0), round<seconds>( milliseconds(-500) ) );
|
---|
67 | BOOST_CHECK_EQUAL( seconds(0), round<seconds>( milliseconds(-499) ) );
|
---|
68 | BOOST_CHECK_EQUAL( seconds(0), round<seconds>( milliseconds(0) ) );
|
---|
69 | BOOST_CHECK_EQUAL( seconds(0), round<seconds>( milliseconds(499) ) );
|
---|
70 | BOOST_CHECK_EQUAL( seconds(0), round<seconds>( milliseconds(500) ) );
|
---|
71 | BOOST_CHECK_EQUAL( seconds(1), round<seconds>( milliseconds(1000) ) );
|
---|
72 | BOOST_CHECK_EQUAL( seconds(1), round<seconds>( milliseconds(1499) ) );
|
---|
73 | BOOST_CHECK_EQUAL( seconds(2), round<seconds>( milliseconds(1500) ) );
|
---|
74 | BOOST_CHECK_EQUAL( seconds(2), round<seconds>( milliseconds(2000) ) );
|
---|
75 | }
|
---|
76 |
|
---|
77 | // check that int32 isn't overflowed in intermediate calculations:
|
---|
78 | BOOST_AUTO_TEST_CASE( overflow_ )
|
---|
79 | {
|
---|
80 | typedef duration<int32_t> sec32;
|
---|
81 | typedef duration< int32_t, boost::ratio<999,1000> > sec32_m1ms;
|
---|
82 | BOOST_CHECK_EQUAL( sec32(-999000000), floor<sec32>( sec32_m1ms(-1000000000) ) );
|
---|
83 | BOOST_CHECK_EQUAL( sec32( 999000000), floor<sec32>( sec32_m1ms( 1000000000) ) );
|
---|
84 | BOOST_CHECK_EQUAL( sec32(-999000000), ceil<sec32>( sec32_m1ms(-1000000000) ) );
|
---|
85 | BOOST_CHECK_EQUAL( sec32( 999000000), ceil<sec32>( sec32_m1ms( 1000000000) ) );
|
---|
86 | BOOST_CHECK_EQUAL( sec32(-999000000), round<sec32>( sec32_m1ms(-1000000000) ) );
|
---|
87 | BOOST_CHECK_EQUAL( sec32( 999000000), round<sec32>( sec32_m1ms( 1000000000) ) );
|
---|
88 | }
|
---|
89 |
|
---|
90 | BOOST_AUTO_TEST_SUITE_END()
|
---|