📄 ios_state_unit_test.cpp
字号:
// 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/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.
// 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 );
char c;
BOOST_CHECK_THROW( ss >> c, std::ios_base::failure );
}
}
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() );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -