]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/console/console.cpp
fix for wxExecute(subprocess which produces a lot of output) bug
[wxWidgets.git] / samples / console / console.cpp
index 9db3141247201196af7574c1566d4d46279000b5..f7f43fc2ea04270a6b01d316b47268d251ca4399 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
+#include <wx/defs.h>
+
+#if wxUSE_GUI
+    #error "This sample can't be compiled in GUI mode."
+#endif // wxUSE_GUI
+
 #include <stdio.h>
 
 #include <wx/string.h>
@@ -48,7 +54,7 @@
 //#define TEST_FILENAME
 //#define TEST_FTP
 //#define TEST_HASH
-//#define TEST_INFO_FUNCTIONS
+#define TEST_INFO_FUNCTIONS
 //#define TEST_LIST
 //#define TEST_LOCALE
 //#define TEST_LOG
@@ -56,8 +62,9 @@
 //#define TEST_MIME
 //#define TEST_PATHLIST
 //#define TEST_REGCONF
+//#define TEST_REGEX
 //#define TEST_REGISTRY
-#define TEST_SNGLINST
+//#define TEST_SNGLINST
 //#define TEST_SOCKETS
 //#define TEST_STREAMS
 //#define TEST_STRINGS
@@ -323,8 +330,8 @@ static void TestDirTraverse()
     printf("There are %u files under '%s'\n", n, TESTDIR);
     if ( n > 1 )
     {
-        printf("First one is '%s'\n", files[0u]);
-        printf(" last one is '%s'\n", files[n - 1]);
+        printf("First one is '%s'\n", files[0u].c_str());
+        printf(" last one is '%s'\n", files[n - 1].c_str());
     }
 
     // enum again with custom traverser
@@ -422,7 +429,7 @@ static void TestEnvironment()
     printf("After 2nd wxSetEnv: getenv(%s) = %s\n",  var, MyGetEnv(var).c_str());
     wxUnsetEnv(var);
     printf("After wxUnsetEnv: getenv(%s) = %s\n",  var, MyGetEnv(var).c_str());
-    printf("PATH = %s\n",  MyGetEnv(_T("PATH")));
+    printf("PATH = %s\n",  MyGetEnv(_T("PATH")).c_str());
 }
 
 #endif // TEST_ENVIRON
@@ -1357,6 +1364,35 @@ static void TestMimeAssociate()
 
 #include <wx/utils.h>
 
+static void TestDiskInfo()
+{
+    puts("*** Testing wxGetDiskSpace() ***");
+
+    for ( ;; )
+    {
+        char pathname[128];
+        printf("\nEnter a directory name: ");
+        if ( !fgets(pathname, WXSIZEOF(pathname), stdin) )
+            break;
+
+        // kill the last '\n'
+        pathname[strlen(pathname) - 1] = 0;
+
+        wxLongLong total, free;
+        if ( !wxGetDiskSpace(pathname, &total, &free) )
+        {
+            wxPuts(_T("ERROR: wxGetDiskSpace failed."));
+        }
+        else
+        {
+            wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
+                    (total / 1024).ToString().c_str(),
+                    (free / 1024).ToString().c_str(),
+                    pathname);
+        }
+    }
+}
+
 static void TestOsInfo()
 {
     puts("*** Testing OS info functions ***\n");
@@ -1403,6 +1439,17 @@ static void TestUserInfo()
 // get a random 64 bit number
 #define RAND_LL()   MAKE_LL(rand(), rand(), rand(), rand())
 
+static const long testLongs[] =
+{
+    0,
+    1,
+    -1,
+    LONG_MAX,
+    LONG_MIN,
+    0x1234,
+    -0x1234
+};
+
 #if wxUSE_LONGLONG_WX
 inline bool operator==(const wxLongLongWx& a, const wxLongLongNative& b)
     { return a.GetHi() == b.GetHi() && a.GetLo() == b.GetLo(); }
@@ -1625,19 +1672,9 @@ static void TestBitOperations()
 
 static void TestLongLongComparison()
 {
+#if wxUSE_LONGLONG_WX
     puts("*** Testing wxLongLong comparison ***\n");
 
-    static const long testLongs[] =
-    {
-        0,
-        1,
-        -1,
-        LONG_MAX,
-        LONG_MIN,
-        0x1234,
-        -0x1234
-    };
-
     static const long ls[2] =
     {
         0x1234,
@@ -1646,7 +1683,7 @@ static void TestLongLongComparison()
 
     wxLongLongWx lls[2];
     lls[0] = ls[0];
-    lls[1] = ls[1]; 
+    lls[1] = ls[1];
 
     for ( size_t n = 0; n < WXSIZEOF(testLongs); n++ )
     {
@@ -1670,6 +1707,24 @@ static void TestLongLongComparison()
                    res == (ls[m] == testLongs[n]) ? "ok" : "ERROR");
         }
     }
+#endif // wxUSE_LONGLONG_WX
+}
+
+static void TestLongLongPrint()
+{
+    wxPuts(_T("*** Testing wxLongLong printing ***\n"));
+
+    for ( size_t n = 0; n < WXSIZEOF(testLongs); n++ )
+    {
+        wxLongLong ll = testLongs[n];
+        wxPrintf(_T("%ld == %s\n"), testLongs[n], ll.ToString().c_str());
+    }
+
+    wxLongLong ll(0x12345678, 0x87654321);
+    wxPrintf(_T("0x1234567887654321 = %s\n"), ll.ToString().c_str());
+
+    ll.Negate();
+    wxPrintf(_T("-0x1234567887654321 = %s\n"), ll.ToString().c_str());
 }
 
 #undef MAKE_LL
