194 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        tests/streams/backfile.cpp
 | |
| // Purpose:     Test wxBackingFile
 | |
| // Author:      Mike Wetherell
 | |
| // Copyright:   (c) 2006 Mike Wetherell
 | |
| // Licence:     wxWindows licence
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #include "testprec.h"
 | |
| 
 | |
| 
 | |
| // for all others, include the necessary headers
 | |
| #ifndef WX_PRECOMP
 | |
|     #include "wx/wx.h"
 | |
| #endif
 | |
| 
 | |
| #include "wx/mstream.h"
 | |
| #include "wx/private/fileback.h"
 | |
| #include "bstream.h"
 | |
| 
 | |
| const size_t TESTSIZE = 256;
 | |
| const size_t BUFSIZE = 100;
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| // Parent stream for testing
 | |
| 
 | |
| class TestStream : public wxMemoryInputStream
 | |
| {
 | |
| public:
 | |
|     TestStream(const void *buf, size_t size)
 | |
|         : wxMemoryInputStream(buf, size) { }
 | |
| 
 | |
|     wxFileOffset GetLength() const wxOVERRIDE { return wxInvalidOffset; }
 | |
| };
 | |
| 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| // The test case
 | |
| 
 | |
| class backStream : public CppUnit::TestCase
 | |
| {
 | |
| public:
 | |
|     backStream();
 | |
| 
 | |
|     CPPUNIT_TEST_SUITE(backStream);
 | |
|         CPPUNIT_TEST(ReadLenSeek);
 | |
|         CPPUNIT_TEST(LenSeekRead);
 | |
|         CPPUNIT_TEST(SeekReadLen);
 | |
|         CPPUNIT_TEST(ReadAll);
 | |
|         CPPUNIT_TEST(ReadTooMuch);
 | |
|         CPPUNIT_TEST(EmptyStream);
 | |
|     CPPUNIT_TEST_SUITE_END();
 | |
| 
 | |
|     void ReadLenSeek();
 | |
|     void LenSeekRead();
 | |
|     void SeekReadLen();
 | |
|     void ReadAll();
 | |
|     void ReadTooMuch();
 | |
|     void EmptyStream();
 | |
| 
 | |
| private:
 | |
|     void Read(wxInputStream& in, size_t size1, size_t size2, size_t size3);
 | |
|     void Len(wxBackedInputStream& in);
 | |
|     void Seek(wxInputStream& in);
 | |
| 
 | |
|     char m_testdata[TESTSIZE];
 | |
| };
 | |
| 
 | |
| backStream::backStream()
 | |
| {
 | |
|     for (unsigned i = 0; i < TESTSIZE; i++)
 | |
|         m_testdata[i] = i;
 | |
| }
 | |
| 
 | |
| void backStream::ReadLenSeek()
 | |
| {
 | |
|     wxBackingFile bf(new TestStream(m_testdata, TESTSIZE), BUFSIZE);
 | |
|     wxBackedInputStream in(bf);
 | |
| 
 | |
|     Read(in, BUFSIZE, BUFSIZE / 2, 2 * BUFSIZE / 3);
 | |
|     Len(in);
 | |
|     Seek(in);
 | |
| }
 | |
| 
 | |
| void backStream::LenSeekRead()
 | |
| {
 | |
|     wxBackingFile bf(new TestStream(m_testdata, TESTSIZE), BUFSIZE);
 | |
|     wxBackedInputStream in(bf);
 | |
| 
 | |
|     Len(in);
 | |
|     Seek(in);
 | |
|     Read(in, BUFSIZE, BUFSIZE / 2, 2 * BUFSIZE / 3);
 | |
| }
 | |
| 
 | |
| void backStream::SeekReadLen()
 | |
| {
 | |
|     wxBackingFile bf(new TestStream(m_testdata, TESTSIZE), BUFSIZE);
 | |
|     wxBackedInputStream in(bf);
 | |
| 
 | |
|     Seek(in);
 | |
|     Read(in, BUFSIZE, BUFSIZE / 2, 2 * BUFSIZE / 3);
 | |
|     Len(in);
 | |
| }
 | |
| 
 | |
| void backStream::ReadAll()
 | |
| {
 | |
|     wxBackingFile bf(new TestStream(m_testdata, TESTSIZE), BUFSIZE);
 | |
|     wxBackedInputStream in(bf);
 | |
| 
 | |
|     Read(in, TESTSIZE, 0, 0);
 | |
| }
 | |
| 
 | |
| void backStream::ReadTooMuch()
 | |
