1///////////////////////////////////////////////////////////////////////////////
2// Name:        tests/streams/memstream.cpp
3// Purpose:     Test wxMemoryInputStream/wxMemoryOutputStream
4// Author:      Hans Van Leemputten
5// RCS-ID:      $Id: memstream.cpp 33293 2005-04-02 22:37:58Z VZ $
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/mstream.h"
24
25#include "bstream.h"
26
27#define DATABUFFER_SIZE     256
28
29///////////////////////////////////////////////////////////////////////////////
30// The test case
31//
32// Try to fully test wxMemoryInputStream and wxMemoryOutputStream
33
34class memStream : public BaseStreamTestCase<wxMemoryInputStream, wxMemoryOutputStream>
35{
36public:
37    memStream();
38    virtual ~memStream();
39
40    CPPUNIT_TEST_SUITE(memStream);
41        // Base class stream tests the memStream supports.
42        CPPUNIT_TEST(Input_GetSize);
43        CPPUNIT_TEST(Input_GetC);
44        CPPUNIT_TEST(Input_Read);
45        CPPUNIT_TEST(Input_Eof);
46        CPPUNIT_TEST(Input_LastRead);
47        CPPUNIT_TEST(Input_SeekI);
48        CPPUNIT_TEST(Input_TellI);
49        CPPUNIT_TEST(Input_Peek);
50        CPPUNIT_TEST(Input_Ungetch);
51
52        CPPUNIT_TEST(Output_PutC);
53        CPPUNIT_TEST(Output_Write);
54        CPPUNIT_TEST(Output_LastWrite);
55        CPPUNIT_TEST(Output_SeekO);
56        CPPUNIT_TEST(Output_TellO);
57
58        // Other test specific for Memory stream test case.
59        CPPUNIT_TEST(Ctor_InFromOut);
60    CPPUNIT_TEST_SUITE_END();
61
62protected:
63    // Add own test here.
64    void Ctor_InFromOut();
65
66private:
67    const char *GetDataBuffer();
68
69private:
70    // Implement base class functions.
71    virtual wxMemoryInputStream  *DoCreateInStream();
72    virtual wxMemoryOutputStream *DoCreateOutStream();
73
74private:
75    char    m_DataBuffer[DATABUFFER_SIZE];
76};
77
78memStream::memStream()
79{
80    // Init the data buffer.
81    for (size_t i = 0; i < DATABUFFER_SIZE; i++)
82        m_DataBuffer[i] = (i % 0xFF);
83}
84
85memStream::~memStream()
86{
87    /* Nothing extra for now. */
88}
89
90const char *memStream::GetDataBuffer()
91{
92    return m_DataBuffer;
93}
94
95wxMemoryInputStream *memStream::DoCreateInStream()
96{
97    wxMemoryInputStream *pMemInStream = new wxMemoryInputStream(GetDataBuffer(), DATABUFFER_SIZE);
98    CPPUNIT_ASSERT(pMemInStream->IsOk());
99    return pMemInStream;
100}
101wxMemoryOutputStream *memStream::DoCreateOutStream()
102{
103    wxMemoryOutputStream *pMemOutStream = new wxMemoryOutputStream();
104    CPPUNIT_ASSERT(pMemOutStream->IsOk());
105    return pMemOutStream;
106}
107
108void memStream::Ctor_InFromOut()
109{
110    wxMemoryOutputStream *pMemOutStream = DoCreateOutStream();
111    pMemOutStream->Write(GetDataBuffer(), DATABUFFER_SIZE);
112    wxMemoryInputStream *pMemInStream = new wxMemoryInputStream(*pMemOutStream);
113    CPPUNIT_ASSERT(pMemInStream->IsOk());
114    CPPUNIT_ASSERT(pMemInStream->GetLength() == pMemOutStream->GetLength());
115    int len = pMemInStream->GetLength();
116    wxStreamBuffer *in = pMemInStream->GetInputStreamBuffer();
117    wxStreamBuffer *out = pMemOutStream->GetOutputStreamBuffer();
118    void *pIn = in->GetBufferStart();
119    void *pOut = out->GetBufferStart();
120    CPPUNIT_ASSERT(pIn != pOut);
121    CPPUNIT_ASSERT(memcmp(pIn, pOut, len) == 0);
122}
123
124// Register the stream sub suite, by using some stream helper macro.
125// Note: Don't forget to connect it to the base suite (See: bstream.cpp => StreamCase::suite())
126STREAM_TEST_SUBSUITE_NAMED_REGISTRATION(memStream)
127