@@ -1702,6 +1757,227 @@ static void TestPathList()
 
 #endif // TEST_PATHLIST
 
+// ----------------------------------------------------------------------------
+// regular expressions
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_REGEX
+
+#include <wx/regex.h>
+
+static void TestRegExCompile()
+{
+    wxPuts(_T("*** Testing RE compilation ***\n"));
+
+    static struct RegExCompTestData
+    {
+        const wxChar *pattern;
+        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 },
+    };
+
+    wxRegEx re;
+    for ( size_t n = 0; n < WXSIZEOF(regExCompTestData); n++ )
+    {
+        const RegExCompTestData& data = regExCompTestData[n];
+        bool ok = re.Compile(data.pattern);
+
+        wxPrintf(_T("'%s' is %sa valid RE (%s)\n"),
+                 data.pattern,
+                 ok ? _T("") : _T("not "),
+                 ok == data.correct ? _T("ok") : _T("ERROR"));
+    }
+}
+
+static void TestRegExMatch()
+{
+    wxPuts(_T("*** Testing RE matching ***\n"));
+
+    static struct RegExMatchTestData
+    {
+        const wxChar *pattern;
+        const wxChar *text;
+        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 },
+    };
+
+    for ( size_t n = 0; n < WXSIZEOF(regExMatchTestData); n++ )
+    {
+        const RegExMatchTestData& data = regExMatchTestData[n];
+
+        wxRegEx re(data.pattern);
+        bool ok = re.Matches(data.text);
+
+        wxPrintf(_T("'%s' %s %s (%s)\n"),
+                 data.pattern,
+                 ok ? _T("matches") : _T("doesn't match"),
+                 data.text,
+                 ok == data.correct ? _T("ok") : _T("ERROR"));
+    }
+}
+
+static void TestRegExSubmatch()
+{
+    wxPuts(_T("*** Testing RE subexpressions ***\n"));
+
+    wxRegEx re(_T("([[:alpha:]]+) ([[:alpha:]]+) ([[:digit:]]+).*([[:digit:]]+)$"));
+    if ( !re.IsValid() )
+    {
+        wxPuts(_T("ERROR: compilation failed."));
+        return;
+    }
+
+    wxString text = _T("Fri Jul 13 18:37:52 CEST 2001");
+
+    if ( !re.Matches(text) )
+    {
+        wxPuts(_T("ERROR: match expected."));
+    }
+    else
+    {
+        wxPrintf(_T("Entire match: %s\n"), re.GetMatch(text).c_str());
+
+        wxPrintf(_T("Date: %s/%s/%s, wday: %s\n"),
+                 re.GetMatch(text, 3).c_str(),
+                 re.GetMatch(text, 2).c_str(),
+                 re.GetMatch(text, 4).c_str(),
+                 re.GetMatch(text, 1).c_str());
+    }
+}
+
+static void TestRegExReplacement()
+{
+    wxPuts(_T("*** Testing RE replacement ***"));
+
+    static struct RegExReplTestData
+    {
+        const wxChar *text;
+        const wxChar *repl;
+        const wxChar *result;
+        size_t count;
+    } regExReplTestData[] =
+    {
+        { _T("foo123"), _T("bar"), _T("bar"), 1 },
+        { _T("foo123"), _T("\\2\\1"), _T("123foo"), 1 },
+        { _T("foo_123"), _T("\\2\\1"), _T("123foo"), 1 },
+        { _T("123foo"), _T("bar"), _T("123foo"), 0 },
+        { _T("123foo456foo"), _T("&&"), _T("123foo456foo456foo"), 1 },
+        { _T("foo123foo123"), _T("bar"), _T("barbar"), 2 },
+        { _T("foo123_foo456_foo789"), _T("bar"), _T("bar_bar_bar"), 3 },
+    };
+
+    const wxChar *pattern = _T("([a-z]+)[^0-9]*([0-9]+)");
+    wxRegEx re = pattern;
+
+    wxPrintf(_T("Using pattern '%s' for replacement.\n"), pattern);
+
+    for ( size_t n = 0; n < WXSIZEOF(regExReplTestData); n++ )
+    {
+        const RegExReplTestData& data = regExReplTestData[n];
+
+        wxString text = data.text;
+        size_t nRepl = re.Replace(&text, data.repl);
+
+        wxPrintf(_T("%s =~ s/RE/%s/g: %u match%s, result = '%s' ("),
+                 data.text, data.repl,
+                 nRepl, nRepl == 1 ? _T("") : _T("es"),
+                 text.c_str());
+        if ( text == data.result && nRepl == data.count )
+        {
+            wxPuts(_T("ok)"));
+        }
+        else
+        {
+            wxPrintf(_T("ERROR: should be %u and '%s')\n"),
+                     data.count, data.result);
+        }
+    }
+}
+
+static void TestRegExInteractive()
+{
+    wxPuts(_T("*** Testing RE interactively ***"));
+
+    for ( ;; )
+    {
+        char pattern[128];
+        printf("\nEnter a pattern: ");
+        if ( !fgets(pattern, WXSIZEOF(pattern), stdin) )
+            break;
+
+        // kill the last '\n'
+        pattern[strlen(pattern) - 1] = 0;
+
+        wxRegEx re;
+        if ( !re.Compile(pattern) )
+        {
+            continue;
+        }
+
+        char text[128];
+        for ( ;; )
+        {
+            printf("Enter text to match: ");
+            if ( !fgets(text, WXSIZEOF(text), stdin) )
+                break;
+
+            // kill the last '\n'
+            text[strlen(text) - 1] = 0;
+
+            if ( !re.Matches(text) )
+            {
+                printf("No match.\n");
+            }
+            else
+            {
+                printf("Pattern matches at '%s'\n", re.GetMatch(text).c_str());
+
+                size_t start, len;
+                for ( size_t n = 1; ; n++ )
+                {
+                    if ( !re.GetMatch(&start, &len, n) )
+                    {
+                        break;
+                    }
+
+                    printf("Subexpr %u matched '%s'\n",
+                           n, wxString(text + start, len).c_str());
+                }
+            }
+        }
+    }
+}
+
+#endif // TEST_REGEX
+
 // ----------------------------------------------------------------------------
 // registry and related stuff
 // ----------------------------------------------------------------------------
