| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: tests/streams/backfile.cpp
- // Purpose: Test wxBackingFile
- // Author: Mike Wetherell
- // Copyright: (c) 2006 Mike Wetherell
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #include "testprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- // 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 { 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)
|