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