@@ -3809,6 +4085,7 @@ static void TestTimeSpanFormat()
         _T("(with ms) %H:%M:%S:%l"),
         _T("100%% of minutes is %M"),       // test "%%"
         _T("%D days and %H hours"),
+        _T("or also %S seconds"),
     };
 
     wxTimeSpan ts1(1, 2, 3, 4),
@@ -4545,6 +4822,44 @@ static void TestStringReplace()
     puts("");
 }
 
+static void TestStringMatch()
+{
+    wxPuts(_T("*** Testing wxString::Matches() ***"));
+
+    static const struct StringMatchTestData
+    {
+        const wxChar *text;
+        const wxChar *wildcard;
+        bool matches;
+    } stringMatchTestData[] =
+    {
+        { _T("foobar"), _T("foo*"), 1 },
+        { _T("foobar"), _T("*oo*"), 1 },
+        { _T("foobar"), _T("*bar"), 1 },
+        { _T("foobar"), _T("??????"), 1 },
+        { _T("foobar"), _T("f??b*"), 1 },
+        { _T("foobar"), _T("f?b*"), 0 },
+        { _T("foobar"), _T("*goo*"), 0 },
+        { _T("foobar"), _T("*foo"), 0 },
+        { _T("foobarfoo"), _T("*foo"), 1 },
+        { _T(""), _T("*"), 1 },
+        { _T(""), _T("?"), 0 },
+    };
+
+    for ( size_t n = 0; n < WXSIZEOF(stringMatchTestData); n++ )
+    {
+        const StringMatchTestData& data = stringMatchTestData[n];
+        bool matches = wxString(data.text).Matches(data.wildcard);
+        wxPrintf(_T("'%s' %s '%s' (%s)\n"),
+                 data.wildcard,
+                 matches ? _T("matches") : _T("doesn't match"),
+                 data.text,
+                 matches == data.matches ? _T("ok") : _T("ERROR"));
+    }
+
+    wxPuts(_T(""));
+}
+
 #endif // TEST_STRINGS
 
 // ----------------------------------------------------------------------------
