1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
///////////////////////////////////////////////////////////////////////////////
// Name: tests/streams/memstream.cpp
// Purpose: Test wxMemoryInputStream/wxMemoryOutputStream
// Author: Hans Van Leemputten
// Copyright: (c) 2004 Hans Van Leemputten
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
// and "wx/cppunit.h"
#include "testprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
// for all others, include the necessary headers
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/mstream.h"
#include "bstream.h"
#define DATABUFFER_SIZE 256
///////////////////////////////////////////////////////////////////////////////
// The test case
//
// Try to fully test wxMemoryInputStream and wxMemoryOutputStream
class memStream : public BaseStreamTestCase<wxMemoryInputStream, wxMemoryOutputStream>
{
public:
memStream();
virtual ~memStream();
CPPUNIT_TEST_SUITE(memStream);
// Base class stream tests the memStream supports.
CPPUNIT_TEST(Input_GetSize);
CPPUNIT_TEST(Input_GetC);
CPPUNIT_TEST(Input_Read);
CPPUNIT_TEST(Input_Eof);
CPPUNIT_TEST(Input_LastRead);
CPPUNIT_TEST(Input_CanRead);
CPPUNIT_TEST(Input_SeekI);
CPPUNIT_TEST(Input_TellI);
CPPUNIT_TEST(Input_Peek);
CPPUNIT_TEST(Input_Ungetch);
CPPUNIT_TEST(Output_PutC);
CPPUNIT_TEST(Output_Write);
CPPUNIT_TEST(Output_LastWrite);
CPPUNIT_TEST(Output_SeekO);
CPPUNIT_TEST(Output_TellO);
// Other test specific for Memory stream test case.
CPPUNIT_TEST(Ctor_InFromIn);
CPPUNIT_TEST(Ctor_InFromOut);
CPPUNIT_TEST_SUITE_END();
protected:
// Add own test here.
void Ctor_InFromIn();
void Ctor_InFromOut();
private:
const char *GetDataBuffer();
private:
// Implement base class functions.
virtual wxMemoryInputStream *DoCreateInStream();
virtual wxMemoryOutputStream *DoCreateOutStream();
private:
char m_DataBuffer[DATABUFFER_SIZE];
};
memStream::memStream()
{
// Init the data buffer.
for (size_t i = 0; i < DATABUFFER_SIZE; i++)
m_DataBuffer[i] = (i % 0xFF);
}
memStream::~memStream()
{
/* Nothing extra for now. */
}
const char *memStream::GetDataBuffer()
{
return m_DataBuffer;
}
wxMemoryInputStream *memStream::DoCreateInStream()
{
wxMemoryInputStream *pMemInStream = new wxMemoryInputStream(GetDataBuffer(), DATABUFFER_SIZE);
CPPUNIT_ASSERT(pMemInStream->IsOk());
return pMemInStream;
}
wxMemoryOutputStream *memStream::DoCreateOutStream()
{
wxMemoryOutputStream *pMemOutStream = new wxMemoryOutputStream();
CPPUNIT_ASSERT(pMemOutStream->IsOk());
return pMemOutStream;
}
void memStream::Ctor_InFromIn()
{
wxMemoryInputStream *pMemInStream1 = DoCreateInStream();
wxMemoryInputStream *pMemInStream2 = new wxMemoryInputStream(*pMemInStream1);
CPPUNIT_ASSERT(pMemInStream2->IsOk());
CPPUNIT_ASSERT_EQUAL(pMemInStream1->GetLength(), pMemInStream2->GetLength());
wxFileOffset len = pMemInStream2->GetLength();
char *dat = new char[len];
pMemInStream2->Read(dat, len);
CPPUNIT_ASSERT_EQUAL(len, (wxFileOffset)pMemInStream2->LastRead());
wxStreamBuffer *buf = pMemInStream1->GetInputStreamBuffer();
void *pIn = buf->GetBufferStart();
CPPUNIT_ASSERT(memcmp(pIn, dat, len) == 0);
delete pMemInStream2;
wxFileOffset len2 = len / 2;
CPPUNIT_ASSERT(len2);
CPPUNIT_ASSERT(pMemInStream1->SeekI(-len2, wxFromCurrent) != wxInvalidOffset);
pIn = buf->GetBufferPos();
pMemInStream2 = new wxMemoryInputStream(*pMemInStream1, len2);
CPPUNIT_ASSERT(pMemInStream2->IsOk());
CPPUNIT_ASSERT_EQUAL((wxFileOffset)len2, pMemInStream2->GetLength());
pMemInStream2->Read(dat, len2);
CPPUNIT_ASSERT_EQUAL(len2, (wxFileOffset)pMemInStream2->LastRead());
CPPUNIT_ASSERT(memcmp(pIn, dat, len2) == 0);
delete[] dat;
delete pMemInStream2;
delete pMemInStream1;
}
void memStream::Ctor_InFromOut()
{
wxMemoryOutputStream *pMemOutStream = DoCreateOutStream();
pMemOutStream->Write(GetDataBuffer(), DATABUFFER_SIZE);
wxMemoryInputStream *pMemInStream = new wxMemoryInputStream(*pMemOutStream);
CPPUNIT_ASSERT(pMemInStream->IsOk());
CPPUNIT_ASSERT_EQUAL(pMemInStream->GetLength(), pMemOutStream->GetLength());
size_t len = pMemInStream->GetLength();
wxStreamBuffer *in = pMemInStream->GetInputStreamBuffer();
wxStreamBuffer *out = pMemOutStream->GetOutputStreamBuffer();
void *pIn = in->GetBufferStart();
void *pOut = out->GetBufferStart();
CPPUNIT_ASSERT(pIn != pOut);
CPPUNIT_ASSERT(memcmp(pIn, pOut, len) == 0);
delete pMemInStream;
delete pMemOutStream;
}
// Register the stream sub suite, by using some stream helper macro.
// Note: Don't forget to connect it to the base suite (See: bstream.cpp => StreamCase::suite())
STREAM_TEST_SUBSUITE_NAMED_REGISTRATION(memStream)
|