X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5e6a0e831533f031463477e11fd9e2c91f56bbbc..0b190b0f6ae1de468733c1c8f8aad877a7d44792:/samples/console/console.cpp diff --git a/samples/console/console.cpp b/samples/console/console.cpp index ee96ced5d4..b589b8fd9e 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -30,18 +30,61 @@ // what to test? //#define TEST_ARRAYS +//#define TEST_CMDLINE //#define TEST_DIR +//#define TEST_EXECUTE +#define TEST_FILECONF //#define TEST_LOG //#define TEST_LONGLONG //#define TEST_MIME //#define TEST_STRINGS //#define TEST_THREADS -#define TEST_TIME +//#define TEST_TIME // ============================================================================ // implementation // ============================================================================ +#ifdef TEST_CMDLINE + +// ---------------------------------------------------------------------------- +// wxCmdLineParser +// ---------------------------------------------------------------------------- + +#include +#include + +static void ShowCmdLine(const wxCmdLineParser& parser) +{ + wxString s = "Input files: "; + + size_t count = parser.GetParamCount(); + for ( size_t param = 0; param < count; param++ ) + { + s << parser.GetParam(param) << ' '; + } + + s << '\n' + << "Verbose:\t" << (parser.Found("v") ? "yes" : "no") << '\n' + << "Quiet:\t" << (parser.Found("q") ? "yes" : "no") << '\n'; + + wxString strVal; + long lVal; + wxDateTime dt; + if ( parser.Found("o", &strVal) ) + s << "Output file:\t" << strVal << '\n'; + if ( parser.Found("i", &strVal) ) + s << "Input dir:\t" << strVal << '\n'; + if ( parser.Found("s", &lVal) ) + s << "Size:\t" << lVal << '\n'; + if ( parser.Found("d", &dt) ) + s << "Date:\t" << dt.FormatISODate() << '\n'; + + wxLogMessage(s); +} + +#endif // TEST_CMDLINE + // ---------------------------------------------------------------------------- // wxDir // ---------------------------------------------------------------------------- @@ -119,6 +162,97 @@ static void TestDirEnum() #endif // TEST_DIR +// ---------------------------------------------------------------------------- +// wxExecute +// ---------------------------------------------------------------------------- + +#ifdef TEST_EXECUTE + +#include + +static void TestExecute() +{ + puts("*** testing wxExecute ***"); + +#ifdef __UNIX__ + #define COMMAND "echo hi" +#elif defined(__WXMSW__) + #define COMMAND "command.com -c 'echo hi'" +#else + #error "no command to exec" +#endif // OS + + if ( wxExecute(COMMAND) == 0 ) + puts("\nOk."); + else + puts("\nError."); +} + +#endif // TEST_EXECUTE + +// ---------------------------------------------------------------------------- +// wxFileConfig +// ---------------------------------------------------------------------------- + +#ifdef TEST_FILECONF + +#include +#include + +static const struct FileConfTestData +{ + const wxChar *name; // value name + const wxChar *value; // the value from the file +} fcTestData[] = +{ + { _T("value1"), _T("one") }, + { _T("value2"), _T("two") }, + { _T("novalue"), _T("default") }, +}; + +static void TestFileConfRead() +{ + puts("*** testing wxFileConfig loading/reading ***"); + + wxFileConfig fileconf(_T("test"), wxEmptyString, + _T("testdata.fc"), wxEmptyString, + wxCONFIG_USE_RELATIVE_PATH); + + // test simple reading + puts("\nReading config file:"); + wxString defValue(_T("default")), value; + for ( size_t n = 0; n < WXSIZEOF(fcTestData); n++ ) + { + const FileConfTestData& data = fcTestData[n]; + value = fileconf.Read(data.name, defValue); + printf("\t%s = %s ", data.name, value.c_str()); + if ( value == data.value ) + { + puts("(ok)"); + } + else + { + printf("(ERROR: should be %s)\n", data.value); + } + } + + // test enumerating the entries + puts("\nEnumerating all root entries:"); + long dummy; + wxString name; + bool cont = fileconf.GetFirstEntry(name, dummy); + while ( cont ) + { + printf("\t%s = %s\n", + name.c_str(), + fileconf.Read(name.c_str(), _T("ERROR")).c_str()); + + cont = fileconf.GetNextEntry(name, dummy); + } +} + +#endif // TEST_FILECONF + // ---------------------------------------------------------------------------- // MIME types // ---------------------------------------------------------------------------- @@ -178,6 +312,19 @@ static void TestMimeEnum() #include #include +// make a 64 bit number from 4 16 bit ones +#define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3) + +// get a random 64 bit number +#define RAND_LL() MAKE_LL(rand(), rand(), rand(), rand()) + +#if wxUSE_LONGLONG_WX +inline bool operator==(const wxLongLongWx& a, const wxLongLongNative& b) + { return a.GetHi() == b.GetHi() && a.GetLo() == b.GetLo(); } +inline bool operator==(const wxLongLongNative& a, const wxLongLongWx& b) + { return a.GetHi() == b.GetHi() && a.GetLo() == b.GetLo(); } +#endif // wxUSE_LONGLONG_WX + static void TestSpeed() { static const long max = 100000000; @@ -222,14 +369,75 @@ static void TestSpeed() } } -static void TestDivision() +static void TestLongLongConversion() { - puts("*** Testing wxLongLong division ***\n"); + puts("*** Testing wxLongLong conversions ***\n"); - #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3) + wxLongLong a; + size_t nTested = 0; + for ( size_t n = 0; n < 100000; n++ ) + { + a = RAND_LL(); - // seed pseudo random generator - srand((unsigned)time(NULL)); +#if wxUSE_LONGLONG_NATIVE + wxLongLongNative b(a.GetHi(), a.GetLo()); + + wxASSERT_MSG( a == b, "conversions failure" ); +#else + puts("Can't do it without native long long type, test skipped."); + + return; +#endif // wxUSE_LONGLONG_NATIVE + + if ( !(nTested % 1000) ) + { + putchar('.'); + fflush(stdout); + } + + nTested++; + } + + puts(" done!"); +} + +static void TestMultiplication() +{ + puts("*** Testing wxLongLong multiplication ***\n"); + + wxLongLong a, b; + size_t nTested = 0; + for ( size_t n = 0; n < 100000; n++ ) + { + a = RAND_LL(); + b = RAND_LL(); + +#if wxUSE_LONGLONG_NATIVE + wxLongLongNative aa(a.GetHi(), a.GetLo()); + wxLongLongNative bb(b.GetHi(), b.GetLo()); + + wxASSERT_MSG( a*b == aa*bb, "multiplication failure" ); +#else // !wxUSE_LONGLONG_NATIVE + puts("Can't do it without native long long type, test skipped."); + + return; +#endif // wxUSE_LONGLONG_NATIVE + + if ( !(nTested % 1000) ) + { + putchar('.'); + fflush(stdout); + } + + nTested++; + } + + puts(" done!"); +} + +static void TestDivision() +{ + puts("*** Testing wxLongLong division ***\n"); wxLongLong q, r; size_t nTested = 0; @@ -244,8 +452,15 @@ static void TestDivision() q = ll / l; r = ll % l; +#if wxUSE_LONGLONG_NATIVE + wxLongLongNative m(ll.GetHi(), ll.GetLo()); + + wxLongLongNative p = m / l, s = m % l; + wxASSERT_MSG( q == p && r == s, "division failure" ); +#else // !wxUSE_LONGLONG_NATIVE // verify the result wxASSERT_MSG( ll == q*l + r, "division failure" ); +#endif // wxUSE_LONGLONG_NATIVE if ( !(nTested % 1000) ) { @@ -257,10 +472,87 @@ static void TestDivision() } puts(" done!"); +} + +static void TestAddition() +{ + puts("*** Testing wxLongLong addition ***\n"); + + wxLongLong a, b, c; + size_t nTested = 0; + for ( size_t n = 0; n < 100000; n++ ) + { + a = RAND_LL(); + b = RAND_LL(); + c = a + b; + +#if wxUSE_LONGLONG_NATIVE + wxASSERT_MSG( c == wxLongLongNative(a.GetHi(), a.GetLo()) + + wxLongLongNative(b.GetHi(), b.GetLo()), + "addition failure" ); +#else // !wxUSE_LONGLONG_NATIVE + wxASSERT_MSG( c - b == a, "addition failure" ); +#endif // wxUSE_LONGLONG_NATIVE + + if ( !(nTested % 1000) ) + { + putchar('.'); + fflush(stdout); + } + + nTested++; + } + + puts(" done!"); +} - #undef MAKE_LL +static void TestBitOperations() +{ + puts("*** Testing wxLongLong bit operation ***\n"); + + wxLongLong a, c; + size_t nTested = 0; + for ( size_t n = 0; n < 100000; n++ ) + { + a = RAND_LL(); + +#if wxUSE_LONGLONG_NATIVE + for ( size_t n = 0; n < 33; n++ ) + { + wxLongLongNative b(a.GetHi(), a.GetLo()); + + b >>= n; + c = a >> n; + + wxASSERT_MSG( b == c, "bit shift failure" ); + + b = wxLongLongNative(a.GetHi(), a.GetLo()) << n; + c = a << n; + + wxASSERT_MSG( b == c, "bit shift failure" ); + } + +#else // !wxUSE_LONGLONG_NATIVE + puts("Can't do it without native long long type, test skipped."); + + return; +#endif // wxUSE_LONGLONG_NATIVE + + if ( !(nTested % 1000) ) + { + putchar('.'); + fflush(stdout); + } + + nTested++; + } + + puts(" done!"); } +#undef MAKE_LL +#undef RAND_LL + #endif // TEST_LONGLONG // ---------------------------------------------------------------------------- @@ -426,6 +718,13 @@ static void TestTimeZones() printf("Current time in Paris:\t%s\n", now.Format("%c", wxDateTime::CET).c_str()); printf(" Moscow:\t%s\n", now.Format("%c", wxDateTime::MSK).c_str()); printf(" New York:\t%s\n", now.Format("%c", wxDateTime::EST).c_str()); + + wxDateTime::Tm tm = now.GetTm(); + if ( wxDateTime(tm) != now ) + { + printf("ERROR: got %s instead of %s\n", + wxDateTime(tm).Format().c_str(), now.Format().c_str()); + } } // test some minimal support for the dates outside the standard range @@ -666,7 +965,9 @@ static void TestTimeWNumber() struct WeekNumberTestData { Date date; // the date - wxDateTime::wxDateTime_t week; // the week number + wxDateTime::wxDateTime_t week; // the week number in the year + wxDateTime::wxDateTime_t wmon; // the week number in the month + wxDateTime::wxDateTime_t wmon2; // same but week starts with Sun wxDateTime::wxDateTime_t dnum; // day number in the year }; @@ -679,6 +980,18 @@ from string import * monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ] wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ] +def GetMonthWeek(dt): + weekNumMonth = dt.iso_week[1] - DateTime(dt.year, dt.month, 1).iso_week[1] + 1 + if weekNumMonth < 0: + weekNumMonth = weekNumMonth + 53 + return weekNumMonth + +def GetLastSundayBefore(dt): + if dt.iso_week[2] == 7: + return dt + else: + return dt - DateTimeDelta(dt.iso_week[2]) + for n in range(20): year = randint(1900, 2100) month = randint(1, 12) @@ -686,34 +999,54 @@ for n in range(20): dt = DateTime(year, month, day) dayNum = dt.day_of_year weekNum = dt.iso_week[1] - - data = { 'day': rjust(`day`, 2), 'month': monthNames[month - 1], 'year': year, 'weekNum': rjust(`weekNum`, 2), 'dayNum': rjust(`dayNum`, 3) } - - print "{ { %(day)s, wxDateTime::%(month)s, %(year)d }, %(weekNum)s, "\ + weekNumMonth = GetMonthWeek(dt) + + weekNumMonth2 = 0 + dtSunday = GetLastSundayBefore(dt) + + while dtSunday >= GetLastSundayBefore(DateTime(dt.year, dt.month, 1)): + weekNumMonth2 = weekNumMonth2 + 1 + dtSunday = dtSunday - DateTimeDelta(7) + + data = { 'day': rjust(`day`, 2), \ + 'month': monthNames[month - 1], \ + 'year': year, \ + 'weekNum': rjust(`weekNum`, 2), \ + 'weekNumMonth': weekNumMonth, \ + 'weekNumMonth2': weekNumMonth2, \ + 'dayNum': rjust(`dayNum`, 3) } + + print " { { %(day)s, "\ + "wxDateTime::%(month)s, "\ + "%(year)d }, "\ + "%(weekNum)s, "\ + "%(weekNumMonth)s, "\ + "%(weekNumMonth2)s, "\ "%(dayNum)s }," % data + */ static const WeekNumberTestData weekNumberTestDates[] = { - { { 2, wxDateTime::Jul, 2093 }, 27, 183 }, - { { 25, wxDateTime::Jun, 1986 }, 26, 176 }, - { { 15, wxDateTime::Jun, 2014 }, 24, 166 }, - { { 20, wxDateTime::Jul, 2018 }, 29, 201 }, - { { 3, wxDateTime::Aug, 2074 }, 31, 215 }, - { { 26, wxDateTime::Jul, 2012 }, 30, 208 }, - { { 4, wxDateTime::Nov, 1915 }, 44, 308 }, - { { 11, wxDateTime::Feb, 2035 }, 6, 42 }, - { { 15, wxDateTime::Feb, 1942 }, 7, 46 }, - { { 5, wxDateTime::Jan, 2087 }, 1, 5 }, - { { 6, wxDateTime::Nov, 2016 }, 44, 311 }, - { { 6, wxDateTime::Jun, 2057 }, 23, 157 }, - { { 25, wxDateTime::Feb, 1976 }, 9, 56 }, - { { 12, wxDateTime::Jan, 2073 }, 2, 12 }, - { { 12, wxDateTime::Sep, 2040 }, 37, 256 }, - { { 15, wxDateTime::Jul, 1931 }, 29, 196 }, - { { 23, wxDateTime::Mar, 2084 }, 12, 83 }, - { { 12, wxDateTime::Dec, 1970 }, 50, 346 }, - { { 6, wxDateTime::Sep, 1996 }, 36, 250 }, - { { 7, wxDateTime::Jan, 2076 }, 2, 7 }, + { { 27, wxDateTime::Dec, 1966 }, 52, 5, 5, 361 }, + { { 22, wxDateTime::Jul, 1926 }, 29, 4, 4, 203 }, + { { 22, wxDateTime::Oct, 2076 }, 43, 4, 4, 296 }, + { { 1, wxDateTime::Jul, 1967 }, 26, 1, 1, 182 }, + { { 8, wxDateTime::Nov, 2004 }, 46, 2, 2, 313 }, + { { 21, wxDateTime::Mar, 1920 }, 12, 3, 4, 81 }, + { { 7, wxDateTime::Jan, 1965 }, 1, 2, 2, 7 }, + { { 19, wxDateTime::Oct, 1999 }, 42, 4, 4, 292 }, + { { 13, wxDateTime::Aug, 1955 }, 32, 2, 2, 225 }, + { { 18, wxDateTime::Jul, 2087 }, 29, 3, 3, 199 }, + { { 2, wxDateTime::Sep, 2028 }, 35, 1, 1, 246 }, + { { 28, wxDateTime::Jul, 1945 }, 30, 5, 4, 209 }, + { { 15, wxDateTime::Jun, 1901 }, 24, 3, 3, 166 }, + { { 10, wxDateTime::Oct, 1939 }, 41, 3, 2, 283 }, + { { 3, wxDateTime::Dec, 1965 }, 48, 1, 1, 337 }, + { { 23, wxDateTime::Feb, 1940 }, 8, 4, 4, 54 }, + { { 2, wxDateTime::Jan, 1987 }, 1, 1, 1, 2 }, + { { 11, wxDateTime::Aug, 2079 }, 32, 2, 2, 223 }, + { { 2, wxDateTime::Feb, 2063 }, 5, 1, 1, 33 }, + { { 16, wxDateTime::Oct, 1942 }, 42, 3, 3, 289 }, }; for ( size_t n = 0; n < WXSIZEOF(weekNumberTestDates); n++ ) @@ -723,8 +1056,11 @@ for n in range(20): wxDateTime dt = d.DT(); - wxDateTime::wxDateTime_t week = dt.GetWeekOfYear(), - dnum = dt.GetDayOfYear(); + wxDateTime::wxDateTime_t + week = dt.GetWeekOfYear(wxDateTime::Monday_First), + wmon = dt.GetWeekOfMonth(wxDateTime::Monday_First), + wmon2 = dt.GetWeekOfMonth(wxDateTime::Sunday_First), + dnum = dt.GetDayOfYear(); printf("%s: the day number is %d", d.FormatDate().c_str(), dnum); @@ -737,7 +1073,27 @@ for n in range(20): printf(" (ERROR: should be %d)", wn.dnum); } - printf(", week number is %d", week); + printf(", week in month is %d", wmon); + if ( wmon == wn.wmon ) + { + printf(" (ok)"); + } + else + { + printf(" (ERROR: should be %d)", wn.wmon); + } + + printf(" or %d", wmon2); + if ( wmon2 == wn.wmon2 ) + { + printf(" (ok)"); + } + else + { + printf(" (ERROR: should be %d)", wn.wmon2); + } + + printf(", week in year is %d", week); if ( week == wn.week ) { puts(" (ok)"); @@ -991,6 +1347,126 @@ static void TestTimeParse() } } +static void TestInteractive() +{ + puts("\n*** interactive wxDateTime tests ***"); + + char buf[128]; + + for ( ;; ) + { + printf("Enter a date: "); + if ( !fgets(buf, WXSIZEOF(buf), stdin) ) + break; + + wxDateTime dt; + if ( !dt.ParseDate(buf) ) + { + puts("failed to parse the date"); + + continue; + } + + printf("%s: day %u, week of month %u/%u, week of year %u\n", + dt.FormatISODate().c_str(), + dt.GetDayOfYear(), + dt.GetWeekOfMonth(wxDateTime::Monday_First), + dt.GetWeekOfMonth(wxDateTime::Sunday_First), + dt.GetWeekOfYear(wxDateTime::Monday_First)); + } + + puts("\n*** done ***"); +} + +static void TestTimeArithmetics() +{ + puts("\n*** testing arithmetic operations on wxDateTime ***"); + + static const struct + { + wxDateSpan span; + const char *name; + } testArithmData[] = + { + { wxDateSpan::Day(), "day" }, + { wxDateSpan::Week(), "week" }, + { wxDateSpan::Month(), "month" }, + { wxDateSpan::Year(), "year" }, + { wxDateSpan(1, 2, 3, 4), "year, 2 months, 3 weeks, 4 days" }, + }; + + wxDateTime dt(29, wxDateTime::Dec, 1999), dt1, dt2; + + for ( size_t n = 0; n < WXSIZEOF(testArithmData); n++ ) + { + wxDateSpan span = testArithmData[n].span; + dt1 = dt + span; + dt2 = dt - span; + + const char *name = testArithmData[n].name; + printf("%s + %s = %s, %s - %s = %s\n", + dt.FormatISODate().c_str(), name, dt1.FormatISODate().c_str(), + dt.FormatISODate().c_str(), name, dt2.FormatISODate().c_str()); + + printf("Going back: %s", (dt1 - span).FormatISODate().c_str()); + if ( dt1 - span == dt ) + { + puts(" (ok)"); + } + else + { + printf(" (ERROR: should be %s)\n", dt.FormatISODate().c_str()); + } + + printf("Going forward: %s", (dt2 + span).FormatISODate().c_str()); + if ( dt2 + span == dt ) + { + puts(" (ok)"); + } + else + { + printf(" (ERROR: should be %s)\n", dt.FormatISODate().c_str()); + } + + printf("Double increment: %s", (dt2 + 2*span).FormatISODate().c_str()); + if ( dt2 + 2*span == dt1 ) + { + puts(" (ok)"); + } + else + { + printf(" (ERROR: should be %s)\n", dt2.FormatISODate().c_str()); + } + + puts(""); + } +} + +static void TestTimeHolidays() +{ + puts("\n*** testing wxDateTimeHolidayAuthority ***\n"); + + wxDateTime::Tm tm = wxDateTime(29, wxDateTime::May, 2000).GetTm(); + wxDateTime dtStart(1, tm.mon, tm.year), + dtEnd = dtStart.GetLastMonthDay(); + + wxDateTimeArray hol; + wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart, dtEnd, hol); + + const wxChar *format = "%d-%b-%Y (%a)"; + + printf("All holidays between %s and %s:\n", + dtStart.Format(format).c_str(), dtEnd.Format(format).c_str()); + + size_t count = hol.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + printf("\t%s\n", hol[n].Format(format).c_str()); + } + + puts(""); +} + #if 0 // test compatibility with the old wxDate/wxTime classes @@ -1287,6 +1763,38 @@ void PrintArray(const char* name, const wxArrayString& array) #ifdef TEST_STRINGS #include "wx/timer.h" +#include "wx/tokenzr.h" + +static void TestStringConstruction() +{ + puts("*** Testing wxString constructores ***"); + + #define TEST_CTOR(args, res) \ + { \ + wxString s args ; \ + printf("wxString%s = %s ", #args, s.c_str()); \ + if ( s == res ) \ + { \ + puts("(ok)"); \ + } \ + else \ + { \ + printf("(ERROR: should be %s)\n", res); \ + } \ + } + + TEST_CTOR((_T('Z'), 4), _T("ZZZZ")); + TEST_CTOR((_T("Hello"), 4), _T("Hell")); + TEST_CTOR((_T("Hello"), 5), _T("Hello")); + // TEST_CTOR((_T("Hello"), 6), _T("Hello")); -- should give assert failure + + static const wxChar *s = _T("?really!"); + const wxChar *start = wxStrchr(s, _T('r')); + const wxChar *end = wxStrchr(s, _T('!')); + TEST_CTOR((start, end), _T("really")); + + puts(""); +} static void TestString() { @@ -1366,6 +1874,179 @@ static void TestStringFormat() puts(""); } +// returns "not found" for npos, value for all others +static wxString PosToString(size_t res) +{ + wxString s = res == wxString::npos ? wxString(_T("not found")) + : wxString::Format(_T("%u"), res); + return s; +} + +static void TestStringFind() +{ + puts("*** Testing wxString find() functions ***"); + + static const wxChar *strToFind = _T("ell"); + static const struct StringFindTest + { + const wxChar *str; + size_t start, + result; // of searching "ell" in str + } findTestData[] = + { + { _T("Well, hello world"), 0, 1 }, + { _T("Well, hello world"), 6, 7 }, + { _T("Well, hello world"), 9, wxString::npos }, + }; + + for ( size_t n = 0; n < WXSIZEOF(findTestData); n++ ) + { + const StringFindTest& ft = findTestData[n]; + size_t res = wxString(ft.str).find(strToFind, ft.start); + + printf(_T("Index of '%s' in '%s' starting from %u is %s "), + strToFind, ft.str, ft.start, PosToString(res).c_str()); + + size_t resTrue = ft.result; + if ( res == resTrue ) + { + puts(_T("(ok)")); + } + else + { + printf(_T("(ERROR: should be %s)\n"), + PosToString(resTrue).c_str()); + } + } + + puts(""); +} + +// replace TABs with \t and CRs with \n +static wxString MakePrintable(const wxChar *s) +{ + wxString str(s); + (void)str.Replace(_T("\t"), _T("\\t")); + (void)str.Replace(_T("\n"), _T("\\n")); + (void)str.Replace(_T("\r"), _T("\\r")); + + return str; +} + +static void TestStringTokenizer() +{ + puts("*** Testing wxStringTokenizer ***"); + + static const wxChar *modeNames[] = + { + _T("default"), + _T("return empty"), + _T("return all empty"), + _T("with delims"), + _T("like strtok"), + }; + + static const struct StringTokenizerTest + { + const wxChar *str; // string to tokenize + const wxChar *delims; // delimiters to use + size_t count; // count of token + wxStringTokenizerMode mode; // how should we tokenize it + } tokenizerTestData[] = + { + { _T(""), _T(" "), 0 }, + { _T("Hello, world"), _T(" "), 2 }, + { _T("Hello, world "), _T(" "), 2 }, + { _T("Hello, world"), _T(","), 2 }, + { _T("Hello, world!"), _T(",!"), 2 }, + { _T("Hello,, world!"), _T(",!"), 3 }, + { _T("Hello, world!"), _T(",!"), 3, wxTOKEN_RET_EMPTY_ALL }, + { _T("username:password:uid:gid:gecos:home:shell"), _T(":"), 7 }, + { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, 4 }, + { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, 6, wxTOKEN_RET_EMPTY }, + { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, 9, wxTOKEN_RET_EMPTY_ALL }, + { _T("01/02/99"), _T("/-"), 3 }, + { _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS }, + }; + + for ( size_t n = 0; n < WXSIZEOF(tokenizerTestData); n++ ) + { + const StringTokenizerTest& tt = tokenizerTestData[n]; + wxStringTokenizer tkz(tt.str, tt.delims, tt.mode); + + size_t count = tkz.CountTokens(); + printf(_T("String '%s' has %u tokens delimited by '%s' (mode = %s) "), + MakePrintable(tt.str).c_str(), + count, + MakePrintable(tt.delims).c_str(), + modeNames[tkz.GetMode()]); + if ( count == tt.count ) + { + puts(_T("(ok)")); + } + else + { + printf(_T("(ERROR: should be %u)\n"), tt.count); + + continue; + } + + // if we emulate strtok(), check that we do it correctly + wxChar *buf, *s, *last; + + if ( tkz.GetMode() == wxTOKEN_STRTOK ) + { + buf = new wxChar[wxStrlen(tt.str) + 1]; + wxStrcpy(buf, tt.str); + + s = wxStrtok(buf, tt.delims, &last); + } + else + { + buf = NULL; + } + + // now show the tokens themselves + size_t count2 = 0; + while ( tkz.HasMoreTokens() ) + { + wxString token = tkz.GetNextToken(); + + printf(_T("\ttoken %u: '%s'"), + ++count2, + MakePrintable(token).c_str()); + + if ( buf ) + { + if ( token == s ) + { + puts(" (ok)"); + } + else + { + printf(" (ERROR: should be %s)\n", s); + } + + s = wxStrtok(NULL, tt.delims, &last); + } + else + { + // nothing to compare with + puts(""); + } + } + + if ( count2 != count ) + { + puts(_T("\tERROR: token count mismatch")); + } + + delete [] buf; + } + + puts(""); +} + #endif // TEST_STRINGS // ---------------------------------------------------------------------------- @@ -1379,6 +2060,46 @@ int main(int argc, char **argv) fprintf(stderr, "Failed to initialize the wxWindows library, aborting."); } +#ifdef TEST_USLEEP + puts("Sleeping for 3 seconds... z-z-z-z-z..."); + wxUsleep(3000); +#endif // TEST_USLEEP + +#ifdef TEST_CMDLINE + static const wxCmdLineEntryDesc cmdLineDesc[] = + { + { 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_PARAM, NULL, NULL, "input file", + wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE }, + + { wxCMD_LINE_NONE } + }; + + wxCmdLineParser parser(cmdLineDesc, argc, argv); + + switch ( parser.Parse() ) + { + case -1: + wxLogMessage("Help was given, terminating."); + break; + + case 0: + ShowCmdLine(parser); + break; + + default: + wxLogMessage("Syntax error detected, aborting."); + break; + } +#endif // TEST_CMDLINE + #ifdef TEST_STRINGS if ( 0 ) { @@ -1387,9 +2108,12 @@ int main(int argc, char **argv) } if ( 0 ) { + TestStringConstruction(); TestStringSub(); + TestStringFormat(); + TestStringFind(); + TestStringTokenizer(); } - TestStringFormat(); #endif // TEST_STRINGS #ifdef TEST_ARRAYS @@ -1428,6 +2152,14 @@ int main(int argc, char **argv) TestDirEnum(); #endif // TEST_DIR +#ifdef TEST_EXECUTE + TestExecute(); +#endif // TEST_EXECUTE + +#ifdef TEST_FILECONF + TestFileConfRead(); +#endif // TEST_FILECONF + #ifdef TEST_LOG wxString s; for ( size_t n = 0; n < 8000; n++ ) @@ -1468,10 +2200,21 @@ int main(int argc, char **argv) #endif // TEST_THREADS #ifdef TEST_LONGLONG + // seed pseudo random generator + srand((unsigned)time(NULL)); + if ( 0 ) + { TestSpeed(); - if ( 1 ) + } + TestMultiplication(); + if ( 0 ) + { TestDivision(); + TestAddition(); + TestLongLongConversion(); + TestBitOperations(); + } #endif // TEST_LONGLONG #ifdef TEST_MIME @@ -1481,19 +2224,22 @@ int main(int argc, char **argv) #ifdef TEST_TIME if ( 0 ) { - TestTimeSet(); - TestTimeStatic(); - TestTimeZones(); - TestTimeRange(); - TestTimeTicks(); - TestTimeJDN(); - TestTimeDST(); - TestTimeWDays(); - TestTimeWNumber(); - TestTimeParse(); + TestTimeSet(); + TestTimeStatic(); + TestTimeRange(); + TestTimeZones(); + TestTimeTicks(); + TestTimeJDN(); + TestTimeDST(); + TestTimeWDays(); + TestTimeWNumber(); + TestTimeParse(); + TestTimeFormat(); + TestTimeArithmetics(); } - - TestTimeFormat(); + TestTimeHolidays(); + if ( 0 ) + TestInteractive(); #endif // TEST_TIME wxUninitialize();