aboutsummaryrefslogtreecommitdiff
path: root/test/unit/fstream_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/fstream_test.cpp')
-rw-r--r--test/unit/fstream_test.cpp915
1 files changed, 0 insertions, 915 deletions
diff --git a/test/unit/fstream_test.cpp b/test/unit/fstream_test.cpp
deleted file mode 100644
index bba41a2..0000000
--- a/test/unit/fstream_test.cpp
+++ /dev/null
@@ -1,915 +0,0 @@
-#include <string>
-#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
-# include <fstream>
-# include <iostream>
-# include <iomanip>
-# include <sstream>
-# include <vector>
-# include <stdexcept>
-
-#include <stdio.h>
-
-# include "full_streambuf.h"
-# include "cppunit/cppunit_proxy.h"
-
-# if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
-using namespace std;
-# endif
-
-//The macro value gives approximately the generated file
-//size in Go
-//#define CHECK_BIG_FILE 4
-
-# if (!defined(STLPORT) && (defined (__GNUC__) && (__GNUC__ > 3))) || \
- (defined (STLPORT) && !defined (_STLP_NO_CUSTOM_IO) && !defined (_STLP_NO_MEMBER_TEMPLATES) && \
- !((defined (_STLP_MSVC) && (_STLP_MSVC < 1300)) || \
- (defined (__GNUC__) && (__GNUC__ < 3)) || \
- (defined (__SUNPRO_CC)) || \
- (defined (__DMC__) && defined (_DLL))))
-# define DO_CUSTOM_FACET_TEST
-# endif
-
-//
-// TestCase class
-//
-class FstreamTest : public CPPUNIT_NS::TestCase
-{
- CPPUNIT_TEST_SUITE(FstreamTest);
- CPPUNIT_TEST(output);
- CPPUNIT_TEST(input);
- CPPUNIT_TEST(input_char);
- CPPUNIT_TEST(io);
- CPPUNIT_TEST(err);
- CPPUNIT_TEST(tellg);
- CPPUNIT_TEST(tellp);
- CPPUNIT_TEST(seek);
- CPPUNIT_TEST(buf);
- CPPUNIT_TEST(rdbuf);
- CPPUNIT_TEST(streambuf_output);
- CPPUNIT_TEST(win32_file_format);
- CPPUNIT_TEST(null_stream);
-# if defined (STLPORT) && (defined (_STLP_NO_WCHAR_T) || !defined (_STLP_USE_EXCEPTIONS))
- CPPUNIT_IGNORE;
-# endif
- CPPUNIT_TEST(null_buf);
-# if !defined (STLPORT) || !defined (_STLP_WIN32)
- CPPUNIT_TEST(offset);
-# endif
-# if defined (CHECK_BIG_FILE)
- CPPUNIT_TEST(big_file);
-# endif
-# if !defined (DO_CUSTOM_FACET_TEST)
- CPPUNIT_IGNORE;
-# endif
- CPPUNIT_TEST(custom_facet);
- CPPUNIT_TEST_SUITE_END();
-
- protected:
- void output();
- void input();
- void input_char();
- void io();
- void err();
- void tellg();
- void tellp();
- void seek();
- void buf();
- void rdbuf();
- void streambuf_output();
- void win32_file_format();
- void null_stream();
- void null_buf();
-# if !defined (STLPORT) || !defined (_STLP_WIN32)
- void offset();
-# endif
- void custom_facet();
-# if defined (CHECK_BIG_FILE)
- void big_file();
-# endif
-};
-
-CPPUNIT_TEST_SUITE_REGISTRATION(FstreamTest);
-
-//
-// tests implementation
-//
-void FstreamTest::output()
-{
- ofstream f( "test_file.txt" );
-
- f << 1 << '\n' << 2.0 << '\n' << "abcd\n" << "ghk lm\n" << "abcd ef";
- CPPUNIT_ASSERT (f.good());
- // CPPUNIT_ASSERT( s.str() == "1\n2\nabcd\nghk lm\nabcd ef" );
-}
-
-void FstreamTest::input()
-{
- {
- ifstream f( "test_file.txt" );
- int i = 0;
- f >> i;
- CPPUNIT_ASSERT( f.good() );
- CPPUNIT_ASSERT( i == 1 );
- double d = 0.0;
- f >> d;
- CPPUNIT_ASSERT( f.good() );
- CPPUNIT_ASSERT( d == 2.0 );
- string str;
- f >> str;
- CPPUNIT_ASSERT( f.good() );
- CPPUNIT_ASSERT( str == "abcd" );
- char c;
- f.get(c); // extract newline, that not extracted by operator >>
- CPPUNIT_ASSERT( f.good() );
- CPPUNIT_ASSERT( c == '\n' );
- getline( f, str );
- CPPUNIT_ASSERT( f.good() );
- CPPUNIT_ASSERT( str == "ghk lm" );
- getline( f, str );
- CPPUNIT_ASSERT( f.eof() );
- CPPUNIT_ASSERT( str == "abcd ef" );
- }
-#if defined (STLPORT) && !defined (_STLP_USE_WIN32_IO)
- {
- ifstream in("/tmp");
- if (in.good()) {
- string s;
- getline(in, s);
- CPPUNIT_ASSERT( in.fail() );
- }
- }
-#endif
-}
-
-void FstreamTest::input_char()
-{
- char buf[16] = { 0, '1', '2', '3' };
- ifstream s( "test_file.txt" );
- s >> buf;
-
- CPPUNIT_ASSERT( buf[0] == '1' );
- CPPUNIT_ASSERT( buf[1] == 0 );
- CPPUNIT_ASSERT( buf[2] == '2' );
-}
-
-void FstreamTest::io()
-{
- basic_fstream<char,char_traits<char> > f( "test_file.txt", ios_base::in | ios_base::out | ios_base::trunc );
-
- CPPUNIT_ASSERT( f.is_open() );
-
- f << 1 << '\n' << 2.0 << '\n' << "abcd\n" << "ghk lm\n" << "abcd ef";
-
- // f.flush();
- f.seekg( 0, ios_base::beg );
-
- int i = 0;
- f >> i;
- CPPUNIT_ASSERT( f.good() );
- CPPUNIT_ASSERT( i == 1 );
- double d = 0.0;
- f >> d;
- CPPUNIT_ASSERT( d == 2.0 );
- string s;
- f >> s;
- CPPUNIT_ASSERT( f.good() );
- CPPUNIT_ASSERT( s == "abcd" );
- char c;
- f.get(c); // extract newline, that not extracted by operator >>
- CPPUNIT_ASSERT( f.good() );
- CPPUNIT_ASSERT( c == '\n' );
- getline( f, s );
- CPPUNIT_ASSERT( f.good() );
- CPPUNIT_ASSERT( s == "ghk lm" );
- getline( f, s );
- CPPUNIT_ASSERT( !f.fail() );
- CPPUNIT_ASSERT( s == "abcd ef" );
- CPPUNIT_ASSERT( f.eof() );
-}
-
-void FstreamTest::err()
-{
- basic_fstream<char,char_traits<char> > f( "test_file.txt", ios_base::in | ios_base::out | ios_base::trunc );
-
- CPPUNIT_ASSERT( f.is_open() );
-
- int i = 9;
- f << i;
- CPPUNIT_ASSERT( f.good() );
- i = 0;
- f.seekg( 0, ios_base::beg );
- f >> i;
- CPPUNIT_ASSERT( !f.fail() );
- CPPUNIT_ASSERT( i == 9 );
- f >> i;
- CPPUNIT_ASSERT( f.fail() );
- CPPUNIT_ASSERT( f.eof() );
- CPPUNIT_ASSERT( i == 9 );
-}
-
-void FstreamTest::tellg()
-{
- {
- // bogus ios_base::binary is for Wins
- ofstream of("test_file.txt", ios_base::out | ios_base::binary | ios_base::trunc);
- CPPUNIT_ASSERT( of.is_open() );
-
- for (int i = 0; i < 50; ++i) {
- of << "line " << setiosflags(ios_base::right) << setfill('0') << setw(2) << i << "\n";
- CPPUNIT_ASSERT( !of.fail() );
- }
- of.close();
- }
-
- {
- // bogus ios_base::binary is for Wins
- ifstream is("test_file.txt", ios_base::in | ios_base::binary);
- CPPUNIT_ASSERT( is.is_open() );
- char buf[64];
-
- // CPPUNIT_ASSERT( is.tellg() == 0 );
- streampos p = 0;
- for (int i = 0; i < 50; ++i) {
- is.read(buf, 0);
- CPPUNIT_ASSERT( is.gcount() == 0 );
- CPPUNIT_ASSERT( is.tellg() == p );
- is.read( buf, 8 );
- CPPUNIT_ASSERT( !is.fail() );
- CPPUNIT_ASSERT( is.gcount() == 8 );
- p += 8;
- }
- }
-
- {
- // bogus ios_base::binary is for Wins
- ifstream is("test_file.txt", ios_base::in | ios_base::binary);
- CPPUNIT_ASSERT( is.is_open() );
-
- streampos p = 0;
- for (int i = 0; i < 50; ++i) {
- CPPUNIT_ASSERT( !is.fail() );
- is.tellg();
- CPPUNIT_ASSERT( is.tellg() == p );
- p += 8;
- is.seekg( p, ios_base::beg );
- CPPUNIT_ASSERT( !is.fail() );
- }
- }
-
- {
- // bogus ios_base::binary is for Wins
- ifstream is("test_file.txt", ios_base::in | ios_base::binary);
- CPPUNIT_ASSERT( is.is_open() );
-
- streampos p = 0;
- for (int i = 0; i < 50; ++i) {
- CPPUNIT_ASSERT( is.tellg() == p );
- p += 8;
- is.seekg( 8, ios_base::cur );
- CPPUNIT_ASSERT( !is.fail() );
- }
- }
-}
-
-void FstreamTest::tellp()
-{
- {
- ofstream o( "test_file.txt" );
-
- o << "123456";
-
- CPPUNIT_CHECK( o.rdbuf()->pubseekoff( 0, ios_base::cur, ios_base::out ) == ofstream::pos_type(6) );
- CPPUNIT_CHECK( o.tellp() == ofstream::pos_type(6) );
- }
- {
- ofstream o( "test_file.txt" );
-
- o << "123456789";
-
- CPPUNIT_CHECK( o.rdbuf()->pubseekoff( 0, ios_base::cur, ios_base::out ) == ofstream::pos_type(9) );
- CPPUNIT_CHECK( o.tellp() == ofstream::pos_type(9) );
- }
- /* According to the standard
- ofstream o( "test_file.txt", ios_base::app | ios_base::out )
- should give the same effect as fopen( "test_file.txt", "a" ).
- Problem is fopen( "test_file.txt", "a" ) has a bit different behaviour
- on different platforms, and this difference is not covered by specification.
- After fopen( "test_file.txt", "a" ) in this context ftell( f ) == 9 for
- Linux and Mac OS X (I expect the same for others POSIX-like platforms too);
- on Windows (independently from version?) ftell( f ) == 0, i.e. write pointer not
- shifted to EOF (but shifted to EOF just before write, as described in the specs).
-
- It isn't specifications violation, neither for Linux and Mac OS X nor for Windows.
-
- The code below is intended to demonstrate ambiguity (dependance from fopen implementation).
- */
- {
- #ifdef WIN32
- //In Windows, stlport and fopen use kernel32.CreateFile for open.
- //File position is at BOF after open, unless we open with ios_base::ate
- long expected_pos = 0;
- #else
- //On UNIX flavours, stlport and fopen use unix's open
- //File position is at EOF after open
- //
- //3rd possible scenario, "other platforms" - _STLP_USE_STDIO_IO
- //stlport uses fopen here. This case may fail this test, since the file position after
- //fopen is implementation-dependent
- long expected_pos = 9;
- #endif
- ofstream o( "test_file.txt", ios_base::app | ios_base::out );
- CPPUNIT_CHECK( o.rdbuf()->pubseekoff( 0, ios_base::cur, ios_base::out ) == ofstream::pos_type(expected_pos) );
- CPPUNIT_CHECK( o.tellp() == ofstream::pos_type(expected_pos) );
- }
- { // for reference, to test fopen/ftell behaviour in append mode:
- #ifdef WIN32
- long expected_pos = 0;
- #else
- long expected_pos = 9;
- #endif
- FILE* f = fopen( "test_file.txt", "a" );
- CPPUNIT_CHECK( ftell( f ) == expected_pos );
- fclose( f );
- }
- {
- //In append mode, file is positioned at EOF just before a write.
- // After a write, file is at EOF. This is implementation-independent.
- ofstream o( "test_file.txt", ios_base::app | ios_base::out );
- o << "X";
- CPPUNIT_CHECK( o.rdbuf()->pubseekoff( 0, ios_base::cur, ios_base::out ) == ofstream::pos_type(10) );
- CPPUNIT_CHECK( o.tellp() == ofstream::pos_type(10) );
- }
-}
-
-void FstreamTest::buf()
-{
- fstream ss( "test_file.txt", ios_base::in | ios_base::out | ios_base::binary | ios_base::trunc );
-
- ss << "1234567\n89\n";
- ss.seekg( 0, ios_base::beg );
- char buf[10];
- buf[7] = 'x';
- ss.get( buf, 10 );
- CPPUNIT_ASSERT( !ss.fail() );
- CPPUNIT_ASSERT( buf[0] == '1' );
- CPPUNIT_ASSERT( buf[1] == '2' );
- CPPUNIT_ASSERT( buf[2] == '3' );
- CPPUNIT_ASSERT( buf[3] == '4' );
- CPPUNIT_ASSERT( buf[4] == '5' );
- CPPUNIT_ASSERT( buf[5] == '6' );
- CPPUNIT_ASSERT( buf[6] == '7' ); // 27.6.1.3 paragraph 10, paragraph 7
- CPPUNIT_ASSERT( buf[7] == 0 ); // 27.6.1.3 paragraph 8
- char c;
- ss.get(c);
- CPPUNIT_ASSERT( !ss.fail() );
- CPPUNIT_ASSERT( c == '\n' ); // 27.6.1.3 paragraph 10, paragraph 7
- ss.get(c);
- CPPUNIT_ASSERT( !ss.fail() );
- CPPUNIT_ASSERT( c == '8' );
-}
-
-void FstreamTest::seek()
-{
- {
- // Test in binary mode:
- {
- fstream s( "test_file.txt", ios_base::in | ios_base::out | ios_base::binary | ios_base::trunc );
- CPPUNIT_ASSERT( s );
-
- s << "1234567890\n";
- CPPUNIT_ASSERT( s );
- }
-
- char b1[] = { 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x' };
- fstream s( "test_file.txt", ios_base::in | ios_base::out | ios_base::binary );
- CPPUNIT_ASSERT( s );
-
- int chars_read = (int)s.rdbuf()->sgetn( b1, sizeof(b1) );
- CPPUNIT_CHECK( chars_read == 11 );
- CPPUNIT_CHECK( b1[9] == '0' );
- CPPUNIT_ASSERT( s.rdbuf()->pubseekoff( 0, ios_base::cur ) == fstream::pos_type(chars_read) );
- CPPUNIT_ASSERT( s.rdbuf()->pubseekoff( -chars_read, ios_base::cur ) == fstream::pos_type(0) );
-
- char b2[10] = { 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y' };
-
- CPPUNIT_ASSERT( s.rdbuf()->sgetn( b2, 10 ) == 10 );
- CPPUNIT_CHECK( b2[9] == '0' );
- }
-
- {
- // Test in text mode:
- {
- fstream s( "test_file.txt", ios_base::in | ios_base::out | ios_base::trunc );
- CPPUNIT_ASSERT( s );
-
- s << "1234567890\n";
- CPPUNIT_ASSERT( s );
- }
-
- char b1[] = { 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x' };
- fstream s( "test_file.txt", ios_base::in | ios_base::out );
- CPPUNIT_ASSERT( s );
-
- int chars_read = (int)s.rdbuf()->sgetn( b1, sizeof(b1) );
- CPPUNIT_CHECK( chars_read == 11 );
- CPPUNIT_CHECK( b1[9] == '0' );
-
- fstream::pos_type pos = s.rdbuf()->pubseekoff(0, ios_base::cur);
- // Depending on how '\n' is written in file, file position can be greater or equal to the number of chars_read read.
- streamoff offset = pos;
- CPPUNIT_ASSERT( offset >= chars_read );
- offset = s.rdbuf()->pubseekoff( -offset, ios_base::cur );
- CPPUNIT_ASSERT( offset == 0 );
-
- char b2[10] = { 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y' };
-
- CPPUNIT_ASSERT( s.rdbuf()->sgetn( b2, 5 ) == 5 );
- CPPUNIT_CHECK( b2[4] == '5' );
-
- pos = s.rdbuf()->pubseekoff(0, ios_base::cur);
- CPPUNIT_ASSERT( pos == fstream::pos_type(5) );
- CPPUNIT_ASSERT( s.rdbuf()->pubseekoff(-5, ios_base::cur) == fstream::pos_type(0) );
- }
-
-#if !defined (STLPORT) || \
- (!defined (_STLP_NO_WCHAR_T) && defined (_STLP_USE_EXCEPTIONS))
- {
- // Test with a wariable encoding:
- locale loc;
- try
- {
- locale tmp(locale::classic(), new codecvt_byname<wchar_t, char, mbstate_t>(".UTF8"));
- loc = tmp;
- }
- catch (const runtime_error&)
- {
- // Localization no supported so no test:
- return;
- }
-
- {
- wfstream s( "test_file.txt", ios_base::in | ios_base::out | ios_base::trunc );
- CPPUNIT_ASSERT( s );
- s.imbue(loc);
- CPPUNIT_ASSERT( s );
-
- s << L"1234567890\n";
- CPPUNIT_ASSERT( s );
- }
-
- 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' };
- wfstream s( "test_file.txt", ios_base::in | ios_base::out );
- CPPUNIT_ASSERT( s );
- s.imbue(loc);
- CPPUNIT_ASSERT( s );
-
- int chars_read = (int)s.rdbuf()->sgetn( b1, sizeof(b1) / sizeof(wchar_t) );
- CPPUNIT_CHECK( chars_read == 11 );
- CPPUNIT_CHECK( b1[9] == L'0' );
-
- fstream::pos_type pos = s.rdbuf()->pubseekoff(0, ios_base::cur);
- // Depending on how '\n' is written in file, file position can be greater or equal to the number of chars_read read.
- streamoff off = pos;
- CPPUNIT_ASSERT( off >= chars_read );
- off = s.rdbuf()->pubseekoff(-off, ios_base::cur);
- CPPUNIT_ASSERT( off == -1 );
- off = s.rdbuf()->pubseekoff(0, ios_base::beg);
- CPPUNIT_ASSERT( off == 0 );
-
- wchar_t b2[10] = { L'y', L'y', L'y', L'y', L'y', L'y', L'y', L'y', L'y', L'y' };
-
- CPPUNIT_ASSERT( s.rdbuf()->sgetn( b2, 5 ) == 5 );
- CPPUNIT_CHECK( b2[4] == L'5' );
-
- pos = s.rdbuf()->pubseekoff(0, ios_base::cur);
- CPPUNIT_ASSERT( pos == fstream::pos_type(5) );
- //CPPUNIT_ASSERT( s.rdbuf()->pubseekoff(-5, ios_base::cur) == fstream::pos_type(0) );
- }
-#endif
-}
-
-void FstreamTest::rdbuf()
-{
- fstream ss( "test_file.txt", ios_base::in | ios_base::out | ios_base::binary | ios_base::trunc );
-
- ss << "1234567\n89\n";
- ss.seekg( 0, ios_base::beg );
-
- ostringstream os;
- ss.get( *os.rdbuf(), '\n' );
- CPPUNIT_ASSERT( !ss.fail() );
- char c;
- ss.get(c);
- CPPUNIT_ASSERT( !ss.fail() );
- CPPUNIT_ASSERT( c == '\n' ); // 27.6.1.3 paragraph 12
- CPPUNIT_ASSERT( os.str() == "1234567" );
-}
-
-void FstreamTest::streambuf_output()
-{
- {
- ofstream ofstr("test_file.txt", ios_base::binary);
- if (!ofstr)
- //No test if we cannot create the file
- return;
- ofstr << "01234567890123456789";
- CPPUNIT_ASSERT( ofstr );
- }
-
- {
- ifstream in("test_file.txt", ios_base::binary);
- CPPUNIT_ASSERT( in );
-
- full_streambuf full_buf(10);
- ostream out(&full_buf);
- CPPUNIT_ASSERT( out );
-
- out << in.rdbuf();
- CPPUNIT_ASSERT( out );
- CPPUNIT_ASSERT( in );
- CPPUNIT_ASSERT( full_buf.str() == "0123456789" );
-
- out << in.rdbuf();
- CPPUNIT_ASSERT( out.fail() );
- CPPUNIT_ASSERT( in );
-
- ostringstream ostr;
- ostr << in.rdbuf();
- CPPUNIT_ASSERT( ostr );
- CPPUNIT_ASSERT( in );
- CPPUNIT_ASSERT( ostr.str() == "0123456789" );
- }
-
-# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
- {
- //If the output stream buffer throws:
- ifstream in("test_file.txt", ios_base::binary);
- CPPUNIT_ASSERT( in );
-
- full_streambuf full_buf(10, true);
- ostream out(&full_buf);
- CPPUNIT_ASSERT( out );
-
- out << in.rdbuf();
- CPPUNIT_ASSERT( out.bad() );
- CPPUNIT_ASSERT( in );
- //out is bad we have no guaranty on what has been extracted:
- //CPPUNIT_ASSERT( full_buf.str() == "0123456789" );
-
- out.clear();
- out << in.rdbuf();
- CPPUNIT_ASSERT( out.fail() && out.bad() );
- CPPUNIT_ASSERT( in );
-
- ostringstream ostr;
- ostr << in.rdbuf();
- CPPUNIT_ASSERT( ostr );
- CPPUNIT_ASSERT( in );
- CPPUNIT_ASSERT( ostr.str() == "0123456789" );
- }
-# endif
-}
-
-void FstreamTest::win32_file_format()
-{
- const char* file_name = "win32_file_format.tmp";
- const size_t nb_lines = 2049;
- {
- ofstream out(file_name);
- CPPUNIT_ASSERT( out.good() );
- out << 'a';
- for (size_t i = 0; i < nb_lines - 1; ++i) {
- out << '\n';
- }
- out << '\r';
- CPPUNIT_ASSERT( out.good() );
- }
- {
- ifstream in(file_name);
- CPPUNIT_ASSERT( in.good() );
- string line, last_line;
- size_t nb_read_lines = 0;
- while (getline(in, line)) {
- ++nb_read_lines;
- last_line = line;
- }
- CPPUNIT_ASSERT( in.eof() );
- CPPUNIT_ASSERT( nb_read_lines == nb_lines );
- CPPUNIT_ASSERT( !last_line.empty() && (last_line[0] == '\r') );
- }
-}
-
-#if defined (DO_CUSTOM_FACET_TEST)
-struct my_state {
- char dummy;
-};
-
-struct my_traits : public char_traits<char> {
- typedef my_state state_type;
- typedef fpos<state_type> pos_type;
-};
-
-#if !defined (STLPORT)
-//STLport grant a default implementation, other Standard libs implementation
-//do not necessarily do the same:
-namespace std {
- template <>
- class codecvt<char, char, my_state>
- : public locale::facet, public codecvt_base {
- public:
- typedef char intern_type;
- typedef char extern_type;
- typedef my_state state_type;
-
- explicit codecvt(size_t __refs = 0) : locale::facet(__refs) {}
- result out(state_type&,
- const intern_type* __from,
- const intern_type*,
- const intern_type*& __from_next,
- extern_type* __to,
- extern_type*,
- extern_type*& __to_next) const
- { __from_next = __from; __to_next = __to; return noconv; }
-
- result in (state_type&,
- const extern_type* __from,
- const extern_type*,
- const extern_type*& __from_next,
- intern_type* __to,
- intern_type*,
- intern_type*& __to_next) const
- { __from_next = __from; __to_next = __to; return noconv; }
-
- result unshift(state_type&,
- extern_type* __to,
- extern_type*,
- extern_type*& __to_next) const
- { __to_next = __to; return noconv; }
-
- int encoding() const throw()
- { return 1; }
-
- bool always_noconv() const throw()
- { return true; }
-
- int length(const state_type&,
- const extern_type* __from,
- const extern_type* __end,
- size_t __max) const
- { return (int)min(static_cast<size_t>(__end - __from), __max); }
-
- int max_length() const throw()
- { return 1; }
-
- static locale::id id;
- };
-
- locale::id codecvt<char, char, my_state>::id;
-}
-# else
-# if defined (__BORLANDC__) && (__BORLANDC__ < 0x590)
-template <>
-locale::id codecvt<char, char, my_state>::id;
-# endif
-# endif
-#endif
-
-void FstreamTest::custom_facet()
-{
-#if defined (DO_CUSTOM_FACET_TEST)
- const char* fileName = "test_file.txt";
- //File preparation:
- {
- ofstream ofstr(fileName, ios_base::binary);
- ofstr << "0123456789";
- CPPUNIT_ASSERT( ofstr );
- }
-
- {
- typedef basic_ifstream<char, my_traits> my_ifstream;
- typedef basic_string<char, my_traits> my_string;
-
- my_ifstream ifstr(fileName);
- CPPUNIT_ASSERT( ifstr );
-
-# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
- ifstr.imbue(locale::classic());
- CPPUNIT_ASSERT( ifstr.fail() && !ifstr.bad() );
- ifstr.clear();
-# endif
- typedef codecvt<char, char, my_state> my_codecvt;
- locale my_loc(locale::classic(), new my_codecvt());
- // Check that my_codecvt has not replace default codecvt:
- CPPUNIT_ASSERT( (has_facet<my_codecvt>(my_loc)) );
- CPPUNIT_ASSERT( (has_facet<codecvt<char, char, mbstate_t> >(my_loc)) );
-# if !defined (STLPORT) || !defined (_STLP_NO_WCHAR_T)
- CPPUNIT_ASSERT( (has_facet<codecvt<wchar_t, char, mbstate_t> >(my_loc)) );
-# endif
- ifstr.imbue(my_loc);
- CPPUNIT_ASSERT( ifstr.good() );
- /*
- my_string res;
- ifstr >> res;
- CPPUNIT_ASSERT( !ifstr.fail() );
- CPPUNIT_ASSERT( !ifstr.bad() );
- CPPUNIT_ASSERT( ifstr.eof() );
- CPPUNIT_ASSERT( res == "0123456789" );
- */
- }
-#endif
-}
-
-# if defined (CHECK_BIG_FILE)
-void FstreamTest::big_file()
-{
- vector<pair<streamsize, streamoff> > file_pos;
-
- //Big file creation:
- {
- ofstream out("big_file.txt");
- CPPUNIT_ASSERT( out );
-
- //We are going to generate a file with the following schema for the content:
- //0(1019 times)0000 //1023 characters + 1 charater for \n (for some platforms it will be a 1 ko line)
- //0(1019 times)0001
- //...
- //0(1019 times)1234
- //...
-
- //Generation of the number of loop:
- streamoff nb = 1;
- for (int i = 0; i < 20; ++i) {
- //This assertion check that the streamoff can at least represent the necessary integers values
- //for this test:
- CPPUNIT_ASSERT( (nb << 1) > nb );
- nb <<= 1;
- }
- CPPUNIT_ASSERT( nb * CHECK_BIG_FILE >= nb );
- nb *= CHECK_BIG_FILE;
-
- //Preparation of the ouput stream state:
- out << setiosflags(ios_base::right) << setfill('*');
- for (streamoff index = 0; index < nb; ++index) {
- if (index % 1024 == 0) {
- file_pos.push_back(make_pair(out.tellp(), index));
- CPPUNIT_ASSERT( file_pos.back().first != streamsize(-1) );
- if (file_pos.size() > 1) {
- CPPUNIT_ASSERT( file_pos[file_pos.size() - 1].first > file_pos[file_pos.size() - 2].first );
- }
- }
- out << setw(1023) << index << '\n';
- }
- }
-
- {
- ifstream in("big_file.txt");
- CPPUNIT_ASSERT( in );
-
- string line;
- vector<pair<streamsize, streamsize> >::const_iterator pit(file_pos.begin()),
- pitEnd(file_pos.end());
- for (; pit != pitEnd; ++pit) {
- in.seekg((*pit).first);
- CPPUNIT_ASSERT( in );
- in >> line;
- size_t lastStarPos = line.rfind('*');
- CPPUNIT_ASSERT( atoi(line.substr(lastStarPos + 1).c_str()) == (*pit).second );
- }
- }
-
- /*
- The following test has been used to check that STLport do not generate
- an infinite loop when the file size is larger than the streamsize and
- streamoff representation (32 bits or 64 bits).
- {
- ifstream in("big_file.txt");
- CPPUNIT_ASSERT( in );
- char tmp[4096];
- streamsize nb_reads = 0;
- while ((!in.eof()) && in.good()){
- in.read(tmp, 4096);
- nb_reads += in.gcount();
- }
- }
- */
-}
-# endif
-
-void FstreamTest::null_stream()
-{
-# if (defined (STLPORT) && defined (_STLP_USE_WIN32_IO)) || \
- (!defined (STLPORT) && (defined (WIN32) || defined (_WIN32)))
- const char* nullStreamName = "NUL";
-# else
- const char* nullStreamName = "/dev/null";
-# endif
- {
- ofstream nullStream(nullStreamName);
- CPPUNIT_CHECK( nullStream );
- }
-
- {
- ofstream nullStream(nullStreamName, ios_base::ate);
- CPPUNIT_CHECK( nullStream );
- }
-
- {
- ofstream nullStream(nullStreamName, ios_base::trunc);
- CPPUNIT_CHECK( nullStream );
- }
-
- {
- ofstream nullStream(nullStreamName, ios_base::app);
- CPPUNIT_CHECK( nullStream );
- }
-
- {
- ifstream nullStream(nullStreamName);
- CPPUNIT_CHECK( nullStream );
- }
-
- {
- ifstream nullStream(nullStreamName, ios_base::ate);
- CPPUNIT_CHECK( nullStream );
- }
-
- {
- fstream nullStream(nullStreamName);
- CPPUNIT_CHECK( nullStream );
- }
-
- {
- fstream nullStream(nullStreamName, ios_base::in | ios_base::out | ios_base::ate);
- CPPUNIT_CHECK( nullStream );
- }
-
- {
- fstream nullStream(nullStreamName, ios_base::in | ios_base::out | ios_base::trunc);
- CPPUNIT_CHECK( nullStream );
- }
-}
-
-void FstreamTest::null_buf()
-{
- /* **********************************************************************************
-
- testcase for bug #1830513:
- in _istream.c
-
- template < class _CharT, class _Traits, class _Is_Delim>
- streamsize _STLP_CALL __read_unbuffered(basic_istream<_CharT, _Traits>* __that,
- basic_streambuf<_CharT, _Traits>* __buf,
- streamsize _Num, _CharT* __s,
- _Is_Delim __is_delim,
- bool __extract_delim, bool __append_null,
- bool __is_getline)
-
- can't accept _Num == 0; this is legal case, and may happen from
-
- template <class _CharT, class _Traits>
- basic_istream<_CharT, _Traits>&
- basic_istream<_CharT, _Traits>::getline(_CharT* __s, streamsize __n, _CharT __delim)
-
- *********************************************************************************** */
-
- fstream f( "test.txt", ios_base::in | ios_base::out | ios_base::trunc );
- // string line;
-
- for ( int i = 0; i < 0x200; ++i ) {
- f.put( ' ' );
- }
-
- // const streambuf *b = f.rdbuf();
-
- // string s;
- char buf[1024];
- buf[0] = 'a';
- buf[1] = 'b';
- buf[2] = 'c';
-
- // getline( f, s );
- // cerr << f.good() << endl;
- f.seekg( 0, ios_base::beg );
- // f.seekg( 0, ios_base::end );
- // buf[0] = f.get();
-
- // cerr << (void *)(b->_M_gptr()) << " " << (void *)(b->_M_egptr()) << endl;
- // cerr << f.good() << endl;
- // getline( f, s );
- f.getline( buf, 1 ); // <-- key line
- CPPUNIT_CHECK( buf[0] == 0 );
- CPPUNIT_CHECK( f.fail() ); // due to delimiter not found while buffer was exhausted
-}
-
-# if !defined (STLPORT) || !defined (_STLP_WIN32)
-void FstreamTest::offset()
-{
-# if (defined(_LARGEFILE_SOURCE) || defined(_LARGEFILE64_SOURCE)) && !defined(_STLP_USE_DEFAULT_FILE_OFFSET)
- CPPUNIT_CHECK( sizeof(streamoff) == 8 );
-# else
- CPPUNIT_CHECK( sizeof(streamoff) == sizeof(off_t) );
-# endif
-}
-# endif
-
-#endif