]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/console/console.cpp
even controls with transparent background should draw it if they have an explicitly...
[wxWidgets.git] / samples / console / console.cpp
index af40ac2e2c3973363cf09de17d579806c7903609..c2e691b4015027267ccfc2fbff59e3f97eed0e23 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        samples/console/console.cpp
-// Purpose:     a sample console (as opposed to GUI) progam using wxWidgets
+// Purpose:     A sample console (as opposed to GUI) program using wxWidgets
 // Author:      Vadim Zeitlin
 // Modified by:
 // Created:     04.10.99
@@ -25,6 +25,8 @@
 #include "wx/file.h"
 #include "wx/app.h"
 #include "wx/log.h"
+#include "wx/apptrait.h"
+#include "wx/platinfo.h"
 
 // without this pragma, the stupid compiler precompiles #defines below so that
 // changing them doesn't "take place" later!
@@ -53,7 +55,7 @@
     #define TEST_CMDLINE
     #define TEST_DATETIME
     #define TEST_DIR
-    #define TEST_DLLLOADER
+    #define TEST_DYNLIB
     #define TEST_ENVIRON
     #define TEST_EXECUTE
     #define TEST_FILE
@@ -65,6 +67,7 @@
     #define TEST_LOCALE
     #define TEST_LOG
     #define TEST_MIME
+    #define TEST_MODULE
     #define TEST_PATHLIST
     #define TEST_ODBC
     #define TEST_PRINTF
@@ -74,6 +77,7 @@
     #define TEST_SCOPEGUARD
     #define TEST_SNGLINST
 //    #define TEST_SOCKETS  --FIXME! (RN)
+    #define TEST_STACKWALKER
     #define TEST_STDPATHS
     #define TEST_STREAMS
     #define TEST_TEXTSTREAM
@@ -84,7 +88,7 @@
     #define TEST_WCHAR
     #define TEST_ZIP
 #else // #if TEST_ALL
-    #define TEST_DLLLOADER
+    #define TEST_STDPATHS
 #endif
 
 // some tests are interactive, define this to run them
@@ -132,7 +136,7 @@ static wxString MakePrintable(const wxChar *s)
 
 static void ShowCmdLine(const wxCmdLineParser& parser)
 {
-    wxString s = _T("Input files: ");
+    wxString s = _T("Command line parsed successfully:\nInput files: ");
 
     size_t count = parser.GetParamCount();
     for ( size_t param = 0; param < count; param++ )
@@ -200,7 +204,7 @@ static void TestCmdLineConvert()
 #ifdef __UNIX__
     static const wxChar *ROOTDIR = _T("/");
     static const wxChar *TESTDIR = _T("/usr/local/share");
-#elif defined(__WXMSW__)
+#elif defined(__WXMSW__) || defined(__DOS__) || defined(__OS2__)
     static const wxChar *ROOTDIR = _T("c:\\");
     static const wxChar *TESTDIR = _T("d:\\");
 #else
@@ -227,6 +231,8 @@ static void TestDirEnumHelper(wxDir& dir,
     wxPuts(wxEmptyString);
 }
 
+#if TEST_ALL
+
 static void TestDirEnum()
 {
     wxPuts(_T("*** Testing wxDir::GetFirst/GetNext ***"));
@@ -282,6 +288,8 @@ static void TestDirEnum()
     TestDirEnumHelper(dirNo);
 }
 
+#endif // TEST_ALL
+
 class DirPrintTraverser : public wxDirTraverser
 {
 public:
@@ -332,6 +340,8 @@ static void TestDirTraverse()
     dir.Traverse(traverser, wxEmptyString, wxDIR_DIRS | wxDIR_HIDDEN);
 }
 
+#if TEST_ALL
+
 static void TestDirExists()
 {
     wxPuts(_T("*** Testing wxDir::Exists() ***"));
@@ -365,13 +375,15 @@ static void TestDirExists()
     }
 }
 
+#endif // TEST_ALL
+
 #endif // TEST_DIR
 
 // ----------------------------------------------------------------------------
 // wxDllLoader
 // ----------------------------------------------------------------------------
 
-#ifdef TEST_DLLLOADER
+#ifdef TEST_DYNLIB
 
 #include "wx/dynlib.h"
 
