+ wxPutchar('\n');
+
+ cont = key.GetNextValue(value, dummy);
+ }
+}
+
+static void TestRegistryAssociation()
+{
+ /*
+ The second call to deleteself genertaes an error message, with a
+ messagebox saying .flo is crucial to system operation, while the .ddf
+ call also fails, but with no error message
+ */
+
+ wxRegKey key;
+
+ key.SetName(wxT("HKEY_CLASSES_ROOT\\.ddf") );
+ key.Create();
+ key = wxT("ddxf_auto_file") ;
+ key.SetName(wxT("HKEY_CLASSES_ROOT\\.flo") );
+ key.Create();
+ key = wxT("ddxf_auto_file") ;
+ key.SetName(wxT("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
+ key.Create();
+ key = wxT("program,0") ;
+ key.SetName(wxT("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
+ key.Create();
+ key = wxT("program \"%1\"") ;
+
+ key.SetName(wxT("HKEY_CLASSES_ROOT\\.ddf") );
+ key.DeleteSelf();
+ key.SetName(wxT("HKEY_CLASSES_ROOT\\.flo") );
+ key.DeleteSelf();
+ key.SetName(wxT("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
+ key.DeleteSelf();
+ key.SetName(wxT("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
+ key.DeleteSelf();
+}
+
+#endif // TEST_REGISTRY
+
+// ----------------------------------------------------------------------------
+// scope guard
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_SCOPEGUARD
+
+#include "wx/scopeguard.h"
+
+static void function0() { puts("function0()"); }
+static void function1(int n) { printf("function1(%d)\n", n); }
+static void function2(double x, char c) { printf("function2(%g, %c)\n", x, c); }
+
+struct Object
+{
+ void method0() { printf("method0()\n"); }
+ void method1(int n) { printf("method1(%d)\n", n); }
+ void method2(double x, char c) { printf("method2(%g, %c)\n", x, c); }
+};
+
+static void TestScopeGuard()
+{
+ wxON_BLOCK_EXIT0(function0);
+ wxON_BLOCK_EXIT1(function1, 17);
+ wxON_BLOCK_EXIT2(function2, 3.14, 'p');
+
+ Object obj;
+ wxON_BLOCK_EXIT_OBJ0(obj, Object::method0);
+ wxON_BLOCK_EXIT_OBJ1(obj, Object::method1, 7);
+ wxON_BLOCK_EXIT_OBJ2(obj, Object::method2, 2.71, 'e');
+
+ wxScopeGuard dismissed = wxMakeGuard(function0);
+ dismissed.Dismiss();
+}
+
+#endif
+
+// ----------------------------------------------------------------------------
+// sockets
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_SOCKETS
+
+#include "wx/socket.h"
+#include "wx/protocol/protocol.h"
+#include "wx/protocol/http.h"
+
+static void TestSocketServer()
+{
+ wxPuts(wxT("*** Testing wxSocketServer ***\n"));
+
+ static const int PORT = 3000;
+
+ wxIPV4address addr;
+ addr.Service(PORT);
+
+ wxSocketServer *server = new wxSocketServer(addr);
+ if ( !server->Ok() )
+ {
+ wxPuts(wxT("ERROR: failed to bind"));
+
+ return;
+ }
+
+ bool quit = false;
+ while ( !quit )
+ {
+ wxPrintf(wxT("Server: waiting for connection on port %d...\n"), PORT);
+
+ wxSocketBase *socket = server->Accept();
+ if ( !socket )
+ {
+ wxPuts(wxT("ERROR: wxSocketServer::Accept() failed."));
+ break;
+ }
+
+ wxPuts(wxT("Server: got a client."));
+
+ server->SetTimeout(60); // 1 min
+
+ bool close = false;
+ while ( !close && socket->IsConnected() )
+ {
+ wxString s;
+ wxChar ch = wxT('\0');
+ for ( ;; )
+ {
+ if ( socket->Read(&ch, sizeof(ch)).Error() )
+ {
+ // don't log error if the client just close the connection
+ if ( socket->IsConnected() )
+ {
+ wxPuts(wxT("ERROR: in wxSocket::Read."));
+ }
+
+ break;
+ }
+
+ if ( ch == '\r' )
+ continue;
+
+ if ( ch == '\n' )
+ break;
+
+ s += ch;
+ }
+
+ if ( ch != '\n' )
+ {
+ break;
+ }
+
+ wxPrintf(wxT("Server: got '%s'.\n"), s.c_str());
+ if ( s == wxT("close") )
+ {
+ wxPuts(wxT("Closing connection"));
+
+ close = true;
+ }
+ else if ( s == wxT("quit") )
+ {
+ close =
+ quit = true;
+
+ wxPuts(wxT("Shutting down the server"));
+ }
+ else // not a special command
+ {
+ socket->Write(s.MakeUpper().c_str(), s.length());
+ socket->Write("\r\n", 2);
+ wxPrintf(wxT("Server: wrote '%s'.\n"), s.c_str());
+ }
+ }
+
+ if ( !close )
+ {
+ wxPuts(wxT("Server: lost a client unexpectedly."));
+ }
+
+ socket->Destroy();
+ }
+
+ // same as "delete server" but is consistent with GUI programs
+ server->Destroy();
+}
+
+static void TestSocketClient()
+{
+ wxPuts(wxT("*** Testing wxSocketClient ***\n"));
+
+ static const wxChar *hostname = wxT("www.wxwidgets.org");
+
+ wxIPV4address addr;
+ addr.Hostname(hostname);
+ addr.Service(80);
+
+ wxPrintf(wxT("--- Attempting to connect to %s:80...\n"), hostname);
+
+ wxSocketClient client;
+ if ( !client.Connect(addr) )
+ {
+ wxPrintf(wxT("ERROR: failed to connect to %s\n"), hostname);
+ }
+ else
+ {
+ wxPrintf(wxT("--- Connected to %s:%u...\n"),
+ addr.Hostname().c_str(), addr.Service());
+
+ wxChar buf[8192];
+
+ // could use simply "GET" here I suppose
+ wxString cmdGet =
+ wxString::Format(wxT("GET http://%s/\r\n"), hostname);
+ client.Write(cmdGet, cmdGet.length());
+ wxPrintf(wxT("--- Sent command '%s' to the server\n"),
+ MakePrintable(cmdGet).c_str());
+ client.Read(buf, WXSIZEOF(buf));
+ wxPrintf(wxT("--- Server replied:\n%s"), buf);
+ }
+}
+
+#endif // TEST_SOCKETS
+
+// ----------------------------------------------------------------------------
+// FTP
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_FTP
+
+#include "wx/protocol/ftp.h"
+#include "wx/protocol/log.h"
+
+#define FTP_ANONYMOUS
+
+static wxFTP *ftp;
+
+#ifdef FTP_ANONYMOUS
+ static const wxChar *directory = wxT("/pub");
+ static const wxChar *filename = wxT("welcome.msg");
+#else
+ static const wxChar *directory = wxT("/etc");
+ static const wxChar *filename = wxT("issue");
+#endif
+
+static bool TestFtpConnect()
+{
+ wxPuts(wxT("*** Testing FTP connect ***"));
+
+#ifdef FTP_ANONYMOUS
+ static const wxChar *hostname = wxT("ftp.wxwidgets.org");
+
+ wxPrintf(wxT("--- Attempting to connect to %s:21 anonymously...\n"), hostname);
+#else // !FTP_ANONYMOUS
+ static const wxChar *hostname = "localhost";
+
+ wxChar user[256];
+ wxFgets(user, WXSIZEOF(user), stdin);
+ user[wxStrlen(user) - 1] = '\0'; // chop off '\n'
+ ftp->SetUser(user);
+
+ wxChar password[256];
+ wxPrintf(wxT("Password for %s: "), password);
+ wxFgets(password, WXSIZEOF(password), stdin);
+ password[wxStrlen(password) - 1] = '\0'; // chop off '\n'
+ ftp->SetPassword(password);
+
+ wxPrintf(wxT("--- Attempting to connect to %s:21 as %s...\n"), hostname, user);
+#endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
+
+ if ( !ftp->Connect(hostname) )
+ {
+ wxPrintf(wxT("ERROR: failed to connect to %s\n"), hostname);
+
+ return false;
+ }
+ else
+ {
+ wxPrintf(wxT("--- Connected to %s, current directory is '%s'\n"),
+ hostname, ftp->Pwd().c_str());
+ ftp->Close();
+ }
+
+ return true;
+}
+
+static void TestFtpList()
+{
+ wxPuts(wxT("*** Testing wxFTP file listing ***\n"));
+
+ // test CWD
+ if ( !ftp->ChDir(directory) )
+ {
+ wxPrintf(wxT("ERROR: failed to cd to %s\n"), directory);
+ }
+
+ wxPrintf(wxT("Current directory is '%s'\n"), ftp->Pwd().c_str());
+
+ // test NLIST and LIST
+ wxArrayString files;
+ if ( !ftp->GetFilesList(files) )
+ {
+ wxPuts(wxT("ERROR: failed to get NLIST of files"));
+ }
+ else
+ {
+ wxPrintf(wxT("Brief list of files under '%s':\n"), ftp->Pwd().c_str());
+ size_t count = files.GetCount();
+ for ( size_t n = 0; n < count; n++ )
+ {
+ wxPrintf(wxT("\t%s\n"), files[n].c_str());
+ }
+ wxPuts(wxT("End of the file list"));
+ }
+
+ if ( !ftp->GetDirList(files) )
+ {
+ wxPuts(wxT("ERROR: failed to get LIST of files"));
+ }
+ else
+ {
+ wxPrintf(wxT("Detailed list of files under '%s':\n"), ftp->Pwd().c_str());
+ size_t count = files.GetCount();
+ for ( size_t n = 0; n < count; n++ )
+ {
+ wxPrintf(wxT("\t%s\n"), files[n].c_str());
+ }
+ wxPuts(wxT("End of the file list"));
+ }
+
+ if ( !ftp->ChDir(wxT("..")) )
+ {
+ wxPuts(wxT("ERROR: failed to cd to .."));
+ }
+
+ wxPrintf(wxT("Current directory is '%s'\n"), ftp->Pwd().c_str());
+}
+
+static void TestFtpDownload()
+{
+ wxPuts(wxT("*** Testing wxFTP download ***\n"));
+
+ // test RETR
+ wxInputStream *in = ftp->GetInputStream(filename);
+ if ( !in )
+ {
+ wxPrintf(wxT("ERROR: couldn't get input stream for %s\n"), filename);
+ }
+ else
+ {
+ size_t size = in->GetSize();
+ wxPrintf(wxT("Reading file %s (%u bytes)..."), filename, size);
+ fflush(stdout);
+
+ wxChar *data = new wxChar[size];
+ if ( !in->Read(data, size) )
+ {
+ wxPuts(wxT("ERROR: read error"));
+ }
+ else
+ {
+ wxPrintf(wxT("\nContents of %s:\n%s\n"), filename, data);
+ }
+
+ delete [] data;
+ delete in;
+ }
+}
+
+static void TestFtpFileSize()
+{
+ wxPuts(wxT("*** Testing FTP SIZE command ***"));
+
+ if ( !ftp->ChDir(directory) )
+ {
+ wxPrintf(wxT("ERROR: failed to cd to %s\n"), directory);
+ }
+
+ wxPrintf(wxT("Current directory is '%s'\n"), ftp->Pwd().c_str());
+
+ if ( ftp->FileExists(filename) )
+ {
+ int size = ftp->GetFileSize(filename);
+ if ( size == -1 )
+ wxPrintf(wxT("ERROR: couldn't get size of '%s'\n"), filename);
+ else
+ wxPrintf(wxT("Size of '%s' is %d bytes.\n"), filename, size);
+ }
+ else
+ {
+ wxPrintf(wxT("ERROR: '%s' doesn't exist\n"), filename);
+ }
+}
+
+static void TestFtpMisc()
+{
+ wxPuts(wxT("*** Testing miscellaneous wxFTP functions ***"));
+
+ if ( ftp->SendCommand(wxT("STAT")) != '2' )
+ {
+ wxPuts(wxT("ERROR: STAT failed"));
+ }
+ else
+ {
+ wxPrintf(wxT("STAT returned:\n\n%s\n"), ftp->GetLastResult().c_str());
+ }
+
+ if ( ftp->SendCommand(wxT("HELP SITE")) != '2' )
+ {
+ wxPuts(wxT("ERROR: HELP SITE failed"));
+ }
+ else
+ {
+ wxPrintf(wxT("The list of site-specific commands:\n\n%s\n"),
+ ftp->GetLastResult().c_str());
+ }
+}
+
+#if TEST_INTERACTIVE
+
+static void TestFtpInteractive()
+{
+ wxPuts(wxT("\n*** Interactive wxFTP test ***"));
+
+ wxChar buf[128];
+
+ for ( ;; )
+ {
+ wxPrintf(wxT("Enter FTP command: "));
+ if ( !wxFgets(buf, WXSIZEOF(buf), stdin) )
+ break;
+
+ // kill the last '\n'
+ buf[wxStrlen(buf) - 1] = 0;
+
+ // special handling of LIST and NLST as they require data connection
+ wxString start(buf, 4);
+ start.MakeUpper();
+ if ( start == wxT("LIST") || start == wxT("NLST") )
+ {
+ wxString wildcard;
+ if ( wxStrlen(buf) > 4 )
+ wildcard = buf + 5;
+
+ wxArrayString files;
+ if ( !ftp->GetList(files, wildcard, start == wxT("LIST")) )
+ {
+ wxPrintf(wxT("ERROR: failed to get %s of files\n"), start.c_str());
+ }
+ else
+ {
+ wxPrintf(wxT("--- %s of '%s' under '%s':\n"),
+ start.c_str(), wildcard.c_str(), ftp->Pwd().c_str());
+ size_t count = files.GetCount();
+ for ( size_t n = 0; n < count; n++ )
+ {
+ wxPrintf(wxT("\t%s\n"), files[n].c_str());
+ }
+ wxPuts(wxT("--- End of the file list"));
+ }
+ }
+ else // !list
+ {
+ wxChar ch = ftp->SendCommand(buf);
+ wxPrintf(wxT("Command %s"), ch ? wxT("succeeded") : wxT("failed"));
+ if ( ch )
+ {
+ wxPrintf(wxT(" (return code %c)"), ch);
+ }
+
+ wxPrintf(wxT(", server reply:\n%s\n\n"), ftp->GetLastResult().c_str());
+ }
+ }
+
+ wxPuts(wxT("\n*** done ***"));
+}
+
+#endif // TEST_INTERACTIVE
+
+static void TestFtpUpload()
+{
+ wxPuts(wxT("*** Testing wxFTP uploading ***\n"));
+
+ // upload a file
+ static const wxChar *file1 = wxT("test1");
+ static const wxChar *file2 = wxT("test2");
+ wxOutputStream *out = ftp->GetOutputStream(file1);
+ if ( out )
+ {
+ wxPrintf(wxT("--- Uploading to %s ---\n"), file1);
+ out->Write("First hello", 11);
+ delete out;
+ }
+
+ // send a command to check the remote file
+ if ( ftp->SendCommand(wxString(wxT("STAT ")) + file1) != '2' )
+ {
+ wxPrintf(wxT("ERROR: STAT %s failed\n"), file1);
+ }
+ else
+ {
+ wxPrintf(wxT("STAT %s returned:\n\n%s\n"),
+ file1, ftp->GetLastResult().c_str());
+ }
+
+ out = ftp->GetOutputStream(file2);
+ if ( out )
+ {
+ wxPrintf(wxT("--- Uploading to %s ---\n"), file1);
+ out->Write("Second hello", 12);
+ delete out;
+ }
+}
+
+#endif // TEST_FTP
+
+// ----------------------------------------------------------------------------
+// stack backtrace
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_STACKWALKER
+
+#if wxUSE_STACKWALKER
+
+#include "wx/stackwalk.h"
+
+class StackDump : public wxStackWalker
+{
+public:
+ StackDump(const char *argv0)
+ : wxStackWalker(argv0)
+ {
+ }
+
+ virtual void Walk(size_t skip = 1, size_t maxdepth = wxSTACKWALKER_MAX_DEPTH)
+ {
+ wxPuts(wxT("Stack dump:"));
+
+ wxStackWalker::Walk(skip, maxdepth);
+ }
+
+protected:
+ virtual void OnStackFrame(const wxStackFrame& frame)
+ {
+ printf("[%2d] ", (int) frame.GetLevel());
+
+ wxString name = frame.GetName();
+ if ( !name.empty() )
+ {
+ printf("%-20.40s", (const char*)name.mb_str());
+ }
+ else
+ {
+ printf("0x%08lx", (unsigned long)frame.GetAddress());
+ }
+
+ if ( frame.HasSourceLocation() )
+ {
+ printf("\t%s:%d",
+ (const char*)frame.GetFileName().mb_str(),
+ (int)frame.GetLine());
+ }
+
+ puts("");
+
+ wxString type, val;
+ for ( size_t n = 0; frame.GetParam(n, &type, &name, &val); n++ )
+ {
+ printf("\t%s %s = %s\n", (const char*)type.mb_str(),
+ (const char*)name.mb_str(),
+ (const char*)val.mb_str());
+ }
+ }
+};
+
+static void TestStackWalk(const char *argv0)
+{
+ wxPuts(wxT("*** Testing wxStackWalker ***\n"));
+
+ StackDump dump(argv0);
+ dump.Walk();
+}
+
+#endif // wxUSE_STACKWALKER
+
+#endif // TEST_STACKWALKER
+
+// ----------------------------------------------------------------------------
+// standard paths
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_STDPATHS
+
+#include "wx/stdpaths.h"
+#include "wx/wxchar.h" // wxPrintf
+
+static void TestStandardPaths()
+{
+ wxPuts(wxT("*** Testing wxStandardPaths ***\n"));
+
+ wxTheApp->SetAppName(wxT("console"));
+
+ wxStandardPathsBase& stdp = wxStandardPaths::Get();
+ wxPrintf(wxT("Config dir (sys):\t%s\n"), stdp.GetConfigDir().c_str());
+ wxPrintf(wxT("Config dir (user):\t%s\n"), stdp.GetUserConfigDir().c_str());
+ wxPrintf(wxT("Data dir (sys):\t\t%s\n"), stdp.GetDataDir().c_str());
+ wxPrintf(wxT("Data dir (sys local):\t%s\n"), stdp.GetLocalDataDir().c_str());
+ wxPrintf(wxT("Data dir (user):\t%s\n"), stdp.GetUserDataDir().c_str());
+ wxPrintf(wxT("Data dir (user local):\t%s\n"), stdp.GetUserLocalDataDir().c_str());
+ wxPrintf(wxT("Documents dir:\t\t%s\n"), stdp.GetDocumentsDir().c_str());
+ wxPrintf(wxT("Executable path:\t%s\n"), stdp.GetExecutablePath().c_str());
+ wxPrintf(wxT("Plugins dir:\t\t%s\n"), stdp.GetPluginsDir().c_str());
+ wxPrintf(wxT("Resources dir:\t\t%s\n"), stdp.GetResourcesDir().c_str());
+ wxPrintf(wxT("Localized res. dir:\t%s\n"),
+ stdp.GetLocalizedResourcesDir(wxT("fr")).c_str());
+ wxPrintf(wxT("Message catalogs dir:\t%s\n"),
+ stdp.GetLocalizedResourcesDir
+ (
+ wxT("fr"),
+ wxStandardPaths::ResourceCat_Messages
+ ).c_str());
+}
+
+#endif // TEST_STDPATHS
+
+// ----------------------------------------------------------------------------
+// streams
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_STREAMS
+
+#include "wx/wfstream.h"
+#include "wx/mstream.h"
+
+static void TestFileStream()
+{
+ wxPuts(wxT("*** Testing wxFileInputStream ***"));
+
+ static const wxString filename = wxT("testdata.fs");
+ {
+ wxFileOutputStream fsOut(filename);
+ fsOut.Write("foo", 3);
+ }
+
+ {
+ wxFileInputStream fsIn(filename);
+ wxPrintf(wxT("File stream size: %u\n"), fsIn.GetSize());
+ int c;
+ while ( (c=fsIn.GetC()) != wxEOF )
+ {
+ wxPutchar(c);
+ }
+ }
+
+ if ( !wxRemoveFile(filename) )
+ {
+ wxPrintf(wxT("ERROR: failed to remove the file '%s'.\n"), filename.c_str());
+ }
+
+ wxPuts(wxT("\n*** wxFileInputStream test done ***"));
+}
+
+static void TestMemoryStream()
+{
+ wxPuts(wxT("*** Testing wxMemoryOutputStream ***"));
+
+ wxMemoryOutputStream memOutStream;
+ wxPrintf(wxT("Initially out stream offset: %lu\n"),
+ (unsigned long)memOutStream.TellO());
+
+ for ( const wxChar *p = wxT("Hello, stream!"); *p; p++ )
+ {
+ memOutStream.PutC(*p);
+ }
+
+ wxPrintf(wxT("Final out stream offset: %lu\n"),
+ (unsigned long)memOutStream.TellO());
+
+ wxPuts(wxT("*** Testing wxMemoryInputStream ***"));
+
+ wxChar buf[1024];
+ size_t len = memOutStream.CopyTo(buf, WXSIZEOF(buf));
+
+ wxMemoryInputStream memInpStream(buf, len);
+ wxPrintf(wxT("Memory stream size: %u\n"), memInpStream.GetSize());
+ int c;
+ while ( (c=memInpStream.GetC()) != wxEOF )
+ {
+ wxPutchar(c);
+ }
+
+ wxPuts(wxT("\n*** wxMemoryInputStream test done ***"));
+}
+
+#endif // TEST_STREAMS
+
+// ----------------------------------------------------------------------------
+// timers
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_TIMER
+
+#include "wx/stopwatch.h"
+#include "wx/utils.h"
+
+static void TestStopWatch()
+{
+ wxPuts(wxT("*** Testing wxStopWatch ***\n"));
+
+ wxStopWatch sw;
+ sw.Pause();
+ wxPrintf(wxT("Initially paused, after 2 seconds time is..."));
+ fflush(stdout);
+ wxSleep(2);
+ wxPrintf(wxT("\t%ldms\n"), sw.Time());
+
+ wxPrintf(wxT("Resuming stopwatch and sleeping 3 seconds..."));
+ fflush(stdout);
+ sw.Resume();
+ wxSleep(3);
+ wxPrintf(wxT("\telapsed time: %ldms\n"), sw.Time());
+
+ sw.Pause();
+ wxPrintf(wxT("Pausing agan and sleeping 2 more seconds..."));
+ fflush(stdout);
+ wxSleep(2);
+ wxPrintf(wxT("\telapsed time: %ldms\n"), sw.Time());
+
+ sw.Resume();
+ wxPrintf(wxT("Finally resuming and sleeping 2 more seconds..."));
+ fflush(stdout);
+ wxSleep(2);
+ wxPrintf(wxT("\telapsed time: %ldms\n"), sw.Time());
+
+ wxStopWatch sw2;
+ wxPuts(wxT("\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 )
+ {
+ wxPuts(wxT("\ntime is negative - ERROR!"));
+ }
+ }
+
+ wxPutchar('.');
+ fflush(stdout);
+ }
+
+ wxPuts(wxT(", ok."));
+}
+
+#include "wx/timer.h"
+#include "wx/evtloop.h"
+
+void TestTimer()
+{
+ wxPuts(wxT("*** Testing wxTimer ***\n"));
+
+ class MyTimer : public wxTimer
+ {
+ public:
+ MyTimer() : wxTimer() { m_num = 0; }
+
+ virtual void Notify()
+ {
+ wxPrintf(wxT("%d"), m_num++);
+ fflush(stdout);
+
+ if ( m_num == 10 )
+ {
+ wxPrintf(wxT("... exiting the event loop"));
+ Stop();
+
+ wxEventLoop::GetActive()->Exit(0);
+ wxPuts(wxT(", ok."));
+ }
+
+ fflush(stdout);
+ }
+
+ private:
+ int m_num;
+ };
+
+ wxEventLoop loop;
+
+ wxTimer timer1;
+ timer1.Start(100, true /* one shot */);
+ timer1.Stop();
+ timer1.Start(100, true /* one shot */);
+
+ MyTimer timer;
+ timer.Start(500);
+
+ loop.Run();
+}
+
+#endif // TEST_TIMER
+
+// ----------------------------------------------------------------------------
+// wxVolume tests
+// ----------------------------------------------------------------------------
+
+#if !defined(__WIN32__) || !wxUSE_FSVOLUME
+ #undef TEST_VOLUME
+#endif
+
+#ifdef TEST_VOLUME
+
+#include "wx/volume.h"
+
+static const wxChar *volumeKinds[] =
+{
+ wxT("floppy"),
+ wxT("hard disk"),
+ wxT("CD-ROM"),
+ wxT("DVD-ROM"),
+ wxT("network volume"),
+ wxT("other volume"),
+};
+
+static void TestFSVolume()
+{
+ wxPuts(wxT("*** Testing wxFSVolume class ***"));
+
+ wxArrayString volumes = wxFSVolume::GetVolumes();
+ size_t count = volumes.GetCount();
+
+ if ( !count )
+ {
+ wxPuts(wxT("ERROR: no mounted volumes?"));
+ return;
+ }
+
+ wxPrintf(wxT("%u mounted volumes found:\n"), count);
+
+ for ( size_t n = 0; n < count; n++ )
+ {
+ wxFSVolume vol(volumes[n]);
+ if ( !vol.IsOk() )
+ {
+ wxPuts(wxT("ERROR: couldn't create volume"));
+ continue;
+ }
+
+ wxPrintf(wxT("%u: %s (%s), %s, %s, %s\n"),
+ n + 1,
+ vol.GetDisplayName().c_str(),
+ vol.GetName().c_str(),
+ volumeKinds[vol.GetKind()],
+ vol.IsWritable() ? wxT("rw") : wxT("ro"),
+ vol.GetFlags() & wxFS_VOL_REMOVABLE ? wxT("removable")
+ : wxT("fixed"));
+ }
+}
+
+#endif // TEST_VOLUME
+
+// ----------------------------------------------------------------------------
+// wide char and Unicode support
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_WCHAR
+
+#include "wx/strconv.h"
+#include "wx/fontenc.h"
+#include "wx/encconv.h"
+#include "wx/buffer.h"
+
+static const unsigned char utf8koi8r[] =
+{
+ 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
+ 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
+ 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
+ 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
+ 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
+ 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
+ 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
+};
+
+static const unsigned char utf8iso8859_1[] =
+{
+ 0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e,
+ 0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65,
+ 0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65,
+ 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65,
+ 0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0
+};
+
+static const unsigned char utf8Invalid[] =
+{
+ 0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30,
+ 0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6,
+ 0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88,
+ 0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70,
+ 0x6c, 0x61, 0x79, 0
+};
+
+static const struct Utf8Data
+{
+ const unsigned char *text;
+ size_t len;
+ const wxChar *charset;
+ wxFontEncoding encoding;
+} utf8data[] =
+{
+ { utf8Invalid, WXSIZEOF(utf8Invalid), wxT("iso8859-1"), wxFONTENCODING_ISO8859_1 },
+ { utf8koi8r, WXSIZEOF(utf8koi8r), wxT("koi8-r"), wxFONTENCODING_KOI8 },
+ { utf8iso8859_1, WXSIZEOF(utf8iso8859_1), wxT("iso8859-1"), wxFONTENCODING_ISO8859_1 },
+};
+
+static void TestUtf8()
+{
+ wxPuts(wxT("*** Testing UTF8 support ***\n"));
+
+ char buf[1024];
+ wchar_t wbuf[1024];
+
+ for ( size_t n = 0; n < WXSIZEOF(utf8data); n++ )
+ {
+ const Utf8Data& u8d = utf8data[n];
+ if ( wxConvUTF8.MB2WC(wbuf, (const char *)u8d.text,
+ WXSIZEOF(wbuf)) == (size_t)-1 )
+ {
+ wxPuts(wxT("ERROR: UTF-8 decoding failed."));
+ }
+ else
+ {
+ wxCSConv conv(u8d.charset);
+ if ( conv.WC2MB(buf, wbuf, WXSIZEOF(buf)) == (size_t)-1 )
+ {
+ wxPrintf(wxT("ERROR: conversion to %s failed.\n"), u8d.charset);
+ }
+ else
+ {
+ wxPrintf(wxT("String in %s: %s\n"), u8d.charset, buf);
+ }
+ }
+
+ wxString s(wxConvUTF8.cMB2WC((const char *)u8d.text));
+ if ( s.empty() )
+ s = wxT("<< conversion failed >>");
+ wxPrintf(wxT("String in current cset: %s\n"), s.c_str());
+
+ }
+
+ wxPuts(wxEmptyString);
+}
+
+static void TestEncodingConverter()
+{
+ wxPuts(wxT("*** Testing wxEncodingConverter ***\n"));
+
+ // using wxEncodingConverter should give the same result as above
+ char buf[1024];
+ wchar_t wbuf[1024];
+ if ( wxConvUTF8.MB2WC(wbuf, (const char *)utf8koi8r,
+ WXSIZEOF(utf8koi8r)) == (size_t)-1 )
+ {
+ wxPuts(wxT("ERROR: UTF-8 decoding failed."));
+ }
+ else
+ {
+ wxEncodingConverter ec;
+ ec.Init(wxFONTENCODING_UNICODE, wxFONTENCODING_KOI8);
+ ec.Convert(wbuf, buf);
+ wxPrintf(wxT("The same KOI8-R string using wxEC: %s\n"), buf);
+ }
+
+ wxPuts(wxEmptyString);
+}
+
+#endif // TEST_WCHAR
+
+// ----------------------------------------------------------------------------
+// ZIP stream
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_ZIP
+
+#include "wx/filesys.h"
+#include "wx/fs_zip.h"
+#include "wx/zipstrm.h"
+
+static const wxChar *TESTFILE_ZIP = wxT("testdata.zip");
+
+static void TestZipStreamRead()
+{
+ wxPuts(wxT("*** Testing ZIP reading ***\n"));
+
+ static const wxString filename = wxT("foo");
+ wxFFileInputStream in(TESTFILE_ZIP);
+ wxZipInputStream istr(in);
+ wxZipEntry entry(filename);
+ istr.OpenEntry(entry);
+
+ wxPrintf(wxT("Archive size: %u\n"), istr.GetSize());
+
+ wxPrintf(wxT("Dumping the file '%s':\n"), filename.c_str());
+ int c;
+ while ( (c=istr.GetC()) != wxEOF )
+ {
+ wxPutchar(c);
+ fflush(stdout);
+ }
+
+ wxPuts(wxT("\n----- done ------"));
+}
+
+static void DumpZipDirectory(wxFileSystem& fs,
+ const wxString& dir,
+ const wxString& indent)
+{
+ wxString prefix = wxString::Format(wxT("%s#zip:%s"),
+ TESTFILE_ZIP, dir.c_str());
+ wxString wildcard = prefix + wxT("/*");
+
+ wxString dirname = fs.FindFirst(wildcard, wxDIR);
+ while ( !dirname.empty() )
+ {
+ if ( !dirname.StartsWith(prefix + wxT('/'), &dirname) )
+ {
+ wxPrintf(wxT("ERROR: unexpected wxFileSystem::FindNext result\n"));
+
+ break;
+ }
+
+ wxPrintf(wxT("%s%s\n"), indent.c_str(), dirname.c_str());
+
+ DumpZipDirectory(fs, dirname,
+ indent + wxString(wxT(' '), 4));
+
+ dirname = fs.FindNext();
+ }
+
+ wxString filename = fs.FindFirst(wildcard, wxFILE);
+ while ( !filename.empty() )
+ {
+ if ( !filename.StartsWith(prefix, &filename) )
+ {
+ wxPrintf(wxT("ERROR: unexpected wxFileSystem::FindNext result\n"));
+
+ break;
+ }
+
+ wxPrintf(wxT("%s%s\n"), indent.c_str(), filename.c_str());
+
+ filename = fs.FindNext();
+ }
+}
+
+static void TestZipFileSystem()
+{
+ wxPuts(wxT("*** Testing ZIP file system ***\n"));
+
+ wxFileSystem::AddHandler(new wxZipFSHandler);
+ wxFileSystem fs;
+ wxPrintf(wxT("Dumping all files in the archive %s:\n"), TESTFILE_ZIP);
+
+ DumpZipDirectory(fs, wxT(""), wxString(wxT(' '), 4));
+}
+
+#endif // TEST_ZIP
+
+// ----------------------------------------------------------------------------
+// date time
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_DATETIME
+
+#include "wx/math.h"
+#include "wx/datetime.h"
+
+// this test miscellaneous static wxDateTime functions
+
+#if TEST_ALL
+
+static void TestTimeStatic()
+{
+ wxPuts(wxT("\n*** wxDateTime static methods test ***"));
+
+ // some info about the current date
+ int year = wxDateTime::GetCurrentYear();
+ wxPrintf(wxT("Current year %d is %sa leap one and has %d days.\n"),
+ year,
+ wxDateTime::IsLeapYear(year) ? "" : "not ",
+ wxDateTime::GetNumberOfDays(year));
+
+ wxDateTime::Month month = wxDateTime::GetCurrentMonth();
+ wxPrintf(wxT("Current month is '%s' ('%s') and it has %d days\n"),
+ wxDateTime::GetMonthName(month, wxDateTime::Name_Abbr).c_str(),
+ wxDateTime::GetMonthName(month).c_str(),
+ wxDateTime::GetNumberOfDays(month));
+}
+
+// test time zones stuff
+static void TestTimeZones()
+{
+ wxPuts(wxT("\n*** wxDateTime timezone test ***"));
+
+ wxDateTime now = wxDateTime::Now();
+
+ wxPrintf(wxT("Current GMT time:\t%s\n"), now.Format(wxT("%c"), wxDateTime::GMT0).c_str());
+ wxPrintf(wxT("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(wxT("%c"), wxDateTime::GMT0).c_str());
+ wxPrintf(wxT("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(wxT("%c"), wxDateTime::EST).c_str());
+ wxPrintf(wxT("Current time in Paris:\t%s\n"), now.Format(wxT("%c"), wxDateTime::CET).c_str());
+ wxPrintf(wxT(" Moscow:\t%s\n"), now.Format(wxT("%c"), wxDateTime::MSK).c_str());
+ wxPrintf(wxT(" New York:\t%s\n"), now.Format(wxT("%c"), wxDateTime::EST).c_str());
+
+ wxPrintf(wxT("%s\n"), wxDateTime::Now().Format(wxT("Our timezone is %Z")).c_str());
+
+ wxDateTime::Tm tm = now.GetTm();
+ if ( wxDateTime(tm) != now )
+ {
+ wxPrintf(wxT("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
+static void TestTimeRange()
+{
+ wxPuts(wxT("\n*** wxDateTime out-of-standard-range dates test ***"));
+
+ static const wxChar *fmt = wxT("%d-%b-%Y %H:%M:%S");
+
+ wxPrintf(wxT("Unix epoch:\t%s\n"),
+ wxDateTime(2440587.5).Format(fmt).c_str());
+ wxPrintf(wxT("Feb 29, 0: \t%s\n"),
+ wxDateTime(29, wxDateTime::Feb, 0).Format(fmt).c_str());
+ wxPrintf(wxT("JDN 0: \t%s\n"),
+ wxDateTime(0.0).Format(fmt).c_str());
+ wxPrintf(wxT("Jan 1, 1AD:\t%s\n"),
+ wxDateTime(1, wxDateTime::Jan, 1).Format(fmt).c_str());
+ wxPrintf(wxT("May 29, 2099:\t%s\n"),
+ wxDateTime(29, wxDateTime::May, 2099).Format(fmt).c_str());
+}
+
+// test DST calculations
+static void TestTimeDST()
+{
+ wxPuts(wxT("\n*** wxDateTime DST test ***"));
+
+ wxPrintf(wxT("DST is%s in effect now.\n\n"),
+ wxDateTime::Now().IsDST() ? wxEmptyString : wxT(" not"));
+
+ for ( int year = 1990; year < 2005; year++ )
+ {
+ wxPrintf(wxT("DST period in Europe for year %d: from %s to %s\n"),
+ year,
+ wxDateTime::GetBeginDST(year, wxDateTime::Country_EEC).Format().c_str(),
+ wxDateTime::GetEndDST(year, wxDateTime::Country_EEC).Format().c_str());
+ }
+}
+
+#endif // TEST_ALL
+
+#if TEST_INTERACTIVE
+
+static void TestDateTimeInteractive()
+{
+ wxPuts(wxT("\n*** interactive wxDateTime tests ***"));
+
+ wxChar buf[128];
+
+ for ( ;; )
+ {
+ wxPrintf(wxT("Enter a date: "));
+ if ( !wxFgets(buf, WXSIZEOF(buf), stdin) )
+ break;
+
+ // kill the last '\n'
+ buf[wxStrlen(buf) - 1] = 0;
+
+ wxDateTime dt;
+ const wxChar *p = dt.ParseDate(buf);
+ if ( !p )
+ {
+ wxPrintf(wxT("ERROR: failed to parse the date '%s'.\n"), buf);
+
+ continue;