safearrayconverttest.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Name: tests/misc/safearrayconverttest.cpp
  3. // Purpose: Test conversions between wxVariant and OLE VARIANT using SAFEARRAYs
  4. // Author: PB
  5. // RCS-ID: $Id: typeinfotest.cpp 67656 2011-04-30 10:57:04Z DS $
  6. // Copyright: (c) the wxWidgets team
  7. // Licence: wxWindows licence
  8. ///////////////////////////////////////////////////////////////////////////////
  9. #include "testprec.h"
  10. #ifdef __BORLANDC__
  11. #pragma hdrstop
  12. #endif
  13. #ifdef __WINDOWS__
  14. #if wxUSE_OLE && wxUSE_VARIANT
  15. #include "wx/msw/ole/oleutils.h"
  16. #include "wx/msw/ole/safearray.h"
  17. // need this to be able to use CPPUNIT_ASSERT_EQUAL with wxVariant objects
  18. inline std::ostream& operator<<(std::ostream& ostr, const wxVariant& v)
  19. {
  20. ostr << v.GetString();
  21. return ostr;
  22. }
  23. // ----------------------------------------------------------------------------
  24. // test class
  25. // ----------------------------------------------------------------------------
  26. class SafeArrayConvertTestCase : public CppUnit::TestCase
  27. {
  28. public:
  29. SafeArrayConvertTestCase () { }
  30. private:
  31. CPPUNIT_TEST_SUITE( SafeArrayConvertTestCase );
  32. CPPUNIT_TEST( VariantListDefault );
  33. CPPUNIT_TEST( VariantStringsDefault );
  34. CPPUNIT_TEST( VariantListReturnSafeArray );
  35. CPPUNIT_TEST( StringsReturnSafeArray );
  36. CPPUNIT_TEST_SUITE_END();
  37. void VariantListDefault();
  38. void VariantStringsDefault();
  39. void VariantListReturnSafeArray();
  40. void StringsReturnSafeArray();
  41. DECLARE_NO_COPY_CLASS(SafeArrayConvertTestCase )
  42. };
  43. // register in the unnamed registry so that these tests are run by default
  44. CPPUNIT_TEST_SUITE_REGISTRATION( SafeArrayConvertTestCase );
  45. // also include in its own registry so that these tests can be run alone
  46. CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( SafeArrayConvertTestCase, "SafeArrayConvertTestCase" );
  47. // test converting a wxVariant with the list type to an OLE VARIANT
  48. // and back to wxVariant the list type
  49. void SafeArrayConvertTestCase::VariantListDefault()
  50. {
  51. wxVariant variant;
  52. VARIANT oleVariant;
  53. variant.NullList();
  54. variant.Append(true);
  55. variant.Append(12.34);
  56. variant.Append(42L);
  57. variant.Append("ABC");
  58. CPPUNIT_ASSERT( wxConvertVariantToOle(variant, oleVariant) );
  59. wxVariant variantCopy;
  60. CPPUNIT_ASSERT( wxConvertOleToVariant(oleVariant, variantCopy) );
  61. CPPUNIT_ASSERT( variant == variantCopy );
  62. }
  63. // test converting a wxVariant with the arrstring type to an OLE VARIANT
  64. // and back to a wxVariant with the arrstring type
  65. void SafeArrayConvertTestCase::VariantStringsDefault()
  66. {
  67. wxVariant variant;
  68. wxArrayString as;
  69. VARIANT oleVariant;
  70. as.push_back("abc");
  71. as.push_back("def");
  72. as.push_back("ghi");
  73. variant = as;
  74. CPPUNIT_ASSERT( wxConvertVariantToOle(variant, oleVariant) );
  75. wxVariant variantCopy;
  76. CPPUNIT_ASSERT( wxConvertOleToVariant(oleVariant, variantCopy) );
  77. CPPUNIT_ASSERT( variant == variantCopy );
  78. }
  79. // test converting a wxVariant with the list type to an OLE VARIANT
  80. // and then to a wxVariant with the safearray type
  81. void SafeArrayConvertTestCase::VariantListReturnSafeArray()
  82. {
  83. wxVariant variant;
  84. VARIANT oleVariant;
  85. variant.NullList();
  86. variant.Append(true);
  87. variant.Append(12.34);
  88. variant.Append(42L);
  89. variant.Append("test");
  90. CPPUNIT_ASSERT( wxConvertVariantToOle(variant, oleVariant) );
  91. wxVariant variantCopy;
  92. CPPUNIT_ASSERT(
  93. wxConvertOleToVariant(oleVariant, variantCopy,
  94. wxOleConvertVariant_ReturnSafeArrays)
  95. );
  96. CPPUNIT_ASSERT( variantCopy.GetType() == wxT("safearray") );
  97. wxSafeArray<VT_VARIANT> safeArray;
  98. wxVariantDataSafeArray*
  99. vsa = wxStaticCastVariantData(variantCopy.GetData(),
  100. wxVariantDataSafeArray);
  101. long bound;
  102. CPPUNIT_ASSERT( vsa );
  103. CPPUNIT_ASSERT( safeArray.Attach(vsa->GetValue()) );
  104. CPPUNIT_ASSERT_EQUAL( 1, safeArray.GetDim() );
  105. CPPUNIT_ASSERT( safeArray.GetLBound(1, bound) );
  106. CPPUNIT_ASSERT_EQUAL( 0, bound );
  107. CPPUNIT_ASSERT( safeArray.GetUBound(1, bound) );
  108. const long count = variant.GetCount();
  109. // bound + 1 because safearray elements are accessed by index ranging from
  110. // LBound to UBound inclusive
  111. CPPUNIT_ASSERT_EQUAL( bound + 1, count );
  112. wxVariant variantItem;
  113. for ( long i = 0; i < count; i++ )
  114. {
  115. CPPUNIT_ASSERT( safeArray.GetElement(&i, variantItem) );
  116. CPPUNIT_ASSERT_EQUAL( variantItem, variant[i] );
  117. }
  118. }
  119. // test converting a wxArrayString to an OLE VARIANT
  120. // and then to a wxVariant with the safearray type
  121. void SafeArrayConvertTestCase::StringsReturnSafeArray()
  122. {
  123. wxArrayString as;
  124. wxSafeArray<VT_BSTR> safeArray;
  125. as.push_back("abc");
  126. as.push_back("def");
  127. as.push_back("ghi");
  128. CPPUNIT_ASSERT( safeArray.CreateFromArrayString(as) );
  129. VARIANT oleVariant;
  130. wxVariant variant;
  131. oleVariant.vt = VT_BSTR | VT_ARRAY;
  132. oleVariant.parray = safeArray.Detach();
  133. CPPUNIT_ASSERT( oleVariant.parray );
  134. CPPUNIT_ASSERT(
  135. wxConvertOleToVariant(oleVariant, variant,
  136. wxOleConvertVariant_ReturnSafeArrays)
  137. );
  138. CPPUNIT_ASSERT( variant.GetType() == wxT("safearray") );
  139. wxVariantDataSafeArray*
  140. vsa = wxStaticCastVariantData(variant.GetData(),
  141. wxVariantDataSafeArray);
  142. long bound;
  143. CPPUNIT_ASSERT( vsa );
  144. CPPUNIT_ASSERT( safeArray.Attach(vsa->GetValue()) );
  145. CPPUNIT_ASSERT_EQUAL( 1, safeArray.GetDim() );
  146. CPPUNIT_ASSERT( safeArray.GetLBound(1, bound) );
  147. CPPUNIT_ASSERT_EQUAL( 0, bound );
  148. CPPUNIT_ASSERT( safeArray.GetUBound(1, bound) );
  149. const long count = as.size();
  150. CPPUNIT_ASSERT_EQUAL( bound + 1, count );
  151. wxString str;
  152. for ( long i = 0; i < count; i++ )
  153. {
  154. CPPUNIT_ASSERT( safeArray.GetElement(&i, str) );
  155. CPPUNIT_ASSERT( str == as[i] );
  156. }
  157. }
  158. #endif // __WINDOWS__
  159. #endif // wxUSE_OLE && wxUSE_VARIANT