1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: tests/streams/stdstream.cpp
3 // Purpose: Test wxStdInputStreamBuffer/wxStdOutputStreamBuffer
4 // Author: Jonathan Liu <net147@gmail.com>
6 // Copyright: (c) 2009 Jonathan Liu
7 // Licence: wxWidgets licence
8 ///////////////////////////////////////////////////////////////////////////////
10 // For compilers that support precompilation, includes "wx/wx.h".
18 // for all others, include the necessary headers
23 #if wxUSE_STD_IOSTREAM
25 #include "wx/stdstream.h"
28 #include "wx/mstream.h"
30 // when std::streamoff is simply long we don't need this as we already allow
31 // comparisons between int and long but we do need it otherwise -- and we don't
32 // have any way to detect it so for now just assume that all 64 bit builds use
33 // long as streamoff and if this is wrong we'll add a check to configure later
34 #if SIZEOF_SIZE_T != 8
35 WX_CPPUNIT_ALLOW_EQUALS_TO_INT(std::streamoff
)
38 // ==========================================================================
40 // ==========================================================================
42 const int TEST_SIZE
= 384;
44 // ==========================================================================
46 // ==========================================================================
48 class StdStreamTestCase
: public CppUnit::TestCase
54 CPPUNIT_TEST_SUITE( StdStreamTestCase
);
55 // Input buffer management and positioning
56 CPPUNIT_TEST( InputBuffer_pubsetbuf
);
57 CPPUNIT_TEST( InputBuffer_pubseekoff
);
58 CPPUNIT_TEST( InputBuffer_pubseekpos
);
59 CPPUNIT_TEST( InputBuffer_pubsync
);
62 CPPUNIT_TEST( InputBuffer_in_avail
);
63 CPPUNIT_TEST( InputBuffer_snextc
);
64 CPPUNIT_TEST( InputBuffer_sbumpc
);
65 CPPUNIT_TEST( InputBuffer_sgetc
);
66 CPPUNIT_TEST( InputBuffer_sgetn
);
67 CPPUNIT_TEST( InputBuffer_sputbackc
);
68 CPPUNIT_TEST( InputBuffer_sungetc
);
70 // Output buffer management and positioning
71 CPPUNIT_TEST( OutputBuffer_pubsetbuf
);
72 CPPUNIT_TEST( OutputBuffer_pubseekoff
);
73 CPPUNIT_TEST( OutputBuffer_pubseekpos
);
74 CPPUNIT_TEST( OutputBuffer_pubsync
);
77 CPPUNIT_TEST( OutputBuffer_sputc
);
78 CPPUNIT_TEST( OutputBuffer_sputn
);
79 CPPUNIT_TEST_SUITE_END();
81 // Input buffer management and positioning
82 void InputBuffer_pubsetbuf();
83 void InputBuffer_pubseekoff();
84 void InputBuffer_pubseekpos();
85 void InputBuffer_pubsync();
88 void InputBuffer_in_avail();
89 void InputBuffer_snextc();
90 void InputBuffer_sbumpc();
91 void InputBuffer_sgetc();
92 void InputBuffer_sgetn();
93 void InputBuffer_sputbackc();
94 void InputBuffer_sungetc();
96 // Output buffer management and positioning
97 void OutputBuffer_pubsetbuf();
98 void OutputBuffer_pubseekoff();
99 void OutputBuffer_pubseekpos();
100 void OutputBuffer_pubsync();
103 void OutputBuffer_sputc();
104 void OutputBuffer_sputn();
106 char m_testData
[TEST_SIZE
];
108 DECLARE_NO_COPY_CLASS(StdStreamTestCase
)
111 // register in the unnamed registry so that these tests are run by default
112 CPPUNIT_TEST_SUITE_REGISTRATION( StdStreamTestCase
);
114 // also include in it's own registry so that these tests can be run alone
115 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( StdStreamTestCase
,
116 "StdStreamTestCase" );
118 // ==========================================================================
120 // ==========================================================================
122 StdStreamTestCase::StdStreamTestCase()
124 for (int i
= 0; i
< TEST_SIZE
; ++i
)
125 m_testData
[i
] = (i
& 0xFF);
128 // --------------------------------------------------------------------------
129 // Input buffer management and positioning
130 // --------------------------------------------------------------------------
132 void StdStreamTestCase::InputBuffer_pubsetbuf()
134 wxMemoryInputStream
stream(m_testData
, TEST_SIZE
);
135 wxStdInputStreamBuffer
buffer(stream
);
136 char testBuffer
[TEST_SIZE
];
138 CPPUNIT_ASSERT(buffer
.pubsetbuf(testBuffer
, TEST_SIZE
) == NULL
);
141 void StdStreamTestCase::InputBuffer_pubseekoff()
143 const char *testData
= "0123456789";
144 wxMemoryInputStream
stream(testData
, 10);
145 wxStdInputStreamBuffer
buffer(stream
);
147 CPPUNIT_ASSERT_EQUAL(2,
148 buffer
.pubseekoff(2, std::ios_base::beg
,
150 CPPUNIT_ASSERT_EQUAL(-1,
151 buffer
.pubseekoff(2, std::ios_base::beg
,
152 std::ios_base::out
));
154 CPPUNIT_ASSERT_EQUAL(4,
155 buffer
.pubseekoff(2, std::ios_base::cur
));
156 CPPUNIT_ASSERT_EQUAL(-1,
157 buffer
.pubseekoff(2, std::ios_base::cur
,
158 std::ios_base::out
));
160 CPPUNIT_ASSERT_EQUAL(8,
161 buffer
.pubseekoff(-2, std::ios_base::end
));
162 CPPUNIT_ASSERT_EQUAL(-1,
163 buffer
.pubseekoff(-2, std::ios_base::end
,
164 std::ios_base::out
));
166 CPPUNIT_ASSERT_EQUAL(-1,
167 buffer
.pubseekoff(3, std::ios_base::cur
));
168 CPPUNIT_ASSERT_EQUAL(-1,
169 buffer
.pubseekoff(3, std::ios_base::cur
,
170 std::ios_base::out
));
173 void StdStreamTestCase::InputBuffer_pubseekpos()
175 const char *testData
= "0123456789";
176 wxMemoryInputStream
stream(testData
, 10);
177 wxStdInputStreamBuffer
buffer(stream
);
179 for (int i
= 9; i
>= 0; --i
)
182 CPPUNIT_ASSERT_EQUAL(i
, buffer
.pubseekpos(i
));
184 CPPUNIT_ASSERT_EQUAL(i
, buffer
.pubseekpos(i
, std::ios_base::in
));
186 CPPUNIT_ASSERT_EQUAL('0' + i
, buffer
.sgetc());
190 void StdStreamTestCase::InputBuffer_pubsync()
192 wxMemoryInputStream
stream(m_testData
, TEST_SIZE
);
193 wxStdInputStreamBuffer
buffer(stream
);
195 CPPUNIT_ASSERT(buffer
.pubsync() == 0);
198 // --------------------------------------------------------------------------
200 // --------------------------------------------------------------------------
202 void StdStreamTestCase::InputBuffer_in_avail()
204 wxMemoryInputStream
stream(m_testData
, TEST_SIZE
);
205 wxStdInputStreamBuffer
buffer(stream
);
207 CPPUNIT_ASSERT(buffer
.sgetc() != EOF
);
208 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
, buffer
.in_avail());
210 char data
[TEST_SIZE
/ 2];
212 buffer
.sgetn(data
, TEST_SIZE
/ 2);
213 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
- TEST_SIZE
/ 2, buffer
.in_avail());
216 void StdStreamTestCase::InputBuffer_snextc()
218 wxMemoryInputStream
stream(m_testData
, TEST_SIZE
);
219 wxStdInputStreamBuffer
buffer(stream
);
221 CPPUNIT_ASSERT(buffer
.sgetc() != EOF
);
222 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
, buffer
.in_avail());
224 char data
[TEST_SIZE
];
226 data
[0] = buffer
.sgetc();
228 for (int i
= 1; i
< TEST_SIZE
; ++i
)
229 data
[i
] = buffer
.snextc();
231 CPPUNIT_ASSERT(memcmp(data
, m_testData
, TEST_SIZE
) == 0);
232 CPPUNIT_ASSERT_EQUAL((int)(unsigned char) (m_testData
[TEST_SIZE
- 1]),
234 CPPUNIT_ASSERT(buffer
.sgetc() == EOF
);
237 void StdStreamTestCase::InputBuffer_sbumpc()
239 wxMemoryInputStream
stream(m_testData
, TEST_SIZE
);
240 wxStdInputStreamBuffer
buffer(stream
);
242 CPPUNIT_ASSERT(buffer
.sgetc() != EOF
);
243 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
, buffer
.in_avail());
245 char data
[TEST_SIZE
];
247 for (int i
= 0; i
< TEST_SIZE
; ++i
)
248 data
[i
] = buffer
.sbumpc();
250 CPPUNIT_ASSERT(memcmp(data
, m_testData
, TEST_SIZE
) == 0);
251 CPPUNIT_ASSERT(buffer
.sgetc() == EOF
);
254 void StdStreamTestCase::InputBuffer_sgetc()
256 wxMemoryInputStream
stream(m_testData
, TEST_SIZE
);
257 wxStdInputStreamBuffer
buffer(stream
);
259 CPPUNIT_ASSERT(buffer
.sgetc() != EOF
);
260 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
, buffer
.in_avail());
262 char data
[TEST_SIZE
];
264 for (int i
= 0; i
< TEST_SIZE
; ++i
) {
265 data
[i
] = buffer
.sgetc();
269 CPPUNIT_ASSERT(memcmp(data
, m_testData
, TEST_SIZE
) == 0);
270 CPPUNIT_ASSERT(buffer
.sgetc() == EOF
);
273 void StdStreamTestCase::InputBuffer_sgetn()
275 wxMemoryInputStream
stream(m_testData
, TEST_SIZE
);
276 wxStdInputStreamBuffer
buffer(stream
);
278 CPPUNIT_ASSERT(buffer
.sgetc() != EOF
);
279 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
, buffer
.in_avail());
281 char data
[TEST_SIZE
* 2];
282 std::streamsize read
= buffer
.sgetn(data
, TEST_SIZE
* 2);
284 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
, read
);
285 CPPUNIT_ASSERT(memcmp(data
, m_testData
, TEST_SIZE
) == 0);
286 CPPUNIT_ASSERT(buffer
.sgetc() == EOF
);
289 void StdStreamTestCase::InputBuffer_sputbackc()
291 wxMemoryInputStream
stream(m_testData
, TEST_SIZE
);
292 wxStdInputStreamBuffer
buffer(stream
);
294 CPPUNIT_ASSERT(buffer
.sgetc() != EOF
);
295 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
, buffer
.in_avail());
297 char data
[TEST_SIZE
];
298 std::streamsize read
= buffer
.sgetn(data
, TEST_SIZE
);
300 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
, read
);
301 CPPUNIT_ASSERT(memcmp(data
, m_testData
, TEST_SIZE
) == 0);
302 CPPUNIT_ASSERT(buffer
.sgetc() == EOF
);
304 char putBackChar
= m_testData
[TEST_SIZE
- 1] + 147;
306 CPPUNIT_ASSERT_EQUAL((int) putBackChar
, buffer
.sputbackc(putBackChar
));
307 CPPUNIT_ASSERT_EQUAL((int) putBackChar
, buffer
.sgetc());
308 CPPUNIT_ASSERT_EQUAL((int) putBackChar
, buffer
.sbumpc());
309 CPPUNIT_ASSERT(buffer
.sgetc() == EOF
);
312 void StdStreamTestCase::InputBuffer_sungetc()
314 wxMemoryInputStream
stream(m_testData
, TEST_SIZE
);
315 wxStdInputStreamBuffer
buffer(stream
);
317 CPPUNIT_ASSERT(buffer
.sgetc() != EOF
);
318 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
, buffer
.in_avail());
320 char data
[TEST_SIZE
];
321 std::streamsize read
= buffer
.sgetn(data
, TEST_SIZE
);
323 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
, read
);
324 CPPUNIT_ASSERT(memcmp(data
, m_testData
, TEST_SIZE
) == 0);
325 CPPUNIT_ASSERT(buffer
.sgetc() == EOF
);
327 CPPUNIT_ASSERT_EQUAL((int) m_testData
[TEST_SIZE
- 1], buffer
.sungetc());
328 CPPUNIT_ASSERT_EQUAL((int) m_testData
[TEST_SIZE
- 1], buffer
.sgetc());
329 CPPUNIT_ASSERT_EQUAL((int) m_testData
[TEST_SIZE
- 1], buffer
.sbumpc());
330 CPPUNIT_ASSERT(buffer
.sgetc() == EOF
);
333 // --------------------------------------------------------------------------
334 // Output buffer management and positioning
335 // --------------------------------------------------------------------------
337 void StdStreamTestCase::OutputBuffer_pubsetbuf()
339 wxMemoryOutputStream stream
;
340 wxStdOutputStreamBuffer
buffer(stream
);
341 char testBuffer
[TEST_SIZE
];
343 CPPUNIT_ASSERT(buffer
.pubsetbuf(testBuffer
, TEST_SIZE
) == NULL
);
346 void StdStreamTestCase::OutputBuffer_pubseekoff()
348 char testData
[] = "0123456789";
349 wxMemoryOutputStream
stream(testData
, 10);
350 wxStdOutputStreamBuffer
buffer(stream
);
352 CPPUNIT_ASSERT_EQUAL(2,
353 buffer
.pubseekoff(2, std::ios_base::beg
,
354 std::ios_base::out
));
355 CPPUNIT_ASSERT_EQUAL(-1,
356 buffer
.pubseekoff(2, std::ios_base::beg
,
359 CPPUNIT_ASSERT_EQUAL(4,
360 buffer
.pubseekoff(2, std::ios_base::cur
));
361 CPPUNIT_ASSERT_EQUAL(-1,
362 buffer
.pubseekoff(2, std::ios_base::cur
,
365 CPPUNIT_ASSERT_EQUAL(8,
366 buffer
.pubseekoff(-2, std::ios_base::end
));
367 CPPUNIT_ASSERT_EQUAL(-1,
368 buffer
.pubseekoff(-2, std::ios_base::end
,
371 CPPUNIT_ASSERT_EQUAL(-1,
372 buffer
.pubseekoff(3, std::ios_base::cur
));
373 CPPUNIT_ASSERT_EQUAL(-1,
374 buffer
.pubseekoff(3, std::ios_base::cur
,
378 void StdStreamTestCase::OutputBuffer_pubseekpos()
380 char testData
[] = "0123456789";
381 wxMemoryOutputStream
stream(testData
, 10);
382 wxStdOutputStreamBuffer
buffer(stream
);
384 for (int i
= 9; i
>= 0; --i
)
388 CPPUNIT_ASSERT_EQUAL(i
, buffer
.pubseekpos(i
));
392 CPPUNIT_ASSERT_EQUAL(i
,
393 buffer
.pubseekpos(i
, std::ios_base::out
));
396 CPPUNIT_ASSERT_EQUAL('0' + (9 - i
), buffer
.sputc('0' + (9 - i
)));
399 CPPUNIT_ASSERT(memcmp(testData
, "9876543210", 10) == 0);
401 CPPUNIT_ASSERT_EQUAL(-1, buffer
.pubseekpos(5, std::ios_base::in
));
404 void StdStreamTestCase::OutputBuffer_pubsync()
406 wxMemoryOutputStream stream
;
407 wxStdOutputStreamBuffer
buffer(stream
);
409 CPPUNIT_ASSERT(buffer
.pubsync() == 0);
412 // --------------------------------------------------------------------------
414 // --------------------------------------------------------------------------
416 void StdStreamTestCase::OutputBuffer_sputc()
418 wxMemoryOutputStream stream
;
419 wxStdOutputStreamBuffer
buffer(stream
);
421 for (int i
= 0; i
< TEST_SIZE
; ++i
)
422 buffer
.sputc(m_testData
[i
]);
424 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
, stream
.GetSize());
426 char result
[TEST_SIZE
];
428 stream
.CopyTo(result
, TEST_SIZE
);
429 CPPUNIT_ASSERT(memcmp(result
, m_testData
, TEST_SIZE
) == 0);
432 void StdStreamTestCase::OutputBuffer_sputn()
434 wxMemoryOutputStream stream
;
435 wxStdOutputStreamBuffer
buffer(stream
);
437 buffer
.sputn(m_testData
, TEST_SIZE
);
438 CPPUNIT_ASSERT_EQUAL(TEST_SIZE
, stream
.GetSize());
440 char result
[TEST_SIZE
];
442 stream
.CopyTo(result
, TEST_SIZE
);
443 CPPUNIT_ASSERT(memcmp(result
, m_testData
, TEST_SIZE
) == 0);
446 #endif // wxUSE_STD_IOSTREAM