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