X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b11a23f38ffd9fd747f5e1c52b1ea529aff24439..9d705dfa81cd65de8fe900a45b80494fa201ef0a:/samples/console/console.cpp?ds=sidebyside diff --git a/samples/console/console.cpp b/samples/console/console.cpp index 5e8f8eab25..662ca1c85a 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#include +#include "wx/defs.h" #if wxUSE_GUI #error "This sample can't be compiled in GUI mode." @@ -25,9 +25,9 @@ #include -#include -#include -#include +#include "wx/string.h" +#include "wx/file.h" +#include "wx/app.h" // without this pragma, the stupid compiler precompiles #defines below so that // changing them doesn't "take place" later! @@ -50,8 +50,9 @@ //#define TEST_ENVIRON //#define TEST_EXECUTE //#define TEST_FILE -//#define TEST_FILECONF +#define TEST_FILECONF //#define TEST_FILENAME +//#define TEST_FILETIME //#define TEST_FTP //#define TEST_HASH //#define TEST_INFO_FUNCTIONS @@ -62,11 +63,12 @@ //#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_STRINGS //#define TEST_THREADS //#define TEST_TIMER //#define TEST_VCARD -- don't enable this (VZ) @@ -75,7 +77,7 @@ //#define TEST_ZLIB #ifdef TEST_SNGLINST - #include + #include "wx/snglinst.h" #endif // TEST_SNGLINST // ---------------------------------------------------------------------------- @@ -133,7 +135,7 @@ static wxString MakePrintable(const wxChar *s) #ifdef TEST_CHARSET -#include +#include "wx/fontmap.h" static void TestCharset() { @@ -173,8 +175,8 @@ static void TestCharset() #ifdef TEST_CMDLINE -#include -#include +#include "wx/cmdline.h" +#include "wx/datetime.h" static void ShowCmdLine(const wxCmdLineParser& parser) { @@ -215,7 +217,7 @@ static void ShowCmdLine(const wxCmdLineParser& parser) #ifdef TEST_DIR -#include +#include "wx/dir.h" #ifdef __UNIX__ static const wxChar *ROOTDIR = _T("/"); @@ -347,7 +349,7 @@ static void TestDirTraverse() #ifdef TEST_DLLLOADER -#include +#include "wx/dynlib.h" static void TestDllLoad() { @@ -371,7 +373,7 @@ static void TestDllLoad() } else { - typedef int (*strlenType)(char *); + typedef int (*strlenType)(const char *); strlenType pfnStrlen = (strlenType)wxDllLoader::GetSymbol(dllHandle, FUNC_NAME); if ( !pfnStrlen ) { @@ -402,7 +404,7 @@ static void TestDllLoad() #ifdef TEST_ENVIRON -#include +#include "wx/utils.h" static wxString MyGetEnv(const wxString& var) { @@ -439,7 +441,7 @@ static void TestEnvironment() #ifdef TEST_EXECUTE -#include +#include "wx/utils.h" static void TestExecute() { @@ -506,9 +508,9 @@ static void TestExecute() #ifdef TEST_FILE -#include -#include -#include +#include "wx/file.h" +#include "wx/ffile.h" +#include "wx/textfile.h" static void TestFileRead() { @@ -641,8 +643,8 @@ static void TestFileCopy() #ifdef TEST_FILECONF -#include -#include +#include "wx/confbase.h" +#include "wx/fileconf.h" static const struct FileConfTestData { @@ -704,7 +706,7 @@ static void TestFileConfRead() #ifdef TEST_FILENAME -#include +#include "wx/filename.h" static struct FileNameInfo { @@ -787,13 +789,55 @@ static void TestFileNameCwd() #endif // TEST_FILENAME +// ---------------------------------------------------------------------------- +// wxFileName time functions +// ---------------------------------------------------------------------------- + +#ifdef TEST_FILETIME + +#include +#include + +static void TestFileGetTimes() +{ + wxFileName fn(_T("testdata.fc")); + + wxDateTime dtAccess, dtMod, dtChange; + if ( !fn.GetTimes(&dtAccess, &dtMod, &dtChange) ) + { + wxPrintf(_T("ERROR: GetTimes() failed.\n")); + } + else + { + static const wxChar *fmt = _T("%Y-%b-%d %H:%M:%S"); + + wxPrintf(_T("File times for '%s':\n"), fn.GetFullPath().c_str()); + wxPrintf(_T("Access: \t%s\n"), dtAccess.Format(fmt).c_str()); + wxPrintf(_T("Mod/creation:\t%s\n"), dtMod.Format(fmt).c_str()); + wxPrintf(_T("Change: \t%s\n"), dtChange.Format(fmt).c_str()); + } +} + +static void TestFileSetTimes() +{ + wxFileName fn(_T("testdata.fc")); + + wxDateTime dtAccess, dtMod, dtChange; + if ( !fn.Touch() ) + { + wxPrintf(_T("ERROR: Touch() failed.\n")); + } +} + +#endif // TEST_FILETIME + // ---------------------------------------------------------------------------- // wxHashTable // ---------------------------------------------------------------------------- #ifdef TEST_HASH -#include +#include "wx/hash.h" struct Foo { @@ -810,7 +854,7 @@ size_t Foo::count = 0; WX_DECLARE_LIST(Foo, wxListFoos); WX_DECLARE_HASH(Foo, wxListFoos, wxHashFoos); -#include +#include "wx/listimpl.cpp" WX_DEFINE_LIST(wxListFoos); @@ -879,10 +923,10 @@ static void TestHash() #ifdef TEST_LIST -#include +#include "wx/list.h" WX_DECLARE_LIST(Bar, wxListBars); -#include +#include "wx/listimpl.cpp" WX_DEFINE_LIST(wxListBars); static void TestListCtor() @@ -1212,7 +1256,7 @@ static void TestDefaultLang() #ifdef TEST_MIME -#include +#include "wx/mimetype.h" static void TestMimeEnum() { @@ -1361,7 +1405,36 @@ static void TestMimeAssociate() #ifdef TEST_INFO_FUNCTIONS -#include +#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() { @@ -1400,8 +1473,8 @@ static void TestUserInfo() #ifdef TEST_LONGLONG -#include -#include +#include "wx/longlong.h" +#include "wx/timer.h" // make a 64 bit number from 4 16 bit ones #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3) @@ -1409,6 +1482,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(); } @@ -1634,17 +1718,6 @@ 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, @@ -1653,7 +1726,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++ ) { @@ -1680,6 +1753,23 @@ static void TestLongLongComparison() #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 #undef RAND_LL @@ -1710,6 +1800,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 // ---------------------------------------------------------------------------- @@ -1722,8 +2033,8 @@ static void TestPathList() #ifdef TEST_REGCONF -#include -#include +#include "wx/confbase.h" +#include "wx/msw/regconf.h" static void TestRegConfWrite() { @@ -1735,7 +2046,7 @@ static void TestRegConfWrite() #ifdef TEST_REGISTRY -#include +#include "wx/msw/registry.h" // I chose this one because I liked its name, but it probably only exists under // NT @@ -1844,9 +2155,9 @@ static void TestRegistryAssociation() #ifdef TEST_SOCKETS -#include -#include -#include +#include "wx/socket.h" +#include "wx/protocol/protocol.h" +#include "wx/protocol/http.h" static void TestSocketServer() { @@ -1976,7 +2287,7 @@ static void TestSocketClient() #ifdef TEST_FTP -#include +#include "wx/protocol/ftp.h" static wxFTP ftp; @@ -2300,8 +2611,8 @@ static void TestFtpUpload() #ifdef TEST_STREAMS -#include -#include +#include "wx/wfstream.h" +#include "wx/mstream.h" static void TestFileStream() { @@ -2353,8 +2664,8 @@ static void TestMemoryStream() #ifdef TEST_TIMER -#include -#include +#include "wx/timer.h" +#include "wx/utils.h" static void TestStopWatch() { @@ -2403,7 +2714,7 @@ static void TestStopWatch() #ifdef TEST_VCARD -#include +#include "wx/vcard.h" static void DumpVObject(size_t level, const wxVCardObject& vcard) { @@ -2645,10 +2956,10 @@ static void TestVCardWrite() #ifdef TEST_WCHAR -#include -#include -#include -#include +#include "wx/strconv.h" +#include "wx/fontenc.h" +#include "wx/encconv.h" +#include "wx/buffer.h" static void TestUtf8() { @@ -2784,8 +3095,8 @@ static void TestZipFileSystem() #ifdef TEST_ZLIB -#include -#include +#include "wx/zstream.h" +#include "wx/wfstream.h" static const wxChar *FILENAME_GZ = _T("test.gz"); static const char *TEST_DATA = "hello and hello again"; @@ -2838,9 +3149,8 @@ static void TestZlibStreamRead() #include -#include - -#include +#include "wx/date.h" +#include "wx/datetime.h" // the test data struct Date @@ -3817,6 +4127,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), @@ -3871,7 +4182,7 @@ static void TestTimeCompatibility() #ifdef TEST_THREADS -#include +#include "wx/thread.h" static size_t gs_counter = (size_t)-1; static wxCriticalSection gs_critsect; @@ -4635,13 +4946,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 }, @@ -4805,6 +5120,32 @@ int main(int argc, char **argv) } #endif // TEST_FILENAME +#ifdef TEST_FILETIME + TestFileGetTimes(); + TestFileSetTimes(); +#endif // TEST_FILETIME + +#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); @@ -4840,8 +5181,9 @@ int main(int argc, char **argv) TestAddition(); TestLongLongConversion(); TestBitOperations(); + TestLongLongComparison(); } - TestLongLongComparison(); + TestLongLongPrint(); #endif // TEST_LONGLONG #ifdef TEST_HASH @@ -4861,8 +5203,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 @@ -4873,6 +5219,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(); @@ -4887,27 +5245,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();