@@ -388,7 +400,7 @@ static void TestDllLoad()
     #error "don't know how to test wxDllLoader on this platform"
 #endif
 
-    wxPuts(_T("*** testing wxDllLoader ***\n"));
+    wxPuts(_T("*** testing basic wxDynamicLibrary functions ***\n"));
 
     wxDynamicLibrary lib(LIB_NAME);
     if ( !lib.IsLoaded() )
@@ -397,7 +409,7 @@ static void TestDllLoad()
     }
     else
     {
-        typedef int (*wxStrlenType)(const char *);
+        typedef int (wxSTDCALL *wxStrlenType)(const char *);
         wxStrlenType pfnStrlen = (wxStrlenType)lib.GetSymbol(FUNC_NAME);
         if ( !pfnStrlen )
         {
@@ -418,10 +430,58 @@ static void TestDllLoad()
                 wxPuts(_T("... ok"));
             }
         }
+
+#ifdef __WXMSW__
+        static const wxChar *FUNC_NAME_AW = _T("lstrlen");
+
+        typedef int (wxSTDCALL *wxStrlenTypeAorW)(const wxChar *);
+        wxStrlenTypeAorW
+            pfnStrlenAorW = (wxStrlenTypeAorW)lib.GetSymbolAorW(FUNC_NAME_AW);
+        if ( !pfnStrlenAorW )
+        {
+            wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
+                     FUNC_NAME_AW, LIB_NAME);
+        }
+        else
+        {
+            if ( pfnStrlenAorW(_T("foobar")) != 6 )
+            {
+                wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
+            }
+        }
+#endif // __WXMSW__
     }
 }
 
-#endif // TEST_DLLLOADER
+#if defined(__WXMSW__) || defined(__UNIX__)
+
+static void TestDllListLoaded()
+{
+    wxPuts(_T("*** testing wxDynamicLibrary::ListLoaded() ***\n"));
+
+    puts("\nLoaded modules:");
+    wxDynamicLibraryDetailsArray dlls = wxDynamicLibrary::ListLoaded();
+    const size_t count = dlls.GetCount();
+    for ( size_t n = 0; n < count; ++n )
+    {
+        const wxDynamicLibraryDetails& details = dlls[n];
+        printf("%-45s", details.GetPath().mb_str());
+
+        void *addr;
+        size_t len;
+        if ( details.GetAddress(&addr, &len) )
+        {
+            printf(" %08lx:%08lx",
+                   (unsigned long)addr, (unsigned long)((char *)addr + len));
+        }
+
+        printf(" %s\n", details.GetVersion().mb_str());
+    }
+}
+
+#endif
+
+#endif // TEST_DYNLIB
 
 // ----------------------------------------------------------------------------
 // wxGet/SetEnv
@@ -660,6 +720,24 @@ static void TestFileCopy()
     wxPuts(wxEmptyString);
 }
 
+static void TestTempFile()
+{
+    wxPuts(_T("*** wxTempFile test ***"));
+
+    wxTempFile tmpFile;
+    if ( tmpFile.Open(_T("test2")) && tmpFile.Write(_T("the answer is 42")) )
+    {
+        if ( tmpFile.Commit() )
+            wxPuts(_T("File committed."));
+        else
+            wxPuts(_T("ERROR: could't commit temp file."));
+
+        wxRemoveFile(_T("test2"));
+    }
+
+    wxPuts(wxEmptyString);
+}
+
 #endif // TEST_FILE
 
 // ----------------------------------------------------------------------------
@@ -812,70 +890,6 @@ static void TestFileNameTemp()
     }
 }
 
