X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/551fe3a6f024a542d26ce8da202d76d8c83f3a6f..555d502fafd60eb3d448dfa6a5a6263d28119f31:/samples/console/console.cpp diff --git a/samples/console/console.cpp b/samples/console/console.cpp index 12d8911e08..f7f43fc2ea 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 @@ -36,7 +42,7 @@ // what to test (in alphabetic order)? //#define TEST_ARRAYS -#define TEST_CHARSET +//#define TEST_CHARSET //#define TEST_CMDLINE //#define TEST_DATETIME //#define TEST_DIR @@ -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,7 +62,9 @@ //#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 @@ -67,6 +75,10 @@ //#define TEST_ZIP //#define TEST_ZLIB +#ifdef TEST_SNGLINST + #include +#endif // TEST_SNGLINST + // ---------------------------------------------------------------------------- // test class for container objects // ---------------------------------------------------------------------------- @@ -206,6 +218,16 @@ static void ShowCmdLine(const wxCmdLineParser& parser) #include +#ifdef __UNIX__ + static const wxChar *ROOTDIR = _T("/"); + static const wxChar *TESTDIR = _T("/usr"); +#elif defined(__WXMSW__) + static const wxChar *ROOTDIR = _T("c:\\"); + static const wxChar *TESTDIR = _T("d:\\"); +#else + #error "don't know where the root directory is" +#endif + static void TestDirEnumHelper(wxDir& dir, int flags = wxDIR_DEFAULT, const wxString& filespec = wxEmptyString) @@ -228,6 +250,8 @@ static void TestDirEnumHelper(wxDir& dir, static void TestDirEnum() { + puts("*** Testing wxDir::GetFirst/GetNext ***"); + wxDir dir(wxGetCwd()); puts("Enumerating everything in current directory:"); @@ -248,13 +272,7 @@ static void TestDirEnum() puts("Enumerating files including hidden in current directory:"); TestDirEnumHelper(dir, wxDIR_FILES | wxDIR_HIDDEN); -#ifdef __UNIX__ - dir.Open("/"); -#elif defined(__WXMSW__) - dir.Open("c:\\"); -#else - #error "don't know where the root directory is" -#endif + dir.Open(ROOTDIR); puts("Enumerating everything in root directory:"); TestDirEnumHelper(dir, wxDIR_DEFAULT); @@ -273,6 +291,55 @@ static void TestDirEnum() TestDirEnumHelper(dirNo); } +class DirPrintTraverser : public wxDirTraverser +{ +public: + virtual wxDirTraverseResult OnFile(const wxString& filename) + { + return wxDIR_CONTINUE; + } + + virtual wxDirTraverseResult OnDir(const wxString& dirname) + { + wxString path, name, ext; + wxSplitPath(dirname, &path, &name, &ext); + + if ( !ext.empty() ) + name << _T('.') << ext; + + wxString indent; + for ( const wxChar *p = path.c_str(); *p; p++ ) + { + if ( wxIsPathSeparator(*p) ) + indent += _T(" "); + } + + printf("%s%s\n", indent.c_str(), name.c_str()); + + return wxDIR_CONTINUE; + } +}; + +static void TestDirTraverse() +{ + puts("*** Testing wxDir::Traverse() ***"); + + // enum all files + wxArrayString files; + size_t n = wxDir::GetAllFiles(TESTDIR, &files); + printf("There are %u files under '%s'\n", n, TESTDIR); + if ( 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 + wxDir dir(TESTDIR); + DirPrintTraverser traverser; + dir.Traverse(traverser, _T(""), wxDIR_DIRS | wxDIR_HIDDEN); +} + #endif // TEST_DIR // ---------------------------------------------------------------------------- @@ -362,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 @@ -1118,11 +1185,19 @@ static void TestDefaultLang() _T("klingonese"), // I bet on some systems it does exist... }; + wxPrintf(_T("The default system encoding is %s (%d)\n"), + wxLocale::GetSystemEncodingName().c_str(), + wxLocale::GetSystemEncoding()); + for ( size_t n = 0; n < WXSIZEOF(langStrings); n++ ) { const char *langStr = langStrings[n]; if ( langStr ) + { + // FIXME: this doesn't do anything at all under Windows, we need + // to create a new wxLocale! wxSetEnv(_T("LC_ALL"), langStr); + } int lang = gs_localeDefault.GetSystemLanguage(); printf("Locale for '%s' is %s.\n", @@ -1289,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"); @@ -1335,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(); } @@ -1557,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, @@ -1578,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++ ) { @@ -1602,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 @@ -1634,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 // ---------------------------------------------------------------------------- @@ -3741,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), @@ -4477,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 // ---------------------------------------------------------------------------- @@ -4485,11 +4868,35 @@ static void TestStringReplace() int main(int argc, char **argv) { - if ( !wxInitialize() ) + wxInitializer initializer; + if ( !initializer ) { fprintf(stderr, "Failed to initialize the wxWindows library, aborting."); + + return -1; } +#ifdef TEST_SNGLINST + wxSingleInstanceChecker checker; + if ( checker.Create(_T(".wxconsole.lock")) ) + { + if ( checker.IsAnotherRunning() ) + { + wxPrintf(_T("Another instance of the program is running, exiting.\n")); + + return 1; + } + + // 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 TestCharset(); #endif // TEST_CHARSET @@ -4538,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 @@ -4601,7 +5006,9 @@ int main(int argc, char **argv) #endif // TEST_ARRAYS #ifdef TEST_DIR - TestDirEnum(); + if ( 0 ) + TestDirEnum(); + TestDirTraverse(); #endif // TEST_DIR #ifdef TEST_DLLLOADER @@ -4667,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); @@ -4702,8 +5130,9 @@ int main(int argc, char **argv) TestAddition(); TestLongLongConversion(); TestBitOperations(); + TestLongLongComparison(); } - TestLongLongComparison(); + TestLongLongPrint(); #endif // TEST_LONGLONG #ifdef TEST_HASH @@ -4723,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 @@ -4735,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(); @@ -4749,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(); @@ -4832,8 +5256,6 @@ int main(int argc, char **argv) TestZlibStreamRead(); #endif // TEST_ZLIB - wxUninitialize(); - return 0; }