]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/console/console.cpp
oops, forgot to fix wxHtmlTag dtor
[wxWidgets.git] / samples / console / console.cpp
index fe75234c257c23f64e426dcb3d47c1b662bbc358..67a1b7f2b2ed7b71c7dc2ac92f18b795af27ddd9 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>
 
 // what to test (in alphabetic order)?
 
-#define TEST_ARRAYS
-#define TEST_CHARSET
-#define TEST_CMDLINE
-#define TEST_DATETIME
-#define TEST_DIR
-#define TEST_DLLLOADER
-#define TEST_ENVIRON
-#define TEST_EXECUTE
-#define TEST_FILE
-#define TEST_FILECONF
-#define TEST_FILENAME
-#define TEST_FTP
-#define TEST_HASH
-#define TEST_INFO_FUNCTIONS
-#define TEST_LIST
-#define TEST_LOCALE
-#define TEST_LOG
-#define TEST_LONGLONG
-#define TEST_MIME
-#define TEST_PATHLIST
-#define TEST_REGCONF
-#define TEST_REGISTRY
-#define TEST_SNGLINST
-#define TEST_SOCKETS
-#define TEST_STREAMS
-#define TEST_STRINGS
-#define TEST_THREADS
-#define TEST_TIMER
+//#define TEST_ARRAYS
+//#define TEST_CHARSET
+//#define TEST_CMDLINE
+//#define TEST_DATETIME
+//#define TEST_DIR
+//#define TEST_DLLLOADER
+//#define TEST_ENVIRON
+//#define TEST_EXECUTE
+//#define TEST_FILE
+//#define TEST_FILECONF
+//#define TEST_FILENAME
+//#define TEST_FTP
+//#define TEST_HASH
+//#define TEST_INFO_FUNCTIONS
+//#define TEST_LIST
+//#define TEST_LOCALE
+//#define TEST_LOG
+//#define TEST_LONGLONG
+//#define TEST_MIME
+//#define TEST_PATHLIST
+//#define TEST_REGCONF
+#define TEST_REGEX
+//#define TEST_REGISTRY
+//#define TEST_SNGLINST
+//#define TEST_SOCKETS
+//#define TEST_STREAMS
+//#define TEST_STRINGS
+//#define TEST_THREADS
+//#define TEST_TIMER
 //#define TEST_VCARD            -- don't enable this (VZ)
-#define TEST_WCHAR
-#define TEST_ZIP
-#define TEST_ZLIB
+//#define TEST_WCHAR
+//#define TEST_ZIP
+//#define TEST_ZLIB
 
 #ifdef TEST_SNGLINST
     #include <wx/snglinst.h>
@@ -1704,6 +1711,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
 // ----------------------------------------------------------------------------
@@ -4547,6 +4775,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
 
 // ----------------------------------------------------------------------------
@@ -4632,16 +4898,14 @@ int main(int argc, char **argv)
     {
         TestPChar();
         TestString();
-    }
         TestStringSub();
-    if ( 0 )
-    {
         TestStringConstruction();
         TestStringFormat();
         TestStringFind();
         TestStringTokenizer();
         TestStringReplace();
     }
+    TestStringMatch();
 #endif // TEST_STRINGS
 
 #ifdef TEST_ARRAYS
@@ -4763,6 +5027,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);
@@ -4831,6 +5116,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();
@@ -4845,27 +5142,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();