1 //  boost utility cast test program  -----------------------------------------//
2 
3 //  (C) Copyright Beman Dawes, Dave Abrahams 1999. Distributed under the Boost
4 //  Software License, Version 1.0. (See accompanying file
5 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 
7 //  See http://www.boost.org for most recent version including documentation.
8 
9 //  Revision History
10 //   28 Set 04  taken from the old cast library (Fernando Cacciola)
11 
12 #include <iostream>
13 #include <climits>
14 #include <cfloat>   // for DBL_MAX (Peter Schmid)
15 
16 #include <boost/numeric/conversion/cast.hpp>
17 
18 #include "boost/test/minimal.hpp"
19 
20 #  if SCHAR_MAX == LONG_MAX
21 #      error "This test program doesn't work if SCHAR_MAX == LONG_MAX"
22 #  endif
23 
24 using namespace boost;
25 using std::cout;
26 
test_main(int argc,char * argv[])27 int test_main( int argc, char * argv[] )
28 {
29 
30 #   ifdef NDEBUG
31         cout << "NDEBUG is defined\n";
32 #   else
33         cout << "NDEBUG is not defined\n";
34 #   endif
35 
36     cout << "\nBeginning tests...\n";
37 
38 //  test implicit_cast and numeric_cast  -------------------------------------//
39 
40     //  tests which should succeed
41     long small_value = 1;
42     long small_negative_value = -1;
43     long large_value = LONG_MAX;
44     long large_negative_value = LONG_MIN;
45     signed char c = 0;
46 
47     c = large_value;  // see if compiler generates warning
48 
49     c = numeric_cast<signed char>( small_value );
50     BOOST_CHECK( c == 1 );
51     c = 0;
52     c = numeric_cast<signed char>( small_value );
53     BOOST_CHECK( c == 1 );
54     c = 0;
55     c = numeric_cast<signed char>( small_negative_value );
56     BOOST_CHECK( c == -1 );
57 
58     // These tests courtesy of Joe R NWP Swatosh<joe.r.swatosh@usace.army.mil>
59     BOOST_CHECK( 0.0f == numeric_cast<float>( 0.0 ) );
60     BOOST_CHECK( 0.0 == numeric_cast<double>( 0.0 ) );
61 
62     //  tests which should result in errors being detected
63 
64     bool caught_exception = false;
65     try { c = numeric_cast<signed char>( large_value ); }
66     catch ( numeric::bad_numeric_cast )
67         { cout<<"caught bad_numeric_cast #1\n"; caught_exception = true; }
68     BOOST_CHECK ( caught_exception );
69 
70     caught_exception = false;
71     try { c = numeric_cast<signed char>( large_negative_value ); }
72     catch ( numeric::bad_numeric_cast )
73         { cout<<"caught bad_numeric_cast #2\n"; caught_exception = true; }
74     BOOST_CHECK ( caught_exception );
75 
76     unsigned long ul;
77     caught_exception = false;
78     try { ul = numeric_cast<unsigned long>( large_negative_value ); }
79     catch ( numeric::bad_numeric_cast )
80         { cout<<"caught bad_numeric_cast #3\n"; caught_exception = true; }
81     BOOST_CHECK ( caught_exception );
82 
83     caught_exception = false;
84     try { ul = numeric_cast<unsigned long>( small_negative_value ); }
85     catch ( numeric::bad_numeric_cast )
86         { cout<<"caught bad_numeric_cast #4\n"; caught_exception = true; }
87     BOOST_CHECK ( caught_exception );
88 
89     caught_exception = false;
90     try { numeric_cast<int>( DBL_MAX ); }
91     catch ( numeric::bad_numeric_cast )
92         { cout<<"caught bad_numeric_cast #5\n"; caught_exception = true; }
93     BOOST_CHECK ( caught_exception );
94 
95     return 0 ;
96 
97 }   // main
98