genericopenlibs/cppstdlib/stl/test/unit/fstream_test.cpp
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cppstdlib/stl/test/unit/fstream_test.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,982 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <string>
+#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
+#  include <fstream>
+#  include <iostream>
+#  include <iomanip>
+#  include <sstream>
+#  include <vector>
+#  include <memory>
+#include <e32std.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 (_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(buf);
+  CPPUNIT_TEST(rdbuf);
+#if !defined (STLPORT) || !defined (_STLP_WIN32)
+  CPPUNIT_TEST(offset);
+#endif
+#  if defined (__DMC__)
+  CPPUNIT_IGNORE;
+#  endif
+  CPPUNIT_TEST(streambuf_output);
+  CPPUNIT_STOP_IGNORE;
+  CPPUNIT_TEST(win32_file_format);
+#  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(fstream_cov1);
+  CPPUNIT_TEST(fstream_cov2);
+  CPPUNIT_TEST(fstream_cov3);
+  CPPUNIT_TEST(fstream_cov4);
+  CPPUNIT_TEST(fstream_cov5);
+  CPPUNIT_TEST_SUITE_END();
+
+  protected:
+    void output();
+    void input();
+    void input_char();
+    void io();
+    void err();
+    void tellg();
+    void buf();
+    void rdbuf();
+    void streambuf_output();
+    void win32_file_format();
+    void custom_facet();
+    void fstream_cov1();
+    void fstream_cov2();
+    void fstream_cov3();
+    void fstream_cov4();
+    void fstream_cov5();
+#  if !defined (STLPORT) || !defined (_STLP_WIN32)
+    void offset();
+#  endif
+#  if defined (CHECK_BIG_FILE)
+    void big_file();
+#  endif
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(FstreamTest);
+
+//
+// tests implementation
+//
+void FstreamTest::output()
+{
+  ofstream f( "c:\\private\\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( "c:\\private\\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" );
+}
+
+void FstreamTest::input_char()
+{
+  char buf[16] = { 0, '1', '2', '3' };
+  ifstream s( "c:\\private\\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( "c:\\private\\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( "c:\\private\\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("c:\\private\\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("c:\\private\\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) {
+      CPPUNIT_ASSERT( is.tellg() == p );
+      is.read( buf, 8 );
+      CPPUNIT_ASSERT( !is.fail() );
+      p += 8;
+    }
+  }
+
+  {
+    // bogus ios_base::binary is for Wins
+    ifstream is("c:\\private\\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("c:\\private\\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::buf()
+{
+  fstream ss( "c:\\private\\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::rdbuf()
+{
+  fstream ss( "c:\\private\\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("c:\\private\\test_file.txt", ios_base::binary);
+    if (!ofstr)
+      //No test if we cannot create the file
+      return;
+    ofstr << "01234567890123456789";
+    CPPUNIT_ASSERT( ofstr );
+  }
+
+  {
+    ifstream in("c:\\private\\test_file.txt", ios_base::binary);
+    CPPUNIT_ASSERT( in );
+
+    auto_ptr<full_streambuf> pfull_buf(new full_streambuf(10));
+    ostream out(pfull_buf.get());
+    CPPUNIT_ASSERT( out );
+
+    out << in.rdbuf();
+    CPPUNIT_ASSERT( out );
+    CPPUNIT_ASSERT( in );
+    CPPUNIT_ASSERT( pfull_buf->str() == "0123456789" );
+
+    out << in.rdbuf();
+    CPPUNIT_ASSERT( out.fail() );
+    CPPUNIT_ASSERT( in );
+
+    ostringstream ostr;
+    ostr << in.rdbuf();
+    CPPUNIT_ASSERT( ostr );
+    CPPUNIT_ASSERT( in );
+    CPPUNIT_ASSERT( ostr.str() == "0123456789" );
+  }
+
+#  if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
+  {
+    //If the output stream buffer throws:
+    ifstream in("c:\\private\\test_file.txt", ios_base::binary);
+    CPPUNIT_ASSERT( in );
+
+    auto_ptr<full_streambuf> pfull_buf(new full_streambuf(10, true));
+    ostream out(pfull_buf.get());
+    CPPUNIT_ASSERT( out );
+
+    out << in.rdbuf();
+    CPPUNIT_ASSERT( out.bad() );
+    CPPUNIT_ASSERT( in );
+    //out is bad we have no guaranty on what has been extracted:
+    //CPPUNIT_ASSERT( pfull_buf->str() == "0123456789" );
+
+    out.clear();
+    out << in.rdbuf();
+    CPPUNIT_ASSERT( out.fail() && out.bad() );
+    CPPUNIT_ASSERT( in );
+
+    ostringstream ostr;
+    ostr << in.rdbuf();
+    CPPUNIT_ASSERT( ostr );
+    CPPUNIT_ASSERT( in );
+    CPPUNIT_ASSERT( ostr.str() == "0123456789" );
+  }
+#  endif
+}
+
+void FstreamTest::win32_file_format()
+{
+  const char* file_name = "c:\\private\\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;
+};
+
+class my_codecvt
+#  if defined (STLPORT)
+  : public codecvt<char, char, my_state> {
+
+#  else
+  : public locale::facet, public codecvt_base {
+  //STLport grant the same default implementation, other Standard libs implementation
+  //do not necessarily do the same:
+  public:
+    typedef char intern_type;
+    typedef char extern_type;
+    typedef my_state state_type;
+
+    explicit my_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;
+#  endif
+	
+};
+
+#  if !defined (STLPORT)
+locale::id my_codecvt::id;
+#  else
+#    if defined (__BORLANDC__)
+template <>
+locale::id codecvt<char, char, my_state>::id;
+#    endif
+#  endif
+#endif
+
+#if defined (__SYMBIAN32__WSD__)
+locale::id& codecvt<char, char, my_state>::GetFacetLocaleId()
+{
+	static locale::id aId = {41};
+	return aId;
+}
+#endif
+
+void FstreamTest::custom_facet()
+{
+#if defined (DO_CUSTOM_FACET_TEST) && !defined (__SYMBIAN32__) 
+
+  const char* fileName = "c:\\private\\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
+    locale my_loc(locale::classic(), new my_codecvt());
+    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
+
+#  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
+void FstreamTest::fstream_cov1()
+	{
+	__UHEAP_MARK;
+		{
+		ofstream ofs;
+		int x = 0;
+		char buf[12];
+		if (!ofs.bad())
+		    {
+		    ofs.open("c:\\test_cpp.txt",ios::out);
+		    ofs << "example";
+		    x = 1;    
+		    ofs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		
+		ifstream ifs;
+		x = 0;
+		if (!ifs.bad())
+		    {
+		    ifs.open("c:\\test_cpp.txt",ios::in);
+		    ifs >> buf; 
+		    x = 1;    
+		    ifs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		CPPUNIT_ASSERT( !strcmp(buf,"example"));
+		}
+		{
+		fstream fs;
+		int x = 0;
+
+		if (!fs.bad())
+		    {
+		    fs.open("c:\\test_cpp1.txt",ios::out);
+		    fs << "example";
+		    x = 1;    
+		    fs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		}
+		__UHEAP_MARKEND;
+	}
+void FstreamTest::fstream_cov2()
+	{
+	__UHEAP_MARK;
+		{/*
+		ofstream ofs;
+		int x = 0;
+		char buf[12];
+		if (!ofs.bad())
+		    {
+		    ofs.open("c:\\test_cpp.txt",ios::out,(long)0666);
+		    ofs << "example";
+		    x = 1;    
+		    ofs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		
+		ifstream ifs;
+		x = 0;
+		if (!ifs.bad())
+		    {
+		    ifs.open("c:\\test_cpp.txt",ios::in,0666);
+		    ifs >> buf; 
+		    x = 1;    
+		    ifs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		CPPUNIT_ASSERT( !strcmp(buf,"example"));*/
+		}
+		{/*
+		fstream fs;
+		int x = 0;
+		char buf[12];
+		if (!fs.bad())
+		    {
+		    fs.open("c:\\test_cpp.txt",ios::in | ios::out,(long)0666);
+		    fs << "example";
+		    fs >> buf; 
+		    x = 1;    
+		    fs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		CPPUNIT_ASSERT( !strcmp(buf,"example"));*/
+		}
+		__UHEAP_MARKEND;
+	}
+void FstreamTest::fstream_cov3()
+	{
+	__UHEAP_MARK;
+		{
+		long pos;
+		char buf[20];
+		ofstream outfile;
+		outfile.open ("c:\\test_cpp12.txt");
+		outfile.write ("Thisisanapple",14);
+		pos=outfile.tellp();
+		outfile.seekp (pos-7);
+		outfile.write ("sam",3);
+  		outfile.flush();
+		outfile.close();
+	
+		ifstream ifs;
+		if (!ifs.bad())
+		    {
+		    ifs.open("c:\\test_cpp12.txt",ios::in);
+		    ifs >> buf; 
+		    ifs.close();
+		    }
+		
+		CPPUNIT_ASSERT( !strcmp(buf,"Thisisasample"));
+		}
+		{
+		long pos;
+		ofstream outfile;
+		outfile.open ("c:\\test_cpp12.txt");
+		outfile.write ("Thisisanapple",14);
+		pos=outfile.tellp();
+		// seekp beyond the file
+		outfile.seekp (pos - (pos + 1) );
+		CPPUNIT_ASSERT( ios::failbit );
+  		outfile.flush();
+		outfile.close();			
+		}
+		{
+		ofstream ofs;
+		int x = 0;
+		if (!ofs.bad())
+		    {
+		    ofs.open("c:\\test_cpp.txt",ios::out);
+		    ofs << "testing";
+		    x = 1;    
+		    ofs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		ifstream myfile( "c:\\test_cpp.txt", ios::in );
+
+		myfile.rdbuf( )->stossc( );
+		char i = myfile.rdbuf( )->sgetc( );
+		CPPUNIT_ASSERT( i == 'e' );
+		}
+		{
+		ofstream ofs;
+		int x = 0;
+		if (!ofs.bad())
+		    {
+		    ofs.open("c:\\test_cpp.txt",ios::out);
+		    ofs << "testing";
+		    x = 1;    
+		    ofs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		ifstream myfile( "c:\\test_cpp.txt", ios::in );
+
+		int i;
+		i = myfile.rdbuf( )->sbumpc( );
+		CPPUNIT_ASSERT( (char)i == 't' );
+		i = myfile.rdbuf( )->sbumpc( );
+		CPPUNIT_ASSERT( (char)i == 'e' );
+		i = myfile.rdbuf( )->sungetc( );
+		CPPUNIT_ASSERT( (char)i == 'e' );
+		i = myfile.rdbuf( )->sungetc( ); 
+		CPPUNIT_ASSERT( (char)i == 't' );
+		i = myfile.rdbuf( )->sbumpc( );
+		CPPUNIT_ASSERT( (char)i == 't' );
+		i = myfile.rdbuf( )->sbumpc( );
+		i = myfile.rdbuf( )->sbumpc( );
+		i = myfile.rdbuf( )->sbumpc( );
+		i = myfile.rdbuf( )->sbumpc( );
+		i = myfile.rdbuf( )->sbumpc( );
+		i = myfile.rdbuf( )->sbumpc( );
+		i = myfile.rdbuf( )->sbumpc( );
+		i = myfile.rdbuf( )->sbumpc( );
+		//CPPUNIT_ASSERT(myfile.eof());
+		}
+		__UHEAP_MARKEND;
+	}
+void FstreamTest::fstream_cov4()
+	{
+	__UHEAP_MARK;
+		{
+		ofstream ofs;
+		int x = 0;
+		if (!ofs.bad())
+		    {
+		    ofs.open("c:\\test_cpp.txt",ios::out);
+		    ofs << "testing";
+		    x = 1;    
+		    ofs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		ifstream myfile( "c:\\test_cpp.txt", ios::in );
+
+		int i;
+		i = myfile.rdbuf( )->snextc( );
+		CPPUNIT_ASSERT( (char)i == 'e' );
+		}
+		{
+		ofstream ofs;
+		int x = 0;
+		char c[10];
+		if (!ofs.bad())
+		    {
+		    ofs.open("c:\\test_cpp.txt",ios::out);
+		    ofs << "testing";
+		    x = 1;    
+		    ofs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		ifstream myfile( "c:\\test_cpp.txt", ios::in );
+
+		int i;
+		i = myfile.rdbuf( )->in_avail( );
+		CPPUNIT_ASSERT( i == 7 );
+		myfile.readsome(&c[0],5);
+		c[5]='\0';
+		CPPUNIT_ASSERT( !strcmp(c,"testi") );
+		}
+		{
+		ofstream ofs;
+		char c;
+		if (!ofs.bad())
+		    {
+		    ofs.open("c:\\test_cpp.txt",ios::out);
+		    ofs << "9876543210";
+		    ofs.close();
+		    }
+		int pos1;
+		ifstream file;
+
+		file.open( "c:\\test_cpp.txt" );
+		if (!file.good())
+			CPPUNIT_ASSERT( 0 );
+		file.seekg( 0 );   // Goes to a zero-based position in the file
+		pos1 = file.tellg( );
+		CPPUNIT_ASSERT( pos1 == 0 );
+		file.get( c);
+		CPPUNIT_ASSERT( c == '9' );
+		CPPUNIT_ASSERT( (int)file.tellg( ) == 1 );
+		pos1 += 1;
+ 	    file.get( c );
+ 	    CPPUNIT_ASSERT( c == '8' );
+		CPPUNIT_ASSERT( (int)file.tellg( ) == 2 );
+ 	    pos1 -= 1;
+ 	    file.seekg( pos1 );
+ 	    file.get( c );
+ 	    CPPUNIT_ASSERT( c == '9' );
+		CPPUNIT_ASSERT( (int)file.tellg( ) == 1 );
+ 	    file.seekg( pos1+2 );
+	    file.get( c );
+	    CPPUNIT_ASSERT( c == '7' );
+		CPPUNIT_ASSERT( (int)file.tellg( ) == 3 );
+		}
+		__UHEAP_MARKEND;
+	}
+void FstreamTest::fstream_cov5()
+	{
+	__UHEAP_MARK;
+		{
+		ofstream ofs;
+		int x = 0;
+		char c;
+		if (!ofs.bad())
+		    {
+		    ofs.open("c:\\test_cpp.txt",ios::out);
+		    ofs << "0123456789";
+		    x = 1;    
+		    ofs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		ifstream file;
+		file.open( "c:\\test_cpp.txt" );
+		file.seekg(2);
+		file >> c;
+	    CPPUNIT_ASSERT( c == '2' );
+	    file.seekg( 0,ios_base::beg);
+	    file >> c;
+		CPPUNIT_ASSERT( c == '0' );
+		file.seekg( -1, ios_base::end );
+	    file >> c;
+        CPPUNIT_ASSERT( c == '9' );
+		}
+		{
+		ofstream ofs;
+		int x = 0;
+
+		if (!ofs.bad())
+		    {
+		    ofs.open("c:\\test_cpp.txt",ios::out);
+		    ofs << "example";
+		    x = 1;    
+		    ofs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		
+		ifstream ifs;
+		x = 0;
+		if (!ifs.bad())
+		    {
+		    ifs.open("c:\\test_cpp.txt");
+		    ostringstream os;
+		    ifs.get( *os.rdbuf());
+		    x = 1;    
+		    ifs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		}
+		{
+		ofstream ofs;
+		int x = 0;
+
+		if (!ofs.bad())
+		    {
+		    ofs.open("c:\\test_cpp.txt",ios::out);
+		    ofs << "testing";
+		    x = 1;    
+		    ofs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		
+		ifstream myfile("c:\\test_cpp.txt", ios::in);
+	    char a[15];
+
+	    streamsize i = myfile.rdbuf()->sgetn(a, 3);  
+	    CPPUNIT_ASSERT( i == 3 );
+	    a[i] = myfile.widen('\0');
+	    CPPUNIT_ASSERT( !strcmp(a,"tes") );
+		}
+		{
+		ofstream ofs;
+		int x = 0;
+		char buf[20];
+		if (!ofs.bad())
+		    {
+		    ofs.open("c:\\test_cpp.txt",ios::out);
+		    ofs << "stdndardcpp";
+		    x = 1;
+		    ofs.seekp(2);
+		    ofs << "a";
+		    ofs.seekp(0,ios::end);
+		    ofs << "onpips";
+		    ofs.close();
+		    }
+		CPPUNIT_ASSERT( x == 1 );
+		ifstream ifs;
+		if (!ifs.bad())
+		    {
+		    ifs.open("c:\\test_cpp.txt",ios::in);
+		    ifs >> buf; 
+		    ifs.close();
+		    }
+		
+		CPPUNIT_ASSERT( !strcmp(buf,"standardcpponpips"));
+		}
+		__UHEAP_MARKEND;
+	}