| {
 | |
|     wxBackingFile bf(new TestStream(m_testdata, TESTSIZE), BUFSIZE);
 | |
|     wxBackedInputStream in(bf);
 | |
| 
 | |
|     char buf[TESTSIZE * 2];
 | |
| 
 | |
|     CPPUNIT_ASSERT_EQUAL(TESTSIZE, in.Read(buf, TESTSIZE * 2).LastRead());
 | |
|     CPPUNIT_ASSERT(in.Eof());
 | |
|     CPPUNIT_ASSERT(memcmp(buf, m_testdata, TESTSIZE) == 0);
 | |
| }
 | |
| 
 | |
| void backStream::EmptyStream()
 | |
| {
 | |
|     wxBackingFile bf(new TestStream(m_testdata, 0), BUFSIZE);
 | |
|     wxBackedInputStream in(bf);
 | |
| 
 | |
|     char buf[1];
 | |
| 
 | |
|     CPPUNIT_ASSERT_EQUAL(size_t(0), in.Read(buf, 1).LastRead());
 | |
|     CPPUNIT_ASSERT(in.Eof());
 | |
| }
 | |
| 
 | |
| void backStream::Read(wxInputStream& in,
 | |
|                       size_t size1,
 | |
|                       size_t size2,
 | |
|                       size_t size3)
 | |
| {
 | |
|     const size_t remainder = TESTSIZE - size1 - size2 - size3;
 | |
|     char buf[TESTSIZE];
 | |
|     char *testdata = m_testdata;
 | |
| 
 | |
|     in.SeekI(0);
 | |
| 
 | |
|     CPPUNIT_ASSERT_EQUAL(size1, in.Read(buf, size1).LastRead());
 | |
|     CPPUNIT_ASSERT(in.IsOk());
 | |
|     CPPUNIT_ASSERT(memcmp(buf, testdata, size1) == 0);
 | |
|     testdata += size1;
 | |
| 
 | |
|     CPPUNIT_ASSERT_EQUAL(size2, in.Read(buf, size2).LastRead());
 | |
|     CPPUNIT_ASSERT(in.IsOk());
 | |
|     CPPUNIT_ASSERT(memcmp(buf, testdata, size2) == 0);
 | |
|     testdata += size2;
 | |
| 
 | |
|     CPPUNIT_ASSERT_EQUAL(size3, in.Read(buf, size3).LastRead());
 | |
|     CPPUNIT_ASSERT(in.IsOk());
 | |
|     CPPUNIT_ASSERT(memcmp(buf, testdata, size3) == 0);
 | |
|     testdata += size3;
 | |
| 
 | |
|     CPPUNIT_ASSERT_EQUAL(remainder, in.Read(buf, TESTSIZE).LastRead());
 | |
|     CPPUNIT_ASSERT(in.Eof());
 | |
|     CPPUNIT_ASSERT(memcmp(buf, testdata, remainder) == 0);
 | |
| 
 | |
|     CPPUNIT_ASSERT_EQUAL(size_t(0), in.Read(buf, TESTSIZE).LastRead());
 | |
|     CPPUNIT_ASSERT(in.Eof());
 | |
| }
 | |
| 
 | |
| void backStream::Len(wxBackedInputStream& in)
 | |
| {
 | |
|     CPPUNIT_ASSERT_EQUAL(wxFileOffset(TESTSIZE), in.FindLength());
 | |
| }
 | |
| 
 | |
| void backStream::Seek(wxInputStream& in)
 | |
| {
 | |
|     CPPUNIT_ASSERT_EQUAL(wxFileOffset(TESTSIZE), in.SeekI(TESTSIZE));
 | |
|     in.GetC();
 | |
|     CPPUNIT_ASSERT_EQUAL(size_t(0), in.LastRead());
 | |
|     CPPUNIT_ASSERT(in.Eof());
 | |
| 
 | |
|     for (wxFileOffset i = TESTSIZE - 1; i >= 0; i--) {
 | |
|         CPPUNIT_ASSERT_EQUAL(i, in.SeekI(i));
 | |
|         CPPUNIT_ASSERT_EQUAL(i, in.TellI());
 | |
|         CPPUNIT_ASSERT_EQUAL(int(i), in.GetC());
 | |
|         CPPUNIT_ASSERT_EQUAL(size_t(1), in.LastRead());
 | |
|         CPPUNIT_ASSERT(in.IsOk());
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Register the stream sub suite, by using some stream helper macro.
 | |
| // Note: Don't forget to connect it to the base suite (See: bstream.cpp => StreamCase::suite())
 | |
| STREAM_TEST_SUBSUITE_NAMED_REGISTRATION(backStream)
 |