123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685 |
- // Boost ios_state_unit_test.cpp test file ---------------------------------//
- // Copyright 2003 Daryle Walker. Use, modification, and distribution are
- // subject to the Boost Software License, Version 1.0. (See accompanying file
- // LICENSE_1_0.txt or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)
- // See <http://www.boost.org/libs/io/> for the library's home page.
- // Revision History
- // 12 Sep 2003 Initial version (Daryle Walker)
- #include <boost/config.hpp>
- #include <boost/io/ios_state.hpp> // for boost::io::ios_flags_saver, etc.
- #include <boost/test/unit_test.hpp> // for main, BOOST_CHECK, etc.
- #include <cstddef> // for NULL
- #include <iomanip> // for std::setiosflags, etc.
- #include <ios> // for std::ios_base
- #include <iostream> // for std::cout, std::cerr, etc.
- #include <istream> // for std::iostream
- #include <locale> // for std::locale, std::numpunct
- #include <sstream> // for std::stringstream, etc.
- #if defined(BOOST_GCC) || (defined(BOOST_CLANG) && defined(BOOST_GNU_STDLIB))
- #include <stdexcept>
- #endif
- // Global constants
- int const word_index = std::ios_base::xalloc();
- // Facet with the (classic) bool names spelled backwards
- class backward_bool_names
- : public std::numpunct<char>
- {
- typedef std::numpunct<char> base_type;
- public:
- explicit backward_bool_names( std::size_t refs = 0 )
- : base_type( refs )
- {}
- protected:
- virtual ~backward_bool_names() {}
- virtual base_type::string_type do_truename() const
- { return "eurt"; }
- virtual base_type::string_type do_falsename() const
- { return "eslaf"; }
- };
- // Unit test for format-flag saving
- void
- ios_flags_saver_unit_test
- (
- )
- {
- using namespace std;
- stringstream ss;
- BOOST_CHECK_EQUAL( (ios_base::skipws | ios_base::dec), ss.flags() );
- {
- boost::io::ios_flags_saver ifs( ss );
- BOOST_CHECK_EQUAL( (ios_base::skipws | ios_base::dec), ss.flags() );
- ss << noskipws << fixed << boolalpha;
- BOOST_CHECK_EQUAL( (ios_base::boolalpha | ios_base::dec
- | ios_base::fixed), ss.flags() );
- }
- BOOST_CHECK_EQUAL( (ios_base::skipws | ios_base::dec), ss.flags() );
- {
- boost::io::ios_flags_saver ifs( ss, (ios_base::showbase
- | ios_base::internal) );
- BOOST_CHECK_EQUAL( (ios_base::showbase | ios_base::internal),
- ss.flags() );
- ss << setiosflags( ios_base::unitbuf );
- BOOST_CHECK_EQUAL( (ios_base::showbase | ios_base::internal
- | ios_base::unitbuf), ss.flags() );
- }
- BOOST_CHECK_EQUAL( (ios_base::skipws | ios_base::dec), ss.flags() );
- }
- // Unit test for precision saving
- void
- ios_precision_saver_unit_test
- (
- )
- {
- using namespace std;
- stringstream ss;
- BOOST_CHECK_EQUAL( 6, ss.precision() );
- {
- boost::io::ios_precision_saver ips( ss );
- BOOST_CHECK_EQUAL( 6, ss.precision() );
- ss << setprecision( 4 );
- BOOST_CHECK_EQUAL( 4, ss.precision() );
- }
- BOOST_CHECK_EQUAL( 6, ss.precision() );
- {
- boost::io::ios_precision_saver ips( ss, 8 );
- BOOST_CHECK_EQUAL( 8, ss.precision() );
- ss << setprecision( 10 );
- BOOST_CHECK_EQUAL( 10, ss.precision() );
- }
- BOOST_CHECK_EQUAL( 6, ss.precision() );
- }
- // Unit test for width saving
- void
- ios_width_saver_unit_test
- (
- )
- {
- using namespace std;
- stringstream ss;
- BOOST_CHECK_EQUAL( 0, ss.width() );
- {
- boost::io::ios_width_saver iws( ss );
- BOOST_CHECK_EQUAL( 0, ss.width() );
- ss << setw( 4 );
- BOOST_CHECK_EQUAL( 4, ss.width() );
- }
- BOOST_CHECK_EQUAL( 0, ss.width() );
- {
- boost::io::ios_width_saver iws( ss, 8 );
- BOOST_CHECK_EQUAL( 8, ss.width() );
- ss << setw( 10 );
- BOOST_CHECK_EQUAL( 10, ss.width() );
- }
- BOOST_CHECK_EQUAL( 0, ss.width() );
- }
- // Unit test for I/O-state saving
- void
- ios_iostate_saver_unit_test
- (
- )
- {
- using namespace std;
- stringstream ss;
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.rdstate() );
- BOOST_CHECK( ss.good() );
- {
- boost::io::ios_iostate_saver iis( ss );
- char c;
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.rdstate() );
- BOOST_CHECK( ss.good() );
- ss >> c;
- BOOST_CHECK_EQUAL( (ios_base::eofbit | ios_base::failbit),
- ss.rdstate() );
- BOOST_CHECK( ss.eof() );
- BOOST_CHECK( ss.fail() );
- BOOST_CHECK( !ss.bad() );
- }
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.rdstate() );
- BOOST_CHECK( ss.good() );
- {
- boost::io::ios_iostate_saver iis( ss, ios_base::eofbit );
- BOOST_CHECK_EQUAL( ios_base::eofbit, ss.rdstate() );
- BOOST_CHECK( ss.eof() );
- ss.setstate( ios_base::badbit );
- BOOST_CHECK_EQUAL( (ios_base::eofbit | ios_base::badbit),
- ss.rdstate() );
- BOOST_CHECK( ss.eof() );
- BOOST_CHECK( ss.fail() );
- BOOST_CHECK( ss.bad() );
- }
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.rdstate() );
- BOOST_CHECK( ss.good() );
- }
- // Unit test for exception-flag saving
- void
- ios_exception_saver_unit_test
- (
- )
- {
- using namespace std;
- stringstream ss;
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.exceptions() );
- {
- boost::io::ios_exception_saver ies( ss );
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.exceptions() );
- ss.exceptions( ios_base::failbit );
- BOOST_CHECK_EQUAL( ios_base::failbit, ss.exceptions() );
- {
- boost::io::ios_iostate_saver iis( ss );
- ss.exceptions( ios_base::failbit | ios_base::badbit );
- char c;
- #if defined(BOOST_GCC) || (defined(BOOST_CLANG) && defined(BOOST_GNU_STDLIB))
- BOOST_CHECK_THROW( ss >> c, std::exception );
- #else
- BOOST_CHECK_THROW( ss >> c, std::ios_base::failure );
- #endif
- }
- }
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.exceptions() );
- {
- boost::io::ios_exception_saver ies( ss, ios_base::eofbit );
- BOOST_CHECK_EQUAL( ios_base::eofbit, ss.exceptions() );
- ss.exceptions( ios_base::badbit );
- BOOST_CHECK_EQUAL( ios_base::badbit, ss.exceptions() );
- {
- boost::io::ios_iostate_saver iis( ss );
- char c;
- BOOST_CHECK_NO_THROW( ss >> c );
- }
- }
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.exceptions() );
- }
- // Unit test for tied-stream saving
- void
- ios_tie_saver_unit_test
- (
- )
- {
- using namespace std;
- BOOST_CHECK( NULL == cout.tie() );
- {
- boost::io::ios_tie_saver its( cout );
- BOOST_CHECK( NULL == cout.tie() );
- cout.tie( &clog );
- BOOST_CHECK_EQUAL( &clog, cout.tie() );
- }
- BOOST_CHECK( NULL == cout.tie() );
- {
- boost::io::ios_tie_saver its( cout, &clog );
- BOOST_CHECK_EQUAL( &clog, cout.tie() );
- cout.tie( &cerr );
- BOOST_CHECK_EQUAL( &cerr, cout.tie() );
- }
- BOOST_CHECK( NULL == cout.tie() );
- }
- // Unit test for connected-streambuf saving
- void
- ios_rdbuf_saver_unit_test
- (
- )
- {
- using namespace std;
- iostream s( NULL );
- BOOST_CHECK( NULL == s.rdbuf() );
- {
- stringbuf sb;
- boost::io::ios_rdbuf_saver irs( s );
- BOOST_CHECK( NULL == s.rdbuf() );
- s.rdbuf( &sb );
- BOOST_CHECK_EQUAL( &sb, s.rdbuf() );
- }
- BOOST_CHECK( NULL == s.rdbuf() );
- {
- stringbuf sb1, sb2( "Hi there" );
- boost::io::ios_rdbuf_saver irs( s, &sb1 );
- BOOST_CHECK_EQUAL( &sb1, s.rdbuf() );
- s.rdbuf( &sb2 );
- BOOST_CHECK_EQUAL( &sb2, s.rdbuf() );
- }
- BOOST_CHECK( NULL == s.rdbuf() );
- }
- // Unit test for fill-character saving
- void
- ios_fill_saver_unit_test
- (
- )
- {
- using namespace std;
- stringstream ss;
- BOOST_CHECK_EQUAL( ' ', ss.fill() );
- {
- boost::io::ios_fill_saver ifs( ss );
- BOOST_CHECK_EQUAL( ' ', ss.fill() );
- ss.fill( 'x' );
- BOOST_CHECK_EQUAL( 'x', ss.fill() );
- }
- BOOST_CHECK_EQUAL( ' ', ss.fill() );
- {
- boost::io::ios_fill_saver ifs( ss, '3' );
- BOOST_CHECK_EQUAL( '3', ss.fill() );
- ss.fill( '+' );
- BOOST_CHECK_EQUAL( '+', ss.fill() );
- }
- BOOST_CHECK_EQUAL( ' ', ss.fill() );
- }
- // Unit test for locale saving
- void
- ios_locale_saver_unit_test
- (
- )
- {
- using namespace std;
- typedef numpunct<char> npc_type;
- stringstream ss;
- BOOST_CHECK( locale() == ss.getloc() );
- // locales are unprintable, so no BOOST_CHECK_EQUAL
- BOOST_CHECK( !has_facet<npc_type>(ss.getloc()) || (NULL
- == dynamic_cast<backward_bool_names const *>(
- &use_facet<npc_type>(ss.getloc()) )) );
- // my implementation of has_facet just checks IDs, but doesn't do dynamic
- // cast (therefore if a specifc facet type is missing, but its base class
- // is available, has_facet will mistakenly[?] match), so I have to do it
- // here. I wanted: "BOOST_CHECK( ! has_facet< backward_bool_names >(
- // ss.getloc() ) )"
- {
- boost::io::ios_locale_saver ils( ss );
- BOOST_CHECK( locale() == ss.getloc() );
- ss.imbue( locale::classic() );
- BOOST_CHECK( locale::classic() == ss.getloc() );
- }
- BOOST_CHECK( locale() == ss.getloc() );
- BOOST_CHECK( !has_facet<npc_type>(ss.getloc()) || (NULL
- == dynamic_cast<backward_bool_names const *>(
- &use_facet<npc_type>(ss.getloc()) )) );
- {
- boost::io::ios_locale_saver ils( ss, locale::classic() );
- BOOST_CHECK( locale::classic() == ss.getloc() );
- BOOST_CHECK( !has_facet<npc_type>(ss.getloc()) || (NULL
- == dynamic_cast<backward_bool_names const *>(
- &use_facet<npc_type>(ss.getloc()) )) );
- ss.imbue( locale(locale::classic(), new backward_bool_names) );
- BOOST_CHECK( locale::classic() != ss.getloc() );
- BOOST_CHECK( has_facet<npc_type>(ss.getloc()) && (NULL
- != dynamic_cast<backward_bool_names const *>(
- &use_facet<npc_type>(ss.getloc()) )) );
- //BOOST_CHECK( has_facet<backward_bool_names>(ss.getloc()) );
- }
- BOOST_CHECK( locale() == ss.getloc() );
- BOOST_CHECK( !has_facet<npc_type>(ss.getloc()) || (NULL
- == dynamic_cast<backward_bool_names const *>(
- &use_facet<npc_type>(ss.getloc()) )) );
- }
- // Unit test for user-defined integer data saving
- void
- ios_iword_saver_unit_test
- (
- )
- {
- using namespace std;
- stringstream ss;
- BOOST_CHECK_EQUAL( 0, ss.iword(word_index) );
- {
- boost::io::ios_iword_saver iis( ss, word_index );
- BOOST_CHECK_EQUAL( 0, ss.iword(word_index) );
- ss.iword( word_index ) = 6;
- BOOST_CHECK_EQUAL( 6, ss.iword(word_index) );
- }
- BOOST_CHECK_EQUAL( 0, ss.iword(word_index) );
- {
- boost::io::ios_iword_saver iis( ss, word_index, 100 );
- BOOST_CHECK_EQUAL( 100, ss.iword(word_index) );
- ss.iword( word_index ) = -2000;
- BOOST_CHECK_EQUAL( -2000, ss.iword(word_index) );
- }
- BOOST_CHECK_EQUAL( 0, ss.iword(word_index) );
- }
- // Unit test for user-defined pointer data saving
- void
- ios_pword_saver_unit_test
- (
- )
- {
- using namespace std;
- stringstream ss;
- BOOST_CHECK( NULL == ss.pword(word_index) );
- {
- boost::io::ios_pword_saver ips( ss, word_index );
- BOOST_CHECK( NULL == ss.pword(word_index) );
- ss.pword( word_index ) = &ss;
- BOOST_CHECK_EQUAL( &ss, ss.pword(word_index) );
- }
- BOOST_CHECK( NULL == ss.pword(word_index) );
- {
- boost::io::ios_pword_saver ips( ss, word_index, ss.rdbuf() );
- BOOST_CHECK_EQUAL( ss.rdbuf(), ss.pword(word_index) );
- ss.pword( word_index ) = &ss;
- BOOST_CHECK_EQUAL( &ss, ss.pword(word_index) );
- }
- BOOST_CHECK( NULL == ss.pword(word_index) );
- }
- // Unit test for all ios_base data saving
- void
- ios_base_all_saver_unit_test
- (
- )
- {
- using namespace std;
- stringstream ss;
- BOOST_CHECK_EQUAL( (ios_base::skipws | ios_base::dec), ss.flags() );
- BOOST_CHECK_EQUAL( 6, ss.precision() );
- BOOST_CHECK_EQUAL( 0, ss.width() );
- {
- boost::io::ios_base_all_saver ibas( ss );
- BOOST_CHECK_EQUAL( (ios_base::skipws | ios_base::dec), ss.flags() );
- BOOST_CHECK_EQUAL( 6, ss.precision() );
- BOOST_CHECK_EQUAL( 0, ss.width() );
- ss << hex << unitbuf << setprecision( 5 ) << setw( 7 );
- BOOST_CHECK_EQUAL( (ios_base::unitbuf | ios_base::hex
- | ios_base::skipws), ss.flags() );
- BOOST_CHECK_EQUAL( 5, ss.precision() );
- BOOST_CHECK_EQUAL( 7, ss.width() );
- }
- BOOST_CHECK_EQUAL( (ios_base::skipws | ios_base::dec), ss.flags() );
- BOOST_CHECK_EQUAL( 6, ss.precision() );
- BOOST_CHECK_EQUAL( 0, ss.width() );
- }
- // Unit test for all basic_ios data saving
- void
- ios_all_saver_unit_test
- (
- )
- {
- using namespace std;
- typedef numpunct<char> npc_type;
- stringbuf sb;
- iostream ss( &sb );
- BOOST_CHECK_EQUAL( (ios_base::skipws | ios_base::dec), ss.flags() );
- BOOST_CHECK_EQUAL( 6, ss.precision() );
- BOOST_CHECK_EQUAL( 0, ss.width() );
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.rdstate() );
- BOOST_CHECK( ss.good() );
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.exceptions() );
- BOOST_CHECK( NULL == ss.tie() );
- BOOST_CHECK( &sb == ss.rdbuf() );
- BOOST_CHECK_EQUAL( ' ', ss.fill() );
- BOOST_CHECK( locale() == ss.getloc() );
- {
- boost::io::ios_all_saver ias( ss );
- BOOST_CHECK_EQUAL( (ios_base::skipws | ios_base::dec), ss.flags() );
- BOOST_CHECK_EQUAL( 6, ss.precision() );
- BOOST_CHECK_EQUAL( 0, ss.width() );
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.rdstate() );
- BOOST_CHECK( ss.good() );
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.exceptions() );
- BOOST_CHECK( NULL == ss.tie() );
- BOOST_CHECK( &sb == ss.rdbuf() );
- BOOST_CHECK_EQUAL( ' ', ss.fill() );
- BOOST_CHECK( locale() == ss.getloc() );
- ss << oct << showpos << noskipws;
- BOOST_CHECK_EQUAL( (ios_base::showpos | ios_base::oct), ss.flags() );
- ss << setprecision( 3 );
- BOOST_CHECK_EQUAL( 3, ss.precision() );
- ss << setw( 9 );
- BOOST_CHECK_EQUAL( 9, ss.width() );
- ss.setstate( ios_base::eofbit );
- BOOST_CHECK_EQUAL( ios_base::eofbit, ss.rdstate() );
- BOOST_CHECK( ss.eof() );
- ss.exceptions( ios_base::failbit );
- BOOST_CHECK_EQUAL( ios_base::failbit, ss.exceptions() );
- {
- boost::io::ios_iostate_saver iis( ss );
- ss.exceptions( ios_base::failbit | ios_base::badbit );
- char c;
- #if defined(BOOST_GCC) || (defined(BOOST_CLANG) && defined(BOOST_GNU_STDLIB))
- BOOST_CHECK_THROW( ss >> c, std::exception );
- #else
- BOOST_CHECK_THROW( ss >> c, std::ios_base::failure );
- #endif
- }
- ss.tie( &clog );
- BOOST_CHECK_EQUAL( &clog, ss.tie() );
- ss.rdbuf( cerr.rdbuf() );
- BOOST_CHECK_EQUAL( cerr.rdbuf(), ss.rdbuf() );
- ss << setfill( 'x' );
- BOOST_CHECK_EQUAL( 'x', ss.fill() );
- ss.imbue( locale(locale::classic(), new backward_bool_names) );
- BOOST_CHECK( locale() != ss.getloc() );
- BOOST_CHECK( has_facet<npc_type>(ss.getloc()) && (NULL
- != dynamic_cast<backward_bool_names const *>(
- &use_facet<npc_type>(ss.getloc()) )) );
- }
- BOOST_CHECK_EQUAL( (ios_base::skipws | ios_base::dec), ss.flags() );
- BOOST_CHECK_EQUAL( 6, ss.precision() );
- BOOST_CHECK_EQUAL( 0, ss.width() );
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.rdstate() );
- BOOST_CHECK( ss.good() );
- BOOST_CHECK_EQUAL( ios_base::goodbit, ss.exceptions() );
- BOOST_CHECK( NULL == ss.tie() );
- BOOST_CHECK( &sb == ss.rdbuf() );
- BOOST_CHECK_EQUAL( ' ', ss.fill() );
- BOOST_CHECK( locale() == ss.getloc() );
- }
- // Unit test for user-defined data saving
- void
- ios_word_saver_unit_test
- (
- )
- {
- using namespace std;
- stringstream ss;
- BOOST_CHECK_EQUAL( 0, ss.iword(word_index) );
- BOOST_CHECK( NULL == ss.pword(word_index) );
- {
- boost::io::ios_all_word_saver iaws( ss, word_index );
- BOOST_CHECK_EQUAL( 0, ss.iword(word_index) );
- BOOST_CHECK( NULL == ss.pword(word_index) );
- ss.iword( word_index ) = -11;
- ss.pword( word_index ) = ss.rdbuf();
- BOOST_CHECK_EQUAL( -11, ss.iword(word_index) );
- BOOST_CHECK_EQUAL( ss.rdbuf(), ss.pword(word_index) );
- }
- BOOST_CHECK_EQUAL( 0, ss.iword(word_index) );
- BOOST_CHECK( NULL == ss.pword(word_index) );
- }
- // Unit test program
- boost::unit_test::test_suite *
- init_unit_test_suite
- (
- int , // "argc" is unused
- char * [] // "argv" is unused
- )
- {
- boost::unit_test::test_suite * test
- = BOOST_TEST_SUITE( "I/O state saver test" );
- test->add( BOOST_TEST_CASE(ios_flags_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_precision_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_width_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_iostate_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_exception_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_tie_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_rdbuf_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_fill_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_locale_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_iword_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_pword_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_base_all_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_all_saver_unit_test) );
- test->add( BOOST_TEST_CASE(ios_word_saver_unit_test) );
- return test;
- }
|