X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2b5f62a0b2db198609b45dec622a018dae37008e..3e5c3c83e5575a1cc2b4a290c0e52b7e5395f8cb:/samples/console/console.cpp diff --git a/samples/console/console.cpp b/samples/console/console.cpp index 24c3bf569a..9eef76e9c2 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -28,6 +28,7 @@ #include "wx/string.h" #include "wx/file.h" #include "wx/app.h" +#include "wx/log.h" // without this pragma, the stupid compiler precompiles #defines below so that // changing them doesn't "take place" later! @@ -77,10 +78,12 @@ #define TEST_REGCONF #define TEST_REGEX #define TEST_REGISTRY + #define TEST_SCOPEGUARD #define TEST_SNGLINST #define TEST_SOCKETS #define TEST_STREAMS #define TEST_STRINGS + #define TEST_TEXTSTREAM #define TEST_THREADS #define TEST_TIMER #define TEST_UNICODE @@ -91,20 +94,23 @@ #define TEST_ZLIB #undef TEST_ALL - static const bool TEST_ALL = TRUE; + static const bool TEST_ALL = true; #else - #define TEST_DATETIME + #define TEST_ARRAYS + #define TEST_HASH + #define TEST_LIST + #define TEST_SCOPEGUARD - static const bool TEST_ALL = FALSE; + static const bool TEST_ALL = false; #endif // some tests are interactive, define this to run them #ifdef TEST_INTERACTIVE #undef TEST_INTERACTIVE - static const bool TEST_INTERACTIVE = TRUE; + static const bool TEST_INTERACTIVE = true; #else - static const bool TEST_INTERACTIVE = FALSE; + static const bool TEST_INTERACTIVE = false; #endif // ---------------------------------------------------------------------------- @@ -205,7 +211,6 @@ static void TestCharset() #include "wx/cmdline.h" #include "wx/datetime.h" -#include "wx/log.h" #if wxUSE_CMDLINE_PARSER @@ -278,7 +283,7 @@ static void TestCmdLineConvert() #ifdef __UNIX__ static const wxChar *ROOTDIR = _T("/"); - static const wxChar *TESTDIR = _T("/usr"); + static const wxChar *TESTDIR = _T("/usr/local/share"); #elif defined(__WXMSW__) static const wxChar *ROOTDIR = _T("c:\\"); static const wxChar *TESTDIR = _T("d:\\"); @@ -405,6 +410,7 @@ static void TestDirTraverse() } // enum again with custom traverser + wxPuts(_T("Now enumerating directories:")); wxDir dir(TESTDIR); DirPrintTraverser traverser; dir.Traverse(traverser, _T(""), wxDIR_DIRS | wxDIR_HIDDEN); @@ -568,7 +574,7 @@ static void TestExecute() wxPrintf(_T("Testing wxExecute: ")); fflush(stdout); - if ( wxExecute(COMMAND, TRUE /* sync */) == 0 ) + if ( wxExecute(COMMAND, true /* sync */) == 0 ) wxPuts(_T("Ok.")); else wxPuts(_T("ERROR.")); @@ -796,6 +802,12 @@ static void TestFileConfRead() cont = fileconf.GetNextEntry(name, dummy); } + + static const wxChar *testEntry = _T("TestEntry"); + wxPrintf(_T("\nTesting deletion of newly created \"Test\" entry: ")); + fileconf.Write(testEntry, _T("A value")); + fileconf.DeleteEntry(testEntry); + wxPrintf(fileconf.HasEntry(testEntry) ? _T("ERROR\n") : _T("ok\n")); } #endif // TEST_FILECONF @@ -851,39 +863,39 @@ static struct FileNameInfo } filenames[] = { // Unix file names - { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), TRUE, wxPATH_UNIX }, - { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), TRUE, wxPATH_UNIX }, - { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), TRUE, wxPATH_UNIX }, - { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), FALSE, wxPATH_UNIX }, - { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE, wxPATH_UNIX }, - { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), TRUE, wxPATH_UNIX }, - { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), TRUE, wxPATH_UNIX }, - { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), FALSE, wxPATH_UNIX }, - { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), TRUE, wxPATH_UNIX }, + { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), true, wxPATH_UNIX }, + { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), true, wxPATH_UNIX }, + { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), true, wxPATH_UNIX }, + { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), false, wxPATH_UNIX }, + { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), false, wxPATH_UNIX }, + { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), true, wxPATH_UNIX }, + { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), true, wxPATH_UNIX }, + { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), false, wxPATH_UNIX }, + { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), true, wxPATH_UNIX }, // Windows file names - { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE, wxPATH_DOS }, - { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), FALSE, wxPATH_DOS }, - { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), FALSE, wxPATH_DOS }, - { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), TRUE, wxPATH_DOS }, - { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), TRUE, wxPATH_DOS }, - { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), TRUE, wxPATH_DOS }, - { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), TRUE, wxPATH_DOS }, + { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), false, wxPATH_DOS }, + { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), false, wxPATH_DOS }, + { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), false, wxPATH_DOS }, + { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS }, + { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), true, wxPATH_DOS }, + { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS }, + { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), true, wxPATH_DOS }, // wxFileName support for Mac file names is broken currently #if 0 // Mac file names - { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE, wxPATH_MAC }, - { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), TRUE, wxPATH_MAC }, - { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), TRUE, wxPATH_MAC }, - { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), FALSE, wxPATH_MAC }, - { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE, wxPATH_MAC }, - { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE, wxPATH_MAC }, + { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), true, wxPATH_MAC }, + { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), true, wxPATH_MAC }, + { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), true, wxPATH_MAC }, + { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), false, wxPATH_MAC }, + { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC }, + { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC }, #endif // 0 // VMS file names - { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), TRUE, wxPATH_VMS }, - { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), FALSE, wxPATH_VMS }, + { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), true, wxPATH_VMS }, + { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), false, wxPATH_VMS }, }; static void TestFileNameConstruction() @@ -1033,6 +1045,24 @@ static void TestFileNameMakeRelative() } } +static void TestFileNameMakeAbsolute() +{ + wxPuts(_T("*** testing wxFileName::MakeAbsolute() ***")); + + for ( size_t n = 0; n < WXSIZEOF(filenames); n++ ) + { + const FileNameInfo& fni = filenames[n]; + wxFileName fn(fni.fullname, fni.format); + + wxPrintf(_T("'%s' absolutized: "), + fn.GetFullPath(fni.format).c_str()); + fn.MakeAbsolute(); + wxPrintf(_T("'%s'\n"), fn.GetFullPath(fni.format).c_str()); + } + + wxPuts(_T("")); +} + static void TestFileNameComparison() { // TODO! @@ -1122,9 +1152,44 @@ 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); + hash.DeleteContents(true); wxPrintf(_T("Hash created: %u foos in hash, %u foos totally\n"), hash.GetCount(), Foo::count); @@ -1171,8 +1236,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 @@ -1335,6 +1402,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")); @@ -1353,7 +1518,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()); - list1.DeleteContents(TRUE); +#if !wxUSE_STL + list1.DeleteContents(true); +#else + WX_CLEAR_LIST(wxListBars, list1); +#endif } wxPrintf(_T("After list destruction: %u objects left.\n"), Bar::GetNumber()); @@ -2254,26 +2423,26 @@ static void TestRegExCompile() bool correct; } regExCompTestData[] = { - { _T("foo"), TRUE }, - { _T("foo("), FALSE }, - { _T("foo(bar"), FALSE }, - { _T("foo(bar)"), TRUE }, - { _T("foo["), FALSE }, - { _T("foo[bar"), FALSE }, - { _T("foo[bar]"), TRUE }, - { _T("foo{"), TRUE }, - { _T("foo{1"), FALSE }, - { _T("foo{bar"), TRUE }, - { _T("foo{1}"), TRUE }, - { _T("foo{1,2}"), TRUE }, - { _T("foo{bar}"), TRUE }, - { _T("foo*"), TRUE }, - { _T("foo**"), FALSE }, - { _T("foo+"), TRUE }, - { _T("foo++"), FALSE }, - { _T("foo?"), TRUE }, - { _T("foo??"), FALSE }, - { _T("foo?+"), FALSE }, + { _T("foo"), true }, + { _T("foo("), false }, + { _T("foo(bar"), false }, + { _T("foo(bar)"), true }, + { _T("foo["), false }, + { _T("foo[bar"), false }, + { _T("foo[bar]"), true }, + { _T("foo{"), true }, + { _T("foo{1"), false }, + { _T("foo{bar"), true }, + { _T("foo{1}"), true }, + { _T("foo{1,2}"), true }, + { _T("foo{bar}"), true }, + { _T("foo*"), true }, + { _T("foo**"), false }, + { _T("foo+"), true }, + { _T("foo++"), false }, + { _T("foo?"), true }, + { _T("foo??"), false }, + { _T("foo?+"), false }, }; wxRegEx re; @@ -2300,12 +2469,12 @@ static void TestRegExMatch() bool correct; } regExMatchTestData[] = { - { _T("foo"), _T("bar"), FALSE }, - { _T("foo"), _T("foobar"), TRUE }, - { _T("^foo"), _T("foobar"), TRUE }, - { _T("^foo"), _T("barfoo"), FALSE }, - { _T("bar$"), _T("barbar"), TRUE }, - { _T("bar$"), _T("barbar "), FALSE }, + { _T("foo"), _T("bar"), false }, + { _T("foo"), _T("foobar"), true }, + { _T("^foo"), _T("foobar"), true }, + { _T("^foo"), _T("barfoo"), false }, + { _T("bar$"), _T("barbar"), true }, + { _T("bar$"), _T("barbar "), false }, }; for ( size_t n = 0; n < WXSIZEOF(regExMatchTestData); n++ ) @@ -2959,6 +3128,42 @@ static void TestRegistryAssociation() #endif // TEST_REGISTRY +// ---------------------------------------------------------------------------- +// scope guard +// ---------------------------------------------------------------------------- + +#ifdef TEST_SCOPEGUARD + +#include "wx/scopeguard.h" + +static void function0() { puts("function0()"); } +static void function1(int n) { printf("function1(%d)\n", n); } +static void function2(double x, char c) { printf("function2(%g, %c)\n", x, c); } + +struct Object +{ + void method0() { printf("method0()\n"); } + void method1(int n) { printf("method1(%d)\n", n); } + void method2(double x, char c) { printf("method2(%g, %c)\n", x, c); } +}; + +static void TestScopeGuard() +{ + ON_BLOCK_EXIT0(function0); + ON_BLOCK_EXIT1(function1, 17); + 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'); + + wxScopeGuard dismissed = wxMakeGuard(function0); + dismissed.Dismiss(); +} + +#endif + // ---------------------------------------------------------------------------- // sockets // ---------------------------------------------------------------------------- @@ -2986,7 +3191,8 @@ static void TestSocketServer() return; } - for ( ;; ) + bool quit = false; + while ( !quit ) { wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT); @@ -3001,7 +3207,8 @@ static void TestSocketServer() server->SetTimeout(60); // 1 min - while ( socket->IsConnected() ) + bool close = false; + while ( !close && socket->IsConnected() ) { wxString s; wxChar ch = _T('\0'); @@ -3033,19 +3240,31 @@ static void TestSocketServer() } wxPrintf(_T("Server: got '%s'.\n"), s.c_str()); - if ( s == _T("bye") ) + if ( s == _T("close") ) { - delete socket; + wxPuts(_T("Closing connection")); - break; + close = true; } + else if ( s == _T("quit") ) + { + close = + quit = true; - socket->Write(s.MakeUpper().c_str(), s.length()); - socket->Write("\r\n", 2); - wxPrintf(_T("Server: wrote '%s'.\n"), s.c_str()); + wxPuts(_T("Shutting down the server")); + } + else // not a special command + { + socket->Write(s.MakeUpper().c_str(), s.length()); + socket->Write("\r\n", 2); + wxPrintf(_T("Server: wrote '%s'.\n"), s.c_str()); + } } - wxPuts(_T("Server: lost a client.")); + if ( !close ) + { + wxPuts(_T("Server: lost a client unexpectedly.")); + } socket->Destroy(); } @@ -3140,7 +3359,7 @@ static bool TestFtpConnect() { wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname); - return FALSE; + return false; } else { @@ -3148,7 +3367,7 @@ static bool TestFtpConnect() hostname, ftp.Pwd().c_str()); } - return TRUE; + return true; } // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0? @@ -4122,7 +4341,6 @@ static void TestZlibStreamRead() #include -#include "wx/date.h" #include "wx/datetime.h" // the test data @@ -4228,8 +4446,8 @@ static void TestTimeStatic() // first line: the years to test { 1990, 1976, 2000, 2030, 1984, }, - // second line: TRUE if leap, FALSE otherwise - { FALSE, TRUE, TRUE, FALSE, TRUE } + // second line: true if leap, false otherwise + { false, true, true, false, true } }; for ( size_t n = 0; n < nYears; n++ ) @@ -4831,7 +5049,7 @@ static void TestTimeFormat() } else { - bool equal = FALSE; // suppress compilaer warning + bool equal = false; // suppress compilaer warning switch ( kind ) { case CompareBoth: @@ -4875,8 +5093,8 @@ static void TestTimeParse() static const ParseTestData parseTestDates[] = { - { _T("Sat, 18 Dec 1999 00:46:40 +0100"), { 18, wxDateTime::Dec, 1999, 00, 46, 40 }, TRUE }, - { _T("Wed, 1 Dec 1999 05:17:20 +0300"), { 1, wxDateTime::Dec, 1999, 03, 17, 20 }, TRUE }, + { _T("Sat, 18 Dec 1999 00:46:40 +0100"), { 18, wxDateTime::Dec, 1999, 00, 46, 40 }, true }, + { _T("Wed, 1 Dec 1999 05:17:20 +0300"), { 1, wxDateTime::Dec, 1999, 03, 17, 20 }, true }, }; for ( size_t n = 0; n < WXSIZEOF(parseTestDates); n++ ) @@ -5122,39 +5340,46 @@ static void TestTimeSpanFormat() wxPuts(_T("")); } -#if 0 +#endif // TEST_DATETIME -// test compatibility with the old wxDate/wxTime classes -static void TestTimeCompatibility() -{ - wxPuts(_T("\n*** wxDateTime compatibility test ***")); +// ---------------------------------------------------------------------------- +// wxTextInput/OutputStream +// ---------------------------------------------------------------------------- - wxPrintf(_T("wxDate for JDN 0: %s\n"), wxDate(0l).FormatDate().c_str()); - wxPrintf(_T("wxDate for MJD 0: %s\n"), wxDate(2400000).FormatDate().c_str()); +#ifdef TEST_TEXTSTREAM - double jdnNow = wxDateTime::Now().GetJDN(); - long jdnMidnight = (long)(jdnNow - 0.5); - wxPrintf(_T("wxDate for today: %s\n"), wxDate(jdnMidnight).FormatDate().c_str()); +#include "wx/txtstrm.h" +#include "wx/wfstream.h" - jdnMidnight = wxDate().Set().GetJulianDate(); - wxPrintf(_T("wxDateTime for today: %s\n"), - wxDateTime((double)(jdnMidnight + 0.5)).Format("%c", wxDateTime::GMT0).c_str()); +static void TestTextInputStream() +{ + wxPuts(_T("\n*** wxTextInputStream test ***")); - int flags = wxEUROPEAN;//wxFULL; - wxDate date; - date.Set(); - wxPrintf(_T("Today is %s\n"), date.FormatDate(flags).c_str()); - for ( int n = 0; n < 7; n++ ) + wxFileInputStream fsIn(_T("testdata.fc")); + if ( !fsIn.Ok() ) { - wxPrintf(_T("Previous %s is %s\n"), - wxDateTime::GetWeekDayName((wxDateTime::WeekDay)n), - date.Previous(n + 1).FormatDate(flags).c_str()); + wxPuts(_T("ERROR: couldn't open file.")); } -} + else + { + wxTextInputStream tis(fsIn); -#endif // 0 + size_t line = 1; + for ( ;; ) + { + const wxString s = tis.ReadLine(); -#endif // TEST_DATETIME + // line could be non empty if the last line of the file isn't + // terminated with EOL + if ( fsIn.Eof() && s.empty() ) + break; + + wxPrintf(_T("Line %d: %s\n"), line++, s.c_str()); + } + } +} + +#endif // TEST_TEXTSTREAM // ---------------------------------------------------------------------------- // threads @@ -5202,7 +5427,7 @@ public: { m_n = n; m_ch = ch; - m_cancelled = FALSE; + m_cancelled = false; Create(); } @@ -5217,7 +5442,7 @@ private: size_t m_n; // number of characters to write wxChar m_ch; // character to write - bool m_cancelled; // FALSE if we exit normally + bool m_cancelled; // false if we exit normally }; wxThread::ExitCode MyDetachedThread::Entry() @@ -5234,7 +5459,7 @@ wxThread::ExitCode MyDetachedThread::Entry() { if ( TestDestroy() ) { - m_cancelled = TRUE; + m_cancelled = true; break; } @@ -5637,6 +5862,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) { @@ -5701,6 +5937,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")); @@ -5853,7 +6136,7 @@ static void TestStringSub() { wxString prefix = prefixes[n], rest; bool rc = s.StartsWith(prefix, &rest); - wxPrintf(_T("StartsWith('%s') = %s"), prefix.c_str(), rc ? _T("TRUE") : _T("FALSE")); + wxPrintf(_T("StartsWith('%s') = %s"), prefix.c_str(), rc ? _T("true") : _T("false")); if ( rc ) { wxPrintf(_T(" (the rest is '%s')\n"), rest.c_str()); @@ -6133,6 +6416,16 @@ static void TestStringMatch() #include "wx/snglinst.h" #endif // TEST_SNGLINST +static int MyStringCompare(wxString* s1, wxString* s2) +{ + return wxStrcmp(s1->c_str(), s2->c_str()); +} + +static int MyStringReverseCompare(wxString* s1, wxString* s2) +{ + return -wxStrcmp(s1->c_str(), s2->c_str()); +} + int main(int argc, char **argv) { wxApp::CheckBuildOptions(wxBuildOptions()); @@ -6262,7 +6555,7 @@ int main(int argc, char **argv) #endif // TEST_STRINGS #ifdef TEST_ARRAYS - if ( TEST_ALL ) + if ( 1 || TEST_ALL ) { wxArrayString a1; a1.Add(_T("tiger")); @@ -6279,47 +6572,59 @@ 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(&MyStringCompare); PrintArray(_T("a1"), a1); wxPuts(_T("*** After sorting a1 in reverse order")); - a1.Sort(TRUE); + a1.Sort(&MyStringReverseCompare); 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 if ( TEST_ALL ) { TestDirExists(); - TestDirTraverse(); + TestDirEnum(); } - TestDirEnum(); + TestDirTraverse(); #endif // TEST_DIR #ifdef TEST_DLLLOADER @@ -6340,6 +6645,7 @@ int main(int argc, char **argv) #ifdef TEST_LIST TestListCtor(); + TestList(); #endif // TEST_LIST #ifdef TEST_LOCALE @@ -6347,12 +6653,17 @@ int main(int argc, char **argv) #endif // TEST_LOCALE #ifdef TEST_LOG + wxPuts(_T("*** Testing wxLog ***")); + wxString s; for ( size_t n = 0; n < 8000; n++ ) { s << (wxChar)(_T('A') + (n % 26)); } + wxLogWarning(_T("The length of the string is %lu"), + (unsigned long)s.length()); + wxString msg; msg.Printf(_T("A very very long message: '%s', the end!\n"), s.c_str()); @@ -6389,6 +6700,7 @@ int main(int argc, char **argv) { TestFileNameConstruction(); TestFileNameMakeRelative(); + TestFileNameMakeAbsolute(); TestFileNameSplit(); TestFileNameTemp(); TestFileNameCwd(); @@ -6525,6 +6837,10 @@ int main(int argc, char **argv) TestMemoryStream(); #endif // TEST_STREAMS +#ifdef TEST_TEXTSTREAM + TestTextInputStream(); +#endif // TEST_TEXTSTREAM + #ifdef TEST_THREADS int nCPUs = wxThread::GetCPUCount(); wxPrintf(_T("This system has %d CPUs\n"), nCPUs); @@ -6575,6 +6891,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);