datastreamtest.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Name: tests/streams/datastreamtest.cpp
  3. // Purpose: wxDataXXXStream Unit Test
  4. // Author: Ryan Norton
  5. // Created: 2004-08-14
  6. // Copyright: (c) 2004 Ryan Norton
  7. ///////////////////////////////////////////////////////////////////////////////
  8. // ----------------------------------------------------------------------------
  9. // headers
  10. // ----------------------------------------------------------------------------
  11. #include "testprec.h"
  12. #ifdef __BORLANDC__
  13. #pragma hdrstop
  14. #endif
  15. #ifndef WX_PRECOMP
  16. #include "wx/wx.h"
  17. #endif // WX_PRECOMP
  18. #include <vector>
  19. #include "wx/datstrm.h"
  20. #include "wx/wfstream.h"
  21. #include "wx/math.h"
  22. // ----------------------------------------------------------------------------
  23. // test class
  24. // ----------------------------------------------------------------------------
  25. class DataStreamTestCase : public CppUnit::TestCase
  26. {
  27. public:
  28. DataStreamTestCase();
  29. private:
  30. CPPUNIT_TEST_SUITE( DataStreamTestCase );
  31. CPPUNIT_TEST( FloatRW );
  32. CPPUNIT_TEST( DoubleRW );
  33. #if wxUSE_LONGLONG
  34. CPPUNIT_TEST( LongLongRW );
  35. #endif
  36. #if wxHAS_INT64
  37. CPPUNIT_TEST( Int64RW );
  38. #endif
  39. CPPUNIT_TEST( NaNRW );
  40. CPPUNIT_TEST( PseudoTest_UseBigEndian );
  41. CPPUNIT_TEST( FloatRW );
  42. CPPUNIT_TEST( DoubleRW );
  43. // Only test standard IEEE 754 formats if we're using IEEE extended
  44. // format by default, otherwise the tests above already covered them.
  45. #if wxUSE_APPLE_IEEE
  46. CPPUNIT_TEST( PseudoTest_UseIEEE754 );
  47. CPPUNIT_TEST( FloatRW );
  48. CPPUNIT_TEST( DoubleRW );
  49. // Also retest little endian version with standard formats.
  50. CPPUNIT_TEST( PseudoTest_UseLittleEndian );
  51. CPPUNIT_TEST( FloatRW );
  52. CPPUNIT_TEST( DoubleRW );
  53. #endif // wxUSE_APPLE_IEEE
  54. CPPUNIT_TEST_SUITE_END();
  55. wxFloat64 TestFloatRW(wxFloat64 fValue);
  56. void FloatRW();
  57. void DoubleRW();
  58. #if wxUSE_LONGLONG
  59. void LongLongRW();
  60. #endif
  61. #if wxHAS_INT64
  62. void Int64RW();
  63. #endif
  64. void NaNRW();
  65. void PseudoTest_UseBigEndian() { ms_useBigEndianFormat = true; }
  66. void PseudoTest_UseLittleEndian() { ms_useBigEndianFormat = false; }
  67. #if wxUSE_APPLE_IEEE
  68. void PseudoTest_UseIEEE754() { ms_useIEEE754 = true; }
  69. #endif // wxUSE_APPLE_IEEE
  70. static bool ms_useBigEndianFormat;
  71. #if wxUSE_APPLE_IEEE
  72. static bool ms_useIEEE754;
  73. #endif // wxUSE_APPLE_IEEE
  74. DECLARE_NO_COPY_CLASS(DataStreamTestCase)
  75. };
  76. // register in the unnamed registry so that these tests are run by default
  77. CPPUNIT_TEST_SUITE_REGISTRATION( DataStreamTestCase );
  78. // also include in its own registry so that these tests can be run alone
  79. CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( DataStreamTestCase, "DataStreamTestCase" );
  80. bool DataStreamTestCase::ms_useBigEndianFormat = false;
  81. #if wxUSE_APPLE_IEEE
  82. bool DataStreamTestCase::ms_useIEEE754 = false;
  83. #endif // wxUSE_APPLE_IEEE
  84. DataStreamTestCase::DataStreamTestCase()
  85. {
  86. }
  87. wxFloat64 DataStreamTestCase::TestFloatRW(wxFloat64 fValue)
  88. {
  89. {
  90. wxFileOutputStream pFileOutput( wxT("mytext.dat") );
  91. wxDataOutputStream pDataOutput( pFileOutput );
  92. if ( ms_useBigEndianFormat )
  93. pDataOutput.BigEndianOrdered(true);
  94. #if wxUSE_APPLE_IEEE
  95. if ( ms_useIEEE754 )
  96. pDataOutput.UseBasicPrecisions();
  97. #endif // wxUSE_APPLE_IEEE
  98. pDataOutput << fValue;
  99. }
  100. wxFileInputStream pFileInput( wxT("mytext.dat") );
  101. wxDataInputStream pDataInput( pFileInput );
  102. if ( ms_useBigEndianFormat )
  103. pDataInput.BigEndianOrdered(true);
  104. #if wxUSE_APPLE_IEEE
  105. if ( ms_useIEEE754 )
  106. pDataInput.UseBasicPrecisions();
  107. #endif // wxUSE_APPLE_IEEE
  108. wxFloat64 fInFloat;
  109. pDataInput >> fInFloat;
  110. return fInFloat;
  111. }
  112. template <class T>
  113. class TestMultiRW {
  114. public:
  115. typedef std::vector<T> ValueArray;
  116. typedef void (wxDataOutputStream::*FnWriter)(const T *buffer, size_t size);
  117. typedef void (wxDataInputStream::*FnReader)(T *buffer, size_t size);
  118. private:
  119. bool m_ok;
  120. private:
  121. void ProcessData(const T *Values,
  122. typename ValueArray::size_type Size,
  123. FnWriter pfnWriter,
  124. FnReader pfnReader)
  125. {
  126. ValueArray InValues(Size);
  127. {
  128. wxFileOutputStream FileOutput( wxT("mytext.dat") );
  129. wxDataOutputStream DataOutput( FileOutput );
  130. (DataOutput.*pfnWriter)(Values, Size);
  131. }
  132. {
  133. wxFileInputStream FileInput( wxT("mytext.dat") );
  134. wxDataInputStream DataInput( FileInput );
  135. (DataInput.*pfnReader)(&*InValues.begin(), InValues.size());
  136. }
  137. m_ok = true;
  138. for (typename ValueArray::size_type idx=0; idx!=Size; ++idx) {
  139. if (InValues[idx]!=Values[idx]) {
  140. m_ok = false;
  141. break;
  142. }
  143. }
  144. }
  145. public:
  146. TestMultiRW(const T *Values,
  147. size_t Size,
  148. FnWriter pfnWriter,
  149. FnReader pfnReader)
  150. {
  151. ProcessData(Values, (typename ValueArray::size_type) Size, pfnWriter, pfnReader);
  152. }
  153. TestMultiRW(const ValueArray &Values,
  154. FnWriter pfnWriter,
  155. FnReader pfnReader)
  156. {
  157. ProcessData(&*Values.begin(), Values.size(), pfnWriter, pfnReader);
  158. }
  159. bool IsOk() const
  160. {
  161. return m_ok;
  162. }
  163. };
  164. template <class T>
  165. static
  166. T TestRW(const T &Value)
  167. {
  168. T InValue;
  169. {
  170. wxFileOutputStream FileOutput( wxT("mytext.dat") );
  171. wxDataOutputStream DataOutput( FileOutput );
  172. DataOutput << Value;
  173. }
  174. {
  175. wxFileInputStream FileInput( wxT("mytext.dat") );
  176. wxDataInputStream DataInput( FileInput );
  177. DataInput >> InValue;
  178. }
  179. return InValue;
  180. }
  181. void DataStreamTestCase::FloatRW()
  182. {
  183. CPPUNIT_ASSERT( TestFloatRW(5.5) == 5.5 );
  184. CPPUNIT_ASSERT( TestFloatRW(5) == 5 );
  185. CPPUNIT_ASSERT( TestFloatRW(5.55) == 5.55 );
  186. CPPUNIT_ASSERT( TestFloatRW(55555.555555) == 55555.555555 );
  187. }
  188. void DataStreamTestCase::DoubleRW()
  189. {
  190. CPPUNIT_ASSERT( TestFloatRW(2132131.1232132) == 2132131.1232132 );
  191. CPPUNIT_ASSERT( TestFloatRW(21321343431.1232143432) == 21321343431.1232143432 );
  192. }
  193. #if wxUSE_LONGLONG
  194. void DataStreamTestCase::LongLongRW()
  195. {
  196. TestMultiRW<wxLongLong>::ValueArray ValuesLL;
  197. TestMultiRW<wxULongLong>::ValueArray ValuesULL;
  198. ValuesLL.push_back(wxLongLong(0l));
  199. ValuesLL.push_back(wxLongLong(1l));
  200. ValuesLL.push_back(wxLongLong(-1l));
  201. ValuesLL.push_back(wxLongLong(0x12345678l));
  202. ValuesLL.push_back(wxLongLong(0x12345678l, 0xabcdef01l));
  203. ValuesULL.push_back(wxULongLong(0l));
  204. ValuesULL.push_back(wxULongLong(1l));
  205. ValuesULL.push_back(wxULongLong(0x12345678l));
  206. ValuesULL.push_back(wxULongLong(0x12345678l, 0xabcdef01l));
  207. CPPUNIT_ASSERT( TestRW(wxLongLong(0x12345678l)) == wxLongLong(0x12345678l) );
  208. CPPUNIT_ASSERT( TestRW(wxLongLong(0x12345678l, 0xabcdef01l)) == wxLongLong(0x12345678l, 0xabcdef01l) );
  209. CPPUNIT_ASSERT( TestMultiRW<wxLongLong>(ValuesLL, &wxDataOutputStream::WriteLL, &wxDataInputStream::ReadLL).IsOk() );
  210. CPPUNIT_ASSERT( TestMultiRW<wxULongLong>(ValuesULL, &wxDataOutputStream::WriteLL, &wxDataInputStream::ReadLL).IsOk() );
  211. }
  212. #endif
  213. #if wxHAS_INT64
  214. void DataStreamTestCase::Int64RW()
  215. {
  216. TestMultiRW<wxInt64>::ValueArray ValuesI64;
  217. TestMultiRW<wxUint64>::ValueArray ValuesUI64;
  218. ValuesI64.push_back(wxInt64(0l));
  219. ValuesI64.push_back(wxInt64(1l));
  220. ValuesI64.push_back(wxInt64(-1l));
  221. ValuesI64.push_back(wxInt64(0x12345678l));
  222. ValuesI64.push_back((wxInt64(0x12345678l) << 32) + wxInt64(0xabcdef01l));
  223. ValuesUI64.push_back(wxUint64(0l));
  224. ValuesUI64.push_back(wxUint64(1l));
  225. ValuesUI64.push_back(wxUint64(0x12345678l));
  226. ValuesUI64.push_back((wxUint64(0x12345678l) << 32) + wxUint64(0xabcdef01l));
  227. CPPUNIT_ASSERT( TestRW(wxUint64(0x12345678l)) == wxUint64(0x12345678l) );
  228. CPPUNIT_ASSERT( TestRW((wxUint64(0x12345678l) << 32) + wxUint64(0xabcdef01l)) == (wxUint64(0x12345678l) << 32) + wxUint64(0xabcdef01l) );
  229. CPPUNIT_ASSERT( TestMultiRW<wxInt64>(ValuesI64, &wxDataOutputStream::Write64, &wxDataInputStream::Read64).IsOk() );
  230. CPPUNIT_ASSERT( TestMultiRW<wxUint64>(ValuesUI64, &wxDataOutputStream::Write64, &wxDataInputStream::Read64).IsOk() );
  231. }
  232. #endif
  233. void DataStreamTestCase::NaNRW()
  234. {
  235. //TODO?
  236. }