-static void TestFileNameMakeRelative()
-{
-    wxPuts(_T("*** testing wxFileName::MakeRelativeTo() ***"));
-
-    for ( size_t n = 0; n < WXSIZEOF(filenames); n++ )
-    {
-        const FileNameInfo& fni = filenames[n];
-
-        wxFileName fn(fni.fullname, fni.format);
-
-        // choose the base dir of the same format
-        wxString base;
-        switch ( fni.format )
-        {
-            case wxPATH_UNIX:
-                base = _T("/usr/bin/");
-                break;
-
-            case wxPATH_DOS:
-                base = _T("c:\\");
-                break;
-
-            case wxPATH_MAC:
-            case wxPATH_VMS:
-                // TODO: I don't know how this is supposed to work there
-                continue;
-
-            case wxPATH_NATIVE: // make gcc happy
-            default:
-                wxFAIL_MSG( _T("unexpected path format") );
-        }
-
-        wxPrintf(_T("'%s' relative to '%s': "),
-               fn.GetFullPath(fni.format).c_str(), base.c_str());
-
-        if ( !fn.MakeRelativeTo(base, fni.format) )
-        {
-            wxPuts(_T("unchanged"));
-        }
-        else
-        {
-            wxPrintf(_T("'%s'\n"), fn.GetFullPath(fni.format).c_str());
-        }
-    }
-}
-
-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(wxEmptyString);
-}
-
 static void TestFileNameDirManip()
 {
     // TODO: test AppendDir(), RemoveDir(), ...
@@ -904,8 +918,8 @@ static void TestFileNameCwd()
 
 #ifdef TEST_FILETIME
 
-#include <wx/filename.h>
-#include <wx/datetime.h>
+#include "wx/filename.h"
+#include "wx/datetime.h"
 
 static void TestFileGetTimes()
 {
@@ -1388,6 +1402,80 @@ static void TestMimeAssociate()
 
 #endif // TEST_MIME
 
+// ----------------------------------------------------------------------------
+// module dependencies feature
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_MODULE
+
+#include "wx/module.h"
+
+class wxTestModule : public wxModule
+{
+protected:
+    virtual bool OnInit() { wxPrintf(_T("Load module: %s\n"), GetClassInfo()->GetClassName()); return true; }
+    virtual void OnExit() { wxPrintf(_T("Unload module: %s\n"), GetClassInfo()->GetClassName()); }
+};
+
+class wxTestModuleA : public wxTestModule
+{
+public:
+    wxTestModuleA();
+private:
+    DECLARE_DYNAMIC_CLASS(wxTestModuleA)
+};
+
+class wxTestModuleB : public wxTestModule
+{
+public:
+    wxTestModuleB();
+private:
+    DECLARE_DYNAMIC_CLASS(wxTestModuleB)
+};
+
+class wxTestModuleC : public wxTestModule
+{
+public:
+    wxTestModuleC();
+private:
+    DECLARE_DYNAMIC_CLASS(wxTestModuleC)
+};
+
+class wxTestModuleD : public wxTestModule
+{
+public:
+    wxTestModuleD();
+private:
+    DECLARE_DYNAMIC_CLASS(wxTestModuleD)
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxTestModuleC, wxModule)
+wxTestModuleC::wxTestModuleC()
+{
+    AddDependency(CLASSINFO(wxTestModuleD));
+}
+
+IMPLEMENT_DYNAMIC_CLASS(wxTestModuleA, wxModule)
+wxTestModuleA::wxTestModuleA()
+{
+    AddDependency(CLASSINFO(wxTestModuleB));
+    AddDependency(CLASSINFO(wxTestModuleD));
+}
+
+IMPLEMENT_DYNAMIC_CLASS(wxTestModuleD, wxModule)
+wxTestModuleD::wxTestModuleD()
+{
+}
+
+IMPLEMENT_DYNAMIC_CLASS(wxTestModuleB, wxModule)
+wxTestModuleB::wxTestModuleB()
+{
+    AddDependency(CLASSINFO(wxTestModuleD));
+    AddDependency(CLASSINFO(wxTestModuleC));
+}
+
+#endif // TEST_MODULE
+
 // ----------------------------------------------------------------------------
 // misc information functions
 // ----------------------------------------------------------------------------
@@ -1396,6 +1484,7 @@ static void TestMimeAssociate()
 
 #include "wx/utils.h"
 
+#if TEST_INTERACTIVE
 static void TestDiskInfo()
 {
     wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
@@ -1424,6 +1513,7 @@ static void TestDiskInfo()
         }
     }
 }
