fileback.cpp 5.1 KB

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