X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/82b99cf952504cd5c6e6c1f6f93756c609f2905c..e2255c89f9a7662514e265d80cc6547d9d1b4b38:/tests/streams/fileback.cpp diff --git a/tests/streams/fileback.cpp b/tests/streams/fileback.cpp new file mode 100644 index 0000000000..0fbce3ec1e --- /dev/null +++ b/tests/streams/fileback.cpp @@ -0,0 +1,202 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: tests/streams/backfile.cpp +// Purpose: Test wxBackingFile +// Author: Mike Wetherell +// RCS-ID: $Id$ +// Copyright: (c) 2006 Mike Wetherell +// Licence: wxWidgets 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/fileback.h" +#include "bstream.h" + +#if wxUSE_STREAMS + +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(wxInputStream& 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 wxMemoryInputStream(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(wxInputStream& in) +{ + CPPUNIT_ASSERT_EQUAL(wxFileOffset(TESTSIZE), in.GetLength()); +} + +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(char(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) + +#endif // wxUSE_STREAMS