X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c66cca2af072daf7abe63f784038cbd9125ca4bd..3fe70739d2098debccaa2755f054f67fff829a59:/samples/console/console.cpp diff --git a/samples/console/console.cpp b/samples/console/console.cpp index 7fbf76d464..6c365c276a 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -78,6 +78,7 @@ #define TEST_REGCONF #define TEST_REGEX #define TEST_REGISTRY + #define TEST_SCOPEGUARD #define TEST_SNGLINST #define TEST_SOCKETS #define TEST_STREAMS @@ -95,7 +96,7 @@ #undef TEST_ALL static const bool TEST_ALL = true; #else - #define TEST_LOG + #define TEST_HASHMAP static const bool TEST_ALL = false; #endif @@ -1148,6 +1149,41 @@ static void TestHash() { wxPuts(_T("*** Testing wxHashTable ***\n")); + { + wxHashTable hash(wxKEY_INTEGER), hash2(wxKEY_STRING); + int i; + + for ( i = 0; i < 100; ++i ) + hash.Put(i, (wxObject*)&i + i); + + hash.BeginFind(); + wxHashTable::compatibility_iterator it = hash.Next(); + i = 0; + + while (it) + { + ++i; + it = hash.Next(); + } + + if (i != 100) + wxPuts(_T("Error in wxHashTable::compatibility_iterator\n")); + + for ( i = 99; i >= 0; --i ) + if( hash.Get(i) != (wxObject*)&i + i ) + wxPuts(_T("Error in wxHashTable::Get/Put\n")); + + hash2.Put("foo", (wxObject*)&i + 1); + hash2.Put("bar", (wxObject*)&i + 2); + hash2.Put("baz", (wxObject*)&i + 3); + + if (hash2.Get("moo") != NULL) + wxPuts(_T("Error in wxHashTable::Get\n")); + + if (hash2.Get("bar") != (wxObject*)&i + 2) + wxPuts(_T("Error in wxHashTable::Get/Put\n")); + } +#if !wxUSE_STL { wxHashFoos hash; hash.DeleteContents(true); @@ -1197,8 +1233,10 @@ static void TestHash() wxPuts(_T("ok (not found)")); } } +#endif wxPrintf(_T("Hash destroyed: %u foos left\n"), Foo::count); + wxPuts(_T("*** Testing wxHashTable finished ***\n")); } #endif // TEST_HASH @@ -1361,6 +1399,104 @@ WX_DECLARE_LIST(Bar, wxListBars); #include "wx/listimpl.cpp" WX_DEFINE_LIST(wxListBars); +WX_DECLARE_LIST(int, wxListInt); +WX_DEFINE_LIST(wxListInt); + +static void TestList() +{ + wxPuts(_T("*** Testing wxList operations ***\n")); + { + wxListInt list1; + int dummy[5]; + int i; + + for ( i = 0; i < 5; ++i ) + list1.Append(dummy + i); + + if ( list1.GetCount() != 5 ) + wxPuts(_T("Wrong number of items in list\n")); + + if ( list1.Item(3)->GetData() != dummy + 3 ) + wxPuts(_T("Error in Item()\n")); + + if ( !list1.Find(dummy + 4) ) + wxPuts(_T("Error in Find()\n")); + + wxListInt::compatibility_iterator node = list1.GetFirst(); + i = 0; + + while (node) + { + if ( node->GetData() != dummy + i ) + wxPuts(_T("Error in compatibility_iterator\n")); + node = node->GetNext(); + ++i; + } + + if ( size_t(i) != list1.GetCount() ) + wxPuts(_T("Error in compatibility_iterator\n")); + + list1.Insert(dummy + 0); + list1.Insert(1, dummy + 1); + list1.Insert(list1.GetFirst()->GetNext()->GetNext(), dummy + 2); + + node = list1.GetFirst(); + i = 0; + + while (i < 3) + { + int* t = node->GetData(); + if ( t != dummy + i ) + wxPuts(_T("Error in Insert\n")); + node = node->GetNext(); + ++i; + } + } + + wxPuts(_T("*** Testing wxList operations finished ***\n")); + + wxPuts(_T("*** Testing std::list operations ***\n")); + + { + wxListInt list1; + wxListInt::iterator it, en; + wxListInt::reverse_iterator rit, ren; + int i; + for ( i = 0; i < 5; ++i ) + list1.push_back(i + &i); + + for ( it = list1.begin(), en = list1.end(), i = 0; + it != en; ++it, ++i ) + if ( *it != i + &i ) + wxPuts(_T("Error in iterator\n")); + + for ( rit = list1.rbegin(), ren = list1.rend(), i = 4; + rit != ren; ++rit, --i ) + if ( *rit != i + &i ) + wxPuts(_T("Error in reverse_iterator\n")); + + if ( *list1.rbegin() != *--list1.end() || + *list1.begin() != *--list1.rend() ) + wxPuts(_T("Error in iterator/reverse_iterator\n")); + if ( *list1.begin() != *--++list1.begin() || + *list1.rbegin() != *--++list1.rbegin() ) + wxPuts(_T("Error in iterator/reverse_iterator\n")); + + if ( list1.front() != &i || list1.back() != &i + 4 ) + wxPuts(_T("Error in front()/back()\n")); + + list1.erase(list1.begin()); + list1.erase(--list1.end()); + + for ( it = list1.begin(), en = list1.end(), i = 1; + it != en; ++it, ++i ) + if ( *it != i + &i ) + wxPuts(_T("Error in erase()\n")); + } + + wxPuts(_T("*** Testing std::list operations finished ***\n")); +} + static void TestListCtor() { wxPuts(_T("*** Testing wxList construction ***\n")); @@ -1379,7 +1515,11 @@ static void TestListCtor() wxPrintf(_T("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n"), list1.GetCount(), list2.GetCount(), Bar::GetNumber()); +#if !wxUSE_STL list1.DeleteContents(true); +#else + WX_CLEAR_LIST(wxListBars, list1); +#endif } wxPrintf(_T("After list destruction: %u objects left.\n"), Bar::GetNumber()); @@ -2989,6 +3129,8 @@ static void TestRegistryAssociation() // scope guard // ---------------------------------------------------------------------------- +#ifdef TEST_SCOPEGUARD + #include "wx/scopeguard.h" static void function0() { puts("function0()"); } @@ -3009,14 +3151,16 @@ static void TestScopeGuard() ON_BLOCK_EXIT2(function2, 3.14, 'p'); Object obj; - ON_BLOCK_EXIT_OBJ0(obj, Object::method0); - ON_BLOCK_EXIT_OBJ1(obj, Object::method1, 7); - ON_BLOCK_EXIT_OBJ2(obj, Object::method2, 2.71, 'e'); + ON_BLOCK_EXIT_OBJ0(obj, &Object::method0); + ON_BLOCK_EXIT_OBJ1(obj, &Object::method1, 7); + ON_BLOCK_EXIT_OBJ2(obj, &Object::method2, 2.71, 'e'); wxScopeGuard dismissed = wxMakeGuard(function0); dismissed.Dismiss(); } +#endif + // ---------------------------------------------------------------------------- // sockets // ---------------------------------------------------------------------------- @@ -5715,6 +5859,17 @@ static void PrintArray(const wxChar* name, const wxArrayString& array) } } +static void PrintArray(const wxChar* name, const wxSortedArrayString& array) +{ + wxPrintf(_T("Dump of the array '%s'\n"), name); + + size_t nCount = array.GetCount(); + for ( size_t n = 0; n < nCount; n++ ) + { + wxPrintf(_T("\t%s[%u] = '%s'\n"), name, n, array[n].c_str()); + } +} + int wxCMPFUNC_CONV StringLenCompare(const wxString& first, const wxString& second) { @@ -5779,6 +5934,53 @@ static void TestArrayOf ## name ## s() \ TestArrayOf(UShort); TestArrayOf(Int); +static void TestStlArray() +{ + wxPuts(_T("*** Testing std::vector operations ***\n")); + + { + wxArrayInt list1; + wxArrayInt::iterator it, en; + wxArrayInt::reverse_iterator rit, ren; + int i; + for ( i = 0; i < 5; ++i ) + list1.push_back(i); + + for ( it = list1.begin(), en = list1.end(), i = 0; + it != en; ++it, ++i ) + if ( *it != i ) + wxPuts(_T("Error in iterator\n")); + + for ( rit = list1.rbegin(), ren = list1.rend(), i = 4; + rit != ren; ++rit, --i ) + if ( *rit != i ) + wxPuts(_T("Error in reverse_iterator\n")); + + if ( *list1.rbegin() != *(list1.end()-1) || + *list1.begin() != *(list1.rend()-1) ) + wxPuts(_T("Error in iterator/reverse_iterator\n")); + + it = list1.begin()+1; + rit = list1.rbegin()+1; + if ( *list1.begin() != *(it-1) || + *list1.rbegin() != *(rit-1) ) + wxPuts(_T("Error in iterator/reverse_iterator\n")); + + if ( list1.front() != 0 || list1.back() != 4 ) + wxPuts(_T("Error in front()/back()\n")); + + list1.erase(list1.begin()); + list1.erase(list1.end()-1); + + for ( it = list1.begin(), en = list1.end(), i = 1; + it != en; ++it, ++i ) + if ( *it != i ) + wxPuts(_T("Error in erase()\n")); + } + + wxPuts(_T("*** Testing std::vector operations finished ***\n")); +} + static void TestArrayOfObjects() { wxPuts(_T("*** Testing wxObjArray ***\n")); @@ -5866,14 +6068,14 @@ static void TestString() for (int i = 0; i < 1000000; ++i) { - a = "Hello"; - b = " world"; - c = "! How'ya doin'?"; + a = _T("Hello"); + b = _T(" world"); + c = _T("! How'ya doin'?"); a += b; a += c; - c = "Hello world! What's up?"; + c = _T("Hello world! What's up?"); if (c != a) - c = "Doh!"; + c = _T("Doh!"); } wxPrintf(_T("TestString elapsed time: %ld\n"), sw.Time()); @@ -5904,7 +6106,7 @@ static void TestPChar() static void TestStringSub() { - wxString s("Hello, world!"); + wxString s(_T("Hello, world!")); wxPuts(_T("*** Testing wxString substring extraction ***")); @@ -6201,6 +6403,180 @@ static void TestStringMatch() wxPuts(_T("")); } +// Sigh, I want Test::Simple, Test::More and Test::Harness... +void ok(int line, bool ok, const wxString& msg = wxEmptyString) +{ + if( !ok ) + wxPuts(_T("NOT OK: (") + wxString::Format(_T("%d"), line) + + _T(") ") + msg); +} + +void is(int line, const wxString& got, const wxString& expected, + const wxString& msg = wxEmptyString) +{ + bool isOk = got == expected; + ok(line, isOk, msg); + if( !isOk ) + { + wxPuts(_T("Got: ") + got); + wxPuts(_T("Expected: ") + expected); + } +} + +void is(int line, const wxChar& got, const wxChar& expected, + const wxString& msg = wxEmptyString) +{ + bool isOk = got == expected; + ok(line, isOk, msg); + if( !isOk ) + { + wxPuts("Got: " + got); + wxPuts("Expected: " + expected); + } +} + +void TestStdString() +{ + wxPuts(_T("*** Testing std::string operations ***\n")); + + // test ctors + wxString s1(_T("abcdefgh")), + s2(_T("abcdefghijklm"), 8), + s3(_T("abcdefghijklm")), + s4(8, _T('a')); + wxString s5(s1), + s6(s3, 0, 8), + s7(s3.begin(), s3.begin() + 8); + wxString s8(s1, 4, 8), s9, s10, s11; + + is( __LINE__, s1, _T("abcdefgh") ); + is( __LINE__, s2, s1 ); + is( __LINE__, s4, _T("aaaaaaaa") ); + is( __LINE__, s5, _T("abcdefgh") ); + is( __LINE__, s6, s1 ); + is( __LINE__, s7, s1 ); + is( __LINE__, s8, _T("efgh") ); + + // test append + s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = _T("abc"); + s1.append(_T("def")); + s2.append(_T("defgh"), 3); + s3.append(wxString(_T("abcdef")), 3, 6); + s4.append(s1); + s5.append(3, _T('a')); + s6.append(s1.begin() + 3, s1.end()); + + is( __LINE__, s1, _T("abcdef") ); + is( __LINE__, s2, _T("abcdef") ); + is( __LINE__, s3, _T("abcdef") ); + is( __LINE__, s4, _T("abcabcdef") ); + is( __LINE__, s5, _T("abcaaa") ); + is( __LINE__, s6, _T("abcdef") ); + + // test assign + s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = _T("abc"); + s1.assign(_T("def")); + s2.assign(_T("defgh"), 3); + s3.assign(wxString(_T("abcdef")), 3, 6); + s4.assign(s1); + s5.assign(3, _T('a')); + s6.assign(s1.begin() + 1, s1.end()); + + is( __LINE__, s1, _T("def") ); + is( __LINE__, s2, _T("def") ); + is( __LINE__, s3, _T("def") ); + is( __LINE__, s4, _T("def") ); + is( __LINE__, s5, _T("aaa") ); + is( __LINE__, s6, _T("ef") ); + + // test compare + s1 = _T("abcdefgh"); + s2 = _T("abcdefgh"); + s3 = _T("abc"); + s4 = _T("abcdefghi"); + s5 = _T("aaa"); + s6 = _T("zzz"); + s7 = _T("zabcdefg"); + + ok( __LINE__, s1.compare(s2) == 0 ); + ok( __LINE__, s1.compare(s3) > 0 ); + ok( __LINE__, s1.compare(s4) < 0 ); + ok( __LINE__, s1.compare(s5) > 0 ); + ok( __LINE__, s1.compare(s6) < 0 ); + ok( __LINE__, s1.compare(1, 12, s1) > 0); + ok( __LINE__, s1.compare(_T("abcdefgh")) == 0); + ok( __LINE__, s1.compare(1, 7, _T("bcdefgh")) == 0); + ok( __LINE__, s1.compare(1, 7, _T("bcdefgh"), 7) == 0); + + // test erase + s1.erase(1, 1); + s2.erase(4, 12); + wxString::iterator it = s3.erase(s3.begin() + 1); + wxString::iterator it2 = s4.erase(s4.begin() + 4, s4.begin() + 6); + wxString::iterator it3 = s7.erase(s7.begin() + 4, s7.begin() + 8); + + is( __LINE__, s1, _T("acdefgh") ); + is( __LINE__, s2, _T("abcd") ); + is( __LINE__, s3, _T("ac") ); + is( __LINE__, s4, _T("abcdghi") ); + is( __LINE__, s7, _T("zabc") ); + is( __LINE__, *it, _T('c') ); + is( __LINE__, *it2, _T('g') ); + ok( __LINE__, it3 == s7.end() ); + + // test insert + s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = _T("aaaa"); + s9 = s10 = _T("cdefg"); + + s1.insert(1, _T("cc") ); + s2.insert(2, _T("cdef"), 3); + s3.insert(2, s10); + s4.insert(2, s10, 3, 7); + s5.insert(1, 2, _T('c')); + it = s6.insert(s6.begin() + 3, _T('X')); + s7.insert(s7.begin(), s9.begin(), s9.end() - 1); + s8.insert(s8.begin(), 2, _T('c')); + + is( __LINE__, s1, _T("accaaa") ); + is( __LINE__, s2, _T("aacdeaa") ); + is( __LINE__, s3, _T("aacdefgaa") ); + is( __LINE__, s4, _T("aafgaa") ); + is( __LINE__, s5, _T("accaaa") ); + is( __LINE__, s6, _T("aaaXa") ); + is( __LINE__, s7, _T("cdefaaaa") ); + is( __LINE__, s8, _T("ccaaaa") ); + + s1 = s2 = s3 = _T("aaaa"); + s1.insert(0, _T("ccc"), 2); + s2.insert(4, _T("ccc"), 2); + + is( __LINE__, s1, _T("ccaaaa") ); + is( __LINE__, s2, _T("aaaacc") ); + + // test replace + s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = _T("QWERTYUIOP"); + s9 = s10 = _T("werty"); + + s1.replace(3, 4, _T("rtyu")); + s1.replace(8, 7, _T("opopop")); + s2.replace(10, 12, _T("WWWW")); + s3.replace(1, 5, s9); + s4.replace(1, 4, s9, 0, 4); + s5.replace(1, 2, s9, 1, 12); + s6.replace(0, 123, s9, 0, 123); + s7.replace(2, 7, s9); + + is( __LINE__, s1, _T("QWErtyuIopopop") ); + is( __LINE__, s2, _T("QWERTYUIOPWWWW") ); + is( __LINE__, s3, _T("QwertyUIOP") ); + is( __LINE__, s4, _T("QwertYUIOP") ); + is( __LINE__, s5, _T("QertyRTYUIOP") ); + is( __LINE__, s6, s9); + is( __LINE__, s7, _T("QWwertyP") ); + + wxPuts(_T("*** Testing std::string operations finished ***\n")); +} + #endif // TEST_STRINGS // ---------------------------------------------------------------------------- @@ -6337,10 +6713,12 @@ int main(int argc, char **argv) { TestStringMatch(); } + + TestStdString(); #endif // TEST_STRINGS #ifdef TEST_ARRAYS - if ( TEST_ALL ) + if ( 1 || TEST_ALL ) { wxArrayString a1; a1.Add(_T("tiger")); @@ -6357,38 +6735,50 @@ int main(int argc, char **argv) wxArrayString a2(a1); PrintArray(_T("a2"), a2); +#if !wxUSE_STL wxSortedArrayString a3(a1); +#else + wxSortedArrayString a3; + for (wxArrayString::iterator it = a1.begin(), en = a1.end(); + it != en; ++it) + a3.Add(*it); +#endif PrintArray(_T("a3"), a3); wxPuts(_T("*** After deleting three strings from a1")); - a1.Remove(2,3); + a1.RemoveAt(2,3); PrintArray(_T("a1"), a1); PrintArray(_T("a2"), a2); PrintArray(_T("a3"), a3); +#if !wxUSE_STL wxPuts(_T("*** After reassigning a1 to a2 and a3")); a3 = a2 = a1; PrintArray(_T("a2"), a2); PrintArray(_T("a3"), a3); +#endif wxPuts(_T("*** After sorting a1")); - a1.Sort(); + a1.Sort(wxStringCompareAscending); PrintArray(_T("a1"), a1); wxPuts(_T("*** After sorting a1 in reverse order")); - a1.Sort(true); + a1.Sort(wxStringCompareDescending); PrintArray(_T("a1"), a1); +#if !wxUSE_STL wxPuts(_T("*** After sorting a1 by the string length")); - a1.Sort(StringLenCompare); + a1.Sort(&StringLenCompare); PrintArray(_T("a1"), a1); +#endif TestArrayOfObjects(); TestArrayOfUShorts(); } TestArrayOfInts(); + TestStlArray(); #endif // TEST_ARRAYS #ifdef TEST_DIR @@ -6418,6 +6808,7 @@ int main(int argc, char **argv) #ifdef TEST_LIST TestListCtor(); + TestList(); #endif // TEST_LIST #ifdef TEST_LOCALE @@ -6663,6 +7054,10 @@ int main(int argc, char **argv) TestDateTimeInteractive(); #endif // TEST_DATETIME +#ifdef TEST_SCOPEGUARD + TestScopeGuard(); +#endif + #ifdef TEST_USLEEP wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z...")); wxUsleep(3000);