X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d34bce842bf0ed4f0f03186a440060d8ba52cac6..80d2803f703d1b238f42725504f08266ef02defe:/samples/console/console.cpp?ds=inline diff --git a/samples/console/console.cpp b/samples/console/console.cpp index 2ad4cca93e..a935db655f 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -23,32 +23,96 @@ #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_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 // ============================================================================ -#ifdef TEST_CMDLINE +// ---------------------------------------------------------------------------- +// 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 @@ -77,6 +141,8 @@ static void ShowCmdLine(const wxCmdLineParser& parser) 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); } @@ -160,6 +226,400 @@ static void TestDirEnum() #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 // ---------------------------------------------------------------------------- @@ -168,12 +628,13 @@ static void TestDirEnum() #include +static wxMimeTypesManager g_mimeManager; + static void TestMimeEnum() { - wxMimeTypesManager mimeTM; wxArrayString mimetypes; - size_t count = mimeTM.EnumAllFileTypes(mimetypes); + size_t count = g_mimeManager.EnumAllFileTypes(mimetypes); printf("*** All %u known filetypes: ***\n", count); @@ -182,7 +643,7 @@ static void TestMimeEnum() for ( size_t n = 0; n < count; n++ ) { - wxFileType *filetype = mimeTM.GetFileTypeFromMimeType(mimetypes[n]); + wxFileType *filetype = g_mimeManager.GetFileTypeFromMimeType(mimetypes[n]); if ( !filetype ) { printf("nothing known about the filetype '%s'!\n", @@ -208,107 +669,1056 @@ static void TestMimeEnum() } } -#endif // TEST_MIME - -// ---------------------------------------------------------------------------- -// long long -// ---------------------------------------------------------------------------- +static void TestMimeOverride() +{ + wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n")); -#ifdef TEST_LONGLONG + wxString mailcap = _T("/tmp/mailcap"), + mimetypes = _T("/tmp/mime.types"); -#include -#include + 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 TestSpeed() +static void TestMimeFilename() { - static const long max = 100000000; - long n; + wxPuts(_T("*** Testing MIME type from filename query ***\n")); + static const wxChar *filenames[] = { - wxStopWatch sw; + _T("readme.txt"), + _T("document.pdf"), + _T("image.gif"), + }; - long l = 0; - for ( n = 0; n < max; n++ ) + 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 ) { - l += n; + wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext.c_str()); } + else + { + wxString desc; + if ( !ft->GetDescription(&desc) ) + desc = _T(""); - printf("Summing longs took %ld milliseconds.\n", sw.Time()); - } + wxString cmd; + if ( !ft->GetOpenCommand(&cmd, + wxFileType::MessageParameters(fname, _T(""))) ) + cmd = _T(""); -#if wxUSE_LONGLONG_NATIVE - { - wxStopWatch sw; + wxPrintf(_T("To open %s (%s) do '%s'.\n"), + fname.c_str(), desc.c_str(), cmd.c_str()); - wxLongLong_t l = 0; - for ( n = 0; n < max; n++ ) - { - l += n; + delete ft; } - - printf("Summing wxLongLong_t took %ld milliseconds.\n", sw.Time()); } -#endif // wxUSE_LONGLONG_NATIVE +} - { - wxStopWatch sw; +#endif // TEST_MIME - wxLongLong l; - for ( n = 0; n < max; n++ ) - { - l += n; - } +// ---------------------------------------------------------------------------- +// 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 TestDivision() -{ - puts("*** Testing wxLongLong division ***\n"); +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()); + + + if ( !vcard.GetFullName(&value) ) + { + value = _T(""); + } + + printf("Full name from wxVCard API: %s\n", value.c_str()); + + // now show how to deal with multiply occuring properties + DumpVCardAddresses(vcard); + DumpVCardPhoneNumbers(vcard); + + // and finally show all + puts("\nNow dumping the entire vCard:\n" + "-----------------------------\n"); + + DumpVObject(0, vcard); + } +} + +static void TestVCardWrite() +{ + puts("*** Testing wxVCard writing ***\n"); + + 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_VCARD + +// ---------------------------------------------------------------------------- +// wide char (Unicode) support +// ---------------------------------------------------------------------------- + +#ifdef TEST_WCHAR + +#include +#include + +static void TestUtf8() +{ + puts("*** Testing UTF8 support ***\n"); + + 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 + + wxWCharBuffer wchBuf = testString.wc_str(wxConvUTF8); + const wchar_t *pwz = (const wchar_t *)wchBuf; + wxString testString2(pwz, wxConvLocal); + + printf("Decoding '%s' => '%s'\n", testString.c_str(), testString2.c_str()); + + 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++ ) + { + pwz2[n] = (wchar_t)(unsigned char)psz[n]; + } + + wxString testString3(pwz2, wxConvUTF8); + delete [] pwz2; + + printf("Encoding '%s' -> '%s'\n", psz, testString3.c_str()); +} + +#endif // TEST_WCHAR + +// ---------------------------------------------------------------------------- +// ZIP stream +// ---------------------------------------------------------------------------- + +#ifdef TEST_ZIP + +#include "wx/zipstrm.h" + +static void TestZipStreamRead() +{ + puts("*** Testing ZIP reading ***\n"); + + wxZipInputStream istr(_T("idx.zip"), _T("IDX.txt")); + printf("Archive size: %u\n", istr.GetSize()); + + puts("Dumping the file:"); + while ( !istr.Eof() ) + { + putchar(istr.GetC()); + fflush(stdout); + } + + puts("\n----- done ------"); +} + +#endif // TEST_ZIP - #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3) +// ---------------------------------------------------------------------------- +// ZLIB stream +// ---------------------------------------------------------------------------- - // seed pseudo random generator - srand((unsigned)time(NULL)); +#ifdef TEST_ZLIB - wxLongLong q, r; - size_t nTested = 0; - for ( size_t n = 0; n < 100000; n++ ) +#include +#include + +static const wxChar *FILENAME_GZ = _T("test.gz"); +static const char *TEST_DATA = "hello and hello again"; + +static void TestZlibStreamWrite() +{ + puts("*** Testing Zlib stream reading ***\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 @@ -734,7 +2144,7 @@ def GetMonthWeek(dt): if weekNumMonth < 0: weekNumMonth = weekNumMonth + 53 return weekNumMonth - + def GetLastSundayBefore(dt): if dt.iso_week[2] == 7: return dt @@ -963,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[] = @@ -1108,16 +2519,24 @@ static void TestInteractive() if ( !fgets(buf, WXSIZEOF(buf), stdin) ) break; + // kill the last '\n' + buf[strlen(buf) - 1] = 0; + wxDateTime dt; - if ( !dt.ParseDate(buf) ) + const char *p = dt.ParseDate(buf); + if ( !p ) { - puts("failed to parse the date"); + 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.FormatISODate().c_str(), + dt.Format("%b %d, %Y").c_str(), dt.GetDayOfYear(), dt.GetWeekOfMonth(wxDateTime::Monday_First), dt.GetWeekOfMonth(wxDateTime::Sunday_First), @@ -1127,23 +2546,58 @@ static void TestInteractive() 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 + static const struct ArithmData { + ArithmData(const wxDateSpan& sp, const char *nam) + : span(sp), name(nam) { } + wxDateSpan span; const char *name; - } testArithmData[] = + } 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" }, + 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"), }; - + wxDateTime dt(29, wxDateTime::Dec, 1999), dt1, dt2; for ( size_t n = 0; n < WXSIZEOF(testArithmData); n++ ) @@ -1191,6 +2645,48 @@ static void TestTimeArithmetics() } } +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 // test compatibility with the old wxDate/wxTime classes @@ -1223,7 +2719,7 @@ static void TestTimeCompatibility() #endif // 0 -#endif // TEST_TIME +#endif // TEST_DATETIME // ---------------------------------------------------------------------------- // threads @@ -1467,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); @@ -1478,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 // ---------------------------------------------------------------------------- @@ -1487,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() { @@ -1550,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(""); } @@ -1566,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 // ---------------------------------------------------------------------------- @@ -1579,6 +3376,11 @@ 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[] = { @@ -1588,7 +3390,7 @@ int main(int argc, char **argv) { 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_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 }, @@ -1598,6 +3400,10 @@ int main(int argc, char **argv) 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: @@ -1620,11 +3426,15 @@ int main(int argc, char **argv) TestPChar(); TestString(); } + TestStringSub(); if ( 0 ) { - TestStringSub(); + TestStringConstruction(); + TestStringFormat(); + TestStringFind(); + TestStringTokenizer(); + TestStringReplace(); } - TestStringFormat(); #endif // TEST_STRINGS #ifdef TEST_ARRAYS @@ -1657,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++ ) @@ -1682,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); @@ -1703,17 +3549,56 @@ 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(); @@ -1726,14 +3611,39 @@ int main(int argc, char **argv) TestTimeWDays(); TestTimeWNumber(); TestTimeParse(); - TestTimeFormat(); TestTimeArithmetics(); + TestTimeHolidays(); + TestTimeFormat(); + TestTimeMS(); + + TestTimeZoneBug(); } if ( 0 ) TestInteractive(); -#endif // TEST_TIME +#endif // TEST_DATETIME + +#ifdef TEST_VCARD + if ( 0 ) + TestVCardRead(); + TestVCardWrite(); +#endif // TEST_VCARD + +#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; } +