]> git.saurik.com Git - wxWidgets.git/blame - tests/streams/fileback.cpp
non-PCH build fix (according to Tinderbox).
[wxWidgets.git] / tests / streams / fileback.cpp
CommitLineData
e2255c89
MW
1///////////////////////////////////////////////////////////////////////////////
2// Name: tests/streams/backfile.cpp
3// Purpose: Test wxBackingFile
4// Author: Mike Wetherell
5// RCS-ID: $Id$
6// Copyright: (c) 2006 Mike Wetherell
7// Licence: wxWidgets licence
8///////////////////////////////////////////////////////////////////////////////
9
10#include "testprec.h"
11
12#ifdef __BORLANDC__
13 #pragma hdrstop
14#endif
15
16// for all others, include the necessary headers
17#ifndef WX_PRECOMP
18 #include "wx/wx.h"
19#endif
20
21#include "wx/mstream.h"
22#include "wx/fileback.h"
23#include "bstream.h"
24
25#if wxUSE_STREAMS
26
27const size_t TESTSIZE = 256;
28const size_t BUFSIZE = 100;
29
30
31///////////////////////////////////////////////////////////////////////////////
32// Parent stream for testing
33
34class TestStream : public wxMemoryInputStream
35{
36public:
37 TestStream(const void *buf, size_t size)
38 : wxMemoryInputStream(buf, size) { }
39
40 wxFileOffset GetLength() const { return wxInvalidOffset; }
41};
42
43
44///////////////////////////////////////////////////////////////////////////////
45// The test case
46
47class backStream : public CppUnit::TestCase
48{
49public:
50 backStream();
51
52 CPPUNIT_TEST_SUITE(backStream);
53 CPPUNIT_TEST(ReadLenSeek);
54 CPPUNIT_TEST(LenSeekRead);
55 CPPUNIT_TEST(SeekReadLen);
56 CPPUNIT_TEST(ReadAll);
57 CPPUNIT_TEST(ReadTooMuch);
58 CPPUNIT_TEST(EmptyStream);
59 CPPUNIT_TEST_SUITE_END();
60
61 void ReadLenSeek();
62 void LenSeekRead();
63 void SeekReadLen();
64 void ReadAll();
65 void ReadTooMuch();
66 void EmptyStream();
67
68private:
69 void Read(wxInputStream& in, size_t size1, size_t size2, size_t size3);
70 void Len(wxInputStream& in);
71 void Seek(wxInputStream& in);
72
73 char m_testdata[TESTSIZE];
74};
75
76backStream::backStream()
77{
78 for (unsigned i = 0; i < TESTSIZE; i++)
79 m_testdata[i] = i;
80}
81
82void backStream::ReadLenSeek()
83{
84 wxBackingFile bf(new TestStream(m_testdata, TESTSIZE), BUFSIZE);
85 wxBackedInputStream in(bf);
86
87 Read(in, BUFSIZE, BUFSIZE / 2, 2 * BUFSIZE / 3);
88 Len(in);
89 Seek(in);
90}
91
92void backStream::LenSeekRead()
93{
94 wxBackingFile bf(new wxMemoryInputStream(m_testdata, TESTSIZE), BUFSIZE);
95 wxBackedInputStream in(bf);
96
97 Len(in);
98 Seek(in);
99 Read(in, BUFSIZE, BUFSIZE / 2, 2 * BUFSIZE / 3);
100}
101
102void backStream::SeekReadLen()
103{
104 wxBackingFile bf(new TestStream(m_testdata, TESTSIZE), BUFSIZE);
105 wxBackedInputStream in(bf);
106
107 Seek(in);
108 Read(in, BUFSIZE, BUFSIZE / 2, 2 * BUFSIZE / 3);
109 Len(in);
110}
111
112void backStream::ReadAll()
113{
114 wxBackingFile bf(new TestStream(m_testdata, TESTSIZE), BUFSIZE);
115 wxBackedInputStream in(bf);
116
117 Read(in, TESTSIZE, 0, 0);
118}
119
120void backStream::ReadTooMuch()
121{
122 wxBackingFile bf(new TestStream(m_testdata, TESTSIZE), BUFSIZE);
123 wxBackedInputStream in(bf);
124
125 char buf[TESTSIZE * 2];
126
127 CPPUNIT_ASSERT_EQUAL(TESTSIZE, in.Read(buf, TESTSIZE * 2).LastRead());
128 CPPUNIT_ASSERT(in.Eof());
129 CPPUNIT_ASSERT(memcmp(buf, m_testdata, TESTSIZE) == 0);
130}
131
132void backStream::EmptyStream()
133{
134 wxBackingFile bf(new TestStream(m_testdata, 0), BUFSIZE);
135 wxBackedInputStream in(bf);
136
137 char buf[1];
138
139 CPPUNIT_ASSERT_EQUAL(size_t(0), in.Read(buf, 1).LastRead());
140 CPPUNIT_ASSERT(in.Eof());
141}
142
143void backStream::Read(wxInputStream& in,
144 size_t size1,
145 size_t size2,
146 size_t size3)
147{
148 const size_t remainder = TESTSIZE - size1 - size2 - size3;
149 char buf[TESTSIZE];
150 char *testdata = m_testdata;
151
152 in.SeekI(0);
153
154 CPPUNIT_ASSERT_EQUAL(size1, in.Read(buf, size1).LastRead());
155 CPPUNIT_ASSERT(in.IsOk());
156 CPPUNIT_ASSERT(memcmp(buf, testdata, size1) == 0);
157 testdata += size1;
158
159 CPPUNIT_ASSERT_EQUAL(size2, in.Read(buf, size2).LastRead());
160 CPPUNIT_ASSERT(in.IsOk());
161 CPPUNIT_ASSERT(memcmp(buf, testdata, size2) == 0);
162 testdata += size2;
163
164 CPPUNIT_ASSERT_EQUAL(size3, in.Read(buf, size3).LastRead());
165 CPPUNIT_ASSERT(in.IsOk());
166 CPPUNIT_ASSERT(memcmp(buf, testdata, size3) == 0);
167 testdata += size3;
168
169 CPPUNIT_ASSERT_EQUAL(remainder, in.Read(buf, TESTSIZE).LastRead());
170 CPPUNIT_ASSERT(in.Eof());
171 CPPUNIT_ASSERT(memcmp(buf, testdata, remainder) == 0);
172
173 CPPUNIT_ASSERT_EQUAL(size_t(0), in.Read(buf, TESTSIZE).LastRead());
174 CPPUNIT_ASSERT(in.Eof());
175}
176
177void backStream::Len(wxInputStream& in)
178{
179 CPPUNIT_ASSERT_EQUAL(wxFileOffset(TESTSIZE), in.GetLength());
180}
181
182void backStream::Seek(wxInputStream& in)
183{
184 CPPUNIT_ASSERT_EQUAL(wxFileOffset(TESTSIZE), in.SeekI(TESTSIZE));
185 in.GetC();
186 CPPUNIT_ASSERT_EQUAL(size_t(0), in.LastRead());
187 CPPUNIT_ASSERT(in.Eof());
188
189 for (wxFileOffset i = TESTSIZE - 1; i >= 0; i--) {
190 CPPUNIT_ASSERT_EQUAL(i, in.SeekI(i));
191 CPPUNIT_ASSERT_EQUAL(i, in.TellI());
192 CPPUNIT_ASSERT_EQUAL(char(i), in.GetC());
193 CPPUNIT_ASSERT_EQUAL(size_t(1), in.LastRead());
194 CPPUNIT_ASSERT(in.IsOk());
195 }
196}
197
198// Register the stream sub suite, by using some stream helper macro.
199// Note: Don't forget to connect it to the base suite (See: bstream.cpp => StreamCase::suite())
200STREAM_TEST_SUBSUITE_NAMED_REGISTRATION(backStream)
201
202#endif // wxUSE_STREAMS