X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d517b60699db7507e9cb377a810b56f108cb7d88..85ad2fa7d2aeaa5f01ce1e1c34c3a04527671852:/tests/any/anytest.cpp diff --git a/tests/any/anytest.cpp b/tests/any/anytest.cpp index 0d856445a6..7c6fdaa131 100644 --- a/tests/any/anytest.cpp +++ b/tests/any/anytest.cpp @@ -18,6 +18,7 @@ #include "wx/any.h" #include "wx/datetime.h" #include "wx/object.h" +#include "wx/vector.h" #include <math.h> @@ -39,6 +40,7 @@ private: CPPUNIT_TEST( Null ); CPPUNIT_TEST( wxVariantConversions ); CPPUNIT_TEST( CustomTemplateSpecialization ); + CPPUNIT_TEST( Misc ); CPPUNIT_TEST_SUITE_END(); void CheckType(); @@ -48,6 +50,7 @@ private: void Null(); void wxVariantConversions(); void CustomTemplateSpecialization(); + void Misc(); wxDateTime m_testDateTime; @@ -98,7 +101,7 @@ private: // register in the unnamed registry so that these tests are run by default CPPUNIT_TEST_SUITE_REGISTRATION( wxAnyTestCase ); -// also include in it's own registry so that these tests can be run alone +// 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, @@ -178,6 +181,10 @@ void wxAnyTestCase::CheckType() 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() @@ -404,16 +411,42 @@ void wxAnyTestCase::GetAs() // // Test user data type for wxAnyValueTypeImpl specialization -// any hand-built wxVariantData +// 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() { @@ -421,6 +454,12 @@ public: } private: + void Init() + { + // We use this for some sanity checking + gs_myClassInstances.push_back(this); + } + int m_someValue; }; @@ -524,7 +563,9 @@ void wxAnyTestCase::wxVariantConversions() 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); @@ -664,5 +705,38 @@ void wxAnyTestCase::CustomTemplateSpecialization() 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