@@ -4630,16 +4945,14 @@ int main(int argc, char **argv)
     {
         TestPChar();
         TestString();
-    }
         TestStringSub();
-    if ( 0 )
-    {
         TestStringConstruction();
         TestStringFormat();
         TestStringFind();
         TestStringTokenizer();
         TestStringReplace();
     }
+    TestStringMatch();
 #endif // TEST_STRINGS
 
 #ifdef TEST_ARRAYS
@@ -4761,6 +5074,27 @@ int main(int argc, char **argv)
     }
 #endif // TEST_FILENAME
 
+#ifdef TEST_FTP
+    wxLog::AddTraceMask(FTP_TRACE_MASK);
+    if ( TestFtpConnect() )
+    {
+            TestFtpFileSize();
+        if ( 0 )
+        {
+            TestFtpList();
+            TestFtpDownload();
+            TestFtpMisc();
+            TestFtpUpload();
+        }
+        if ( 0 )
+        TestFtpInteractive();
+    }
+    //else: connecting to the FTP server failed
+
+    if ( 0 )
+        TestFtpWuFtpd();
+#endif // TEST_FTP
+
 #ifdef TEST_THREADS
     int nCPUs = wxThread::GetCPUCount();
     printf("This system has %d CPUs\n", nCPUs);
@@ -4796,8 +5130,9 @@ int main(int argc, char **argv)
         TestAddition();
         TestLongLongConversion();
         TestBitOperations();
+        TestLongLongComparison();
     }
-    TestLongLongComparison();
+    TestLongLongPrint();
 #endif // TEST_LONGLONG
 
 #ifdef TEST_HASH
@@ -4817,8 +5152,12 @@ int main(int argc, char **argv)
 #endif // TEST_MIME
 
 #ifdef TEST_INFO_FUNCTIONS
-    TestOsInfo();
-    TestUserInfo();
+    TestDiskInfo();
+    if ( 0 )
+    {
+        TestOsInfo();
+        TestUserInfo();
+    }
 #endif // TEST_INFO_FUNCTIONS
 
 #ifdef TEST_PATHLIST
@@ -4829,6 +5168,18 @@ int main(int argc, char **argv)
     TestRegConfWrite();
 #endif // TEST_REGCONF
 
+#ifdef TEST_REGEX
+    // TODO: write a real test using src/regex/tests file
+    if ( 0 )
+    {
+        TestRegExCompile();
+        TestRegExMatch();
+        TestRegExSubmatch();
+        TestRegExInteractive();
+    }
+    TestRegExReplacement();
+#endif // TEST_REGEX
+
 #ifdef TEST_REGISTRY
     if ( 0 )
         TestRegistryRead();
@@ -4843,27 +5194,6 @@ int main(int argc, char **argv)
         TestSocketClient();
 #endif // TEST_SOCKETS
 
-#ifdef TEST_FTP
-    wxLog::AddTraceMask(FTP_TRACE_MASK);
-    if ( TestFtpConnect() )
-    {
-            TestFtpFileSize();
-        if ( 0 )
-        {
-            TestFtpList();
-            TestFtpDownload();
-            TestFtpMisc();
-            TestFtpUpload();
-        }
-        if ( 0 )
-        TestFtpInteractive();
-    }
-    //else: connecting to the FTP server failed
-
-    if ( 0 )
-        TestFtpWuFtpd();
-#endif // TEST_FTP
-
 #ifdef TEST_STREAMS
     if ( 0 )
     TestFileStream();