X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7d9cfc5483c227e513b5e2a3fa693ce07eed6e00..f155075229d771430f0793700f5048ad4be00e9d:/tests/hashes/hashes.cpp diff --git a/tests/hashes/hashes.cpp b/tests/hashes/hashes.cpp index e33d6ff3b0..87237eb1cc 100644 --- a/tests/hashes/hashes.cpp +++ b/tests/hashes/hashes.cpp @@ -2,9 +2,10 @@ // Name: tests/hashes/hashes.cpp // Purpose: wxHashTable, wxHashMap, wxHashSet unit test // Author: Vadim Zeitlin, Mattia Barbon +// Modified: Mike Wetherell // Created: 2004-05-16 // RCS-ID: $Id$ -// Copyright: (c) 2004 Vadim Zeitlin, Mattia Barbon +// Copyright: (c) 2004 Vadim Zeitlin, Mattia Barbon, 2005 M. Wetherell /////////////////////////////////////////////////////////////////////////////// // ---------------------------------------------------------------------------- @@ -25,6 +26,11 @@ #include "wx/hashmap.h" #include "wx/hashset.h" +#if defined wxLongLong_t && !defined wxLongLongIsLong && \ + (!defined __VISUALC__ || __VISUALC__ > 1100) // doesn't work on VC5 + #define TEST_LONGLONG +#endif + // -------------------------------------------------------------------------- // helper class for typed/untyped wxHashTable // -------------------------------------------------------------------------- @@ -67,14 +73,36 @@ private: CPPUNIT_TEST( wxHashTableTest ); CPPUNIT_TEST( wxUntypedHashTableDeleteContents ); CPPUNIT_TEST( wxTypedHashTableTest ); - CPPUNIT_TEST( wxHashMapTest ); + CPPUNIT_TEST( StringHashMapTest ); + CPPUNIT_TEST( PtrHashMapTest ); + CPPUNIT_TEST( LongHashMapTest ); + CPPUNIT_TEST( ULongHashMapTest ); + CPPUNIT_TEST( UIntHashMapTest ); + CPPUNIT_TEST( IntHashMapTest ); + CPPUNIT_TEST( ShortHashMapTest ); + CPPUNIT_TEST( UShortHashMapTest ); +#ifdef TEST_LONGLONG + CPPUNIT_TEST( LLongHashMapTest ); + CPPUNIT_TEST( ULLongHashMapTest ); +#endif CPPUNIT_TEST( wxHashSetTest ); CPPUNIT_TEST_SUITE_END(); void wxHashTableTest(); void wxUntypedHashTableDeleteContents(); void wxTypedHashTableTest(); - void wxHashMapTest(); + void StringHashMapTest(); + void PtrHashMapTest(); + void LongHashMapTest(); + void ULongHashMapTest(); + void UIntHashMapTest(); + void IntHashMapTest(); + void ShortHashMapTest(); + void UShortHashMapTest(); +#ifdef TEST_LONGLONG + void LLongHashMapTest(); + void ULLongHashMapTest(); +#endif void wxHashSetTest(); DECLARE_NO_COPY_CLASS(HashesTestCase) @@ -83,7 +111,7 @@ private: // register in the unnamed registry so that these tests are run by default CPPUNIT_TEST_SUITE_REGISTRATION( HashesTestCase ); -// 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( HashesTestCase, "HashesTestCase" ); void HashesTestCase::wxHashTableTest() @@ -134,16 +162,16 @@ void HashesTestCase::wxHashTableTest() for ( i = 0; i < COUNT/2; ++i ) CPPUNIT_ASSERT( hash.Get(i) == NULL); - hash2.Put(_T("foo"), &o + 1); - hash2.Put(_T("bar"), &o + 2); - hash2.Put(_T("baz"), &o + 3); + hash2.Put(wxT("foo"), &o + 1); + hash2.Put(wxT("bar"), &o + 2); + hash2.Put(wxT("baz"), &o + 3); - CPPUNIT_ASSERT(hash2.Get(_T("moo")) == NULL); - CPPUNIT_ASSERT(hash2.Get(_T("bar")) == &o + 2); + CPPUNIT_ASSERT(hash2.Get(wxT("moo")) == NULL); + CPPUNIT_ASSERT(hash2.Get(wxT("bar")) == &o + 2); - hash2.Put(_T("bar"), &o + 0); + hash2.Put(wxT("bar"), &o + 0); - CPPUNIT_ASSERT(hash2.Get(_T("bar")) == &o + 2); + CPPUNIT_ASSERT(hash2.Get(wxT("bar")) == &o + 2); } // and now some corner-case testing; 3 and 13 hash to the same bucket @@ -236,17 +264,8 @@ void HashesTestCase::wxUntypedHashTableDeleteContents() CPPUNIT_ASSERT( FooObject::count == 0 ); } -#if WXWIN_COMPATIBILITY_2_4 -WX_DECLARE_LIST(Foo, wxListFoos); -#endif - WX_DECLARE_HASH(Foo, wxListFoos, wxHashFoos); -#if WXWIN_COMPATIBILITY_2_4 -#include "wx/listimpl.cpp" -WX_DEFINE_LIST(wxListFoos); -#endif - void HashesTestCase::wxTypedHashTableTest() { // need a nested scope for destruction @@ -314,20 +333,68 @@ WX_DECLARE_HASH_MAP( unsigned short, unsigned, wxIntegerHash, wxIntegerEqual, // myStringHashMap ); WX_DECLARE_STRING_HASH_MAP(wxString, myStringHashMap); -typedef myStringHashMap::iterator Itor; +#ifdef TEST_LONGLONG + WX_DECLARE_HASH_MAP( wxLongLong_t, wxLongLong_t, + wxIntegerHash, wxIntegerEqual, myLLongHashMap ); + WX_DECLARE_HASH_MAP( wxULongLong_t, wxULongLong_t, + wxIntegerHash, wxIntegerEqual, myULLongHashMap ); +#endif + +// Helpers to generate a key value pair for item 'i', out of a total of 'count' +void MakeKeyValuePair(size_t i, size_t /*count*/, wxString& key, wxString& val) +{ + key.clear(); + key << i; + val = wxT("A") + key + wxT("C"); +} + +// for integral keys generate a range of keys that will use all the bits of +// the key type +template +IntT MakeKey(size_t i, size_t count) +{ + IntT max = 1; + max <<= sizeof(KeyT) * 8 - 2; + max -= count / 4 + 1; + + return max / count * 4 * i + i / 3; +} -void HashesTestCase::wxHashMapTest() +// make key/value pairs for integer types +template +void MakeKeyValuePair(size_t i, size_t count, KeyT& key, ValueT& value) { - myStringHashMap sh(0); // as small as possible - wxString buf; + key = MakeKey(i, count); + value = wx_truncate_cast(ValueT, key); +} + +// make key/values paris for pointer types +template +void MakeKeyValuePair(size_t i, size_t count, T*& key, ValueT& value) +{ + key = (T*)wxUIntToPtr(MakeKey(i, count)); + value = wx_truncate_cast(ValueT, key); +} + +// the test +template +void HashMapTest() +{ + typedef typename HashMapT::value_type::second_type value_type; + typedef typename HashMapT::key_type key_type; + typedef typename HashMapT::iterator Itor; + + HashMapT sh(0); // as small as possible + key_type buf; + value_type value; size_t i; const size_t count = 10000; // init with some data for( i = 0; i < count; ++i ) { - buf.Printf(wxT("%d"), i ); - sh[buf] = wxT("A") + buf + wxT("C"); + MakeKeyValuePair(i, count, buf, value); + sh[buf] = value; } // test that insertion worked @@ -335,8 +402,8 @@ void HashesTestCase::wxHashMapTest() for( i = 0; i < count; ++i ) { - buf.Printf(wxT("%d"), i ); - CPPUNIT_ASSERT( sh[buf] == wxT("A") + buf + wxT("C") ); + MakeKeyValuePair(i, count, buf, value); + CPPUNIT_ASSERT( sh[buf] == value ); } // check that iterators work @@ -350,7 +417,7 @@ void HashesTestCase::wxHashMapTest() CPPUNIT_ASSERT( sh.size() == i ); // test copy ctor, assignment operator - myStringHashMap h1( sh ), h2( 0 ); + HashMapT h1( sh ), h2( 0 ); h2 = sh; for( i = 0, it = sh.begin(); it != sh.end(); ++it, ++i ) @@ -362,7 +429,7 @@ void HashesTestCase::wxHashMapTest() // other tests for( i = 0; i < count; ++i ) { - buf.Printf(wxT("%d"), i ); + MakeKeyValuePair(i, count, buf, value); size_t sz = sh.size(); // test find() and erase(it) @@ -388,6 +455,26 @@ void HashesTestCase::wxHashMapTest() } } +void HashesTestCase::StringHashMapTest() { HashMapTest(); } +void HashesTestCase::PtrHashMapTest() { HashMapTest(); } +void HashesTestCase::LongHashMapTest() { HashMapTest(); } +void HashesTestCase::ULongHashMapTest() { HashMapTest(); } +void HashesTestCase::UIntHashMapTest() { HashMapTest(); } +void HashesTestCase::IntHashMapTest() { HashMapTest(); } +void HashesTestCase::ShortHashMapTest() { HashMapTest(); } +void HashesTestCase::UShortHashMapTest() { HashMapTest(); } + +#ifdef TEST_LONGLONG +void HashesTestCase::LLongHashMapTest() { HashMapTest(); } +void HashesTestCase::ULLongHashMapTest() { HashMapTest(); } +#endif + +#ifdef __VISUALC__ + #if __VISUALC__ <= 1200 + #pragma warning(disable:4284) // operator->() returns a non-UDT + #endif +#endif // __VISUALC__ + // test compilation of basic set types WX_DECLARE_HASH_SET( int*, wxPointerHash, wxPointerEqual, myPtrHashSet ); WX_DECLARE_HASH_SET( long, wxIntegerHash, wxIntegerEqual, myLongHashSet ); @@ -436,16 +523,16 @@ void HashesTestCase::wxHashSetTest() { wxStringHashSet set1; - set1.insert( _T("abc") ); + set1.insert( wxT("abc") ); CPPUNIT_ASSERT( set1.size() == 1 ); - set1.insert( _T("bbc") ); - set1.insert( _T("cbc") ); + set1.insert( wxT("bbc") ); + set1.insert( wxT("cbc") ); CPPUNIT_ASSERT( set1.size() == 3 ); - set1.insert( _T("abc") ); + set1.insert( wxT("abc") ); CPPUNIT_ASSERT( set1.size() == 3 ); @@ -453,11 +540,11 @@ void HashesTestCase::wxHashSetTest() int dummy; MyStruct tmp; - tmp.ptr = &dummy; tmp.str = _T("ABC"); + tmp.ptr = &dummy; tmp.str = wxT("ABC"); set2.insert( tmp ); tmp.ptr = &dummy + 1; set2.insert( tmp ); - tmp.ptr = &dummy; tmp.str = _T("CDE"); + tmp.ptr = &dummy; tmp.str = wxT("CDE"); set2.insert( tmp ); CPPUNIT_ASSERT( set2.size() == 2 ); @@ -466,5 +553,5 @@ void HashesTestCase::wxHashSetTest() CPPUNIT_ASSERT( it != set2.end() ); CPPUNIT_ASSERT( it->ptr == &dummy ); - CPPUNIT_ASSERT( it->str == _T("ABC") ); + CPPUNIT_ASSERT( it->str == wxT("ABC") ); }