numeric_cast<> test factored out from conversion\cast_test.cp

and also added (duplicated) in numeric\conversion\test


[SVN r25468]
This commit is contained in:
Fernando Cacciola
2004-09-28 21:48:39 +00:00
parent bba9169401
commit a096a4b153
3 changed files with 118 additions and 78 deletions

View File

@@ -7,6 +7,7 @@
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
// Revision History // Revision History
// 28 Set 04 factored out numeric_cast<> test (Fernando Cacciola)
// 20 Jan 01 removed use of <limits> for portability to raw GCC (David Abrahams) // 20 Jan 01 removed use of <limits> for portability to raw GCC (David Abrahams)
// 28 Jun 00 implicit_cast removed (Beman Dawes) // 28 Jun 00 implicit_cast removed (Beman Dawes)
// 30 Aug 99 value_cast replaced by numeric_cast // 30 Aug 99 value_cast replaced by numeric_cast
@@ -19,7 +20,7 @@
# if SCHAR_MAX == LONG_MAX # if SCHAR_MAX == LONG_MAX
# error "This test program doesn't work if SCHAR_MAX == LONG_MAX" # error "This test program doesn't work if SCHAR_MAX == LONG_MAX"
# endif # endif
using namespace boost; using namespace boost;
using std::cout; using std::cout;
@@ -27,39 +28,34 @@ using std::cout;
namespace namespace
{ {
struct Base struct Base
{ {
virtual char kind() { return 'B'; } virtual char kind() { return 'B'; }
}; };
struct Base2 struct Base2
{ {
virtual char kind2() { return '2'; } virtual char kind2() { return '2'; }
}; };
struct Derived : public Base, Base2 struct Derived : public Base, Base2
{ {
virtual char kind() { return 'D'; } virtual char kind() { return 'D'; }
}; };
} }
int main( int argc, char * argv[] ) int main( int argc, char * argv[] )
{ {
cout << "Usage: test_casts [n], where n omitted or is:\n"
" 1 = execute #1 assert failure (#ifndef NDEBUG)\n"
" 2 = execute #2 assert failure (#ifndef NDEBUG)\n"
"Example: test_casts 2\n\n";
# ifdef NDEBUG # ifdef NDEBUG
cout << "NDEBUG is defined\n"; cout << "NDEBUG is defined\n";
# else # else
cout << "NDEBUG is not defined\n"; cout << "NDEBUG is not defined\n";
# endif # endif
cout << "\nBeginning tests...\n"; cout << "\nBeginning tests...\n";
// test polymorphic_cast ---------------------------------------------------// // test polymorphic_cast ---------------------------------------------------//
// tests which should succeed // tests which should succeed
Base * base = new Derived; Base * base = new Derived;
Base2 * base2 = 0; Base2 * base2 = 0;
@@ -89,63 +85,6 @@ int main( int argc, char * argv[] )
// the following is just so generated code can be inspected // the following is just so generated code can be inspected
if ( derived->kind() == 'B' ) ++err_count; if ( derived->kind() == 'B' ) ++err_count;
// test implicit_cast and numeric_cast -------------------------------------//
// tests which should succeed
long small_value = 1;
long small_negative_value = -1;
long large_value = LONG_MAX;
long large_negative_value = LONG_MIN;
signed char c = 0;
c = large_value; // see if compiler generates warning
c = numeric_cast<signed char>( small_value );
assert( c == 1 );
c = 0;
c = numeric_cast<signed char>( small_value );
assert( c == 1 );
c = 0;
c = numeric_cast<signed char>( small_negative_value );
assert( c == -1 );
// These tests courtesy of Joe R NWP Swatosh<joe.r.swatosh@usace.army.mil>
assert( 0.0f == numeric_cast<float>( 0.0 ) );
assert( 0.0 == numeric_cast<double>( 0.0 ) );
// tests which should result in errors being detected
caught_exception = false;
try { c = numeric_cast<signed char>( large_value ); }
catch (bad_numeric_cast)
{ cout<<"caught bad_numeric_cast #1\n"; caught_exception = true; }
if ( !caught_exception ) ++err_count;
caught_exception = false;
try { c = numeric_cast<signed char>( large_negative_value ); }
catch (bad_numeric_cast)
{ cout<<"caught bad_numeric_cast #2\n"; caught_exception = true; }
if ( !caught_exception ) ++err_count;
unsigned long ul;
caught_exception = false;
try { ul = numeric_cast<unsigned long>( large_negative_value ); }
catch (bad_numeric_cast)
{ cout<<"caught bad_numeric_cast #3\n"; caught_exception = true; }
if ( !caught_exception ) ++err_count;
caught_exception = false;
try { ul = numeric_cast<unsigned long>( small_negative_value ); }
catch (bad_numeric_cast)
{ cout<<"caught bad_numeric_cast #4\n"; caught_exception = true; }
if ( !caught_exception ) ++err_count;
caught_exception = false;
try { numeric_cast<int>( DBL_MAX ); }
catch (bad_numeric_cast)
{ cout<<"caught bad_numeric_cast #5\n"; caught_exception = true; }
if ( !caught_exception ) ++err_count;
cout << err_count << " errors detected\nTest " cout << err_count << " errors detected\nTest "
<< (err_count==0 ? "passed\n" : "failed\n"); << (err_count==0 ? "passed\n" : "failed\n");
return err_count; return err_count;

100
numeric_cast_test.cpp Normal file
View File

@@ -0,0 +1,100 @@
// boost utility cast test program -----------------------------------------//
// (C) Copyright Beman Dawes, Dave Abrahams 1999. 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)
// See http://www.boost.org for most recent version including documentation.
// Revision History
// 28 Set 04 factored out numeric_cast<> test (Fernando Cacciola)
// 20 Jan 01 removed use of <limits> for portability to raw GCC (David Abrahams)
// 28 Jun 00 implicit_cast removed (Beman Dawes)
// 30 Aug 99 value_cast replaced by numeric_cast
// 3 Aug 99 Initial Version
#include <iostream>
#include <climits>
#include <cfloat> // for DBL_MAX (Peter Schmid)
#include <boost/cast.hpp>
#include "boost/test/minimal.hpp"
# if SCHAR_MAX == LONG_MAX
# error "This test program doesn't work if SCHAR_MAX == LONG_MAX"
# endif
using namespace boost;
using std::cout;
int main( int argc, char * argv[] )
{
# ifdef NDEBUG
cout << "NDEBUG is defined\n";
# else
cout << "NDEBUG is not defined\n";
# endif
cout << "\nBeginning tests...\n";
// test implicit_cast and numeric_cast -------------------------------------//
// tests which should succeed
long small_value = 1;
long small_negative_value = -1;
long large_value = LONG_MAX;
long large_negative_value = LONG_MIN;
signed char c = 0;
c = large_value; // see if compiler generates warning
c = numeric_cast<signed char>( small_value );
BOOST_CHECK( c == 1 );
c = 0;
c = numeric_cast<signed char>( small_value );
BOOST_CHECK( c == 1 );
c = 0;
c = numeric_cast<signed char>( small_negative_value );
BOOST_CHECK( c == -1 );
// These tests courtesy of Joe R NWP Swatosh<joe.r.swatosh@usace.army.mil>
BOOST_CHECK( 0.0f == numeric_cast<float>( 0.0 ) );
BOOST_CHECK( 0.0 == numeric_cast<double>( 0.0 ) );
// tests which should result in errors being detected
caught_exception = false;
try { c = numeric_cast<signed char>( large_value ); }
catch (bad_numeric_cast)
{ cout<<"caught bad_numeric_cast #1\n"; caught_exception = true; }
BOOST_CHECK ( caught_exception )
caught_exception = false;
try { c = numeric_cast<signed char>( large_negative_value ); }
catch (bad_numeric_cast)
{ cout<<"caught bad_numeric_cast #2\n"; caught_exception = true; }
BOOST_CHECK ( caught_exception )
unsigned long ul;
caught_exception = false;
try { ul = numeric_cast<unsigned long>( large_negative_value ); }
catch (bad_numeric_cast)
{ cout<<"caught bad_numeric_cast #3\n"; caught_exception = true; }
BOOST_CHECK ( caught_exception )
caught_exception = false;
try { ul = numeric_cast<unsigned long>( small_negative_value ); }
catch (bad_numeric_cast)
{ cout<<"caught bad_numeric_cast #4\n"; caught_exception = true; }
BOOST_CHECK ( caught_exception )
caught_exception = false;
try { numeric_cast<int>( DBL_MAX ); }
catch (bad_numeric_cast)
{ cout<<"caught bad_numeric_cast #5\n"; caught_exception = true; }
BOOST_CHECK ( caught_exception )
return 0 ;
} // main

View File

@@ -2,13 +2,13 @@
# Copyright (C) 2001-2003 Douglas Gregor # Copyright (C) 2001-2003 Douglas Gregor
# Permission to copy, use, sell and distribute this software is granted # Permission to copy, use, sell and distribute this software is granted
# provided this copyright notice appears in all copies. Permission to modify # provided this copyright notice appears in all copies. Permission to modify
# the code and to distribute modified code is granted provided this copyright # the code and to distribute modified code is granted provided this copyright
# notice appears in all copies, and a notice that the code was modified is # notice appears in all copies, and a notice that the code was modified is
# included with the copyright notice. This software is provided "as is" # included with the copyright notice. This software is provided "as is"
# without express or implied warranty, and with no claim as to its suitability # without express or implied warranty, and with no claim as to its suitability
# for any purpose. # for any purpose.
# For more information, see http://www.boost.org/ # For more information, see http://www.boost.org/
@@ -27,6 +27,7 @@ DEPENDS all : test ;
: [ run implicit_cast.cpp ] : [ run implicit_cast.cpp ]
[ compile-fail implicit_cast_fail.cpp ] [ compile-fail implicit_cast_fail.cpp ]
[ run ../cast_test.cpp ] [ run ../cast_test.cpp ]
[ run ../numeric_cast_test.cpp ]
[ run ../lexical_cast_test.cpp ] [ run ../lexical_cast_test.cpp ]
; ;
} }