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