+#endif // TEST_INTERACTIVE
 
 static void TestOsInfo()
 {
@@ -1434,7 +1524,7 @@ static void TestOsInfo()
     wxPrintf(_T("Running under: %s, version %d.%d\n"),
             wxGetOsDescription().c_str(), major, minor);
 
-    wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory());
+    wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory().ToLong());
 
     wxPrintf(_T("Host name is %s (%s).\n"),
            wxGetHostName().c_str(), wxGetFullHostName().c_str());
@@ -1442,6 +1532,23 @@ static void TestOsInfo()
     wxPuts(wxEmptyString);
 }
 
+static void TestPlatformInfo()
+{
+    wxPuts(_T("*** Testing wxPlatformInfo functions ***\n"));
+
+    // get this platform
+    wxPlatformInfo plat;
+
+    wxPrintf(_T("Operating system family name is: %s\n"), plat.GetOperatingSystemFamilyName().c_str());
+    wxPrintf(_T("Operating system name is: %s\n"), plat.GetOperatingSystemIdName().c_str());
+    wxPrintf(_T("Port ID name is: %s\n"), plat.GetPortIdName().c_str());
+    wxPrintf(_T("Port ID short name is: %s\n"), plat.GetPortIdShortName().c_str());
+    wxPrintf(_T("Architecture is: %s\n"), plat.GetArchName().c_str());
+    wxPrintf(_T("Endianness is: %s\n"), plat.GetEndiannessName().c_str());
+
+    wxPuts(wxEmptyString);
+}
+
 static void TestUserInfo()
 {
     wxPuts(_T("*** Testing user info functions ***\n"));
@@ -1561,7 +1668,7 @@ static void TestRegExInteractive()
 
 #ifdef TEST_ODBC
 
-#include <wx/db.h>
+#include "wx/db.h"
 
 static void TestDbOpen()
 {
@@ -2120,9 +2227,9 @@ static void TestScopeGuard()
     wxON_BLOCK_EXIT2(function2, 3.14, 'p');
 
     Object obj;
-    wxON_BLOCK_EXIT_OBJ0(obj, &Object::method0);
-    wxON_BLOCK_EXIT_OBJ1(obj, &Object::method1, 7);
-    wxON_BLOCK_EXIT_OBJ2(obj, &Object::method2, 2.71, 'e');
+    wxON_BLOCK_EXIT_OBJ0(obj, Object::method0);
+    wxON_BLOCK_EXIT_OBJ1(obj, Object::method1, 7);
+    wxON_BLOCK_EXIT_OBJ2(obj, Object::method2, 2.71, 'e');
 
     wxScopeGuard dismissed = wxMakeGuard(function0);
     dismissed.Dismiss();
@@ -2601,6 +2708,75 @@ static void TestFtpUpload()
 
 #endif // TEST_FTP
 
+// ----------------------------------------------------------------------------
+// stack backtrace
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_STACKWALKER
+
+#if wxUSE_STACKWALKER
+
+#include "wx/stackwalk.h"
+
+class StackDump : public wxStackWalker
+{
+public:
+    StackDump(const char *argv0)
+        : wxStackWalker(argv0)
+    {
+    }
+
+    virtual void Walk(size_t skip = 1)
+    {
+        wxPuts(_T("Stack dump:"));
+
+        wxStackWalker::Walk(skip);
+    }
+
+protected:
+    virtual void OnStackFrame(const wxStackFrame& frame)
+    {
+        printf("[%2d] ", frame.GetLevel());
+
+        wxString name = frame.GetName();
+        if ( !name.empty() )
+        {
+            printf("%-20.40s", name.mb_str());
+        }
+        else
+        {
+            printf("0x%08lx", (unsigned long)frame.GetAddress());
+        }
+
+        if ( frame.HasSourceLocation() )
+        {
+            printf("\t%s:%d",
+                   frame.GetFileName().mb_str(),
+                   frame.GetLine());
+        }
+
+        puts("");
+
+        wxString type, val;
+        for ( size_t n = 0; frame.GetParam(n, &type, &name, &val); n++ )
+        {
+            printf("\t%s %s = %s\n", type.mb_str(), name.mb_str(), val.mb_str());
+        }
+    }
+};
+
+static void TestStackWalk(const char *argv0)
+{
+    wxPuts(_T("*** Testing wxStackWalker ***\n"));
+
+    StackDump dump(argv0);
+    dump.Walk();
+}
+
+#endif // wxUSE_STACKWALKER
+
+#endif // TEST_STACKWALKER
+
 // ----------------------------------------------------------------------------
 // standard paths
 // ----------------------------------------------------------------------------
@@ -2615,14 +2791,25 @@ static void TestStandardPaths()
 
     wxTheApp->SetAppName(_T("console"));
 
-    wxStandardPaths& stdp = wxStandardPaths::Get();
+    wxStandardPathsBase& stdp = wxStandardPaths::Get();
     wxPrintf(_T("Config dir (sys):\t%s\n"), stdp.GetConfigDir().c_str());
     wxPrintf(_T("Config dir (user):\t%s\n"), stdp.GetUserConfigDir().c_str());
     wxPrintf(_T("Data dir (sys):\t\t%s\n"), stdp.GetDataDir().c_str());
     wxPrintf(_T("Data dir (sys local):\t%s\n"), stdp.GetLocalDataDir().c_str());
     wxPrintf(_T("Data dir (user):\t%s\n"), stdp.GetUserDataDir().c_str());
     wxPrintf(_T("Data dir (user local):\t%s\n"), stdp.GetUserLocalDataDir().c_str());
+    wxPrintf(_T("Documents dir:\t\t%s\n"), stdp.GetDocumentsDir().c_str());
+    wxPrintf(_T("Executable path:\t%s\n"), stdp.GetExecutablePath().c_str());
     wxPrintf(_T("Plugins dir:\t\t%s\n"), stdp.GetPluginsDir().c_str());
+    wxPrintf(_T("Resources dir:\t\t%s\n"), stdp.GetResourcesDir().c_str());
+    wxPrintf(_T("Localized res. dir:\t%s\n"),
+             stdp.GetLocalizedResourcesDir(_T("fr")).c_str());
+    wxPrintf(_T("Message catalogs dir:\t%s\n"),
+             stdp.GetLocalizedResourcesDir
+                  (
+                    _T("fr"),
+                    wxStandardPaths::ResourceCat_Messages
+                  ).c_str());
 }
 
 #endif // TEST_STDPATHS
@@ -2646,11 +2833,13 @@ static void TestFileStream()
         fsOut.Write("foo", 3);
     }
 
