| 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  factored out numeric_cast<> test (Fernando Cacciola) | 
|---|
| 11 | //   20 Jan 01  removed use of <limits> for portability to raw GCC (David Abrahams) | 
|---|
| 12 | //   28 Jun 00  implicit_cast removed (Beman Dawes) | 
|---|
| 13 | //   30 Aug 99  value_cast replaced by numeric_cast | 
|---|
| 14 | //    3 Aug 99  Initial Version | 
|---|
| 15 |  | 
|---|
| 16 | #include <iostream> | 
|---|
| 17 | #include <climits> | 
|---|
| 18 | #include <cfloat>   // for DBL_MAX (Peter Schmid) | 
|---|
| 19 | #include <boost/cast.hpp> | 
|---|
| 20 |  | 
|---|
| 21 | #include "boost/test/minimal.hpp" | 
|---|
| 22 |  | 
|---|
| 23 | #  if SCHAR_MAX == LONG_MAX | 
|---|
| 24 | #      error "This test program doesn't work if SCHAR_MAX == LONG_MAX" | 
|---|
| 25 | #  endif | 
|---|
| 26 |  | 
|---|
| 27 | using namespace boost; | 
|---|
| 28 | using std::cout; | 
|---|
| 29 |  | 
|---|
| 30 |  | 
|---|
| 31 | int test_main( int argc, char * argv[] ) | 
|---|
| 32 | { | 
|---|
| 33 |  | 
|---|
| 34 | #   ifdef NDEBUG | 
|---|
| 35 |         cout << "NDEBUG is defined\n"; | 
|---|
| 36 | #   else | 
|---|
| 37 |         cout << "NDEBUG is not defined\n"; | 
|---|
| 38 | #   endif | 
|---|
| 39 |  | 
|---|
| 40 |     cout << "\nBeginning tests...\n"; | 
|---|
| 41 |  | 
|---|
| 42 | //  test implicit_cast and numeric_cast  -------------------------------------// | 
|---|
| 43 |  | 
|---|
| 44 |     //  tests which should succeed | 
|---|
| 45 |     long small_value = 1; | 
|---|
| 46 |     long small_negative_value = -1; | 
|---|
| 47 |     long large_value = LONG_MAX; | 
|---|
| 48 |     long large_negative_value = LONG_MIN; | 
|---|
| 49 |     signed char c = 0; | 
|---|
| 50 |  | 
|---|
| 51 |     c = large_value;  // see if compiler generates warning | 
|---|
| 52 |  | 
|---|
| 53 |     c = numeric_cast<signed char>( small_value ); | 
|---|
| 54 |     BOOST_CHECK( c == 1 ); | 
|---|
| 55 |     c = 0; | 
|---|
| 56 |     c = numeric_cast<signed char>( small_value ); | 
|---|
| 57 |     BOOST_CHECK( c == 1 ); | 
|---|
| 58 |     c = 0; | 
|---|
| 59 |     c = numeric_cast<signed char>( small_negative_value ); | 
|---|
| 60 |     BOOST_CHECK( c == -1 ); | 
|---|
| 61 |  | 
|---|
| 62 |     // These tests courtesy of Joe R NWP Swatosh<joe.r.swatosh@usace.army.mil> | 
|---|
| 63 |     BOOST_CHECK( 0.0f == numeric_cast<float>( 0.0 ) ); | 
|---|
| 64 |     BOOST_CHECK( 0.0 == numeric_cast<double>( 0.0 ) ); | 
|---|
| 65 |  | 
|---|
| 66 |     //  tests which should result in errors being detected | 
|---|
| 67 |  | 
|---|
| 68 |     bool caught_exception = false; | 
|---|
| 69 |     try { c = numeric_cast<signed char>( large_value ); } | 
|---|
| 70 |     catch (bad_numeric_cast) | 
|---|
| 71 |         { cout<<"caught bad_numeric_cast #1\n"; caught_exception = true; } | 
|---|
| 72 |     BOOST_CHECK ( caught_exception ); | 
|---|
| 73 |  | 
|---|
| 74 |     caught_exception = false; | 
|---|
| 75 |     try { c = numeric_cast<signed char>( large_negative_value ); } | 
|---|
| 76 |     catch (bad_numeric_cast) | 
|---|
| 77 |         { cout<<"caught bad_numeric_cast #2\n"; caught_exception = true; } | 
|---|
| 78 |     BOOST_CHECK ( caught_exception ); | 
|---|
| 79 |  | 
|---|
| 80 |     unsigned long ul; | 
|---|
| 81 |     caught_exception = false; | 
|---|
| 82 |     try { ul = numeric_cast<unsigned long>( large_negative_value ); } | 
|---|
| 83 |     catch (bad_numeric_cast) | 
|---|
| 84 |         { cout<<"caught bad_numeric_cast #3\n"; caught_exception = true; } | 
|---|
| 85 |     BOOST_CHECK ( caught_exception ); | 
|---|
| 86 |  | 
|---|
| 87 |     caught_exception = false; | 
|---|
| 88 |     try { ul = numeric_cast<unsigned long>( small_negative_value ); } | 
|---|
| 89 |     catch (bad_numeric_cast) | 
|---|
| 90 |         { cout<<"caught bad_numeric_cast #4\n"; caught_exception = true; } | 
|---|
| 91 |     BOOST_CHECK ( caught_exception ); | 
|---|
| 92 |  | 
|---|
| 93 |     caught_exception = false; | 
|---|
| 94 |     try { numeric_cast<int>( DBL_MAX ); } | 
|---|
| 95 |     catch (bad_numeric_cast) | 
|---|
| 96 |         { cout<<"caught bad_numeric_cast #5\n"; caught_exception = true; } | 
|---|
| 97 |     BOOST_CHECK ( caught_exception ); | 
|---|
| 98 |  | 
|---|
| 99 |     return 0 ; | 
|---|
| 100 | } | 
|---|