]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/console/console.cpp
Apple's gcc fixes to bakefile
[wxWidgets.git] / samples / console / console.cpp
index 24c3bf569a620534b872f15ec8d7c08e0197d2c9..9eef76e9c26c454e29af7ccf8d489ce168b2b66b 100644 (file)
@@ -28,6 +28,7 @@
 #include "wx/string.h"
 #include "wx/file.h"
 #include "wx/app.h"
 #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!
 
 // without this pragma, the stupid compiler precompiles #defines below so that
 // changing them doesn't "take place" later!
     #define TEST_REGCONF
     #define TEST_REGEX
     #define TEST_REGISTRY
     #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_SNGLINST
     #define TEST_SOCKETS
     #define TEST_STREAMS
     #define TEST_STRINGS
+    #define TEST_TEXTSTREAM
     #define TEST_THREADS
     #define TEST_TIMER
     #define TEST_UNICODE
     #define TEST_THREADS
     #define TEST_TIMER
     #define TEST_UNICODE
     #define TEST_ZLIB
 
     #undef TEST_ALL
     #define TEST_ZLIB
 
     #undef TEST_ALL
-    static const bool TEST_ALL = TRUE;
+    static const bool TEST_ALL = true;
 #else
 #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
 
 #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
 #else
-    static const bool TEST_INTERACTIVE = FALSE;
+    static const bool TEST_INTERACTIVE = false;
 #endif
 
 // ----------------------------------------------------------------------------
 #endif
 
 // ----------------------------------------------------------------------------
@@ -205,7 +211,6 @@ static void TestCharset()
 
 #include "wx/cmdline.h"
 #include "wx/datetime.h"
 
 #include "wx/cmdline.h"
 #include "wx/datetime.h"
-#include "wx/log.h"
 
 #if wxUSE_CMDLINE_PARSER
 
 
 #if wxUSE_CMDLINE_PARSER
 
@@ -278,7 +283,7 @@ static void TestCmdLineConvert()
 
 #ifdef __UNIX__
     static const wxChar *ROOTDIR = _T("/");
 
 #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:\\");
 #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
     }
 
     // enum again with custom traverser
+    wxPuts(_T("Now enumerating directories:"));
     wxDir dir(TESTDIR);
     DirPrintTraverser traverser;
     dir.Traverse(traverser, _T(""), wxDIR_DIRS | wxDIR_HIDDEN);
     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);
 
     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."));
         wxPuts(_T("Ok."));
     else
         wxPuts(_T("ERROR."));
@@ -796,6 +802,12 @@ static void TestFileConfRead()
 
         cont = fileconf.GetNextEntry(name, dummy);
     }
 
         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
 }
 
 #endif // TEST_FILECONF
@@ -851,39 +863,39 @@ static struct FileNameInfo
 } filenames[] =
 {
     // Unix file names
 } 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
 
     // 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
 
     // 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
 #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()
 };
 
 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!
 static void TestFileNameComparison()
 {
     // TODO!
@@ -1122,9 +1152,44 @@ static void TestHash()
 {
     wxPuts(_T("*** Testing wxHashTable ***\n"));
 
 {
     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;
     {
         wxHashFoos hash;
-        hash.DeleteContents(TRUE);
+        hash.DeleteContents(true);
 
         wxPrintf(_T("Hash created: %u foos in hash, %u foos totally\n"),
                hash.GetCount(), Foo::count);
 
         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)"));
         }
     }
             wxPuts(_T("ok (not found)"));
         }
     }
+#endif
 
     wxPrintf(_T("Hash destroyed: %u foos left\n"), Foo::count);
 
     wxPrintf(_T("Hash destroyed: %u foos left\n"), Foo::count);
+    wxPuts(_T("*** Testing wxHashTable finished ***\n"));
 }
 
 #endif // TEST_HASH
 }
 
 #endif // TEST_HASH
@@ -1335,6 +1402,104 @@ WX_DECLARE_LIST(Bar, wxListBars);
 #include "wx/listimpl.cpp"
 WX_DEFINE_LIST(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"));
 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());
 
         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());
     }
 
     wxPrintf(_T("After list destruction: %u objects left.\n"), Bar::GetNumber());
