1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <string> 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS) 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <fstream> 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <iostream> 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <iomanip> 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <sstream> 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <vector> 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <stdexcept> 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <stdio.h> 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include "full_streambuf.h" 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include "cppunit/cppunit_proxy.h" 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottusing namespace std; 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//The macro value gives approximately the generated file 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//size in Go 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//#define CHECK_BIG_FILE 4 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if (!defined(STLPORT) && (defined (__GNUC__) && (__GNUC__ > 3))) || \ 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (defined (STLPORT) && !defined (_STLP_NO_CUSTOM_IO) && !defined (_STLP_NO_MEMBER_TEMPLATES) && \ 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott !((defined (_STLP_MSVC) && (_STLP_MSVC < 1300)) || \ 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (defined (__GNUC__) && (__GNUC__ < 3)) || \ 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (defined (__SUNPRO_CC)) || \ 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (defined (__DMC__) && defined (_DLL)))) 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define DO_CUSTOM_FACET_TEST 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// TestCase class 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass FstreamTest : public CPPUNIT_NS::TestCase 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST_SUITE(FstreamTest); 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(output); 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(input); 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(input_char); 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(io); 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(err); 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(tellg); 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(tellp); 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(seek); 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(buf); 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(rdbuf); 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(streambuf_output); 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(win32_file_format); 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(null_stream); 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if defined (STLPORT) && (defined (_STLP_NO_WCHAR_T) || !defined (_STLP_USE_EXCEPTIONS)) 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_IGNORE; 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(null_buf); 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || !defined (_STLP_WIN32) 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(offset); 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if defined (CHECK_BIG_FILE) 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(big_file); 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (DO_CUSTOM_FACET_TEST) 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_IGNORE; 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(custom_facet); 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST_SUITE_END(); 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott protected: 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void output(); 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void input(); 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void input_char(); 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void io(); 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void err(); 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void tellg(); 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void tellp(); 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void seek(); 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void buf(); 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void rdbuf(); 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void streambuf_output(); 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void win32_file_format(); 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void null_stream(); 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void null_buf(); 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || !defined (_STLP_WIN32) 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void offset(); 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void custom_facet(); 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if defined (CHECK_BIG_FILE) 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void big_file(); 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottCPPUNIT_TEST_SUITE_REGISTRATION(FstreamTest); 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// tests implementation 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::output() 97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream f( "test_file.txt" ); 99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f << 1 << '\n' << 2.0 << '\n' << "abcd\n" << "ghk lm\n" << "abcd ef"; 101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT (f.good()); 102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // CPPUNIT_ASSERT( s.str() == "1\n2\nabcd\nghk lm\nabcd ef" ); 103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::input() 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream f( "test_file.txt" ); 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int i = 0; 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f >> i; 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.good() ); 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( i == 1 ); 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott double d = 0.0; 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f >> d; 115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.good() ); 116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( d == 2.0 ); 117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott string str; 118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f >> str; 119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.good() ); 120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( str == "abcd" ); 121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char c; 122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f.get(c); // extract newline, that not extracted by operator >> 123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.good() ); 124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( c == '\n' ); 125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott getline( f, str ); 126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.good() ); 127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( str == "ghk lm" ); 128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott getline( f, str ); 129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.eof() ); 130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( str == "abcd ef" ); 131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_USE_WIN32_IO) 133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream in("/tmp"); 135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (in.good()) { 136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott string s; 137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott getline(in, s); 138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in.fail() ); 139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::input_char() 145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char buf[16] = { 0, '1', '2', '3' }; 147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream s( "test_file.txt" ); 148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott s >> buf; 149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( buf[0] == '1' ); 151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( buf[1] == 0 ); 152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( buf[2] == '2' ); 153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::io() 156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott basic_fstream<char,char_traits<char> > f( "test_file.txt", ios_base::in | ios_base::out | ios_base::trunc ); 158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.is_open() ); 160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f << 1 << '\n' << 2.0 << '\n' << "abcd\n" << "ghk lm\n" << "abcd ef"; 162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // f.flush(); 164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f.seekg( 0, ios_base::beg ); 165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int i = 0; 167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f >> i; 168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.good() ); 169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( i == 1 ); 170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott double d = 0.0; 171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f >> d; 172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( d == 2.0 ); 173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott string s; 174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f >> s; 175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.good() ); 176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s == "abcd" ); 177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char c; 178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f.get(c); // extract newline, that not extracted by operator >> 179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.good() ); 180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( c == '\n' ); 181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott getline( f, s ); 182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.good() ); 183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s == "ghk lm" ); 184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott getline( f, s ); 185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !f.fail() ); 186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s == "abcd ef" ); 187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.eof() ); 188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::err() 191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott basic_fstream<char,char_traits<char> > f( "test_file.txt", ios_base::in | ios_base::out | ios_base::trunc ); 193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.is_open() ); 195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int i = 9; 197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f << i; 198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.good() ); 199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott i = 0; 200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f.seekg( 0, ios_base::beg ); 201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f >> i; 202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !f.fail() ); 203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( i == 9 ); 204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f >> i; 205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.fail() ); 206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( f.eof() ); 207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( i == 9 ); 208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::tellg() 211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // bogus ios_base::binary is for Wins 214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream of("test_file.txt", ios_base::out | ios_base::binary | ios_base::trunc); 215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( of.is_open() ); 216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (int i = 0; i < 50; ++i) { 218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott of << "line " << setiosflags(ios_base::right) << setfill('0') << setw(2) << i << "\n"; 219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !of.fail() ); 220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott of.close(); 222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // bogus ios_base::binary is for Wins 226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream is("test_file.txt", ios_base::in | ios_base::binary); 227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( is.is_open() ); 228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char buf[64]; 229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // CPPUNIT_ASSERT( is.tellg() == 0 ); 231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streampos p = 0; 232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (int i = 0; i < 50; ++i) { 233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott is.read(buf, 0); 234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( is.gcount() == 0 ); 235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( is.tellg() == p ); 236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott is.read( buf, 8 ); 237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !is.fail() ); 238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( is.gcount() == 8 ); 239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott p += 8; 240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // bogus ios_base::binary is for Wins 245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream is("test_file.txt", ios_base::in | ios_base::binary); 246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( is.is_open() ); 247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streampos p = 0; 249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (int i = 0; i < 50; ++i) { 250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !is.fail() ); 251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott is.tellg(); 252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( is.tellg() == p ); 253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott p += 8; 254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott is.seekg( p, ios_base::beg ); 255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !is.fail() ); 256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // bogus ios_base::binary is for Wins 261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream is("test_file.txt", ios_base::in | ios_base::binary); 262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( is.is_open() ); 263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streampos p = 0; 265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (int i = 0; i < 50; ++i) { 266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( is.tellg() == p ); 267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott p += 8; 268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott is.seekg( 8, ios_base::cur ); 269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !is.fail() ); 270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::tellp() 275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream o( "test_file.txt" ); 278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott o << "123456"; 280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( o.rdbuf()->pubseekoff( 0, ios_base::cur, ios_base::out ) == ofstream::pos_type(6) ); 282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( o.tellp() == ofstream::pos_type(6) ); 283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream o( "test_file.txt" ); 286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott o << "123456789"; 288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( o.rdbuf()->pubseekoff( 0, ios_base::cur, ios_base::out ) == ofstream::pos_type(9) ); 290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( o.tellp() == ofstream::pos_type(9) ); 291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* According to the standard 293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream o( "test_file.txt", ios_base::app | ios_base::out ) 294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott should give the same effect as fopen( "test_file.txt", "a" ). 295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott Problem is fopen( "test_file.txt", "a" ) has a bit different behaviour 296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott on different platforms, and this difference is not covered by specification. 297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott After fopen( "test_file.txt", "a" ) in this context ftell( f ) == 9 for 298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott Linux and Mac OS X (I expect the same for others POSIX-like platforms too); 299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott on Windows (independently from version?) ftell( f ) == 0, i.e. write pointer not 300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott shifted to EOF (but shifted to EOF just before write, as described in the specs). 301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott It isn't specifications violation, neither for Linux and Mac OS X nor for Windows. 303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott The code below is intended to demonstrate ambiguity (dependance from fopen implementation). 305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott #ifdef WIN32 308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //In Windows, stlport and fopen use kernel32.CreateFile for open. 309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //File position is at BOF after open, unless we open with ios_base::ate 310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott long expected_pos = 0; 311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott #else 312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //On UNIX flavours, stlport and fopen use unix's open 313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //File position is at EOF after open 314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // 315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //3rd possible scenario, "other platforms" - _STLP_USE_STDIO_IO 316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //stlport uses fopen here. This case may fail this test, since the file position after 317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //fopen is implementation-dependent 318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott long expected_pos = 9; 319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott #endif 320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream o( "test_file.txt", ios_base::app | ios_base::out ); 321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( o.rdbuf()->pubseekoff( 0, ios_base::cur, ios_base::out ) == ofstream::pos_type(expected_pos) ); 322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( o.tellp() == ofstream::pos_type(expected_pos) ); 323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { // for reference, to test fopen/ftell behaviour in append mode: 325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott #ifdef WIN32 326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott long expected_pos = 0; 327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott #else 328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott long expected_pos = 9; 329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott #endif 330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott FILE* f = fopen( "test_file.txt", "a" ); 331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( ftell( f ) == expected_pos ); 332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fclose( f ); 333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 335e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //In append mode, file is positioned at EOF just before a write. 336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // After a write, file is at EOF. This is implementation-independent. 337e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream o( "test_file.txt", ios_base::app | ios_base::out ); 338e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott o << "X"; 339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( o.rdbuf()->pubseekoff( 0, ios_base::cur, ios_base::out ) == ofstream::pos_type(10) ); 340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( o.tellp() == ofstream::pos_type(10) ); 341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 342e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 343e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 344e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::buf() 345e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fstream ss( "test_file.txt", ios_base::in | ios_base::out | ios_base::binary | ios_base::trunc ); 347e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 348e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ss << "1234567\n89\n"; 349e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ss.seekg( 0, ios_base::beg ); 350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char buf[10]; 351e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott buf[7] = 'x'; 352e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ss.get( buf, 10 ); 353e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !ss.fail() ); 354e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( buf[0] == '1' ); 355e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( buf[1] == '2' ); 356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( buf[2] == '3' ); 357e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( buf[3] == '4' ); 358e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( buf[4] == '5' ); 359e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( buf[5] == '6' ); 360e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( buf[6] == '7' ); // 27.6.1.3 paragraph 10, paragraph 7 361e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( buf[7] == 0 ); // 27.6.1.3 paragraph 8 362e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char c; 363e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ss.get(c); 364e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !ss.fail() ); 365e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( c == '\n' ); // 27.6.1.3 paragraph 10, paragraph 7 366e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ss.get(c); 367e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !ss.fail() ); 368e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( c == '8' ); 369e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 370e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 371e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::seek() 372e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 374e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Test in binary mode: 375e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 376e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fstream s( "test_file.txt", ios_base::in | ios_base::out | ios_base::binary | ios_base::trunc ); 377e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s ); 378e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott s << "1234567890\n"; 380e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s ); 381e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 383e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char b1[] = { 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x' }; 384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fstream s( "test_file.txt", ios_base::in | ios_base::out | ios_base::binary ); 385e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s ); 386e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 387e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int chars_read = (int)s.rdbuf()->sgetn( b1, sizeof(b1) ); 388e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( chars_read == 11 ); 389e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( b1[9] == '0' ); 390e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s.rdbuf()->pubseekoff( 0, ios_base::cur ) == fstream::pos_type(chars_read) ); 391e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s.rdbuf()->pubseekoff( -chars_read, ios_base::cur ) == fstream::pos_type(0) ); 392e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 393e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char b2[10] = { 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y' }; 394e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 395e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s.rdbuf()->sgetn( b2, 10 ) == 10 ); 396e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( b2[9] == '0' ); 397e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 398e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 399e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 400e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Test in text mode: 401e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 402e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fstream s( "test_file.txt", ios_base::in | ios_base::out | ios_base::trunc ); 403e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s ); 404e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 405e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott s << "1234567890\n"; 406e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s ); 407e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 408e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 409e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char b1[] = { 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x' }; 410e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fstream s( "test_file.txt", ios_base::in | ios_base::out ); 411e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s ); 412e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 413e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int chars_read = (int)s.rdbuf()->sgetn( b1, sizeof(b1) ); 414e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( chars_read == 11 ); 415e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( b1[9] == '0' ); 416e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 417e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fstream::pos_type pos = s.rdbuf()->pubseekoff(0, ios_base::cur); 418e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Depending on how '\n' is written in file, file position can be greater or equal to the number of chars_read read. 419e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streamoff offset = pos; 420e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( offset >= chars_read ); 421e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott offset = s.rdbuf()->pubseekoff( -offset, ios_base::cur ); 422e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( offset == 0 ); 423e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 424e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char b2[10] = { 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y' }; 425e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 426e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s.rdbuf()->sgetn( b2, 5 ) == 5 ); 427e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( b2[4] == '5' ); 428e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 429e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott pos = s.rdbuf()->pubseekoff(0, ios_base::cur); 430e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( pos == fstream::pos_type(5) ); 431e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s.rdbuf()->pubseekoff(-5, ios_base::cur) == fstream::pos_type(0) ); 432e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 433e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 434e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || \ 435e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (!defined (_STLP_NO_WCHAR_T) && defined (_STLP_USE_EXCEPTIONS)) 436e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 437e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Test with a wariable encoding: 438e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc; 439e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try 440e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 441e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale tmp(locale::classic(), new codecvt_byname<wchar_t, char, mbstate_t>(".UTF8")); 442e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc = tmp; 443e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 444e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (const runtime_error&) 445e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 446e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Localization no supported so no test: 447e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return; 448e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 449e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 450e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 451e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wfstream s( "test_file.txt", ios_base::in | ios_base::out | ios_base::trunc ); 452e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s ); 453e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott s.imbue(loc); 454e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s ); 455e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 456e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott s << L"1234567890\n"; 457e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s ); 458e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 459e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 460e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wchar_t b1[] = { L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x', L'x' }; 461e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wfstream s( "test_file.txt", ios_base::in | ios_base::out ); 462e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s ); 463e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott s.imbue(loc); 464e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s ); 465e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 466e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int chars_read = (int)s.rdbuf()->sgetn( b1, sizeof(b1) / sizeof(wchar_t) ); 467e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( chars_read == 11 ); 468e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( b1[9] == L'0' ); 469e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 470e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fstream::pos_type pos = s.rdbuf()->pubseekoff(0, ios_base::cur); 471e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Depending on how '\n' is written in file, file position can be greater or equal to the number of chars_read read. 472e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streamoff off = pos; 473e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( off >= chars_read ); 474e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott off = s.rdbuf()->pubseekoff(-off, ios_base::cur); 475e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( off == -1 ); 476e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott off = s.rdbuf()->pubseekoff(0, ios_base::beg); 477e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( off == 0 ); 478e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 479e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wchar_t b2[10] = { L'y', L'y', L'y', L'y', L'y', L'y', L'y', L'y', L'y', L'y' }; 480e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 481e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( s.rdbuf()->sgetn( b2, 5 ) == 5 ); 482e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( b2[4] == L'5' ); 483e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 484e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott pos = s.rdbuf()->pubseekoff(0, ios_base::cur); 485e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( pos == fstream::pos_type(5) ); 486e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //CPPUNIT_ASSERT( s.rdbuf()->pubseekoff(-5, ios_base::cur) == fstream::pos_type(0) ); 487e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 488e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 489e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 490e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 491e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::rdbuf() 492e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 493e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fstream ss( "test_file.txt", ios_base::in | ios_base::out | ios_base::binary | ios_base::trunc ); 494e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 495e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ss << "1234567\n89\n"; 496e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ss.seekg( 0, ios_base::beg ); 497e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 498e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostringstream os; 499e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ss.get( *os.rdbuf(), '\n' ); 500e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !ss.fail() ); 501e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char c; 502e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ss.get(c); 503e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !ss.fail() ); 504e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( c == '\n' ); // 27.6.1.3 paragraph 12 505e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( os.str() == "1234567" ); 506e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 507e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 508e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::streambuf_output() 509e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 510e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 511e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream ofstr("test_file.txt", ios_base::binary); 512e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!ofstr) 513e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //No test if we cannot create the file 514e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return; 515e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstr << "01234567890123456789"; 516e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( ofstr ); 517e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 518e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 519e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 520e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream in("test_file.txt", ios_base::binary); 521e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in ); 522e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 523e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott full_streambuf full_buf(10); 524e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostream out(&full_buf); 525e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( out ); 526e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 527e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott out << in.rdbuf(); 528e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( out ); 529e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in ); 530e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( full_buf.str() == "0123456789" ); 531e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 532e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott out << in.rdbuf(); 533e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( out.fail() ); 534e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in ); 535e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 536e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostringstream ostr; 537e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostr << in.rdbuf(); 538e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( ostr ); 539e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in ); 540e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( ostr.str() == "0123456789" ); 541e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 542e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 543e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 544e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 545e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //If the output stream buffer throws: 546e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream in("test_file.txt", ios_base::binary); 547e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in ); 548e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 549e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott full_streambuf full_buf(10, true); 550e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostream out(&full_buf); 551e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( out ); 552e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 553e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott out << in.rdbuf(); 554e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( out.bad() ); 555e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in ); 556e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //out is bad we have no guaranty on what has been extracted: 557e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //CPPUNIT_ASSERT( full_buf.str() == "0123456789" ); 558e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 559e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott out.clear(); 560e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott out << in.rdbuf(); 561e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( out.fail() && out.bad() ); 562e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in ); 563e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 564e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostringstream ostr; 565e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostr << in.rdbuf(); 566e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( ostr ); 567e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in ); 568e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( ostr.str() == "0123456789" ); 569e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 570e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 571e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 572e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 573e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::win32_file_format() 574e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 575e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* file_name = "win32_file_format.tmp"; 576e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const size_t nb_lines = 2049; 577e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 578e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream out(file_name); 579e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( out.good() ); 580e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott out << 'a'; 581e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (size_t i = 0; i < nb_lines - 1; ++i) { 582e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott out << '\n'; 583e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 584e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott out << '\r'; 585e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( out.good() ); 586e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 587e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 588e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream in(file_name); 589e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in.good() ); 590e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott string line, last_line; 591e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott size_t nb_read_lines = 0; 592e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott while (getline(in, line)) { 593e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ++nb_read_lines; 594e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott last_line = line; 595e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 596e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in.eof() ); 597e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( nb_read_lines == nb_lines ); 598e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !last_line.empty() && (last_line[0] == '\r') ); 599e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 600e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 601e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 602e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (DO_CUSTOM_FACET_TEST) 603e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct my_state { 604e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char dummy; 605e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 606e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 607e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct my_traits : public char_traits<char> { 608e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef my_state state_type; 609e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef fpos<state_type> pos_type; 610e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 611e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 612e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) 613e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//STLport grant a default implementation, other Standard libs implementation 614e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//do not necessarily do the same: 615e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottnamespace std { 616e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott template <> 617e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott class codecvt<char, char, my_state> 618e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott : public locale::facet, public codecvt_base { 619e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott public: 620e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef char intern_type; 621e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef char extern_type; 622e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef my_state state_type; 623e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 624e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott explicit codecvt(size_t __refs = 0) : locale::facet(__refs) {} 625e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott result out(state_type&, 626e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const intern_type* __from, 627e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const intern_type*, 628e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const intern_type*& __from_next, 629e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott extern_type* __to, 630e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott extern_type*, 631e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott extern_type*& __to_next) const 632e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { __from_next = __from; __to_next = __to; return noconv; } 633e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 634e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott result in (state_type&, 635e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const extern_type* __from, 636e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const extern_type*, 637e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const extern_type*& __from_next, 638e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott intern_type* __to, 639e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott intern_type*, 640e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott intern_type*& __to_next) const 641e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { __from_next = __from; __to_next = __to; return noconv; } 642e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 643e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott result unshift(state_type&, 644e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott extern_type* __to, 645e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott extern_type*, 646e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott extern_type*& __to_next) const 647e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { __to_next = __to; return noconv; } 648e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 649e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int encoding() const throw() 650e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { return 1; } 651e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 652e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott bool always_noconv() const throw() 653e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { return true; } 654e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 655e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int length(const state_type&, 656e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const extern_type* __from, 657e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const extern_type* __end, 658e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott size_t __max) const 659e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { return (int)min(static_cast<size_t>(__end - __from), __max); } 660e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 661e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int max_length() const throw() 662e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { return 1; } 663e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 664e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static locale::id id; 665e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott }; 666e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 667e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::id codecvt<char, char, my_state>::id; 668e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 669e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# else 670e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if defined (__BORLANDC__) && (__BORLANDC__ < 0x590) 671e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <> 672e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id codecvt<char, char, my_state>::id; 673e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 674e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 675e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 676e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 677e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::custom_facet() 678e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 679e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (DO_CUSTOM_FACET_TEST) 680e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* fileName = "test_file.txt"; 681e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //File preparation: 682e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 683e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream ofstr(fileName, ios_base::binary); 684e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstr << "0123456789"; 685e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( ofstr ); 686e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 687e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 688e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 689e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef basic_ifstream<char, my_traits> my_ifstream; 690e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef basic_string<char, my_traits> my_string; 691e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 692e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott my_ifstream ifstr(fileName); 693e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( ifstr ); 694e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 695e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 696e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstr.imbue(locale::classic()); 697e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( ifstr.fail() && !ifstr.bad() ); 698e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstr.clear(); 699e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 700e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef codecvt<char, char, my_state> my_codecvt; 701e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale my_loc(locale::classic(), new my_codecvt()); 702e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Check that my_codecvt has not replace default codecvt: 703e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( (has_facet<my_codecvt>(my_loc)) ); 704e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( (has_facet<codecvt<char, char, mbstate_t> >(my_loc)) ); 705e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || !defined (_STLP_NO_WCHAR_T) 706e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( (has_facet<codecvt<wchar_t, char, mbstate_t> >(my_loc)) ); 707e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 708e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstr.imbue(my_loc); 709e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( ifstr.good() ); 710e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* 711e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott my_string res; 712e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstr >> res; 713e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !ifstr.fail() ); 714e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !ifstr.bad() ); 715e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( ifstr.eof() ); 716e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( res == "0123456789" ); 717e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 718e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 719e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 720e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 721e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 722e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if defined (CHECK_BIG_FILE) 723e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::big_file() 724e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 725e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott vector<pair<streamsize, streamoff> > file_pos; 726e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 727e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //Big file creation: 728e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 729e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream out("big_file.txt"); 730e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( out ); 731e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 732e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //We are going to generate a file with the following schema for the content: 733e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //0(1019 times)0000 //1023 characters + 1 charater for \n (for some platforms it will be a 1 ko line) 734e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //0(1019 times)0001 735e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //... 736e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //0(1019 times)1234 737e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //... 738e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 739e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //Generation of the number of loop: 740e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streamoff nb = 1; 741e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (int i = 0; i < 20; ++i) { 742e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //This assertion check that the streamoff can at least represent the necessary integers values 743e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //for this test: 744e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( (nb << 1) > nb ); 745e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott nb <<= 1; 746e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 747e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( nb * CHECK_BIG_FILE >= nb ); 748e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott nb *= CHECK_BIG_FILE; 749e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 750e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //Preparation of the ouput stream state: 751e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott out << setiosflags(ios_base::right) << setfill('*'); 752e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (streamoff index = 0; index < nb; ++index) { 753e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (index % 1024 == 0) { 754e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott file_pos.push_back(make_pair(out.tellp(), index)); 755e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( file_pos.back().first != streamsize(-1) ); 756e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (file_pos.size() > 1) { 757e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( file_pos[file_pos.size() - 1].first > file_pos[file_pos.size() - 2].first ); 758e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 759e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 760e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott out << setw(1023) << index << '\n'; 761e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 762e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 763e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 764e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 765e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream in("big_file.txt"); 766e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in ); 767e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 768e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott string line; 769e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott vector<pair<streamsize, streamsize> >::const_iterator pit(file_pos.begin()), 770e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott pitEnd(file_pos.end()); 771e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (; pit != pitEnd; ++pit) { 772e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott in.seekg((*pit).first); 773e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in ); 774e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott in >> line; 775e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott size_t lastStarPos = line.rfind('*'); 776e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( atoi(line.substr(lastStarPos + 1).c_str()) == (*pit).second ); 777e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 778e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 779e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 780e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* 781e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott The following test has been used to check that STLport do not generate 782e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott an infinite loop when the file size is larger than the streamsize and 783e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streamoff representation (32 bits or 64 bits). 784e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 785e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream in("big_file.txt"); 786e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( in ); 787e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char tmp[4096]; 788e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streamsize nb_reads = 0; 789e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott while ((!in.eof()) && in.good()){ 790e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott in.read(tmp, 4096); 791e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott nb_reads += in.gcount(); 792e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 793e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 794e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 795e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 796e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 797e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 798e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::null_stream() 799e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 800e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if (defined (STLPORT) && defined (_STLP_USE_WIN32_IO)) || \ 801e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (!defined (STLPORT) && (defined (WIN32) || defined (_WIN32))) 802e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* nullStreamName = "NUL"; 803e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# else 804e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const char* nullStreamName = "/dev/null"; 805e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 806e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 807e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream nullStream(nullStreamName); 808e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( nullStream ); 809e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 810e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 811e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 812e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream nullStream(nullStreamName, ios_base::ate); 813e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( nullStream ); 814e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 815e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 816e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 817e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream nullStream(nullStreamName, ios_base::trunc); 818e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( nullStream ); 819e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 820e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 821e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 822e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ofstream nullStream(nullStreamName, ios_base::app); 823e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( nullStream ); 824e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 825e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 826e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 827e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream nullStream(nullStreamName); 828e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( nullStream ); 829e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 830e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 831e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 832e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ifstream nullStream(nullStreamName, ios_base::ate); 833e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( nullStream ); 834e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 835e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 836e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 837e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fstream nullStream(nullStreamName); 838e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( nullStream ); 839e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 840e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 841e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 842e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fstream nullStream(nullStreamName, ios_base::in | ios_base::out | ios_base::ate); 843e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( nullStream ); 844e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 845e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 846e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 847e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fstream nullStream(nullStreamName, ios_base::in | ios_base::out | ios_base::trunc); 848e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( nullStream ); 849e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 850e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 851e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 852e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::null_buf() 853e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 854e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* ********************************************************************************** 855e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 856e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott testcase for bug #1830513: 857e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott in _istream.c 858e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 859e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott template < class _CharT, class _Traits, class _Is_Delim> 860e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streamsize _STLP_CALL __read_unbuffered(basic_istream<_CharT, _Traits>* __that, 861e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott basic_streambuf<_CharT, _Traits>* __buf, 862e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott streamsize _Num, _CharT* __s, 863e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Is_Delim __is_delim, 864e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott bool __extract_delim, bool __append_null, 865e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott bool __is_getline) 866e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 867e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott can't accept _Num == 0; this is legal case, and may happen from 868e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 869e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott template <class _CharT, class _Traits> 870e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott basic_istream<_CharT, _Traits>& 871e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott basic_istream<_CharT, _Traits>::getline(_CharT* __s, streamsize __n, _CharT __delim) 872e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 873e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *********************************************************************************** */ 874e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 875e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fstream f( "test.txt", ios_base::in | ios_base::out | ios_base::trunc ); 876e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // string line; 877e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 878e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for ( int i = 0; i < 0x200; ++i ) { 879e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f.put( ' ' ); 880e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 881e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 882e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // const streambuf *b = f.rdbuf(); 883e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 884e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // string s; 885e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char buf[1024]; 886e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott buf[0] = 'a'; 887e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott buf[1] = 'b'; 888e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott buf[2] = 'c'; 889e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 890e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // getline( f, s ); 891e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // cerr << f.good() << endl; 892e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f.seekg( 0, ios_base::beg ); 893e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // f.seekg( 0, ios_base::end ); 894e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // buf[0] = f.get(); 895e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 896e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // cerr << (void *)(b->_M_gptr()) << " " << (void *)(b->_M_egptr()) << endl; 897e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // cerr << f.good() << endl; 898e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // getline( f, s ); 899e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott f.getline( buf, 1 ); // <-- key line 900e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( buf[0] == 0 ); 901e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( f.fail() ); // due to delimiter not found while buffer was exhausted 902e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 903e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 904e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || !defined (_STLP_WIN32) 905e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid FstreamTest::offset() 906e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 907e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if (defined(_LARGEFILE_SOURCE) || defined(_LARGEFILE64_SOURCE)) && !defined(_STLP_USE_DEFAULT_FILE_OFFSET) 908e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( sizeof(streamoff) == 8 ); 909e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# else 910e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK( sizeof(streamoff) == sizeof(off_t) ); 911e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 912e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 913e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 914e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 915e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 916