diff -r 000000000000 -r e4d67989cc36 genericopenlibs/cppstdlib/stl/test/unit/sstream_test.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cppstdlib/stl/test/unit/sstream_test.cpp Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,397 @@ +#include +#include "math_aux.h" + +#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS) +# include +# include + +# include "full_streambuf.h" + +# include "cppunit/cppunit_proxy.h" + +# if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) +using namespace std; +# endif + +// +// TestCase class +// +class SstreamTest : public CPPUNIT_NS::TestCase +{ + CPPUNIT_TEST_SUITE(SstreamTest); + CPPUNIT_TEST(output); + CPPUNIT_TEST(input); + CPPUNIT_TEST(input_char); + CPPUNIT_TEST(io); + CPPUNIT_TEST(err); + CPPUNIT_TEST(err_long); + CPPUNIT_TEST(maxint); + CPPUNIT_TEST(init_in); + CPPUNIT_TEST(init_out); + CPPUNIT_TEST(buf); + CPPUNIT_TEST(rdbuf); + CPPUNIT_TEST(streambuf_output); + CPPUNIT_TEST(seek); + CPPUNIT_TEST(negative); + CPPUNIT_TEST_SUITE_END(); + + protected: + void output(); + void input(); + void input_char(); + void io(); + void err(); + void err_long(); + void maxint(); + void init_in(); + void init_out(); + void buf(); + void rdbuf(); + void streambuf_output(); + void seek(); + void negative(); +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(SstreamTest); + +// +// tests implementation +// +void SstreamTest::output() +{ + { + ostringstream s; + + s << 1 << '\n' << 2.0 << '\n' << "abcd\n" << "ghk lm\n" << "abcd ef"; + CPPUNIT_ASSERT( s.good() ); + CPPUNIT_ASSERT( s.str() == "1\n2\nabcd\nghk lm\nabcd ef" ); + } + + //Following tests are mostly used to reveal problem with the MSVC /Wp64 option + //used to track 64 bits portability issue: + { + ostringstream s; + size_t i = 0; + s << i; + CPPUNIT_ASSERT( s.good() ); + CPPUNIT_ASSERT( s.str() == "0" ); + } + { + ostringstream s; + ptrdiff_t i = 0; + s << i; + CPPUNIT_ASSERT( s.good() ); + CPPUNIT_ASSERT( s.str() == "0" ); + } +} + +void SstreamTest::input() +{ + { + istringstream s( "1\n2\nabcd\nghk lm\nabcd ef" ); + int i = 0; + s >> i; + CPPUNIT_ASSERT( s.good() ); + CPPUNIT_ASSERT( i == 1 ); + double d = 0.0; + s >> d; + CPPUNIT_ASSERT( s.good() ); + CPPUNIT_ASSERT( d == 2.0 ); + string str; + s >> str; + CPPUNIT_ASSERT( s.good() ); + CPPUNIT_ASSERT( str == "abcd" ); + char c; + s.get(c); // extract newline, that not extracted by operator >> + CPPUNIT_ASSERT( s.good() ); + CPPUNIT_ASSERT( c == '\n' ); + getline( s, str ); + CPPUNIT_ASSERT( s.good() ); + CPPUNIT_ASSERT( str == "ghk lm" ); + getline( s, str ); + CPPUNIT_ASSERT( s.eof() ); + CPPUNIT_ASSERT( str == "abcd ef" ); + } + { + istringstream s("0"); + size_t i = 1; + s >> i; + CPPUNIT_ASSERT( !s.fail() ); + CPPUNIT_ASSERT( s.eof() ); + CPPUNIT_ASSERT( i == 0 ); + } +} + +void SstreamTest::input_char() +{ + char buf[16] = { 0, '1', '2', '3' }; + istringstream s( "0" ); + s >> buf; + + CPPUNIT_ASSERT( buf[0] == '0' ); + CPPUNIT_ASSERT( buf[1] == 0 ); + CPPUNIT_ASSERT( buf[2] == '2' ); +} + + +void SstreamTest::io() +{ + stringstream s; + s << 1 << '\n' << 2.0 << '\n' << "abcd\n" << "ghk lm\n" << "abcd ef"; + CPPUNIT_ASSERT( s.good() ); + + int i = 0; + s >> i; + CPPUNIT_ASSERT( i == 1 ); + CPPUNIT_ASSERT( s.good() ); + double d = 0.0; + s >> d; + CPPUNIT_ASSERT( d == 2.0 ); + CPPUNIT_ASSERT( s.good() ); + string str; + s >> str; + CPPUNIT_ASSERT( str == "abcd" ); + CPPUNIT_ASSERT( s.good() ); + char c; + s.get(c); // extract newline, that not extracted by operator >> + CPPUNIT_ASSERT( s.good() ); + CPPUNIT_ASSERT( c == '\n' ); + getline( s, str ); + CPPUNIT_ASSERT( s.good() ); + CPPUNIT_ASSERT( str == "ghk lm" ); + getline( s, str ); + CPPUNIT_ASSERT( str == "abcd ef" ); + CPPUNIT_ASSERT( s.eof() ); +} + +void SstreamTest::err() +{ + stringstream s( "9" ); + + int i = 0; + s >> i; + CPPUNIT_ASSERT( !s.fail() ); + CPPUNIT_ASSERT( i == 9 ); + s >> i; + CPPUNIT_ASSERT( s.fail() ); + CPPUNIT_ASSERT( s.eof() ); + CPPUNIT_ASSERT( i == 9 ); +} + +void SstreamTest::err_long() +{ + stringstream s( "9" ); + + long i = 0; + s >> i; + CPPUNIT_ASSERT( !s.fail() ); + CPPUNIT_ASSERT( i == 9 ); + s >> i; + CPPUNIT_ASSERT( s.fail() ); + CPPUNIT_ASSERT( s.eof() ); + CPPUNIT_ASSERT( i == 9 ); +} + +void SstreamTest::maxint() +{ + stringstream s; + + s << INT_MAX << " " << UINT_MAX << " " << LONG_MAX << " " << ULONG_MAX << " " + << INT_MIN << " " << LONG_MIN; + CPPUNIT_ASSERT( s.good() ); + + int i = 0; + unsigned int u = 0; + long l = 0; + unsigned long ul = 0; + + s >> i >> u >> l >> ul; + CPPUNIT_ASSERT( s.good() ); + CPPUNIT_ASSERT( i == INT_MAX ); + CPPUNIT_ASSERT( u == UINT_MAX ); + CPPUNIT_ASSERT( l == LONG_MAX ); + CPPUNIT_ASSERT( ul == ULONG_MAX ); + + s >> i >> l; + CPPUNIT_ASSERT( !s.fail() ); + CPPUNIT_ASSERT( i == INT_MIN ); + CPPUNIT_ASSERT( l == LONG_MIN ); +} + +void SstreamTest::init_in() +{ + istringstream is( "12345" ); + int n; + + is >> n; + CPPUNIT_ASSERT( !is.fail() ); + CPPUNIT_ASSERT( n == 12345 ); + + istringstream dis( "1.2345" ); + double d; + + dis >> d; + CPPUNIT_ASSERT( !dis.fail() ); + CPPUNIT_ASSERT( are_equals(d, 1.2345) ); + + istringstream fis( "1.2345" ); + float f; + + fis >> f; + CPPUNIT_ASSERT( !fis.fail() ); + CPPUNIT_ASSERT( are_equals(f, 1.2345f) ); +} + +void SstreamTest::init_out() +{ + ostringstream os( "12345" ); + CPPUNIT_ASSERT( os.str() == "12345" ); + + os << 67; + CPPUNIT_ASSERT( os.good() ); + + // This satisfy to the Standard: + CPPUNIT_ASSERT( os.str() == "67345" ); + // But we don't know the reason, why standard state that. + + os.str( "89ab" ); + CPPUNIT_ASSERT( os.str() == "89ab" ); + + os << 10; + CPPUNIT_ASSERT( os.good() ); + CPPUNIT_ASSERT( os.str() == "10ab" ); +} + +void SstreamTest::buf() +{ + stringstream ss; + + ss << "1234567\n89\n"; + char buf[10]; + buf[7] = 'x'; + ss.get( buf, 10 ); + CPPUNIT_ASSERT( !ss.fail() ); + CPPUNIT_ASSERT( buf[0] == '1' ); + CPPUNIT_ASSERT( buf[1] == '2' ); + CPPUNIT_ASSERT( buf[2] == '3' ); + CPPUNIT_ASSERT( buf[3] == '4' ); + CPPUNIT_ASSERT( buf[4] == '5' ); + CPPUNIT_ASSERT( buf[5] == '6' ); + CPPUNIT_ASSERT( buf[6] == '7' ); // 27.6.1.3 paragraph 10, paragraph 7 + CPPUNIT_ASSERT( buf[7] == 0 ); // 27.6.1.3 paragraph 8 + char c; + ss.get(c); + CPPUNIT_ASSERT( !ss.fail() ); + CPPUNIT_ASSERT( c == '\n' ); // 27.6.1.3 paragraph 10, paragraph 7 + ss.get(c); + CPPUNIT_ASSERT( !ss.fail() ); + CPPUNIT_ASSERT( c == '8' ); +} + +void SstreamTest::rdbuf() +{ + stringstream ss; + + ss << "1234567\n89\n"; + + ostringstream os; + ss.get( *os.rdbuf(), '\n' ); + CPPUNIT_ASSERT( !ss.fail() ); + char c; + ss.get(c); + CPPUNIT_ASSERT( !ss.fail() ); + CPPUNIT_ASSERT( c == '\n' ); // 27.6.1.3 paragraph 12 + CPPUNIT_ASSERT( os.str() == "1234567" ); +} + +void SstreamTest::streambuf_output() +{ + { + istringstream in("01234567890123456789"); + CPPUNIT_ASSERT( in ); + + auto_ptr pfull_buf(new full_streambuf(10)); + ostream out(pfull_buf.get()); + CPPUNIT_ASSERT( out ); + + out << in.rdbuf(); + CPPUNIT_ASSERT( out ); + CPPUNIT_ASSERT( in ); + //out is good we can check what has been extracted: + CPPUNIT_ASSERT( pfull_buf->str() == "0123456789" ); + + out << in.rdbuf(); + CPPUNIT_ASSERT( out.fail() ); + CPPUNIT_ASSERT( in ); + + ostringstream ostr; + ostr << in.rdbuf(); + CPPUNIT_ASSERT( ostr ); + CPPUNIT_ASSERT( in ); + CPPUNIT_ASSERT( ostr.str() == "0123456789" ); + } + +# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) + { + //If the output stream buffer throws: + istringstream in("01234567890123456789"); + CPPUNIT_ASSERT( in ); + + auto_ptr pfull_buf(new full_streambuf(10, true)); + ostream out(pfull_buf.get()); + CPPUNIT_ASSERT( out ); + + out << in.rdbuf(); + CPPUNIT_ASSERT( out.bad() ); + CPPUNIT_ASSERT( in ); + //out is bad we have no guaranty on what has been extracted: + //CPPUNIT_ASSERT( pfull_buf->str() == "0123456789" ); + + out.clear(); + out << in.rdbuf(); + CPPUNIT_ASSERT( out.fail() && out.bad() ); + CPPUNIT_ASSERT( in ); + + ostringstream ostr; + ostr << in.rdbuf(); + CPPUNIT_ASSERT( ostr ); + CPPUNIT_ASSERT( in ); + CPPUNIT_ASSERT( ostr.str() == "01234567890123456789" ); + } +# endif +} + +void SstreamTest::seek() +{ + stringstream s( "0123456789" ); + + CPPUNIT_ASSERT( s.tellg() == stringstream::pos_type(0) ); + s.seekg( 6, ios::beg ); + CPPUNIT_ASSERT( s.tellg() == stringstream::pos_type(6) ); + s.seekg( -3, ios::cur ); + CPPUNIT_ASSERT( s.tellg() == stringstream::pos_type(3) ); + + istringstream is( "0123456789" ); + CPPUNIT_ASSERT( is.tellg() == stringstream::pos_type(0) ); + is.seekg( 6, ios::beg ); + CPPUNIT_ASSERT( is.tellg() == stringstream::pos_type(6) ); + is.seekg( -3, ios::cur ); + CPPUNIT_ASSERT( is.tellg() == stringstream::pos_type(3) ); +} + + +template < class T > +string to_string( const T& v ) +{ + ostringstream oss; + oss << v; + return oss.str(); +} + +void SstreamTest::negative() +{ + CPPUNIT_CHECK( to_string(-1) == "-1" ); + CPPUNIT_CHECK( to_string(-1) == "-1" ); +} + +#endif