@@ -2254,26 +2423,26 @@ static void TestRegExCompile()
         bool correct;
     } regExCompTestData[] =
     {
         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;
     };
 
     wxRegEx re;
@@ -2300,12 +2469,12 @@ static void TestRegExMatch()
         bool correct;
     } regExMatchTestData[] =
     {
         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++ )
     };
 
     for ( size_t n = 0; n < WXSIZEOF(regExMatchTestData); n++ )
@@ -2959,6 +3128,42 @@ static void TestRegistryAssociation()
 
 #endif // TEST_REGISTRY
 
 
 #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
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // sockets
 // ----------------------------------------------------------------------------
@@ -2986,7 +3191,8 @@ static void TestSocketServer()
         return;
     }
 
         return;
     }
 
-    for ( ;; )
+    bool quit = false;
+    while ( !quit )
     {
         wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT);
 
     {
         wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT);
 
@@ -3001,7 +3207,8 @@ static void TestSocketServer()
 
         server->SetTimeout(60); // 1 min
 
 
         server->SetTimeout(60); // 1 min
 
-        while ( socket->IsConnected() )
+        bool close = false;
+        while ( !close && socket->IsConnected() )
         {
             wxString s;
             wxChar ch = _T('\0');
         {
             wxString s;
             wxChar ch = _T('\0');
@@ -3033,19 +3240,31 @@ static void TestSocketServer()
             }
 
             wxPrintf(_T("Server: got '%s'.\n"), s.c_str());
             }
 
             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();
     }
 
         socket->Destroy();
     }
@@ -3140,7 +3359,7 @@ static bool TestFtpConnect()
     {
         wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname);
 
     {
         wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname);
 
-        return FALSE;
+        return false;
     }
     else
     {
     }
     else
     {
@@ -3148,7 +3367,7 @@ static bool TestFtpConnect()
                hostname, ftp.Pwd().c_str());
     }
 
                hostname, ftp.Pwd().c_str());
     }
 
-    return TRUE;
+    return true;
 }
 
 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
 }
 
 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
@@ -4122,7 +4341,6 @@ static void TestZlibStreamRead()
 
 #include <math.h>
 
 
 #include <math.h>
 
-#include "wx/date.h"
 #include "wx/datetime.h"
 
 // the test data
 #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, },
 
         // 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++ )
     };
 
     for ( size_t n = 0; n < nYears; n++ )
@@ -4831,7 +5049,7 @@ static void TestTimeFormat()
             }
             else
             {
             }
             else
             {
-                bool equal = FALSE; // suppress compilaer warning
+                bool equal = false; // suppress compilaer warning
                 switch ( kind )
                 {
                     case CompareBoth:
                 switch ( kind )
                 {
                     case CompareBoth:
@@ -4875,8 +5093,8 @@ static void TestTimeParse()
 
     static const ParseTestData parseTestDates[] =
     {
 
     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++ )
     };
 
     for ( size_t n = 0; n < WXSIZEOF(parseTestDates); n++ )
@@ -5122,39 +5340,46 @@ static void TestTimeSpanFormat()
     wxPuts(_T(""));
 }
 
     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
 
 // ----------------------------------------------------------------------------
 // threads
@@ -5202,7 +5427,7 @@ public:
     {
         m_n = n;
         m_ch = ch;
     {
         m_n = n;
         m_ch = ch;
-        m_cancelled = FALSE;
+        m_cancelled = false;
 
         Create();
     }
 
         Create();
     }
@@ -5217,7 +5442,7 @@ private:
     size_t m_n; // number of characters to write
     wxChar m_ch;  // character to write
 
     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()
 };
 
 wxThread::ExitCode MyDetachedThread::Entry()
