| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: tests/any/anytest.cpp
- // Purpose: Test the wxAny classes
- // Author: Jaakko Salli
- // Copyright: (c) the wxWidgets team
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #include "testprec.h"
- #ifdef __BORLANDC__
- # pragma hdrstop
- #endif
- #if wxUSE_ANY
- #include "wx/any.h"
- #include "wx/datetime.h"
- #include "wx/object.h"
- #include "wx/vector.h"
- #include <math.h>
- // ----------------------------------------------------------------------------
- // test class
- // ----------------------------------------------------------------------------
- class wxAnyTestCase : public CppUnit::TestCase
- {
- public:
- wxAnyTestCase();
- private:
- CPPUNIT_TEST_SUITE( wxAnyTestCase );
- CPPUNIT_TEST( CheckType );
- CPPUNIT_TEST( Equality );
- CPPUNIT_TEST( As );
- CPPUNIT_TEST( GetAs );
- CPPUNIT_TEST( Null );
- CPPUNIT_TEST( wxVariantConversions );
- CPPUNIT_TEST( CustomTemplateSpecialization );
- CPPUNIT_TEST( Misc );
- CPPUNIT_TEST_SUITE_END();
- void CheckType();
- void Equality();
- void As();
- void GetAs();
- void Null();
- void wxVariantConversions();
- void CustomTemplateSpecialization();
- void Misc();
- wxDateTime m_testDateTime;
- wxAny m_anySignedChar1;
- wxAny m_anySignedShort1;
- wxAny m_anySignedInt1;
- wxAny m_anySignedLong1;
- wxAny m_anySignedLongLong1;
- wxAny m_anyUnsignedChar1;
- wxAny m_anyUnsignedShort1;
- wxAny m_anyUnsignedInt1;
- wxAny m_anyUnsignedLong1;
- wxAny m_anyUnsignedLongLong1;
- wxAny m_anyStringString1;
- wxAny m_anyCharString1;
- wxAny m_anyWcharString1;
- wxAny m_anyBool1;
- wxAny m_anyFloatDouble1;
- wxAny m_anyDoubleDouble1;
- wxAny m_anyWxObjectPtr1;
- wxAny m_anyVoidPtr1;
- wxAny m_anyDateTime1;
- wxAny m_anyUniChar1;
- wxAny m_anySignedChar2;
- wxAny m_anySignedShort2;
- wxAny m_anySignedInt2;
- wxAny m_anySignedLong2;
- wxAny m_anySignedLongLong2;
- wxAny m_anyUnsignedChar2;
- wxAny m_anyUnsignedShort2;
- wxAny m_anyUnsignedInt2;
- wxAny m_anyUnsignedLong2;
- wxAny m_anyUnsignedLongLong2;
- wxAny m_anyStringString2;
- wxAny m_anyCharString2;
- wxAny m_anyWcharString2;
- wxAny m_anyBool2;
- wxAny m_anyFloatDouble2;
- wxAny m_anyDoubleDouble2;
- wxAny m_anyWxObjectPtr2;
- wxAny m_anyVoidPtr2;
- wxAny m_anyDateTime2;
- DECLARE_NO_COPY_CLASS(wxAnyTestCase)
- };
- // register in the unnamed registry so that these tests are run by default
- CPPUNIT_TEST_SUITE_REGISTRATION( wxAnyTestCase );
- // also include in its own registry so that these tests can be run alone
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( wxAnyTestCase, "wxAnyTestCase" );
- // Let's use a number with first digit after decimal dot less than 5,
- // so that we don't have to worry about whether conversion from float
- // to int truncates or rounds.
- const float TEST_FLOAT_CONST = 123.456f;
- const double TEST_DOUBLE_CONST = 123.456;
- const double FEQ_DELTA = 0.001;
- wxObject* dummyWxObjectPointer = reinterpret_cast<wxObject*>(1234);
- void* dummyVoidPointer = reinterpret_cast<void*>(1234);
- //
- // Test both 'creation' methods
- wxAnyTestCase::wxAnyTestCase()
- : m_anySignedChar1((signed char)15),
- m_anySignedShort1((signed short)15),
- m_anySignedInt1((signed int)15),
- m_anySignedLong1((signed long)15),
- #ifdef wxLongLong_t
- m_anySignedLongLong1((wxLongLong_t)15),
- #endif
- m_anyUnsignedChar1((unsigned char)15),
- m_anyUnsignedShort1((unsigned short)15),
- m_anyUnsignedInt1((unsigned int)15),
- m_anyUnsignedLong1((unsigned long)15),
- #ifdef wxLongLong_t
- m_anyUnsignedLongLong1((wxULongLong_t)15),
- #endif
- m_anyStringString1(wxString("abc")),
- m_anyCharString1("abc"),
- m_anyWcharString1(L"abc"),
- m_anyBool1(true),
- m_anyFloatDouble1(TEST_FLOAT_CONST),
- m_anyDoubleDouble1(TEST_DOUBLE_CONST),
- m_anyWxObjectPtr1(dummyWxObjectPointer),
- m_anyVoidPtr1(dummyVoidPointer),
- m_anyDateTime1(wxDateTime::Now())
- {
- m_testDateTime = wxDateTime::Now();
- m_anySignedChar2 = (signed char)15;
- m_anySignedShort2 = (signed short)15;
- m_anySignedInt2 = (signed int)15;
- m_anySignedLong2 = (signed long)15;
- #ifdef wxLongLong_t
- m_anySignedLongLong2 = (wxLongLong_t)15;
- #endif
- m_anyUnsignedChar2 = (unsigned char)15;
- m_anyUnsignedShort2 = (unsigned short)15;
- m_anyUnsignedInt2 = (unsigned int)15;
- m_anyUnsignedLong2 = (unsigned long)15;
- #ifdef wxLongLong_t
- m_anyUnsignedLongLong2 = (wxULongLong_t)15;
- #endif
- m_anyStringString2 = wxString("abc");
- m_anyCharString2 = "abc";
- m_anyWcharString2 = L"abc";
- m_anyBool2 = true;
- m_anyFloatDouble2 = TEST_FLOAT_CONST;
- m_anyDoubleDouble2 = TEST_DOUBLE_CONST;
- m_anyDateTime2 = m_testDateTime;
- m_anyUniChar1 = wxUniChar('A');
- m_anyWxObjectPtr2 = dummyWxObjectPointer;
- m_anyVoidPtr2 = dummyVoidPointer;
- }
- void wxAnyTestCase::CheckType()
- {
- wxAny nullAny;
- CPPUNIT_ASSERT(!wxANY_CHECK_TYPE(nullAny, wxString));
- CPPUNIT_ASSERT(wxANY_CHECK_TYPE(m_anyCharString2, const char*));
- CPPUNIT_ASSERT(!wxANY_CHECK_TYPE(m_anyCharString2, wxString));
- CPPUNIT_ASSERT(!wxANY_CHECK_TYPE(m_anyCharString2, const wchar_t*));
- CPPUNIT_ASSERT(wxANY_CHECK_TYPE(m_anyWcharString2, const wchar_t*));
- CPPUNIT_ASSERT(!wxANY_CHECK_TYPE(m_anyWcharString2, wxString));
- CPPUNIT_ASSERT(!wxANY_CHECK_TYPE(m_anyWcharString2, const char*));
- // HasSameType()
- CPPUNIT_ASSERT( m_anyWcharString1.HasSameType(m_anyWcharString2) );
- CPPUNIT_ASSERT( !m_anyWcharString1.HasSameType(m_anyBool1) );
- }
- void wxAnyTestCase::Equality()
- {
- //
- // Currently this should work
- CPPUNIT_ASSERT(m_anyUnsignedLong1 == 15L);
- CPPUNIT_ASSERT(m_anyUnsignedLong1 != 30L);
- CPPUNIT_ASSERT(m_anyUnsignedLong1 == 15UL);
- CPPUNIT_ASSERT(m_anyUnsignedLong1 != 30UL);
- CPPUNIT_ASSERT(m_anyStringString1 == wxString("abc"));
- CPPUNIT_ASSERT(m_anyStringString1 != wxString("ABC"));
- CPPUNIT_ASSERT(m_anyStringString1 == "abc");
- CPPUNIT_ASSERT(m_anyStringString1 != "ABC");
- CPPUNIT_ASSERT(m_anyStringString1 == L"abc");
- CPPUNIT_ASSERT(m_anyStringString1 != L"ABC");
- CPPUNIT_ASSERT(m_anyBool1 == true);
- CPPUNIT_ASSERT(m_anyBool1 != false);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(wxANY_AS(m_anyFloatDouble1, double),
- wxANY_AS(m_anyDoubleDouble1, double),
- FEQ_DELTA);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(wxANY_AS(m_anyFloatDouble1, double),
- TEST_FLOAT_CONST,
- FEQ_DELTA);
- CPPUNIT_ASSERT(wxANY_AS(m_anyWxObjectPtr1, wxObject*)
- == dummyWxObjectPointer);
- CPPUNIT_ASSERT(wxANY_AS(m_anyVoidPtr1, void*) == dummyVoidPointer);
- CPPUNIT_ASSERT(m_anySignedLong2 == 15);
- CPPUNIT_ASSERT(m_anyStringString2 == wxString("abc"));
- CPPUNIT_ASSERT(m_anyStringString2 == "abc");
- CPPUNIT_ASSERT(m_anyStringString2 == L"abc");
- CPPUNIT_ASSERT(m_anyBool2 == true);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(wxANY_AS(m_anyFloatDouble2, double),
- wxANY_AS(m_anyDoubleDouble2, double),
- FEQ_DELTA);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(wxANY_AS(m_anyFloatDouble2, double),
- TEST_FLOAT_CONST,
- FEQ_DELTA);
- CPPUNIT_ASSERT(wxANY_AS(m_anyWxObjectPtr2, wxObject*)
- == dummyWxObjectPointer);
- CPPUNIT_ASSERT(wxANY_AS(m_anyVoidPtr2, void*) == dummyVoidPointer);
- // Test sub-type system type compatibility
- CPPUNIT_ASSERT(m_anySignedShort1.GetType()->
- IsSameType(m_anySignedLongLong1.GetType()));
- CPPUNIT_ASSERT(m_anyUnsignedShort1.GetType()->
- IsSameType(m_anyUnsignedLongLong1.GetType()));
- }
- void wxAnyTestCase::As()
- {
- //
- // Test getting C++ data from wxAny without dynamic conversion
- signed char a = wxANY_AS(m_anySignedChar1, signed char);
- CPPUNIT_ASSERT(a == (signed int)15);
- signed short b = wxANY_AS(m_anySignedShort1, signed short);
- CPPUNIT_ASSERT(b == (signed int)15);
- signed int c = wxANY_AS(m_anySignedInt1, signed int);
- CPPUNIT_ASSERT(c == (signed int)15);
- signed long d = wxANY_AS(m_anySignedLong1, signed long);
- CPPUNIT_ASSERT(d == (signed int)15);
- #ifdef wxLongLong_t
- wxLongLong_t e = wxANY_AS(m_anySignedLongLong1, wxLongLong_t);
- CPPUNIT_ASSERT(e == (signed int)15);
- #endif
- unsigned char f = wxANY_AS(m_anyUnsignedChar1, unsigned char);
- CPPUNIT_ASSERT(f == (unsigned int)15);
- unsigned short g = wxANY_AS(m_anyUnsignedShort1, unsigned short);
- CPPUNIT_ASSERT(g == (unsigned int)15);
- unsigned int h = wxANY_AS(m_anyUnsignedInt1, unsigned int);
- CPPUNIT_ASSERT(h == (unsigned int)15);
- unsigned long i = wxANY_AS(m_anyUnsignedLong1, unsigned long);
- CPPUNIT_ASSERT(i == (unsigned int)15);
- #ifdef wxLongLong_t
- wxULongLong_t j = wxANY_AS(m_anyUnsignedLongLong1, wxULongLong_t);
- CPPUNIT_ASSERT(j == (unsigned int)15);
- #endif
- wxString k = wxANY_AS(m_anyStringString1, wxString);
- CPPUNIT_ASSERT(k == "abc");
- wxString l = wxANY_AS(m_anyCharString1, wxString);
- const char* cptr = wxANY_AS(m_anyCharString1, const char*);
- CPPUNIT_ASSERT(l == "abc");
- CPPUNIT_ASSERT(cptr);
- wxString m = wxANY_AS(m_anyWcharString1, wxString);
- const wchar_t* wcptr = wxANY_AS(m_anyWcharString1, const wchar_t*);
- CPPUNIT_ASSERT(wcptr);
- CPPUNIT_ASSERT(m == "abc");
- bool n = wxANY_AS(m_anyBool1, bool);
- CPPUNIT_ASSERT(n);
- // Make sure the stored float that comes back is -identical-.
- // So do not use delta comparison here.
- float o = wxANY_AS(m_anyFloatDouble1, float);
- CPPUNIT_ASSERT_EQUAL(o, TEST_FLOAT_CONST);
- double p = wxANY_AS(m_anyDoubleDouble1, double);
- CPPUNIT_ASSERT_EQUAL(p, TEST_DOUBLE_CONST);
- wxUniChar chr = wxANY_AS(m_anyUniChar1, wxUniChar);
- CPPUNIT_ASSERT(chr == 'A');
- wxDateTime q = wxANY_AS(m_anyDateTime1, wxDateTime);
- CPPUNIT_ASSERT(q == m_testDateTime);
- wxObject* r = wxANY_AS(m_anyWxObjectPtr1, wxObject*);
- CPPUNIT_ASSERT(r == dummyWxObjectPointer);
- void* s = wxANY_AS(m_anyVoidPtr1, void*);
- CPPUNIT_ASSERT(s == dummyVoidPointer);
- }
- void wxAnyTestCase::Null()
- {
- wxAny a;
- CPPUNIT_ASSERT(a.IsNull());
- a = -127;
- CPPUNIT_ASSERT(a == -127);
- a.MakeNull();
- CPPUNIT_ASSERT(a.IsNull());
- }
- void wxAnyTestCase::GetAs()
- {
- //
- // Test dynamic conversion
- bool res;
- long l = 0;
- short int si = 0;
- unsigned long ul = 0;
- wxString s;
- // Let's test against float instead of double, since the former
- // is not the native underlying type the code converts to, but
- // should still work, all the same.
- float f = 0.0;
- bool b = false;
- // Conversions from signed long type
- // The first check should be enough to make sure that the sub-type system
- // has not failed.
- res = m_anySignedLong1.GetAs(&si);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT_EQUAL(si, 15);
- res = m_anySignedLong1.GetAs(&ul);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT_EQUAL(ul, 15UL);
- res = m_anySignedLong1.GetAs(&s);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(s == "15");
- res = m_anySignedLong1.GetAs(&f);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(f, 15.0, FEQ_DELTA);
- res = m_anySignedLong1.GetAs(&b);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(b == true);
- // Conversions from unsigned long type
- res = m_anyUnsignedLong1.GetAs(&l);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(l == static_cast<signed long>(15));
- res = m_anyUnsignedLong1.GetAs(&s);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(s == "15");
- res = m_anyUnsignedLong1.GetAs(&f);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(f, 15.0, FEQ_DELTA);
- res = m_anyUnsignedLong1.GetAs(&b);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(b == true);
- // Conversions from default "abc" string to other types
- // should not work.
- CPPUNIT_ASSERT(!m_anyStringString1.GetAs(&l));
- CPPUNIT_ASSERT(!m_anyStringString1.GetAs(&ul));
- CPPUNIT_ASSERT(!m_anyStringString1.GetAs(&f));
- CPPUNIT_ASSERT(!m_anyStringString1.GetAs(&b));
- // Let's test some other conversions from string that should work.
- wxAny anyString;
- anyString = "15";
- res = anyString.GetAs(&l);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(l == static_cast<signed long>(15));
- res = anyString.GetAs(&ul);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT_EQUAL(ul, static_cast<unsigned long>(15));
- res = anyString.GetAs(&f);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(f, 15.0, FEQ_DELTA);
- anyString = "TRUE";
- res = anyString.GetAs(&b);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(b == true);
- anyString = "0";
- res = anyString.GetAs(&b);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(b == false);
- // Conversions from bool type
- res = m_anyBool1.GetAs(&l);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(l == static_cast<signed long>(1));
- res = m_anyBool1.GetAs(&ul);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT_EQUAL(ul, static_cast<unsigned long>(1));
- res = m_anyBool1.GetAs(&s);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(s == "true");
- CPPUNIT_ASSERT(!m_anyBool1.GetAs(&f));
- // Conversions from floating point type
- res = m_anyDoubleDouble1.GetAs(&l);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(l == static_cast<signed long>(123));
- res = m_anyDoubleDouble1.GetAs(&ul);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT_EQUAL(ul, static_cast<unsigned long>(123));
- res = m_anyDoubleDouble1.GetAs(&s);
- CPPUNIT_ASSERT(res);
- double d2;
- res = s.ToCDouble(&d2);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(d2, TEST_FLOAT_CONST, FEQ_DELTA);
- }
- //
- // Test user data type for wxAnyValueTypeImpl specialization
- // any hand-built wxVariantData. Also for inplace allocation
- // sanity checks.
- //
- class MyClass;
- static wxVector<MyClass*> gs_myClassInstances;
- class MyClass
- {
- public:
- MyClass( int someValue = 32768 )
- {
- Init();
- m_someValue = someValue;
- }
- MyClass( const MyClass& other )
- {
- Init();
- m_someValue = other.m_someValue;
- }
- virtual ~MyClass()
- {
- for ( size_t i=0; i<gs_myClassInstances.size(); i++ )
- {
- if ( gs_myClassInstances[i] == this )
- {
- gs_myClassInstances.erase(gs_myClassInstances.begin()+i);
- }
- }
- }
- int GetValue() const
- {
- return m_someValue;
- }
- wxString ToString()
- {
- return wxString::Format("%i", m_someValue);
- }
- private:
- void Init()
- {
- // We use this for some sanity checking
- gs_myClassInstances.push_back(this);
- }
- int m_someValue;
- };
- #if wxUSE_VARIANT
- // For testing purposes, create dummy variant data implementation
- // that does not have wxAny conversion code
- class wxMyVariantData : public wxVariantData
- {
- public:
- wxMyVariantData(const MyClass& value)
- {
- m_value = value;
- }
- virtual bool Eq(wxVariantData& WXUNUSED(data)) const
- {
- return false;
- }
- // What type is it? Return a string name.
- virtual wxString GetType() const { return "MyClass"; }
- virtual wxVariantData* Clone() const
- {
- return new wxMyVariantData(m_value);
- }
- protected:
- MyClass m_value;
- };
- #endif // wxUSE_VARIANT
- void wxAnyTestCase::wxVariantConversions()
- {
- #if wxUSE_VARIANT
- //
- // Test various conversions to and from wxVariant
- //
- bool res;
- // Prepare wxVariants
- wxVariant vLong(123L);
- wxVariant vString("ABC");
- wxVariant vDouble(TEST_FLOAT_CONST);
- wxVariant vBool((bool)true);
- wxVariant vChar('A');
- #ifdef wxLongLong_t
- wxVariant vLongLong(wxLongLong(wxLL(0xAABBBBCCCC)));
- wxVariant vULongLong(wxULongLong(wxULL(123456)));
- #endif
- wxArrayString arrstr;
- arrstr.push_back("test string");
- wxVariant vArrayString(arrstr);
- wxVariant vDateTime(m_testDateTime);
- wxVariant vVoidPtr(dummyVoidPointer);
- wxVariant vCustomType(new wxMyVariantData(MyClass(101)));
- wxVariant vList;
- vList.NullList();
- vList.Append(15);
- vList.Append("abc");
- // Convert to wxAnys, and then back to wxVariants
- wxVariant variant;
- wxAny any(vLong);
- CPPUNIT_ASSERT(any == 123L);
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant == 123L);
- // Make sure integer variant has correct type information
- CPPUNIT_ASSERT(variant.GetLong() == 123);
- CPPUNIT_ASSERT(variant.GetType() == "long");
- // Unsigned long wxAny should convert to "ulonglong" wxVariant
- any = 1000UL;
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant.GetType() == "ulonglong");
- CPPUNIT_ASSERT(variant.GetLong() == 1000);
- any = vString;
- CPPUNIT_ASSERT(any == "ABC");
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant.GetString() == "ABC");
- // Must be able to build string wxVariant from wxAny built from
- // string literal
- any = "ABC";
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant.GetType() == "string");
- CPPUNIT_ASSERT(variant.GetString() == "ABC");
- any = L"ABC";
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant.GetType() == "string");
- #if wxUSE_UNICODE
- CPPUNIT_ASSERT(variant.GetString() == L"ABC");
- #endif
- any = vDouble;
- double d = wxANY_AS(any, double);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(d, TEST_FLOAT_CONST, FEQ_DELTA);
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT_DOUBLES_EQUAL(variant.GetDouble(),
- TEST_FLOAT_CONST,
- FEQ_DELTA);
- any = vBool;
- CPPUNIT_ASSERT(wxANY_AS(any, bool) == true);
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant.GetBool() == true);
- any = wxAny(vChar);
- //CPPUNIT_ASSERT(wxANY_AS(any, wxUniChar) == 'A');
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant.GetChar() == 'A');
- #ifdef wxLongLong_t
- any = wxAny(vLongLong);
- CPPUNIT_ASSERT(any == wxLL(0xAABBBBCCCC));
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant.GetType() == "longlong");
- CPPUNIT_ASSERT(variant.GetLongLong() == wxLongLong(wxLL(0xAABBBBCCCC)));
- #if LONG_MAX == wxINT64_MAX
- // As a sanity check, test that wxVariant of type 'long' converts
- // seamlessly to 'longlong' (on some 64-bit systems)
- any = 0xAABBBBCCCCL;
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(variant.GetLongLong() == wxLongLong(wxLL(0xAABBBBCCCC)));
- #endif
- any = wxAny(vULongLong);
- CPPUNIT_ASSERT(any == wxLL(123456));
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant.GetType() == "ulonglong");
- CPPUNIT_ASSERT(variant.GetULongLong() == wxULongLong(wxULL(123456)));
- #endif
- // Cannot test equality for the rest, just test that they convert
- // back correctly.
- any = wxAny(vArrayString);
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- wxArrayString arrstr2 = variant.GetArrayString();
- CPPUNIT_ASSERT(arrstr2 == arrstr);
- any = m_testDateTime;
- CPPUNIT_ASSERT(wxANY_AS(any, wxDateTime) == m_testDateTime);
- any = wxAny(vDateTime);
- CPPUNIT_ASSERT(wxANY_AS(any, wxDateTime) == m_testDateTime);
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant == m_testDateTime);
- any = wxAny(vVoidPtr);
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant.GetVoidPtr() == dummyVoidPointer);
- any = wxAny(vList);
- CPPUNIT_ASSERT(wxANY_CHECK_TYPE(any, wxAnyList));
- wxAnyList anyList = wxANY_AS(any, wxAnyList);
- CPPUNIT_ASSERT(anyList.GetCount() == 2);
- CPPUNIT_ASSERT(wxANY_AS((*anyList[0]), int) == 15);
- CPPUNIT_ASSERT(wxANY_AS((*anyList[1]), wxString) == "abc");
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant.GetType() == "list");
- CPPUNIT_ASSERT(variant.GetCount() == 2);
- CPPUNIT_ASSERT(variant[0].GetLong() == 15);
- CPPUNIT_ASSERT(variant[1].GetString() == "abc");
- any = wxAny(vCustomType);
- CPPUNIT_ASSERT(wxANY_CHECK_TYPE(any, wxVariantData*));
- res = any.GetAs(&variant);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT(variant.GetType() == "MyClass");
- #endif // wxUSE_VARIANT
- }
- template<>
- class wxAnyValueTypeImpl<MyClass> :
- public wxAnyValueTypeImplBase<MyClass>
- {
- WX_DECLARE_ANY_VALUE_TYPE(wxAnyValueTypeImpl<MyClass>)
- public:
- wxAnyValueTypeImpl() :
- wxAnyValueTypeImplBase<MyClass>() { }
- virtual ~wxAnyValueTypeImpl() { }
- virtual bool ConvertValue(const wxAnyValueBuffer& src,
- wxAnyValueType* dstType,
- wxAnyValueBuffer& dst) const
- {
- MyClass value = GetValue(src);
- if ( wxANY_VALUE_TYPE_CHECK_TYPE(dstType, wxString) )
- {
- wxString s = value.ToString();
- wxAnyValueTypeImpl<wxString>::SetValue(s, dst);
- }
- else
- return false;
- return true;
- }
- };
- //
- // Following must be placed somewhere in your source code
- WX_IMPLEMENT_ANY_VALUE_TYPE(wxAnyValueTypeImpl<MyClass>)
- void wxAnyTestCase::CustomTemplateSpecialization()
- {
- // Do only a minimal CheckType() test, as dynamic type conversion already
- // uses it a lot.
- bool res;
- MyClass myObject;
- wxAny any = myObject;
- CPPUNIT_ASSERT( wxANY_CHECK_TYPE(any, MyClass) );
- MyClass myObject2 = wxANY_AS(any, MyClass);
- wxUnusedVar(myObject2);
- wxString str;
- res = any.GetAs(&str);
- CPPUNIT_ASSERT(res);
- CPPUNIT_ASSERT_EQUAL(str, myObject.ToString());
- }
- void wxAnyTestCase::Misc()
- {
- // Do some (inplace) allocation sanity checks
- {
- // Do it inside a scope so we can easily test instance count
- // afterwards
- MyClass myObject(15);
- wxAny any = myObject;
- // There must be two instances - first in myObject,
- // and second copied in any.
- CPPUNIT_ASSERT_EQUAL(gs_myClassInstances.size(), 2);
- // Check that it is allocated in-place, as supposed
- if ( sizeof(MyClass) <= WX_ANY_VALUE_BUFFER_SIZE )
- {
- // Memory block of the instance second must be inside the any
- size_t anyBegin = reinterpret_cast<size_t>(&any);
- size_t anyEnd = anyBegin + sizeof(wxAny);
- size_t pos = reinterpret_cast<size_t>(gs_myClassInstances[1]);
- CPPUNIT_ASSERT( pos >= anyBegin );
- CPPUNIT_ASSERT( pos < anyEnd );
- }
- wxAny any2 = any;
- CPPUNIT_ASSERT( wxANY_AS(any2, MyClass).GetValue() == 15 );
- }
- // Make sure allocations and deallocations match
- CPPUNIT_ASSERT_EQUAL(gs_myClassInstances.size(), 0);
- }
- #endif // wxUSE_ANY
|