Ticket #9419: chrono_rounding.cpp

File chrono_rounding.cpp, 4.4 KB (added by 1czajnik@…, 9 years ago)

unit test demonstrating the problem

Line 
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
21BOOST_AUTO_TEST_SUITE( boost_chrono_rounding_ )
22
23using namespace boost::chrono;
24
25BOOST_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
42BOOST_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
59BOOST_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:
78BOOST_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
90BOOST_AUTO_TEST_SUITE_END()