+ result |= wxStrcmp (buf,
+ _T("onetwo three "));
+
+ wxPuts (result != 0 ? _T("Test failed!") : _T("Test ok."));
+ }
+
+#ifdef wxLongLong_t
+ {
+ wxChar buf[200];
+
+ wxSprintf(buf, _T("%07") wxLongLongFmtSpec _T("o"), wxLL(040000000000));
+ #if 0
+ // for some reason below line fails under Borland
+ wxPrintf (_T("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf);
+ #endif
+
+ if (wxStrcmp (buf, _T("40000000000")) != 0)
+ {
+ result = 1;
+ wxPuts (_T("\tFAILED"));
+ }
+ wxUnusedVar(result);
+ wxPuts (wxEmptyString);
+ }
+#endif // wxLongLong_t
+
+ wxPrintf (_T("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX + 2, UCHAR_MAX + 2);
+ wxPrintf (_T("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX + 2, USHRT_MAX + 2);
+
+ wxPuts (_T("--- Should be no further output. ---"));
+ rfg1 ();
+ rfg2 ();
+
+#if 0
+ {
+ wxChar bytes[7];
+ wxChar buf[20];
+
+ memset (bytes, '\xff', sizeof bytes);
+ wxSprintf (buf, _T("foo%hhn\n"), &bytes[3]);
+ if (bytes[0] != '\xff' || bytes[1] != '\xff' || bytes[2] != '\xff'
+ || bytes[4] != '\xff' || bytes[5] != '\xff' || bytes[6] != '\xff')
+ {
+ wxPuts (_T("%hhn overwrite more bytes"));
+ result = 1;
+ }
+ if (bytes[3] != 3)
+ {
+ wxPuts (_T("%hhn wrote incorrect value"));
+ result = 1;
+ }
+ }
+#endif
+}
+
+static void
+rfg1 (void)
+{
+ wxChar buf[100];
+
+ wxSprintf (buf, _T("%5.s"), _T("xyz"));
+ if (wxStrcmp (buf, _T(" ")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" "));
+ wxSprintf (buf, _T("%5.f"), 33.3);
+ if (wxStrcmp (buf, _T(" 33")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 33"));
+ wxSprintf (buf, _T("%8.e"), 33.3e7);
+ if (wxStrcmp (buf, _T(" 3e+08")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 3e+08"));
+ wxSprintf (buf, _T("%8.E"), 33.3e7);
+ if (wxStrcmp (buf, _T(" 3E+08")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 3E+08"));
+ wxSprintf (buf, _T("%.g"), 33.3);
+ if (wxStrcmp (buf, _T("3e+01")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T("3e+01"));
+ wxSprintf (buf, _T("%.G"), 33.3);
+ if (wxStrcmp (buf, _T("3E+01")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T("3E+01"));
+}
+
+static void
+rfg2 (void)
+{
+ int prec;
+ wxChar buf[100];
+ wxString test_format;
+
+ prec = 0;
+ wxSprintf (buf, _T("%.*g"), prec, 3.3);
+ if (wxStrcmp (buf, _T("3")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T("3"));
+ prec = 0;
+ wxSprintf (buf, _T("%.*G"), prec, 3.3);
+ if (wxStrcmp (buf, _T("3")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T("3"));
+ prec = 0;
+ wxSprintf (buf, _T("%7.*G"), prec, 3.33);
+ if (wxStrcmp (buf, _T(" 3")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 3"));
+ prec = 3;
+ test_format = _T("%04.*o");
+ wxSprintf (buf, test_format.c_str(), prec, 33);
+ if (wxStrcmp (buf, _T(" 041")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 041"));
+ prec = 7;
+ test_format = _T("%09.*u");
+ wxSprintf (buf, test_format.c_str(), prec, 33);
+ if (wxStrcmp (buf, _T(" 0000033")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 0000033"));
+ prec = 3;
+ test_format = _T("%04.*x");
+ wxSprintf (buf, test_format.c_str(), prec, 33);
+ if (wxStrcmp (buf, _T(" 021")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 021"));
+ prec = 3;
+ test_format = _T("%04.*X");
+ wxSprintf (buf, test_format.c_str(), prec, 33);
+ if (wxStrcmp (buf, _T(" 021")) != 0)
+ wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 021"));
+}
+
+#endif // TEST_PRINTF
+
+// ----------------------------------------------------------------------------
+// registry and related stuff
+// ----------------------------------------------------------------------------
+
+// this is for MSW only
+#ifndef __WXMSW__
+ #undef TEST_REGCONF
+ #undef TEST_REGISTRY
+#endif
+
+#ifdef TEST_REGCONF
+
+#include "wx/confbase.h"
+#include "wx/msw/regconf.h"
+
+#if 0
+static void TestRegConfWrite()
+{
+ wxConfig *config = new wxConfig(_T("myapp"));
+ config->SetPath(_T("/group1"));
+ config->Write(_T("entry1"), _T("foo"));
+ config->SetPath(_T("/group2"));
+ config->Write(_T("entry1"), _T("bar"));
+}
+#endif
+
+static void TestRegConfRead()
+{
+ wxConfig *config = new wxConfig(_T("myapp"));
+
+ wxString str;
+ long dummy;
+ config->SetPath(_T("/"));
+ wxPuts(_T("Enumerating / subgroups:"));
+ bool bCont = config->GetFirstGroup(str, dummy);
+ while(bCont)
+ {
+ wxPuts(str);
+ bCont = config->GetNextGroup(str, dummy);
+ }
+}
+
+#endif // TEST_REGCONF
+
+#ifdef TEST_REGISTRY
+
+#include "wx/msw/registry.h"
+
+// I chose this one because I liked its name, but it probably only exists under
+// NT
+static const wxChar *TESTKEY =
+ _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
+
+static void TestRegistryRead()
+{
+ wxPuts(_T("*** testing registry reading ***"));
+
+ wxRegKey key(TESTKEY);
+ wxPrintf(_T("The test key name is '%s'.\n"), key.GetName().c_str());
+ if ( !key.Open() )
+ {
+ wxPuts(_T("ERROR: test key can't be opened, aborting test."));
+
+ return;
+ }
+
+ size_t nSubKeys, nValues;
+ if ( key.GetKeyInfo(&nSubKeys, NULL, &nValues, NULL) )
+ {
+ wxPrintf(_T("It has %u subkeys and %u values.\n"), nSubKeys, nValues);
+ }
+
+ wxPrintf(_T("Enumerating values:\n"));
+
+ long dummy;
+ wxString value;
+ bool cont = key.GetFirstValue(value, dummy);
+ while ( cont )
+ {
+ wxPrintf(_T("Value '%s': type "), value.c_str());
+ switch ( key.GetValueType(value) )
+ {
+ case wxRegKey::Type_None: wxPrintf(_T("ERROR (none)")); break;
+ case wxRegKey::Type_String: wxPrintf(_T("SZ")); break;
+ case wxRegKey::Type_Expand_String: wxPrintf(_T("EXPAND_SZ")); break;
+ case wxRegKey::Type_Binary: wxPrintf(_T("BINARY")); break;
+ case wxRegKey::Type_Dword: wxPrintf(_T("DWORD")); break;
+ case wxRegKey::Type_Multi_String: wxPrintf(_T("MULTI_SZ")); break;
+ default: wxPrintf(_T("other (unknown)")); break;
+ }
+
+ wxPrintf(_T(", value = "));
+ if ( key.IsNumericValue(value) )
+ {
+ long val;
+ key.QueryValue(value, &val);
+ wxPrintf(_T("%ld"), val);
+ }
+ else // string
+ {
+ wxString val;
+ key.QueryValue(value, val);
+ wxPrintf(_T("'%s'"), val.c_str());
+
+ key.QueryRawValue(value, val);
+ wxPrintf(_T(" (raw value '%s')"), val.c_str());
+ }
+
+ 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(_T("HKEY_CLASSES_ROOT\\.ddf") );
+ key.Create();
+ key = _T("ddxf_auto_file") ;
+ key.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
+ key.Create();
+ key = _T("ddxf_auto_file") ;
+ key.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
+ key.Create();
+ key = _T("program,0") ;
+ key.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
+ key.Create();
+ key = _T("program \"%1\"") ;
+
+ key.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
+ key.DeleteSelf();
+ key.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
+ key.DeleteSelf();
+ key.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
+ key.DeleteSelf();
+ key.SetName(_T("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(_T("*** Testing wxSocketServer ***\n"));
+
+ static const int PORT = 3000;
+
+ wxIPV4address addr;
+ addr.Service(PORT);
+
+ wxSocketServer *server = new wxSocketServer(addr);
+ if ( !server->Ok() )
+ {
+ wxPuts(_T("ERROR: failed to bind"));
+
+ return;
+ }
+
+ bool quit = false;
+ while ( !quit )
+ {
+ wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT);
+
+ wxSocketBase *socket = server->Accept();
+ if ( !socket )
+ {
+ wxPuts(_T("ERROR: wxSocketServer::Accept() failed."));
+ break;
+ }
+
+ wxPuts(_T("Server: got a client."));
+
+ server->SetTimeout(60); // 1 min
+
+ bool close = false;
+ while ( !close && socket->IsConnected() )
+ {
+ wxString s;
+ wxChar ch = _T('\0');
+ for ( ;; )
+ {
+ if ( socket->Read(&ch, sizeof(ch)).Error() )
+ {
+ // don't log error if the client just close the connection
+ if ( socket->IsConnected() )
+ {
+ wxPuts(_T("ERROR: in wxSocket::Read."));
+ }
+
+ break;
+ }
+
+ if ( ch == '\r' )
+ continue;
+
+ if ( ch == '\n' )
+ break;
+
+ s += ch;
+ }
+
+ if ( ch != '\n' )
+ {
+ break;
+ }
+
+ wxPrintf(_T("Server: got '%s'.\n"), s.c_str());
+ if ( s == _T("close") )
+ {
+ wxPuts(_T("Closing connection"));
+
+ close = true;
+ }
+ else if ( s == _T("quit") )
+ {
+ close =
+ quit = true;
+
+ wxPuts(_T("Shutting down the server"));
+ }
+ else // not a special command
+ {
+ socket->Write(s.MakeUpper().c_str(), s.length());
+ socket->Write("\r\n", 2);
+ wxPrintf(_T("Server: wrote '%s'.\n"), s.c_str());
+ }
+ }
+
+ if ( !close )
+ {
+ wxPuts(_T("Server: lost a client unexpectedly."));
+ }
+
+ socket->Destroy();
+ }
+
+ // same as "delete server" but is consistent with GUI programs
+ server->Destroy();
+}
+
+static void TestSocketClient()
+{
+ wxPuts(_T("*** Testing wxSocketClient ***\n"));
+
+ static const wxChar *hostname = _T("www.wxwidgets.org");
+
+ wxIPV4address addr;
+ addr.Hostname(hostname);
+ addr.Service(80);
+
+ wxPrintf(_T("--- Attempting to connect to %s:80...\n"), hostname);
+
+ wxSocketClient client;
+ if ( !client.Connect(addr) )
+ {
+ wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname);
+ }
+ else
+ {
+ wxPrintf(_T("--- 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(_T("GET http://%s/\r\n"), hostname);
+ client.Write(cmdGet, cmdGet.length());
+ wxPrintf(_T("--- Sent command '%s' to the server\n"),
+ MakePrintable(cmdGet).c_str());
+ client.Read(buf, WXSIZEOF(buf));
+ wxPrintf(_T("--- Server replied:\n%s"), buf);
+ }
+}
+
+#endif // TEST_SOCKETS
+
+// ----------------------------------------------------------------------------
+// FTP
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_FTP
+
+#include "wx/protocol/ftp.h"
+
+static wxFTP ftp;
+
+#define FTP_ANONYMOUS
+
+#ifdef FTP_ANONYMOUS
+ static const wxChar *directory = _T("/pub");
+ static const wxChar *filename = _T("welcome.msg");
+#else
+ static const wxChar *directory = _T("/etc");
+ static const wxChar *filename = _T("issue");
+#endif
+
+static bool TestFtpConnect()
+{
+ wxPuts(_T("*** Testing FTP connect ***"));
+
+#ifdef FTP_ANONYMOUS
+ static const wxChar *hostname = _T("ftp.wxwidgets.org");
+
+ wxPrintf(_T("--- 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(_T("Password for %s: "), password);
+ wxFgets(password, WXSIZEOF(password), stdin);
+ password[wxStrlen(password) - 1] = '\0'; // chop off '\n'
+ ftp.SetPassword(password);
+
+ wxPrintf(_T("--- Attempting to connect to %s:21 as %s...\n"), hostname, user);
+#endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
+
+ if ( !ftp.Connect(hostname) )
+ {
+ wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname);
+
+ return false;
+ }
+ else
+ {
+ wxPrintf(_T("--- Connected to %s, current directory is '%s'\n"),
+ hostname, ftp.Pwd().c_str());
+ ftp.Close();
+ }
+
+ return true;
+}
+
+// test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
+static void TestFtpWuFtpd()
+{
+ wxFTP ftp;
+ static const wxChar *hostname = _T("ftp.eudora.com");
+ if ( !ftp.Connect(hostname) )
+ {
+ wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname);
+ }
+ else
+ {
+ static const wxChar *filename = _T("eudora/pubs/draft-gellens-submit-09.txt");