1///////////////////////////////////////////////////////////////////////////////
2// Name:        tests/streams/ffilestream.cpp
3// Purpose:     Test wxFFileInputStream/wxFFileOutputStream
4// Author:      Hans Van Leemputten
5// RCS-ID:      $Id: ffilestream.cpp 30685 2004-11-22 05:00:19Z RN $
6// Copyright:   (c) 2004 Hans Van Leemputten
7// Licence:     wxWidgets licence
8///////////////////////////////////////////////////////////////////////////////
9
10// For compilers that support precompilation, includes "wx/wx.h".
11// and "wx/cppunit.h"
12#include "testprec.h"
13
14#ifdef __BORLANDC__
15    #pragma hdrstop
16#endif
17
18// for all others, include the necessary headers
19#ifndef WX_PRECOMP
20    #include "wx/wx.h"
21#endif
22
23#include "wx/wfstream.h"
24
25#include "bstream.h"
26
27#define DATABUFFER_SIZE     1024
28
29static const wxString FILENAME_FFILEINSTREAM = _T("ffileinstream.test");
30static const wxString FILENAME_FFILEOUTSTREAM = _T("ffileoutstream.test");
31
32///////////////////////////////////////////////////////////////////////////////
33// The test case
34//
35// Try to fully test wxFFileInputStream and wxFFileOutputStream
36
37class ffileStream : public BaseStreamTestCase<wxFFileInputStream, wxFFileOutputStream>
38{
39public:
40    ffileStream();
41    virtual ~ffileStream();
42
43    CPPUNIT_TEST_SUITE(ffileStream);
44        // Base class stream tests the ffileStream supports.
45        CPPUNIT_TEST(Input_GetSize);
46        CPPUNIT_TEST(Input_GetC);
47        CPPUNIT_TEST(Input_Read);
48        CPPUNIT_TEST(Input_Eof);
49        CPPUNIT_TEST(Input_LastRead);
50        CPPUNIT_TEST(Input_SeekI);
51        CPPUNIT_TEST(Input_TellI);
52        CPPUNIT_TEST(Input_Peek);
53        CPPUNIT_TEST(Input_Ungetch);
54
55        CPPUNIT_TEST(Output_PutC);
56        CPPUNIT_TEST(Output_Write);
57        CPPUNIT_TEST(Output_LastWrite);
58        CPPUNIT_TEST(Output_SeekO);
59        CPPUNIT_TEST(Output_TellO);
60
61        // Other test specific for File stream test case.
62    CPPUNIT_TEST_SUITE_END();
63
64protected:
65    // Add own test here.
66
67private:
68    // Implement base class functions.
69    virtual wxFFileInputStream  *DoCreateInStream();
70    virtual wxFFileOutputStream *DoCreateOutStream();
71    virtual void DoDeleteOutStream();
72
73private:
74    wxString GetInFileName() const;
75};
76
77ffileStream::ffileStream()
78{
79    m_bSeekInvalidBeyondEnd = false;
80    m_bEofAtLastRead = false;
81}
82
83ffileStream::~ffileStream()
84{
85    // Remove the temp test file...
86    ::wxRemoveFile(FILENAME_FFILEINSTREAM);
87    ::wxRemoveFile(FILENAME_FFILEOUTSTREAM);
88}
89
90wxFFileInputStream *ffileStream::DoCreateInStream()
91{
92    wxFFileInputStream *pFileInStream = new wxFFileInputStream(GetInFileName());
93    CPPUNIT_ASSERT(pFileInStream->IsOk());
94    return pFileInStream;
95}
96wxFFileOutputStream *ffileStream::DoCreateOutStream()
97{
98    wxFFileOutputStream *pFileOutStream = new wxFFileOutputStream(FILENAME_FFILEOUTSTREAM);
99    CPPUNIT_ASSERT(pFileOutStream->IsOk());
100    return pFileOutStream;
101}
102
103void ffileStream::DoDeleteOutStream()
104{
105    ::wxRemoveFile(FILENAME_FFILEOUTSTREAM);
106}
107
108wxString ffileStream::GetInFileName() const
109{
110    static bool bFileCreated = false;
111    if (!bFileCreated)
112    {
113        // Create the file only once
114        bFileCreated = true;
115
116        // Make sure we have a input file...
117        char buf[DATABUFFER_SIZE];
118        wxFFileOutputStream out(FILENAME_FFILEINSTREAM);
119
120        // Init the data buffer.
121        for (size_t i = 0; i < DATABUFFER_SIZE; i++)
122            buf[i] = (i % 0xFF);
123
124        // Save the data
125        out.Write(buf, DATABUFFER_SIZE);
126    }
127
128    return FILENAME_FFILEINSTREAM;
129}
130
131// Register the stream sub suite, by using some stream helper macro.
132// Note: Don't forget to connect it to the base suite (See: bstream.cpp => StreamCase::suite())
133STREAM_TEST_SUBSUITE_NAMED_REGISTRATION(ffileStream)
134