memstream.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Name: tests/streams/memstream.cpp
  3. // Purpose: Test wxMemoryInputStream/wxMemoryOutputStream
  4. // Author: Hans Van Leemputten
  5. // Copyright: (c) 2004 Hans Van Leemputten
  6. // Licence: wxWindows licence
  7. ///////////////////////////////////////////////////////////////////////////////
  8. // For compilers that support precompilation, includes "wx/wx.h".
  9. // and "wx/cppunit.h"
  10. #include "testprec.h"
  11. #ifdef __BORLANDC__
  12. #pragma hdrstop
  13. #endif
  14. // for all others, include the necessary headers
  15. #ifndef WX_PRECOMP
  16. #include "wx/wx.h"
  17. #endif
  18. #include "wx/mstream.h"
  19. #include "bstream.h"
  20. #define DATABUFFER_SIZE 256
  21. ///////////////////////////////////////////////////////////////////////////////
  22. // The test case
  23. //
  24. // Try to fully test wxMemoryInputStream and wxMemoryOutputStream
  25. class memStream : public BaseStreamTestCase<wxMemoryInputStream, wxMemoryOutputStream>
  26. {
  27. public:
  28. memStream();
  29. virtual ~memStream();
  30. CPPUNIT_TEST_SUITE(memStream);
  31. // Base class stream tests the memStream supports.
  32. CPPUNIT_TEST(Input_GetSize);
  33. CPPUNIT_TEST(Input_GetC);
  34. CPPUNIT_TEST(Input_Read);
  35. CPPUNIT_TEST(Input_Eof);
  36. CPPUNIT_TEST(Input_LastRead);
  37. CPPUNIT_TEST(Input_CanRead);
  38. CPPUNIT_TEST(Input_SeekI);
  39. CPPUNIT_TEST(Input_TellI);
  40. CPPUNIT_TEST(Input_Peek);
  41. CPPUNIT_TEST(Input_Ungetch);
  42. CPPUNIT_TEST(Output_PutC);
  43. CPPUNIT_TEST(Output_Write);
  44. CPPUNIT_TEST(Output_LastWrite);
  45. CPPUNIT_TEST(Output_SeekO);
  46. CPPUNIT_TEST(Output_TellO);
  47. // Other test specific for Memory stream test case.
  48. CPPUNIT_TEST(Ctor_InFromIn);
  49. CPPUNIT_TEST(Ctor_InFromOut);
  50. CPPUNIT_TEST_SUITE_END();
  51. protected:
  52. // Add own test here.
  53. void Ctor_InFromIn();
  54. void Ctor_InFromOut();
  55. private:
  56. const char *GetDataBuffer();
  57. private:
  58. // Implement base class functions.
  59. virtual wxMemoryInputStream *DoCreateInStream();
  60. virtual wxMemoryOutputStream *DoCreateOutStream();
  61. private:
  62. char m_DataBuffer[DATABUFFER_SIZE];
  63. };
  64. memStream::memStream()
  65. {
  66. // Init the data buffer.
  67. for (size_t i = 0; i < DATABUFFER_SIZE; i++)
  68. m_DataBuffer[i] = (i % 0xFF);
  69. }
  70. memStream::~memStream()
  71. {
  72. /* Nothing extra for now. */
  73. }
  74. const char *memStream::GetDataBuffer()
  75. {
  76. return m_DataBuffer;
  77. }
  78. wxMemoryInputStream *memStream::DoCreateInStream()
  79. {
  80. wxMemoryInputStream *pMemInStream = new wxMemoryInputStream(GetDataBuffer(), DATABUFFER_SIZE);
  81. CPPUNIT_ASSERT(pMemInStream->IsOk());
  82. return pMemInStream;
  83. }
  84. wxMemoryOutputStream *memStream::DoCreateOutStream()
  85. {
  86. wxMemoryOutputStream *pMemOutStream = new wxMemoryOutputStream();
  87. CPPUNIT_ASSERT(pMemOutStream->IsOk());
  88. return pMemOutStream;
  89. }
  90. void memStream::Ctor_InFromIn()
  91. {
  92. wxMemoryInputStream *pMemInStream1 = DoCreateInStream();
  93. wxMemoryInputStream *pMemInStream2 = new wxMemoryInputStream(*pMemInStream1);
  94. CPPUNIT_ASSERT(pMemInStream2->IsOk());
  95. CPPUNIT_ASSERT_EQUAL(pMemInStream1->GetLength(), pMemInStream2->GetLength());
  96. wxFileOffset len = pMemInStream2->GetLength();
  97. char *dat = new char[len];
  98. pMemInStream2->Read(dat, len);
  99. CPPUNIT_ASSERT_EQUAL(len, (wxFileOffset)pMemInStream2->LastRead());
  100. wxStreamBuffer *buf = pMemInStream1->GetInputStreamBuffer();
  101. void *pIn = buf->GetBufferStart();
  102. CPPUNIT_ASSERT(memcmp(pIn, dat, len) == 0);
  103. delete pMemInStream2;
  104. wxFileOffset len2 = len / 2;
  105. CPPUNIT_ASSERT(len2);
  106. CPPUNIT_ASSERT(pMemInStream1->SeekI(-len2, wxFromCurrent) != wxInvalidOffset);
  107. pIn = buf->GetBufferPos();
  108. pMemInStream2 = new wxMemoryInputStream(*pMemInStream1, len2);
  109. CPPUNIT_ASSERT(pMemInStream2->IsOk());
  110. CPPUNIT_ASSERT_EQUAL((wxFileOffset)len2, pMemInStream2->GetLength());
  111. pMemInStream2->Read(dat, len2);
  112. CPPUNIT_ASSERT_EQUAL(len2, (wxFileOffset)pMemInStream2->LastRead());
  113. CPPUNIT_ASSERT(memcmp(pIn, dat, len2) == 0);
  114. delete[] dat;
  115. delete pMemInStream2;
  116. delete pMemInStream1;
  117. }
  118. void memStream::Ctor_InFromOut()
  119. {
  120. wxMemoryOutputStream *pMemOutStream = DoCreateOutStream();
  121. pMemOutStream->Write(GetDataBuffer(), DATABUFFER_SIZE);
  122. wxMemoryInputStream *pMemInStream = new wxMemoryInputStream(*pMemOutStream);
  123. CPPUNIT_ASSERT(pMemInStream->IsOk());
  124. CPPUNIT_ASSERT_EQUAL(pMemInStream->GetLength(), pMemOutStream->GetLength());
  125. size_t len = pMemInStream->GetLength();
  126. wxStreamBuffer *in = pMemInStream->GetInputStreamBuffer();
  127. wxStreamBuffer *out = pMemOutStream->GetOutputStreamBuffer();
  128. void *pIn = in->GetBufferStart();
  129. void *pOut = out->GetBufferStart();
  130. CPPUNIT_ASSERT(pIn != pOut);
  131. CPPUNIT_ASSERT(memcmp(pIn, pOut, len) == 0);
  132. delete pMemInStream;
  133. delete pMemOutStream;
  134. }
  135. // Register the stream sub suite, by using some stream helper macro.
  136. // Note: Don't forget to connect it to the base suite (See: bstream.cpp => StreamCase::suite())
  137. STREAM_TEST_SUBSUITE_NAMED_REGISTRATION(memStream)