X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/58b24a564c95091aea510e4c3c6cd50d92b1a3e4..edb89f7e356761b4fbdaebb8b5ebd5c7a7643da7:/samples/console/console.cpp diff --git a/samples/console/console.cpp b/samples/console/console.cpp index 003e3b99f3..7795300fae 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -17,6 +17,12 @@ // headers // ---------------------------------------------------------------------------- +#include + +#if wxUSE_GUI + #error "This sample can't be compiled in GUI mode." +#endif // wxUSE_GUI + #include #include @@ -37,7 +43,7 @@ //#define TEST_ARRAYS //#define TEST_CHARSET -//#define TEST_CMDLINE +#define TEST_CMDLINE //#define TEST_DATETIME //#define TEST_DIR //#define TEST_DLLLOADER @@ -56,6 +62,7 @@ //#define TEST_MIME //#define TEST_PATHLIST //#define TEST_REGCONF +//#define TEST_REGEX //#define TEST_REGISTRY #define TEST_SNGLINST //#define TEST_SOCKETS @@ -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 +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 + +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 // ---------------------------------------------------------------------------- @@ -4562,17 +4877,24 @@ int main(int argc, char **argv) } #ifdef TEST_SNGLINST - wxSingleInstanceChecker checker(_T("wxConsoleSample")); - if ( checker.IsAnotherRunning() ) + wxSingleInstanceChecker checker; + if ( checker.Create(_T(".wxconsole.lock")) ) { - wxPrintf(_T("Another instance of the program is running, exiting.\n")); + if ( checker.IsAnotherRunning() ) + { + wxPrintf(_T("Another instance of the program is running, exiting.\n")); - return 1; - } + return 1; + } - // wait some time to give time to launch another instance - wxPrintf(_T("Press \"Enter\" to continue...")); - wxFgetc(stdin); + // wait some time to give time to launch another instance + wxPrintf(_T("Press \"Enter\" to continue...")); + wxFgetc(stdin); + } + else // failed to create + { + wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n")); + } #endif // TEST_SNGLINST #ifdef TEST_CHARSET @@ -4582,13 +4904,17 @@ int main(int argc, char **argv) #ifdef TEST_CMDLINE static const wxCmdLineEntryDesc cmdLineDesc[] = { + { wxCMD_LINE_SWITCH, _T("h"), _T("help"), "show this help message", + wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, { wxCMD_LINE_SWITCH, "v", "verbose", "be verbose" }, { wxCMD_LINE_SWITCH, "q", "quiet", "be quiet" }, { wxCMD_LINE_OPTION, "o", "output", "output file" }, { wxCMD_LINE_OPTION, "i", "input", "input dir" }, - { wxCMD_LINE_OPTION, "s", "size", "output block size", wxCMD_LINE_VAL_NUMBER }, - { wxCMD_LINE_OPTION, "d", "date", "output file date", wxCMD_LINE_VAL_DATE }, + { wxCMD_LINE_OPTION, "s", "size", "output block size", + wxCMD_LINE_VAL_NUMBER }, + { wxCMD_LINE_OPTION, "d", "date", "output file date", + wxCMD_LINE_VAL_DATE }, { wxCMD_LINE_PARAM, NULL, NULL, "input file", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE }, @@ -4623,16 +4949,14 @@ int main(int argc, char **argv) { TestPChar(); TestString(); - } TestStringSub(); - if ( 0 ) - { TestStringConstruction(); TestStringFormat(); TestStringFind(); TestStringTokenizer(); TestStringReplace(); } + TestStringMatch(); #endif // TEST_STRINGS #ifdef TEST_ARRAYS @@ -4754,6 +5078,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); @@ -4789,8 +5134,9 @@ int main(int argc, char **argv) TestAddition(); TestLongLongConversion(); TestBitOperations(); + TestLongLongComparison(); } - TestLongLongComparison(); + TestLongLongPrint(); #endif // TEST_LONGLONG #ifdef TEST_HASH @@ -4810,8 +5156,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 @@ -4822,6 +5172,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(); @@ -4836,27 +5198,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();