@@ -5234,7 +5459,7 @@ wxThread::ExitCode MyDetachedThread::Entry()
     {
         if ( TestDestroy() )
         {
     {
         if ( TestDestroy() )
         {
-            m_cancelled = TRUE;
+            m_cancelled = true;
 
             break;
         }
 
             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)
 {
 int wxCMPFUNC_CONV StringLenCompare(const wxString& first,
                                     const wxString& second)
 {
@@ -5701,6 +5937,53 @@ static void TestArrayOf ## name ## s()                                        \
 TestArrayOf(UShort);
 TestArrayOf(Int);
 
 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"));
 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);
     {
         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());
         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
 
     #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());
 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
 #endif // TEST_STRINGS
 
 #ifdef TEST_ARRAYS
-    if ( TEST_ALL )
+    if ( 1 || TEST_ALL )
     {
         wxArrayString a1;
         a1.Add(_T("tiger"));
     {
         wxArrayString a1;
         a1.Add(_T("tiger"));
@@ -6279,47 +6572,59 @@ int main(int argc, char **argv)
         wxArrayString a2(a1);
         PrintArray(_T("a2"), a2);
 
         wxArrayString a2(a1);
         PrintArray(_T("a2"), a2);
 
+#if !wxUSE_STL
         wxSortedArrayString a3(a1);
         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"));
         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);
 
 
         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);
         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"));
 
         wxPuts(_T("*** After sorting a1"));
-        a1.Sort();
+        a1.Sort(&MyStringCompare);
         PrintArray(_T("a1"), a1);
 
         wxPuts(_T("*** After sorting a1 in reverse order"));
         PrintArray(_T("a1"), a1);
 
         wxPuts(_T("*** After sorting a1 in reverse order"));
-        a1.Sort(TRUE);
+        a1.Sort(&MyStringReverseCompare);
         PrintArray(_T("a1"), a1);
 
         PrintArray(_T("a1"), a1);
 
+#if !wxUSE_STL
         wxPuts(_T("*** After sorting a1 by the string length"));
         wxPuts(_T("*** After sorting a1 by the string length"));
-        a1.Sort(StringLenCompare);
+        a1.Sort(&StringLenCompare);
         PrintArray(_T("a1"), a1);
         PrintArray(_T("a1"), a1);
+#endif
 
         TestArrayOfObjects();
         TestArrayOfUShorts();
     }
 
     TestArrayOfInts();
 
         TestArrayOfObjects();
         TestArrayOfUShorts();
     }
 
     TestArrayOfInts();
+    TestStlArray();
 #endif // TEST_ARRAYS
 
 #ifdef TEST_DIR
     if ( TEST_ALL )
     {
         TestDirExists();
 #endif // TEST_ARRAYS
 
 #ifdef TEST_DIR
     if ( TEST_ALL )
     {
         TestDirExists();
-        TestDirTraverse();
+        TestDirEnum();
     }
     }
-    TestDirEnum();
+    TestDirTraverse();
 #endif // TEST_DIR
 
 #ifdef TEST_DLLLOADER
 #endif // TEST_DIR
 
 #ifdef TEST_DLLLOADER
@@ -6340,6 +6645,7 @@ int main(int argc, char **argv)
 
 #ifdef TEST_LIST
     TestListCtor();
 
 #ifdef TEST_LIST
     TestListCtor();
+    TestList();
 #endif // TEST_LIST
 
 #ifdef TEST_LOCALE
 #endif // TEST_LIST
 
 #ifdef TEST_LOCALE
@@ -6347,12 +6653,17 @@ int main(int argc, char **argv)
 #endif // TEST_LOCALE
 
 #ifdef TEST_LOG
 #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));
     }
 
     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());
 
     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();
     {
         TestFileNameConstruction();
         TestFileNameMakeRelative();
+        TestFileNameMakeAbsolute();
         TestFileNameSplit();
         TestFileNameTemp();
         TestFileNameCwd();
         TestFileNameSplit();
         TestFileNameTemp();
         TestFileNameCwd();
@@ -6525,6 +6837,10 @@ int main(int argc, char **argv)
         TestMemoryStream();
 #endif // TEST_STREAMS
 
         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);
 #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
 
         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);
 #ifdef TEST_USLEEP
     wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
     wxUsleep(3000);