X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5e6a0e831533f031463477e11fd9e2c91f56bbbc..80d2803f703d1b238f42725504f08266ef02defe:/samples/console/console.cpp?ds=inline diff --git a/samples/console/console.cpp b/samples/console/console.cpp index ee96ced5d4..a935db655f 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -23,25 +23,132 @@ #include #include +// without this pragma, the stupid compiler precompiles #defines below so that +// changing them doesn't "take place" later! +#ifdef __VISUALC__ + #pragma hdrstop +#endif + // ---------------------------------------------------------------------------- // conditional compilation // ---------------------------------------------------------------------------- -// what to test? +// what to test (in alphabetic order)? //#define TEST_ARRAYS +//#define TEST_CMDLINE +//#define TEST_DATETIME //#define TEST_DIR +//#define TEST_DLLLOADER +//#define TEST_EXECUTE +#define TEST_FILE +//#define TEST_FILECONF +//#define TEST_HASH +//#define TEST_LIST //#define TEST_LOG //#define TEST_LONGLONG //#define TEST_MIME +//#define TEST_INFO_FUNCTIONS +//#define TEST_SOCKETS //#define TEST_STRINGS //#define TEST_THREADS -#define TEST_TIME +//#define TEST_TIMER +//#define TEST_VCARD -- don't enable this (VZ) +//#define TEST_WCHAR +//#define TEST_ZIP +//#define TEST_ZLIB + +// ---------------------------------------------------------------------------- +// test class for container objects +// ---------------------------------------------------------------------------- + +#if defined(TEST_ARRAYS) || defined(TEST_LIST) + +class Bar // Foo is already taken in the hash test +{ +public: + Bar(const wxString& name) : m_name(name) { ms_bars++; } + ~Bar() { ms_bars--; } + + static size_t GetNumber() { return ms_bars; } + + const char *GetName() const { return m_name; } + +private: + wxString m_name; + + static size_t ms_bars; +}; + +size_t Bar::ms_bars = 0; + +#endif // defined(TEST_ARRAYS) || defined(TEST_LIST) // ============================================================================ // implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// helper functions +// ---------------------------------------------------------------------------- + +#if defined(TEST_STRINGS) || defined(TEST_SOCKETS) + +// 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; +} + +#endif // MakePrintable() is used + +// ---------------------------------------------------------------------------- +// wxCmdLineParser +// ---------------------------------------------------------------------------- + +#ifdef TEST_CMDLINE + +#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'; + if ( parser.Found("project_name", &strVal) ) + s << "Project:\t" << strVal << '\n'; + + wxLogMessage(s); +} + +#endif // TEST_CMDLINE + // ---------------------------------------------------------------------------- // wxDir // ---------------------------------------------------------------------------- @@ -83,191 +190,1535 @@ static void TestDirEnum() puts("Enumerating object files in current directory:"); TestDirEnumHelper(dir, wxDIR_DEFAULT, "*.o"); - puts("Enumerating directories in current directory:"); - TestDirEnumHelper(dir, wxDIR_DIRS); + puts("Enumerating directories in current directory:"); + TestDirEnumHelper(dir, wxDIR_DIRS); + + puts("Enumerating files in current directory:"); + TestDirEnumHelper(dir, wxDIR_FILES); + + 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 + + puts("Enumerating everything in root directory:"); + TestDirEnumHelper(dir, wxDIR_DEFAULT); + + puts("Enumerating directories in root directory:"); + TestDirEnumHelper(dir, wxDIR_DIRS); + + puts("Enumerating files in root directory:"); + TestDirEnumHelper(dir, wxDIR_FILES); + + puts("Enumerating files including hidden in root directory:"); + TestDirEnumHelper(dir, wxDIR_FILES | wxDIR_HIDDEN); + + puts("Enumerating files in non existing directory:"); + wxDir dirNo("nosuchdir"); + TestDirEnumHelper(dirNo); +} + +#endif // TEST_DIR + +// ---------------------------------------------------------------------------- +// wxDllLoader +// ---------------------------------------------------------------------------- + +#ifdef TEST_DLLLOADER + +#include + +static void TestDllLoad() +{ +#if defined(__WXMSW__) + static const wxChar *LIB_NAME = _T("kernel32.dll"); + static const wxChar *FUNC_NAME = _T("lstrlenA"); +#elif defined(__UNIX__) + // weird: using just libc.so does *not* work! + static const wxChar *LIB_NAME = _T("/lib/libc-2.0.7.so"); + static const wxChar *FUNC_NAME = _T("strlen"); +#else + #error "don't know how to test wxDllLoader on this platform" +#endif + + puts("*** testing wxDllLoader ***\n"); + + wxDllType dllHandle = wxDllLoader::LoadLibrary(LIB_NAME); + if ( !dllHandle ) + { + wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME); + } + else + { + typedef int (*strlenType)(char *); + strlenType pfnStrlen = (strlenType)wxDllLoader::GetSymbol(dllHandle, FUNC_NAME); + if ( !pfnStrlen ) + { + wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"), + FUNC_NAME, LIB_NAME); + } + else + { + if ( pfnStrlen("foo") != 3 ) + { + wxPrintf(_T("ERROR: loaded function is not strlen()!\n")); + } + else + { + puts("... ok"); + } + } + + wxDllLoader::UnloadLibrary(dllHandle); + } +} + +#endif // TEST_DLLLOADER + +// ---------------------------------------------------------------------------- +// wxExecute +// ---------------------------------------------------------------------------- + +#ifdef TEST_EXECUTE + +#include + +static void TestExecute() +{ + puts("*** testing wxExecute ***"); + +#ifdef __UNIX__ + #define COMMAND "echo hi" + #define SHELL_COMMAND "echo hi from shell" + #define REDIRECT_COMMAND "date" +#elif defined(__WXMSW__) + #define COMMAND "command.com -c 'echo hi'" + #define SHELL_COMMAND "echo hi" + #define REDIRECT_COMMAND COMMAND +#else + #error "no command to exec" +#endif // OS + + printf("Testing wxShell: "); + fflush(stdout); + if ( wxShell(SHELL_COMMAND) ) + puts("Ok."); + else + puts("ERROR."); + + printf("Testing wxExecute: "); + fflush(stdout); + if ( wxExecute(COMMAND, TRUE /* sync */) == 0 ) + puts("Ok."); + else + puts("ERROR."); + +#if 0 // no, it doesn't work (yet?) + printf("Testing async wxExecute: "); + fflush(stdout); + if ( wxExecute(COMMAND) != 0 ) + puts("Ok (command launched)."); + else + puts("ERROR."); +#endif // 0 + + printf("Testing wxExecute with redirection:\n"); + wxArrayString output; + if ( wxExecute(REDIRECT_COMMAND, output) != 0 ) + { + puts("ERROR."); + } + else + { + size_t count = output.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + printf("\t%s\n", output[n].c_str()); + } + + puts("Ok."); + } +} + +#endif // TEST_EXECUTE + +// ---------------------------------------------------------------------------- +// file +// ---------------------------------------------------------------------------- + +#ifdef TEST_FILE + +#include +#include + +static void TestFileRead() +{ + puts("*** wxFile read test ***"); + + wxFile file(_T("testdata.fc")); + if ( file.IsOpened() ) + { + printf("File length: %lu\n", file.Length()); + + puts("File dump:\n----------"); + + static const off_t len = 1024; + char buf[len]; + for ( ;; ) + { + off_t nRead = file.Read(buf, len); + if ( nRead == wxInvalidOffset ) + { + printf("Failed to read the file."); + break; + } + + fwrite(buf, nRead, 1, stdout); + + if ( nRead < len ) + break; + } + + puts("----------"); + } + else + { + printf("ERROR: can't open test file.\n"); + } + + puts(""); +} + +static void TestTextFileRead() +{ + puts("*** wxTextFile read test ***"); + + wxTextFile file(_T("testdata.fc")); + if ( file.Open() ) + { + printf("Number of lines: %u\n", file.GetLineCount()); + printf("Last line: '%s'\n", file.GetLastLine().c_str()); + + wxString s; + + puts("\nDumping the entire file:"); + for ( s = file.GetFirstLine(); !file.Eof(); s = file.GetNextLine() ) + { + printf("%6u: %s\n", file.GetCurrentLine() + 1, s.c_str()); + } + printf("%6u: %s\n", file.GetCurrentLine() + 1, s.c_str()); + + puts("\nAnd now backwards:"); + for ( s = file.GetLastLine(); + file.GetCurrentLine() != 0; + s = file.GetPrevLine() ) + { + printf("%6u: %s\n", file.GetCurrentLine() + 1, s.c_str()); + } + printf("%6u: %s\n", file.GetCurrentLine() + 1, s.c_str()); + } + else + { + printf("ERROR: can't open '%s'\n", file.GetName()); + } + + puts(""); +} + +#endif // TEST_FILE + +// ---------------------------------------------------------------------------- +// 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 + +// ---------------------------------------------------------------------------- +// wxHashTable +// ---------------------------------------------------------------------------- + +#ifdef TEST_HASH + +#include + +struct Foo +{ + Foo(int n_) { n = n_; count++; } + ~Foo() { count--; } + + int n; + + static size_t count; +}; + +size_t Foo::count = 0; + +WX_DECLARE_LIST(Foo, wxListFoos); +WX_DECLARE_HASH(Foo, wxListFoos, wxHashFoos); + +#include + +WX_DEFINE_LIST(wxListFoos); + +static void TestHash() +{ + puts("*** Testing wxHashTable ***\n"); + + { + wxHashFoos hash; + hash.DeleteContents(TRUE); + + printf("Hash created: %u foos in hash, %u foos totally\n", + hash.GetCount(), Foo::count); + + static const int hashTestData[] = + { + 0, 1, 17, -2, 2, 4, -4, 345, 3, 3, 2, 1, + }; + + size_t n; + for ( n = 0; n < WXSIZEOF(hashTestData); n++ ) + { + hash.Put(hashTestData[n], n, new Foo(n)); + } + + printf("Hash filled: %u foos in hash, %u foos totally\n", + hash.GetCount(), Foo::count); + + puts("Hash access test:"); + for ( n = 0; n < WXSIZEOF(hashTestData); n++ ) + { + printf("\tGetting element with key %d, value %d: ", + hashTestData[n], n); + Foo *foo = hash.Get(hashTestData[n], n); + if ( !foo ) + { + printf("ERROR, not found.\n"); + } + else + { + printf("%d (%s)\n", foo->n, + (size_t)foo->n == n ? "ok" : "ERROR"); + } + } + + printf("\nTrying to get an element not in hash: "); + + if ( hash.Get(1234) || hash.Get(1, 0) ) + { + puts("ERROR: found!"); + } + else + { + puts("ok (not found)"); + } + } + + printf("Hash destroyed: %u foos left\n", Foo::count); +} + +#endif // TEST_HASH + +// ---------------------------------------------------------------------------- +// wxList +// ---------------------------------------------------------------------------- + +#ifdef TEST_LIST + +#include + +WX_DECLARE_LIST(Bar, wxListBars); +#include +WX_DEFINE_LIST(wxListBars); + +static void TestListCtor() +{ + puts("*** Testing wxList construction ***\n"); + + { + wxListBars list1; + list1.Append(new Bar(_T("first"))); + list1.Append(new Bar(_T("second"))); + + printf("After 1st list creation: %u objects in the list, %u objects total.\n", + list1.GetCount(), Bar::GetNumber()); + + wxListBars list2; + list2 = list1; + + printf("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n", + list1.GetCount(), list2.GetCount(), Bar::GetNumber()); + + list1.DeleteContents(TRUE); + } + + printf("After list destruction: %u objects left.\n", Bar::GetNumber()); +} + +#endif // TEST_LIST + +// ---------------------------------------------------------------------------- +// MIME types +// ---------------------------------------------------------------------------- + +#ifdef TEST_MIME + +#include + +static wxMimeTypesManager g_mimeManager; + +static void TestMimeEnum() +{ + wxArrayString mimetypes; + + size_t count = g_mimeManager.EnumAllFileTypes(mimetypes); + + printf("*** All %u known filetypes: ***\n", count); + + wxArrayString exts; + wxString desc; + + for ( size_t n = 0; n < count; n++ ) + { + wxFileType *filetype = g_mimeManager.GetFileTypeFromMimeType(mimetypes[n]); + if ( !filetype ) + { + printf("nothing known about the filetype '%s'!\n", + mimetypes[n].c_str()); + continue; + } + + filetype->GetDescription(&desc); + filetype->GetExtensions(exts); + + filetype->GetIcon(NULL); + + wxString extsAll; + for ( size_t e = 0; e < exts.GetCount(); e++ ) + { + if ( e > 0 ) + extsAll << _T(", "); + extsAll += exts[e]; + } + + printf("\t%s: %s (%s)\n", + mimetypes[n].c_str(), desc.c_str(), extsAll.c_str()); + } +} + +static void TestMimeOverride() +{ + wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n")); + + wxString mailcap = _T("/tmp/mailcap"), + mimetypes = _T("/tmp/mime.types"); + + wxPrintf(_T("Loading mailcap from '%s': %s\n"), + mailcap.c_str(), + g_mimeManager.ReadMailcap(mailcap) ? _T("ok") : _T("ERROR")); + wxPrintf(_T("Loading mime.types from '%s': %s\n"), + mimetypes.c_str(), + g_mimeManager.ReadMimeTypes(mimetypes) ? _T("ok") : _T("ERROR")); +} + +static void TestMimeFilename() +{ + wxPuts(_T("*** Testing MIME type from filename query ***\n")); + + static const wxChar *filenames[] = + { + _T("readme.txt"), + _T("document.pdf"), + _T("image.gif"), + }; + + for ( size_t n = 0; n < WXSIZEOF(filenames); n++ ) + { + const wxString fname = filenames[n]; + wxString ext = fname.AfterLast(_T('.')); + wxFileType *ft = g_mimeManager.GetFileTypeFromExtension(ext); + if ( !ft ) + { + wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext.c_str()); + } + else + { + wxString desc; + if ( !ft->GetDescription(&desc) ) + desc = _T(""); + + wxString cmd; + if ( !ft->GetOpenCommand(&cmd, + wxFileType::MessageParameters(fname, _T(""))) ) + cmd = _T(""); + + wxPrintf(_T("To open %s (%s) do '%s'.\n"), + fname.c_str(), desc.c_str(), cmd.c_str()); + + delete ft; + } + } +} + +#endif // TEST_MIME + +// ---------------------------------------------------------------------------- +// misc information functions +// ---------------------------------------------------------------------------- + +#ifdef TEST_INFO_FUNCTIONS + +#include + +static void TestOsInfo() +{ + puts("*** Testing OS info functions ***\n"); + + int major, minor; + wxGetOsVersion(&major, &minor); + printf("Running under: %s, version %d.%d\n", + wxGetOsDescription().c_str(), major, minor); + + printf("%ld free bytes of memory left.\n", wxGetFreeMemory()); + + printf("Host name is %s (%s).\n", + wxGetHostName().c_str(), wxGetFullHostName().c_str()); + + puts(""); +} + +static void TestUserInfo() +{ + puts("*** Testing user info functions ***\n"); + + printf("User id is:\t%s\n", wxGetUserId().c_str()); + printf("User name is:\t%s\n", wxGetUserName().c_str()); + printf("Home dir is:\t%s\n", wxGetHomeDir().c_str()); + printf("Email address:\t%s\n", wxGetEmailAddress().c_str()); + + puts(""); +} + +#endif // TEST_INFO_FUNCTIONS + +// ---------------------------------------------------------------------------- +// long long +// ---------------------------------------------------------------------------- + +#ifdef TEST_LONGLONG + +#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; + long n; + + { + wxStopWatch sw; + + long l = 0; + for ( n = 0; n < max; n++ ) + { + l += n; + } + + printf("Summing longs took %ld milliseconds.\n", sw.Time()); + } + +#if wxUSE_LONGLONG_NATIVE + { + wxStopWatch sw; + + wxLongLong_t l = 0; + for ( n = 0; n < max; n++ ) + { + l += n; + } + + printf("Summing wxLongLong_t took %ld milliseconds.\n", sw.Time()); + } +#endif // wxUSE_LONGLONG_NATIVE + + { + wxStopWatch sw; + + wxLongLong l; + for ( n = 0; n < max; n++ ) + { + l += n; + } + + printf("Summing wxLongLongs took %ld milliseconds.\n", sw.Time()); + } +} + +static void TestLongLongConversion() +{ + puts("*** Testing wxLongLong conversions ***\n"); + + wxLongLong a; + size_t nTested = 0; + for ( size_t n = 0; n < 100000; n++ ) + { + a = RAND_LL(); + +#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; + for ( size_t n = 0; n < 100000; n++ ) + { + // get a random wxLongLong (shifting by 12 the MSB ensures that the + // multiplication will not overflow) + wxLongLong ll = MAKE_LL((rand() >> 12), rand(), rand(), rand()); + + // get a random long (not wxLongLong for now) to divide it with + long l = rand(); + 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) ) + { + putchar('.'); + fflush(stdout); + } + + nTested++; + } + + 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!"); +} + +static void TestBitOperations() +{ + puts("*** Testing wxLongLong bit operation ***\n"); + + wxLongLong ll; + size_t nTested = 0; + for ( size_t n = 0; n < 100000; n++ ) + { + ll = RAND_LL(); + +#if wxUSE_LONGLONG_NATIVE + for ( size_t n = 0; n < 33; n++ ) + { + } +#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 TestLongLongComparison() +{ + puts("*** Testing wxLongLong comparison ***\n"); + + static const long testLongs[] = + { + 0, + 1, + -1, + LONG_MAX, + LONG_MIN, + 0x1234, + -0x1234 + }; + + static const long ls[2] = + { + 0x1234, + -0x1234, + }; + + wxLongLongWx lls[2]; + lls[0] = ls[0]; + lls[1] = ls[1]; + + for ( size_t n = 0; n < WXSIZEOF(testLongs); n++ ) + { + bool res; + + for ( size_t m = 0; m < WXSIZEOF(lls); m++ ) + { + res = lls[m] > testLongs[n]; + printf("0x%lx > 0x%lx is %s (%s)\n", + ls[m], testLongs[n], res ? "true" : "false", + res == (ls[m] > testLongs[n]) ? "ok" : "ERROR"); + + res = lls[m] < testLongs[n]; + printf("0x%lx < 0x%lx is %s (%s)\n", + ls[m], testLongs[n], res ? "true" : "false", + res == (ls[m] < testLongs[n]) ? "ok" : "ERROR"); + + res = lls[m] == testLongs[n]; + printf("0x%lx == 0x%lx is %s (%s)\n", + ls[m], testLongs[n], res ? "true" : "false", + res == (ls[m] == testLongs[n]) ? "ok" : "ERROR"); + } + } +} + +#undef MAKE_LL +#undef RAND_LL + +#endif // TEST_LONGLONG + +// ---------------------------------------------------------------------------- +// sockets +// ---------------------------------------------------------------------------- + +#ifdef TEST_SOCKETS + +#include +#include +#include +#include + +static void TestSocketServer() +{ + puts("*** Testing wxSocketServer ***\n"); + + static const int PORT = 3000; + + wxIPV4address addr; + addr.Service(PORT); + + wxSocketServer *server = new wxSocketServer(addr); + if ( !server->Ok() ) + { + puts("ERROR: failed to bind"); + + return; + } + + for ( ;; ) + { + printf("Server: waiting for connection on port %d...\n", PORT); + + wxSocketBase *socket = server->Accept(); + if ( !socket ) + { + puts("ERROR: wxSocketServer::Accept() failed."); + break; + } + + puts("Server: got a client."); + + server->SetTimeout(60); // 1 min + + while ( socket->IsConnected() ) + { + wxString s; + char ch = '\0'; + for ( ;; ) + { + if ( socket->Read(&ch, sizeof(ch)).Error() ) + { + // don't log error if the client just close the connection + if ( socket->IsConnected() ) + { + puts("ERROR: in wxSocket::Read."); + } + + break; + } + + if ( ch == '\r' ) + continue; + + if ( ch == '\n' ) + break; + + s += ch; + } + + if ( ch != '\n' ) + { + break; + } + + printf("Server: got '%s'.\n", s.c_str()); + if ( s == _T("bye") ) + { + delete socket; + + break; + } + + socket->Write(s.MakeUpper().c_str(), s.length()); + socket->Write("\r\n", 2); + printf("Server: wrote '%s'.\n", s.c_str()); + } + + puts("Server: lost a client."); + + socket->Destroy(); + } + + // same as "delete server" but is consistent with GUI programs + server->Destroy(); +} + +static void TestSocketClient() +{ + puts("*** Testing wxSocketClient ***\n"); + + static const char *hostname = "www.wxwindows.org"; + + wxIPV4address addr; + addr.Hostname(hostname); + addr.Service(80); + + printf("--- Attempting to connect to %s:80...\n", hostname); + + wxSocketClient client; + if ( !client.Connect(addr) ) + { + printf("ERROR: failed to connect to %s\n", hostname); + } + else + { + printf("--- Connected to %s:%u...\n", + addr.Hostname().c_str(), addr.Service()); + + char buf[8192]; + + // could use simply "GET" here I suppose + wxString cmdGet = + wxString::Format("GET http://%s/\r\n", hostname); + client.Write(cmdGet, cmdGet.length()); + printf("--- Sent command '%s' to the server\n", + MakePrintable(cmdGet).c_str()); + client.Read(buf, WXSIZEOF(buf)); + printf("--- Server replied:\n%s", buf); + } +} + +static void TestProtocolFtp() +{ + puts("*** Testing wxFTP download ***\n"); + + wxLog::AddTraceMask(_T("ftp")); + + static const char *hostname = "ftp.wxwindows.org"; + + printf("--- Attempting to connect to %s:21...\n", hostname); + + wxFTP ftp; + if ( !ftp.Connect(hostname) ) + { + printf("ERROR: failed to connect to %s\n", hostname); + } + else + { + printf("--- Connected to %s, current directory is '%s'\n", + hostname, ftp.Pwd().c_str()); + if ( !ftp.ChDir(_T("pub")) ) + { + puts("ERROR: failed to cd to pub"); + } + + wxArrayString files; + if ( !ftp.GetList(files) ) + { + puts("ERROR: failed to get list of files"); + } + else + { + printf("List of files under '%s':\n", ftp.Pwd().c_str()); + size_t count = files.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + printf("\t%s\n", files[n].c_str()); + } + puts("End of the file list"); + } + + if ( !ftp.ChDir(_T("..")) ) + { + puts("ERROR: failed to cd to .."); + } + + static const char *filename = "welcome.msg"; + wxInputStream *in = ftp.GetInputStream(filename); + if ( !in ) + { + puts("ERROR: couldn't get input stream"); + } + else + { + size_t size = in->StreamSize(); + printf("Reading file %s (%u bytes)...", filename, size); + + char *data = new char[size]; + if ( !in->Read(data, size) ) + { + puts("ERROR: read error"); + } + else + { + printf("\nContents of %s:\n%s\n", filename, data); + } + + delete [] data; + delete in; + } + } +} + +static void TestProtocolFtpUpload() +{ + puts("*** Testing wxFTP uploading ***\n"); + + wxLog::AddTraceMask(_T("ftp")); + + static const char *hostname = "localhost"; + + printf("--- Attempting to connect to %s:21...\n", hostname); + + wxFTP ftp; + ftp.SetUser("zeitlin"); + ftp.SetPassword("insert your password here"); + if ( !ftp.Connect(hostname) ) + { + printf("ERROR: failed to connect to %s\n", hostname); + } + else + { + printf("--- Connected to %s, current directory is '%s'\n", + hostname, ftp.Pwd().c_str()); + + // upload a file + static const char *file1 = "test1"; + static const char *file2 = "test2"; + wxOutputStream *out = ftp.GetOutputStream(file1); + if ( out ) + { + printf("--- Uploading to %s ---\n", file1); + out->Write("First hello", 11); + delete out; + } + + out = ftp.GetOutputStream(file2); + if ( out ) + { + printf("--- Uploading to %s ---\n", file1); + out->Write("Second hello", 12); + delete out; + } + } +} + +#endif // TEST_SOCKETS + +// ---------------------------------------------------------------------------- +// timers +// ---------------------------------------------------------------------------- + +#ifdef TEST_TIMER + +#include +#include + +static void TestStopWatch() +{ + puts("*** Testing wxStopWatch ***\n"); + + wxStopWatch sw; + printf("Sleeping 3 seconds..."); + wxSleep(3); + printf("\telapsed time: %ldms\n", sw.Time()); + + sw.Pause(); + printf("Sleeping 2 more seconds..."); + wxSleep(2); + printf("\telapsed time: %ldms\n", sw.Time()); + + sw.Resume(); + printf("And 3 more seconds..."); + wxSleep(3); + printf("\telapsed time: %ldms\n", sw.Time()); + + wxStopWatch sw2; + puts("\nChecking for 'backwards clock' bug..."); + for ( size_t n = 0; n < 70; n++ ) + { + sw2.Start(); + + for ( size_t m = 0; m < 100000; m++ ) + { + if ( sw.Time() < 0 || sw2.Time() < 0 ) + { + puts("\ntime is negative - ERROR!"); + } + } + + putchar('.'); + } + + puts(", ok."); +} + +#endif // TEST_TIMER + +// ---------------------------------------------------------------------------- +// vCard support +// ---------------------------------------------------------------------------- + +#ifdef TEST_VCARD + +#include + +static void DumpVObject(size_t level, const wxVCardObject& vcard) +{ + void *cookie; + wxVCardObject *vcObj = vcard.GetFirstProp(&cookie); + while ( vcObj ) + { + printf("%s%s", + wxString(_T('\t'), level).c_str(), + vcObj->GetName().c_str()); + + wxString value; + switch ( vcObj->GetType() ) + { + case wxVCardObject::String: + case wxVCardObject::UString: + { + wxString val; + vcObj->GetValue(&val); + value << _T('"') << val << _T('"'); + } + break; + + case wxVCardObject::Int: + { + unsigned int i; + vcObj->GetValue(&i); + value.Printf(_T("%u"), i); + } + break; + + case wxVCardObject::Long: + { + unsigned long l; + vcObj->GetValue(&l); + value.Printf(_T("%lu"), l); + } + break; + + case wxVCardObject::None: + break; + + case wxVCardObject::Object: + value = _T(""); + break; + + default: + value = _T(""); + } + + if ( !!value ) + printf(" = %s", value.c_str()); + putchar('\n'); + + DumpVObject(level + 1, *vcObj); + + delete vcObj; + vcObj = vcard.GetNextProp(&cookie); + } +} + +static void DumpVCardAddresses(const wxVCard& vcard) +{ + puts("\nShowing all addresses from vCard:\n"); + + size_t nAdr = 0; + void *cookie; + wxVCardAddress *addr = vcard.GetFirstAddress(&cookie); + while ( addr ) + { + wxString flagsStr; + int flags = addr->GetFlags(); + if ( flags & wxVCardAddress::Domestic ) + { + flagsStr << _T("domestic "); + } + if ( flags & wxVCardAddress::Intl ) + { + flagsStr << _T("international "); + } + if ( flags & wxVCardAddress::Postal ) + { + flagsStr << _T("postal "); + } + if ( flags & wxVCardAddress::Parcel ) + { + flagsStr << _T("parcel "); + } + if ( flags & wxVCardAddress::Home ) + { + flagsStr << _T("home "); + } + if ( flags & wxVCardAddress::Work ) + { + flagsStr << _T("work "); + } + + printf("Address %u:\n" + "\tflags = %s\n" + "\tvalue = %s;%s;%s;%s;%s;%s;%s\n", + ++nAdr, + flagsStr.c_str(), + addr->GetPostOffice().c_str(), + addr->GetExtAddress().c_str(), + addr->GetStreet().c_str(), + addr->GetLocality().c_str(), + addr->GetRegion().c_str(), + addr->GetPostalCode().c_str(), + addr->GetCountry().c_str() + ); + + delete addr; + addr = vcard.GetNextAddress(&cookie); + } +} + +static void DumpVCardPhoneNumbers(const wxVCard& vcard) +{ + puts("\nShowing all phone numbers from vCard:\n"); + + size_t nPhone = 0; + void *cookie; + wxVCardPhoneNumber *phone = vcard.GetFirstPhoneNumber(&cookie); + while ( phone ) + { + wxString flagsStr; + int flags = phone->GetFlags(); + if ( flags & wxVCardPhoneNumber::Voice ) + { + flagsStr << _T("voice "); + } + if ( flags & wxVCardPhoneNumber::Fax ) + { + flagsStr << _T("fax "); + } + if ( flags & wxVCardPhoneNumber::Cellular ) + { + flagsStr << _T("cellular "); + } + if ( flags & wxVCardPhoneNumber::Modem ) + { + flagsStr << _T("modem "); + } + if ( flags & wxVCardPhoneNumber::Home ) + { + flagsStr << _T("home "); + } + if ( flags & wxVCardPhoneNumber::Work ) + { + flagsStr << _T("work "); + } + + printf("Phone number %u:\n" + "\tflags = %s\n" + "\tvalue = %s\n", + ++nPhone, + flagsStr.c_str(), + phone->GetNumber().c_str() + ); + + delete phone; + phone = vcard.GetNextPhoneNumber(&cookie); + } +} + +static void TestVCardRead() +{ + puts("*** Testing wxVCard reading ***\n"); + + wxVCard vcard(_T("vcard.vcf")); + if ( !vcard.IsOk() ) + { + puts("ERROR: couldn't load vCard."); + } + else + { + // read individual vCard properties + wxVCardObject *vcObj = vcard.GetProperty("FN"); + wxString value; + if ( vcObj ) + { + vcObj->GetValue(&value); + delete vcObj; + } + else + { + value = _T(""); + } + + printf("Full name retrieved directly: %s\n", value.c_str()); - puts("Enumerating files in current directory:"); - TestDirEnumHelper(dir, wxDIR_FILES); - puts("Enumerating files including hidden in current directory:"); - TestDirEnumHelper(dir, wxDIR_FILES | wxDIR_HIDDEN); + if ( !vcard.GetFullName(&value) ) + { + value = _T(""); + } -#ifdef __UNIX__ - dir.Open("/"); -#elif defined(__WXMSW__) - dir.Open("c:\\"); -#else - #error "don't know where the root directory is" -#endif + printf("Full name from wxVCard API: %s\n", value.c_str()); - puts("Enumerating everything in root directory:"); - TestDirEnumHelper(dir, wxDIR_DEFAULT); + // now show how to deal with multiply occuring properties + DumpVCardAddresses(vcard); + DumpVCardPhoneNumbers(vcard); - puts("Enumerating directories in root directory:"); - TestDirEnumHelper(dir, wxDIR_DIRS); + // and finally show all + puts("\nNow dumping the entire vCard:\n" + "-----------------------------\n"); - puts("Enumerating files in root directory:"); - TestDirEnumHelper(dir, wxDIR_FILES); + DumpVObject(0, vcard); + } +} - puts("Enumerating files including hidden in root directory:"); - TestDirEnumHelper(dir, wxDIR_FILES | wxDIR_HIDDEN); +static void TestVCardWrite() +{ + puts("*** Testing wxVCard writing ***\n"); - puts("Enumerating files in non existing directory:"); - wxDir dirNo("nosuchdir"); - TestDirEnumHelper(dirNo); + wxVCard vcard; + if ( !vcard.IsOk() ) + { + puts("ERROR: couldn't create vCard."); + } + else + { + // set some fields + vcard.SetName("Zeitlin", "Vadim"); + vcard.SetFullName("Vadim Zeitlin"); + vcard.SetOrganization("wxWindows", "R&D"); + + // just dump the vCard back + puts("Entire vCard follows:\n"); + puts(vcard.Write()); + } } -#endif // TEST_DIR +#endif // TEST_VCARD // ---------------------------------------------------------------------------- -// MIME types +// wide char (Unicode) support // ---------------------------------------------------------------------------- -#ifdef TEST_MIME +#ifdef TEST_WCHAR -#include +#include +#include -static void TestMimeEnum() +static void TestUtf8() { - wxMimeTypesManager mimeTM; - wxArrayString mimetypes; + puts("*** Testing UTF8 support ***\n"); - size_t count = mimeTM.EnumAllFileTypes(mimetypes); + wxString testString = "français"; +#if 0 +"************ French - Français ****************" +"Juste un petit exemple pour dire que les français aussi" +"ont à cœur de pouvoir utiliser tous leurs caractères ! :)"; +#endif - printf("*** All %u known filetypes: ***\n", count); + wxWCharBuffer wchBuf = testString.wc_str(wxConvUTF8); + const wchar_t *pwz = (const wchar_t *)wchBuf; + wxString testString2(pwz, wxConvLocal); - wxArrayString exts; - wxString desc; + printf("Decoding '%s' => '%s'\n", testString.c_str(), testString2.c_str()); - for ( size_t n = 0; n < count; n++ ) + char *psz = "fran" "\xe7" "ais"; + size_t len = strlen(psz); + wchar_t *pwz2 = new wchar_t[len + 1]; + for ( size_t n = 0; n <= len; n++ ) { - wxFileType *filetype = mimeTM.GetFileTypeFromMimeType(mimetypes[n]); - if ( !filetype ) - { - printf("nothing known about the filetype '%s'!\n", - mimetypes[n].c_str()); - continue; - } - - filetype->GetDescription(&desc); - filetype->GetExtensions(exts); - - filetype->GetIcon(NULL); + pwz2[n] = (wchar_t)(unsigned char)psz[n]; + } - wxString extsAll; - for ( size_t e = 0; e < exts.GetCount(); e++ ) - { - if ( e > 0 ) - extsAll << _T(", "); - extsAll += exts[e]; - } + wxString testString3(pwz2, wxConvUTF8); + delete [] pwz2; - printf("\t%s: %s (%s)\n", - mimetypes[n].c_str(), desc.c_str(), extsAll.c_str()); - } + printf("Encoding '%s' -> '%s'\n", psz, testString3.c_str()); } -#endif // TEST_MIME +#endif // TEST_WCHAR // ---------------------------------------------------------------------------- -// long long +// ZIP stream // ---------------------------------------------------------------------------- -#ifdef TEST_LONGLONG +#ifdef TEST_ZIP -#include -#include +#include "wx/zipstrm.h" -static void TestSpeed() +static void TestZipStreamRead() { - static const long max = 100000000; - long n; - - { - wxStopWatch sw; + puts("*** Testing ZIP reading ***\n"); - long l = 0; - for ( n = 0; n < max; n++ ) - { - l += n; - } + wxZipInputStream istr(_T("idx.zip"), _T("IDX.txt")); + printf("Archive size: %u\n", istr.GetSize()); - printf("Summing longs took %ld milliseconds.\n", sw.Time()); + puts("Dumping the file:"); + while ( !istr.Eof() ) + { + putchar(istr.GetC()); + fflush(stdout); } -#if wxUSE_LONGLONG_NATIVE - { - wxStopWatch sw; + puts("\n----- done ------"); +} - wxLongLong_t l = 0; - for ( n = 0; n < max; n++ ) - { - l += n; - } +#endif // TEST_ZIP - printf("Summing wxLongLong_t took %ld milliseconds.\n", sw.Time()); - } -#endif // wxUSE_LONGLONG_NATIVE +// ---------------------------------------------------------------------------- +// ZLIB stream +// ---------------------------------------------------------------------------- - { - wxStopWatch sw; +#ifdef TEST_ZLIB - wxLongLong l; - for ( n = 0; n < max; n++ ) - { - l += n; - } +#include +#include - printf("Summing wxLongLongs took %ld milliseconds.\n", sw.Time()); - } -} +static const wxChar *FILENAME_GZ = _T("test.gz"); +static const char *TEST_DATA = "hello and hello again"; -static void TestDivision() +static void TestZlibStreamWrite() { - puts("*** Testing wxLongLong division ***\n"); - - #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3) - - // seed pseudo random generator - srand((unsigned)time(NULL)); + puts("*** Testing Zlib stream reading ***\n"); - wxLongLong q, r; - size_t nTested = 0; - for ( size_t n = 0; n < 100000; n++ ) + wxFileOutputStream fileOutStream(FILENAME_GZ); + wxZlibOutputStream ostr(fileOutStream, 0); + printf("Compressing the test string... "); + ostr.Write(TEST_DATA, sizeof(TEST_DATA)); + if ( !ostr ) { - // get a random wxLongLong (shifting by 12 the MSB ensures that the - // multiplication will not overflow) - wxLongLong ll = MAKE_LL((rand() >> 12), rand(), rand(), rand()); + puts("(ERROR: failed)"); + } + else + { + puts("(ok)"); + } - // get a random long (not wxLongLong for now) to divide it with - long l = rand(); - q = ll / l; - r = ll % l; + puts("\n----- done ------"); +} - // verify the result - wxASSERT_MSG( ll == q*l + r, "division failure" ); +static void TestZlibStreamRead() +{ + puts("*** Testing Zlib stream reading ***\n"); - if ( !(nTested % 1000) ) - { - putchar('.'); - fflush(stdout); - } + wxFileInputStream fileInStream(FILENAME_GZ); + wxZlibInputStream istr(fileInStream); + printf("Archive size: %u\n", istr.GetSize()); - nTested++; + puts("Dumping the file:"); + while ( !istr.Eof() ) + { + putchar(istr.GetC()); + fflush(stdout); } - puts(" done!"); - - #undef MAKE_LL + puts("\n----- done ------"); } -#endif // TEST_LONGLONG +#endif // TEST_ZLIB // ---------------------------------------------------------------------------- // date time // ---------------------------------------------------------------------------- -#ifdef TEST_TIME +#ifdef TEST_DATETIME #include @@ -426,6 +1877,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 +2124,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 +2139,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 +2158,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 +2215,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 +2232,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)"); @@ -858,6 +2373,7 @@ static void TestTimeFormat() { CompareBoth, "Date is %x, time is %X" }, { CompareTime, "Time is %H:%M:%S or %I:%M:%S %p" }, { CompareNone, "The day of year: %j, the week of year: %W" }, + { CompareDate, "ISO date without separators: %4Y%2m%2d" }, }; static const Date formatTestDates[] = @@ -942,53 +2458,233 @@ static void TestTimeParse() { puts("\n*** wxDateTime parse test ***"); - struct ParseTestData + struct ParseTestData + { + const char *format; + Date date; + bool good; + }; + + static const ParseTestData parseTestDates[] = + { + { "Sat, 18 Dec 1999 00:46:40 +0100", { 18, wxDateTime::Dec, 1999, 00, 46, 40 }, TRUE }, + { "Wed, 1 Dec 1999 05:17:20 +0300", { 1, wxDateTime::Dec, 1999, 03, 17, 20 }, TRUE }, + }; + + for ( size_t n = 0; n < WXSIZEOF(parseTestDates); n++ ) + { + const char *format = parseTestDates[n].format; + + printf("%s => ", format); + + wxDateTime dt; + if ( dt.ParseRfc822Date(format) ) + { + printf("%s ", dt.Format().c_str()); + + if ( parseTestDates[n].good ) + { + wxDateTime dtReal = parseTestDates[n].date.DT(); + if ( dt == dtReal ) + { + puts("(ok)"); + } + else + { + printf("(ERROR: should be %s)\n", dtReal.Format().c_str()); + } + } + else + { + puts("(ERROR: bad format)"); + } + } + else + { + printf("bad format (%s)\n", + parseTestDates[n].good ? "ERROR" : "ok"); + } + } +} + +static void TestInteractive() +{ + puts("\n*** interactive wxDateTime tests ***"); + + char buf[128]; + + for ( ;; ) + { + printf("Enter a date: "); + if ( !fgets(buf, WXSIZEOF(buf), stdin) ) + break; + + // kill the last '\n' + buf[strlen(buf) - 1] = 0; + + wxDateTime dt; + const char *p = dt.ParseDate(buf); + if ( !p ) + { + printf("ERROR: failed to parse the date '%s'.\n", buf); + + continue; + } + else if ( *p ) + { + printf("WARNING: parsed only first %u characters.\n", p - buf); + } + + printf("%s: day %u, week of month %u/%u, week of year %u\n", + dt.Format("%b %d, %Y").c_str(), + dt.GetDayOfYear(), + dt.GetWeekOfMonth(wxDateTime::Monday_First), + dt.GetWeekOfMonth(wxDateTime::Sunday_First), + dt.GetWeekOfYear(wxDateTime::Monday_First)); + } + + puts("\n*** done ***"); +} + +static void TestTimeMS() +{ + puts("*** testing millisecond-resolution support in wxDateTime ***"); + + wxDateTime dt1 = wxDateTime::Now(), + dt2 = wxDateTime::UNow(); + + printf("Now = %s\n", dt1.Format("%H:%M:%S:%l").c_str()); + printf("UNow = %s\n", dt2.Format("%H:%M:%S:%l").c_str()); + printf("Dummy loop: "); + for ( int i = 0; i < 6000; i++ ) + { + //for ( int j = 0; j < 10; j++ ) + { + wxString s; + s.Printf("%g", sqrt(i)); + } + + if ( !(i % 100) ) + putchar('.'); + } + puts(", done"); + + dt1 = dt2; + dt2 = wxDateTime::UNow(); + printf("UNow = %s\n", dt2.Format("%H:%M:%S:%l").c_str()); + + printf("Loop executed in %s ms\n", (dt2 - dt1).Format("%l").c_str()); + + puts("\n*** done ***"); +} + +static void TestTimeArithmetics() +{ + puts("\n*** testing arithmetic operations on wxDateTime ***"); + + static const struct ArithmData { - const char *format; - Date date; - bool good; - }; + ArithmData(const wxDateSpan& sp, const char *nam) + : span(sp), name(nam) { } - static const ParseTestData parseTestDates[] = + wxDateSpan span; + const char *name; + } testArithmData[] = { - { "Sat, 18 Dec 1999 00:46:40 +0100", { 18, wxDateTime::Dec, 1999, 00, 46, 40 }, TRUE }, - { "Wed, 1 Dec 1999 05:17:20 +0300", { 1, wxDateTime::Dec, 1999, 03, 17, 20 }, TRUE }, + ArithmData(wxDateSpan::Day(), "day"), + ArithmData(wxDateSpan::Week(), "week"), + ArithmData(wxDateSpan::Month(), "month"), + ArithmData(wxDateSpan::Year(), "year"), + ArithmData(wxDateSpan(1, 2, 3, 4), "year, 2 months, 3 weeks, 4 days"), }; - for ( size_t n = 0; n < WXSIZEOF(parseTestDates); n++ ) + wxDateTime dt(29, wxDateTime::Dec, 1999), dt1, dt2; + + for ( size_t n = 0; n < WXSIZEOF(testArithmData); n++ ) { - const char *format = parseTestDates[n].format; + wxDateSpan span = testArithmData[n].span; + dt1 = dt + span; + dt2 = dt - span; - printf("%s => ", format); + 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()); - wxDateTime dt; - if ( dt.ParseRfc822Date(format) ) + printf("Going back: %s", (dt1 - span).FormatISODate().c_str()); + if ( dt1 - span == dt ) { - printf("%s ", dt.Format().c_str()); + puts(" (ok)"); + } + else + { + printf(" (ERROR: should be %s)\n", dt.FormatISODate().c_str()); + } - if ( parseTestDates[n].good ) - { - wxDateTime dtReal = parseTestDates[n].date.DT(); - if ( dt == dtReal ) - { - puts("(ok)"); - } - else - { - printf("(ERROR: should be %s)\n", dtReal.Format().c_str()); - } - } - else - { - puts("(ERROR: bad format)"); - } + printf("Going forward: %s", (dt2 + span).FormatISODate().c_str()); + if ( dt2 + span == dt ) + { + puts(" (ok)"); } else { - printf("bad format (%s)\n", - parseTestDates[n].good ? "ERROR" : "ok"); + 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(""); +} + +static void TestTimeZoneBug() +{ + puts("\n*** testing for DST/timezone bug ***\n"); + + wxDateTime date = wxDateTime(1, wxDateTime::Mar, 2000); + for ( int i = 0; i < 31; i++ ) + { + printf("Date %s: week day %s.\n", + date.Format(_T("%d-%m-%Y")).c_str(), + date.GetWeekDayName(date.GetWeekDay()).c_str()); + + date += wxDateSpan::Day(); } + + puts(""); } #if 0 @@ -1023,7 +2719,7 @@ static void TestTimeCompatibility() #endif // 0 -#endif // TEST_TIME +#endif // TEST_DATETIME // ---------------------------------------------------------------------------- // threads @@ -1267,7 +2963,7 @@ void TestThreadDelete() #ifdef TEST_ARRAYS -void PrintArray(const char* name, const wxArrayString& array) +static void PrintArray(const char* name, const wxArrayString& array) { printf("Dump of the array '%s'\n", name); @@ -1278,6 +2974,44 @@ void PrintArray(const char* name, const wxArrayString& array) } } +static int StringLenCompare(const wxString& first, const wxString& second) +{ + return first.length() - second.length(); +} + +#include "wx/dynarray.h" + +WX_DECLARE_OBJARRAY(Bar, ArrayBars); +#include "wx/arrimpl.cpp" +WX_DEFINE_OBJARRAY(ArrayBars); + +static void TestArrayOfObjects() +{ + puts("*** Testing wxObjArray ***\n"); + + { + ArrayBars bars; + Bar bar("second bar"); + + printf("Initially: %u objects in the array, %u objects total.\n", + bars.GetCount(), Bar::GetNumber()); + + bars.Add(new Bar("first bar")); + bars.Add(bar); + + printf("Now: %u objects in the array, %u objects total.\n", + bars.GetCount(), Bar::GetNumber()); + + bars.Empty(); + + printf("After Empty(): %u objects in the array, %u objects total.\n", + bars.GetCount(), Bar::GetNumber()); + } + + printf("Finally: no more objects in the array, %u objects total.\n", + Bar::GetNumber()); +} + #endif // TEST_ARRAYS // ---------------------------------------------------------------------------- @@ -1287,6 +3021,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() { @@ -1350,6 +3116,32 @@ static void TestStringSub() printf("substr(3, 5) = '%s'\n", s.substr(3, 5).c_str()); printf("substr(3) = '%s'\n", s.substr(3).c_str()); + static const wxChar *prefixes[] = + { + _T("Hello"), + _T("Hello, "), + _T("Hello, world!"), + _T("Hello, world!!!"), + _T(""), + _T("Goodbye"), + _T("Hi"), + }; + + for ( size_t n = 0; n < WXSIZEOF(prefixes); n++ ) + { + wxString prefix = prefixes[n], rest; + bool rc = s.StartsWith(prefix, &rest); + printf("StartsWith('%s') = %s", prefix.c_str(), rc ? "TRUE" : "FALSE"); + if ( rc ) + { + printf(" (the rest is '%s')\n", rest.c_str()); + } + else + { + putchar('\n'); + } + } + puts(""); } @@ -1366,6 +3158,211 @@ 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(""); +} + +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 = NULL, *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(""); +} + +static void TestStringReplace() +{ + puts("*** Testing wxString::replace ***"); + + static const struct StringReplaceTestData + { + const wxChar *original; // original test string + size_t start, len; // the part to replace + const wxChar *replacement; // the replacement string + const wxChar *result; // and the expected result + } stringReplaceTestData[] = + { + { _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") }, + { _T("increase"), 0, 2, _T("de"), _T("decrease") }, + { _T("wxWindow"), 8, 0, _T("s"), _T("wxWindows") }, + { _T("foobar"), 3, 0, _T("-"), _T("foo-bar") }, + { _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") }, + }; + + for ( size_t n = 0; n < WXSIZEOF(stringReplaceTestData); n++ ) + { + const StringReplaceTestData data = stringReplaceTestData[n]; + + wxString original = data.original; + original.replace(data.start, data.len, data.replacement); + + wxPrintf(_T("wxString(\"%s\").replace(%u, %u, %s) = %s "), + data.original, data.start, data.len, data.replacement, + original.c_str()); + + if ( original == data.result ) + { + puts("(ok)"); + } + else + { + wxPrintf(_T("(ERROR: should be '%s')\n"), data.result); + } + } + + puts(""); +} + #endif // TEST_STRINGS // ---------------------------------------------------------------------------- @@ -1379,17 +3376,65 @@ 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); + + parser.AddOption("project_name", "", "full path to project file", + wxCMD_LINE_VAL_STRING, + wxCMD_LINE_OPTION_MANDATORY | wxCMD_LINE_NEEDS_SEPARATOR); + + 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 ) { TestPChar(); TestString(); } + TestStringSub(); if ( 0 ) { - TestStringSub(); + TestStringConstruction(); + TestStringFormat(); + TestStringFind(); + TestStringTokenizer(); + TestStringReplace(); } - TestStringFormat(); #endif // TEST_STRINGS #ifdef TEST_ARRAYS @@ -1422,12 +3467,42 @@ int main(int argc, char **argv) a3 = a2 = a1; PrintArray("a2", a2); PrintArray("a3", a3); + + puts("*** After sorting a1"); + a1.Sort(); + PrintArray("a1", a1); + + puts("*** After sorting a1 in reverse order"); + a1.Sort(TRUE); + PrintArray("a1", a1); + + puts("*** After sorting a1 by the string length"); + a1.Sort(StringLenCompare); + PrintArray("a1", a1); + + TestArrayOfObjects(); #endif // TEST_ARRAYS #ifdef TEST_DIR TestDirEnum(); #endif // TEST_DIR +#ifdef TEST_DLLLOADER + TestDllLoad(); +#endif // TEST_DLLLOADER + +#ifdef TEST_EXECUTE + TestExecute(); +#endif // TEST_EXECUTE + +#ifdef TEST_FILECONF + TestFileConfRead(); +#endif // TEST_FILECONF + +#ifdef TEST_LIST + TestListCtor(); +#endif // TEST_LIST + #ifdef TEST_LOG wxString s; for ( size_t n = 0; n < 8000; n++ ) @@ -1447,6 +3522,12 @@ int main(int argc, char **argv) wxLogMessage("A very very long message 2: '%s', the end!", s.c_str()); #endif // TEST_LOG +#ifdef TEST_FILE + if ( 0 ) + TestFileRead(); + TestTextFileRead(); +#endif // TEST_FILE + #ifdef TEST_THREADS int nCPUs = wxThread::GetCPUCount(); printf("This system has %d CPUs\n", nCPUs); @@ -1468,35 +3549,101 @@ 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 ) + } + if ( 0 ) + { + TestMultiplication(); TestDivision(); + TestAddition(); + TestLongLongConversion(); + TestBitOperations(); + } + TestLongLongComparison(); #endif // TEST_LONGLONG +#ifdef TEST_HASH + TestHash(); +#endif // TEST_HASH + #ifdef TEST_MIME - TestMimeEnum(); + wxLog::AddTraceMask(_T("mime")); + if ( 0 ) + TestMimeEnum(); + TestMimeOverride(); + TestMimeFilename(); #endif // TEST_MIME -#ifdef TEST_TIME +#ifdef TEST_INFO_FUNCTIONS + TestOsInfo(); + TestUserInfo(); +#endif // TEST_INFO_FUNCTIONS + +#ifdef TEST_SOCKETS + if ( 0 ) + { + TestSocketServer(); + TestSocketClient(); + TestProtocolFtp(); + } + TestProtocolFtpUpload(); +#endif // TEST_SOCKETS + +#ifdef TEST_TIMER + TestStopWatch(); +#endif // TEST_TIMER + +#ifdef TEST_DATETIME if ( 0 ) { - TestTimeSet(); - TestTimeStatic(); - TestTimeZones(); - TestTimeRange(); - TestTimeTicks(); - TestTimeJDN(); - TestTimeDST(); - TestTimeWDays(); - TestTimeWNumber(); - TestTimeParse(); + TestTimeSet(); + TestTimeStatic(); + TestTimeRange(); + TestTimeZones(); + TestTimeTicks(); + TestTimeJDN(); + TestTimeDST(); + TestTimeWDays(); + TestTimeWNumber(); + TestTimeParse(); + TestTimeArithmetics(); + TestTimeHolidays(); + TestTimeFormat(); + TestTimeMS(); + + TestTimeZoneBug(); } + if ( 0 ) + TestInteractive(); +#endif // TEST_DATETIME + +#ifdef TEST_VCARD + if ( 0 ) + TestVCardRead(); + TestVCardWrite(); +#endif // TEST_VCARD - TestTimeFormat(); -#endif // TEST_TIME +#ifdef TEST_WCHAR + TestUtf8(); +#endif // TEST_WCHAR + +#ifdef TEST_ZIP + TestZipStreamRead(); +#endif // TEST_ZIP + +#ifdef TEST_ZLIB + if ( 0 ) + TestZlibStreamWrite(); + TestZlibStreamRead(); +#endif // TEST_ZLIB wxUninitialize(); return 0; } +