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