-    wxFileInputStream fsIn(filename);
-    wxPrintf(_T("File stream size: %u\n"), fsIn.GetSize());
-    while ( !fsIn.Eof() )
     {
-        wxPutchar(fsIn.GetC());
+        wxFileInputStream fsIn(filename);
+        wxPrintf(_T("File stream size: %u\n"), fsIn.GetSize());
+        while ( !fsIn.Eof() )
+        {
+            wxPutchar(fsIn.GetC());
+        }
     }
 
     if ( !wxRemoveFile(filename) )
@@ -2700,7 +2889,7 @@ static void TestMemoryStream()
 
 #ifdef TEST_TIMER
 
-#include "wx/timer.h"
+#include "wx/stopwatch.h"
 #include "wx/utils.h"
 
 static void TestStopWatch()
@@ -2961,7 +3150,7 @@ static void TestVCardRead()
 
         wxPrintf(_T("Full name from wxVCard API: %s\n"), value.c_str());
 
-        // now show how to deal with multiply occuring properties
+        // now show how to deal with multiply occurring properties
         DumpVCardAddresses(vcard);
         DumpVCardPhoneNumbers(vcard);
 
@@ -3980,6 +4169,24 @@ static void TestSemaphore()
 
 int main(int argc, char **argv)
 {
+#if wxUSE_UNICODE
+    wxChar **wxArgv = new wxChar *[argc + 1];
+
+    {
+        int n;
+
+        for (n = 0; n < argc; n++ )
+        {
+            wxMB2WXbuf warg = wxConvertMB2WX(argv[n]);
+            wxArgv[n] = wxStrdup(warg);
+        }
+
+        wxArgv[n] = NULL;
+    }
+#else // !wxUSE_UNICODE
+    #define wxArgv argv
+#endif // wxUSE_UNICODE/!wxUSE_UNICODE
+
     wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, "program");
 
     wxInitializer initializer;
@@ -4035,34 +4242,7 @@ int main(int argc, char **argv)
         { wxCMD_LINE_NONE }
     };
 
-#if wxUSE_UNICODE
-    wxChar **wargv = new wxChar *[argc + 1];
-
-    {
-        int n;
-
-        for (n = 0; n < argc; n++ )
-        {
-            wxMB2WXbuf warg = wxConvertMB2WX(argv[n]);
-            wargv[n] = wxStrdup(warg);
-        }
-
-        wargv[n] = NULL;
-    }
-
-    #define argv wargv
-#endif // wxUSE_UNICODE
-
-    wxCmdLineParser parser(cmdLineDesc, argc, argv);
-
-#if wxUSE_UNICODE
-    {
-        for ( int n = 0; n < argc; n++ )
-            free(wargv[n]);
-
-        delete [] wargv;
-    }
-#endif // wxUSE_UNICODE
+    wxCmdLineParser parser(cmdLineDesc, argc, wxArgv);
 
     parser.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
                      wxCMD_LINE_VAL_STRING,
@@ -4094,9 +4274,10 @@ int main(int argc, char **argv)
     TestDirTraverse();
 #endif // TEST_DIR
 
-#ifdef TEST_DLLLOADER
+#ifdef TEST_DYNLIB
     TestDllLoad();
-#endif // TEST_DLLLOADER
+    TestDllListLoaded();
+#endif // TEST_DYNLIB
 
 #ifdef TEST_ENVIRON
     TestEnvironment();
@@ -4142,13 +4323,10 @@ int main(int argc, char **argv)
     TestFileRead();
     TestTextFileRead();
     TestFileCopy();
+    TestTempFile();
 #endif // TEST_FILE
 
 #ifdef TEST_FILENAME
-    TestFileNameConstruction();
-    TestFileNameMakeRelative();
-    TestFileNameMakeAbsolute();
-    TestFileNameSplit();
     TestFileNameTemp();
     TestFileNameCwd();
     TestFileNameDirManip();
@@ -4190,20 +4368,19 @@ int main(int argc, char **argv)
     wxLog::AddTraceMask(_T("mime"));
     #if TEST_ALL
         TestMimeEnum();
+    #endif
         TestMimeOverride();
         TestMimeAssociate();
-    #endif
     TestMimeFilename();
 #endif // TEST_MIME
 
 #ifdef TEST_INFO_FUNCTIONS
-    #if TEST_ALL
-        TestOsInfo();
-        TestUserInfo();
+    TestOsInfo();
+    TestPlatformInfo();
+    TestUserInfo();
 
-        #if TEST_INTERACTIVE
-            TestDiskInfo();
-        #endif
+    #if TEST_INTERACTIVE
+        TestDiskInfo();
     #endif
 #endif // TEST_INFO_FUNCTIONS
 
@@ -4276,17 +4453,10 @@ int main(int argc, char **argv)
 
 #ifdef TEST_DATETIME
     #if TEST_ALL
-        TestTimeSet();
         TestTimeStatic();
         TestTimeRange();
         TestTimeZones();
-        TestTimeTicks();
-        TestTimeJDN();
         TestTimeDST();
-        TestTimeWDays();
-        TestTimeWNumber();
-        TestTimeParse();
-        TestTimeArithmetics();
         TestTimeHolidays();
         TestTimeSpanFormat();
         TestTimeMS();
@@ -4303,6 +4473,12 @@ int main(int argc, char **argv)
     TestScopeGuard();
 #endif
 
+#ifdef TEST_STACKWALKER
+#if wxUSE_STACKWALKER
+    TestStackWalk(argv[0]);
+#endif
+#endif // TEST_STACKWALKER
+
 #ifdef TEST_STDPATHS
     TestStandardPaths();
 #endif
@@ -4331,8 +4507,16 @@ int main(int argc, char **argv)
     TestZipFileSystem();
 #endif // TEST_ZIP
 
+#if wxUSE_UNICODE
+    {
+        for ( int n = 0; n < argc; n++ )
+            free(wxArgv[n]);
+
+        delete [] wxArgv;
+    }
+#endif // wxUSE_UNICODE
+
     wxUnusedVar(argc);
     wxUnusedVar(argv);
     return 0;
 }
-