1 /////////////////////////////////////////////////////////////////////////////
2 // Name: samples/console/console.cpp
3 // Purpose: A sample console (as opposed to GUI) program using wxWidgets
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
24 #include "wx/string.h"
28 #include "wx/apptrait.h"
29 #include "wx/platinfo.h"
30 #include "wx/wxchar.h"
32 // without this pragma, the stupid compiler precompiles #defines below so that
33 // changing them doesn't "take place" later!
38 // ----------------------------------------------------------------------------
39 // conditional compilation
40 // ----------------------------------------------------------------------------
43 A note about all these conditional compilation macros: this file is used
44 both as a test suite for various non-GUI wxWidgets classes and as a
45 scratchpad for quick tests. So there are two compilation modes: if you
46 define TEST_ALL all tests are run, otherwise you may enable the individual
47 tests individually in the "#else" branch below.
50 // what to test (in alphabetic order)? Define TEST_ALL to 0 to do a single
51 // test, define it to 1 to do all tests.
66 // #define TEST_FTP --FIXME! (RN)
67 #define TEST_INFO_FUNCTIONS
77 #define TEST_SCOPEGUARD
79 // #define TEST_SOCKETS --FIXME! (RN)
80 #define TEST_STACKWALKER
83 #define TEST_TEXTSTREAM
86 // #define TEST_VCARD -- don't enable this (VZ)
87 // #define TEST_VOLUME --FIXME! (RN)
94 // some tests are interactive, define this to run them
95 #ifdef TEST_INTERACTIVE
96 #undef TEST_INTERACTIVE
98 #define TEST_INTERACTIVE 1
100 #define TEST_INTERACTIVE 0
103 // ============================================================================
105 // ============================================================================
107 // ----------------------------------------------------------------------------
109 // ----------------------------------------------------------------------------
111 #if defined(TEST_SOCKETS)
113 // replace TABs with \t and CRs with \n
114 static wxString
MakePrintable(const wxChar
*s
)
117 (void)str
.Replace(_T("\t"), _T("\\t"));
118 (void)str
.Replace(_T("\n"), _T("\\n"));
119 (void)str
.Replace(_T("\r"), _T("\\r"));
124 #endif // MakePrintable() is used
126 // ----------------------------------------------------------------------------
128 // ----------------------------------------------------------------------------
132 #include "wx/cmdline.h"
133 #include "wx/datetime.h"
135 #if wxUSE_CMDLINE_PARSER
137 static void ShowCmdLine(const wxCmdLineParser
& parser
)
139 wxString s
= _T("Command line parsed successfully:\nInput files: ");
141 size_t count
= parser
.GetParamCount();
142 for ( size_t param
= 0; param
< count
; param
++ )
144 s
<< parser
.GetParam(param
) << ' ';
148 << _T("Verbose:\t") << (parser
.Found(_T("v")) ? _T("yes") : _T("no")) << '\n'
149 << _T("Quiet:\t") << (parser
.Found(_T("q")) ? _T("yes") : _T("no")) << '\n';
155 if ( parser
.Found(_T("o"), &strVal
) )
156 s
<< _T("Output file:\t") << strVal
<< '\n';
157 if ( parser
.Found(_T("i"), &strVal
) )
158 s
<< _T("Input dir:\t") << strVal
<< '\n';
159 if ( parser
.Found(_T("s"), &lVal
) )
160 s
<< _T("Size:\t") << lVal
<< '\n';
161 if ( parser
.Found(_T("f"), &dVal
) )
162 s
<< _T("Double:\t") << dVal
<< '\n';
163 if ( parser
.Found(_T("d"), &dt
) )
164 s
<< _T("Date:\t") << dt
.FormatISODate() << '\n';
165 if ( parser
.Found(_T("project_name"), &strVal
) )
166 s
<< _T("Project:\t") << strVal
<< '\n';
171 #endif // wxUSE_CMDLINE_PARSER
173 static void TestCmdLineConvert()
175 static const wxChar
*cmdlines
[] =
178 _T("-a \"-bstring 1\" -c\"string 2\" \"string 3\""),
179 _T("literal \\\" and \"\""),
182 for ( size_t n
= 0; n
< WXSIZEOF(cmdlines
); n
++ )
184 const wxChar
*cmdline
= cmdlines
[n
];
185 wxPrintf(_T("Parsing: %s\n"), cmdline
);
186 wxArrayString args
= wxCmdLineParser::ConvertStringToArgs(cmdline
);
188 size_t count
= args
.GetCount();
189 wxPrintf(_T("\targc = %u\n"), count
);
190 for ( size_t arg
= 0; arg
< count
; arg
++ )
192 wxPrintf(_T("\targv[%u] = %s\n"), arg
, args
[arg
].c_str());
197 #endif // TEST_CMDLINE
199 // ----------------------------------------------------------------------------
201 // ----------------------------------------------------------------------------
208 static const wxChar
*ROOTDIR
= _T("/");
209 static const wxChar
*TESTDIR
= _T("/usr/local/share");
210 #elif defined(__WXMSW__) || defined(__DOS__) || defined(__OS2__)
211 static const wxChar
*ROOTDIR
= _T("c:\\");
212 static const wxChar
*TESTDIR
= _T("d:\\");
214 #error "don't know where the root directory is"
217 static void TestDirEnumHelper(wxDir
& dir
,
218 int flags
= wxDIR_DEFAULT
,
219 const wxString
& filespec
= wxEmptyString
)
223 if ( !dir
.IsOpened() )
226 bool cont
= dir
.GetFirst(&filename
, filespec
, flags
);
229 wxPrintf(_T("\t%s\n"), filename
.c_str());
231 cont
= dir
.GetNext(&filename
);
234 wxPuts(wxEmptyString
);
239 static void TestDirEnum()
241 wxPuts(_T("*** Testing wxDir::GetFirst/GetNext ***"));
243 wxString cwd
= wxGetCwd();
244 if ( !wxDir::Exists(cwd
) )
246 wxPrintf(_T("ERROR: current directory '%s' doesn't exist?\n"), cwd
.c_str());
251 if ( !dir
.IsOpened() )
253 wxPrintf(_T("ERROR: failed to open current directory '%s'.\n"), cwd
.c_str());
257 wxPuts(_T("Enumerating everything in current directory:"));
258 TestDirEnumHelper(dir
);
260 wxPuts(_T("Enumerating really everything in current directory:"));
261 TestDirEnumHelper(dir
, wxDIR_DEFAULT
| wxDIR_DOTDOT
);
263 wxPuts(_T("Enumerating object files in current directory:"));
264 TestDirEnumHelper(dir
, wxDIR_DEFAULT
, _T("*.o*"));
266 wxPuts(_T("Enumerating directories in current directory:"));
267 TestDirEnumHelper(dir
, wxDIR_DIRS
);
269 wxPuts(_T("Enumerating files in current directory:"));
270 TestDirEnumHelper(dir
, wxDIR_FILES
);
272 wxPuts(_T("Enumerating files including hidden in current directory:"));
273 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
277 wxPuts(_T("Enumerating everything in root directory:"));
278 TestDirEnumHelper(dir
, wxDIR_DEFAULT
);
280 wxPuts(_T("Enumerating directories in root directory:"));
281 TestDirEnumHelper(dir
, wxDIR_DIRS
);
283 wxPuts(_T("Enumerating files in root directory:"));
284 TestDirEnumHelper(dir
, wxDIR_FILES
);
286 wxPuts(_T("Enumerating files including hidden in root directory:"));
287 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
289 wxPuts(_T("Enumerating files in non existing directory:"));
290 wxDir
dirNo(_T("nosuchdir"));
291 TestDirEnumHelper(dirNo
);
296 class DirPrintTraverser
: public wxDirTraverser
299 virtual wxDirTraverseResult
OnFile(const wxString
& WXUNUSED(filename
))
301 return wxDIR_CONTINUE
;
304 virtual wxDirTraverseResult
OnDir(const wxString
& dirname
)
306 wxString path
, name
, ext
;
307 wxSplitPath(dirname
, &path
, &name
, &ext
);
310 name
<< _T('.') << ext
;
313 for ( const wxChar
*p
= path
.c_str(); *p
; p
++ )
315 if ( wxIsPathSeparator(*p
) )
319 wxPrintf(_T("%s%s\n"), indent
.c_str(), name
.c_str());
321 return wxDIR_CONTINUE
;
325 static void TestDirTraverse()
327 wxPuts(_T("*** Testing wxDir::Traverse() ***"));
331 size_t n
= wxDir::GetAllFiles(TESTDIR
, &files
);
332 wxPrintf(_T("There are %u files under '%s'\n"), n
, TESTDIR
);
335 wxPrintf(_T("First one is '%s'\n"), files
[0u].c_str());
336 wxPrintf(_T(" last one is '%s'\n"), files
[n
- 1].c_str());
339 // enum again with custom traverser
340 wxPuts(_T("Now enumerating directories:"));
342 DirPrintTraverser traverser
;
343 dir
.Traverse(traverser
, wxEmptyString
, wxDIR_DIRS
| wxDIR_HIDDEN
);
348 static void TestDirExists()
350 wxPuts(_T("*** Testing wxDir::Exists() ***"));
352 static const wxChar
*dirnames
[] =
355 #if defined(__WXMSW__)
358 _T("\\\\share\\file"),
362 _T("c:\\autoexec.bat"),
363 #elif defined(__UNIX__)
372 for ( size_t n
= 0; n
< WXSIZEOF(dirnames
); n
++ )
374 wxPrintf(_T("%-40s: %s\n"),
376 wxDir::Exists(dirnames
[n
]) ? _T("exists")
377 : _T("doesn't exist"));
385 // ----------------------------------------------------------------------------
387 // ----------------------------------------------------------------------------
391 #include "wx/dynlib.h"
393 static void TestDllLoad()
395 #if defined(__WXMSW__)
396 static const wxChar
*LIB_NAME
= _T("kernel32.dll");
397 static const wxChar
*FUNC_NAME
= _T("lstrlenA");
398 #elif defined(__UNIX__)
399 // weird: using just libc.so does *not* work!
400 static const wxChar
*LIB_NAME
= _T("/lib/libc.so.6");
401 static const wxChar
*FUNC_NAME
= _T("strlen");
403 #error "don't know how to test wxDllLoader on this platform"
406 wxPuts(_T("*** testing basic wxDynamicLibrary functions ***\n"));
408 wxDynamicLibrary
lib(LIB_NAME
);
409 if ( !lib
.IsLoaded() )
411 wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME
);
415 typedef int (wxSTDCALL
*wxStrlenType
)(const char *);
416 wxStrlenType pfnStrlen
= (wxStrlenType
)lib
.GetSymbol(FUNC_NAME
);
419 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
420 FUNC_NAME
, LIB_NAME
);
424 wxPrintf(_T("Calling %s dynamically loaded from %s "),
425 FUNC_NAME
, LIB_NAME
);
427 if ( pfnStrlen("foo") != 3 )
429 wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
433 wxPuts(_T("... ok"));
438 static const wxChar
*FUNC_NAME_AW
= _T("lstrlen");
440 typedef int (wxSTDCALL
*wxStrlenTypeAorW
)(const wxChar
*);
442 pfnStrlenAorW
= (wxStrlenTypeAorW
)lib
.GetSymbolAorW(FUNC_NAME_AW
);
443 if ( !pfnStrlenAorW
)
445 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
446 FUNC_NAME_AW
, LIB_NAME
);
450 if ( pfnStrlenAorW(_T("foobar")) != 6 )
452 wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
459 #if defined(__WXMSW__) || defined(__UNIX__)
461 static void TestDllListLoaded()
463 wxPuts(_T("*** testing wxDynamicLibrary::ListLoaded() ***\n"));
465 puts("\nLoaded modules:");
466 wxDynamicLibraryDetailsArray dlls
= wxDynamicLibrary::ListLoaded();
467 const size_t count
= dlls
.GetCount();
468 for ( size_t n
= 0; n
< count
; ++n
)
470 const wxDynamicLibraryDetails
& details
= dlls
[n
];
471 printf("%-45s", (const char *)details
.GetPath().mb_str());
475 if ( details
.GetAddress(&addr
, &len
) )
477 printf(" %08lx:%08lx",
478 (unsigned long)addr
, (unsigned long)((char *)addr
+ len
));
481 printf(" %s\n", (const char *)details
.GetVersion().mb_str());
487 #endif // TEST_DYNLIB
489 // ----------------------------------------------------------------------------
491 // ----------------------------------------------------------------------------
495 #include "wx/utils.h"
497 static wxString
MyGetEnv(const wxString
& var
)
500 if ( !wxGetEnv(var
, &val
) )
503 val
= wxString(_T('\'')) + val
+ _T('\'');
508 static void TestEnvironment()
510 const wxChar
*var
= _T("wxTestVar");
512 wxPuts(_T("*** testing environment access functions ***"));
514 wxPrintf(_T("Initially getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
515 wxSetEnv(var
, _T("value for wxTestVar"));
516 wxPrintf(_T("After wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
517 wxSetEnv(var
, _T("another value"));
518 wxPrintf(_T("After 2nd wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
520 wxPrintf(_T("After wxUnsetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
521 wxPrintf(_T("PATH = %s\n"), MyGetEnv(_T("PATH")).c_str());
524 #endif // TEST_ENVIRON
526 // ----------------------------------------------------------------------------
528 // ----------------------------------------------------------------------------
532 #include "wx/utils.h"
534 static void TestExecute()
536 wxPuts(_T("*** testing wxExecute ***"));
539 #define COMMAND "echo hi"
540 #define ASYNC_COMMAND "xclock"
541 #define SHELL_COMMAND "echo hi from shell"
542 #define REDIRECT_COMMAND "cat -n Makefile"
543 #elif defined(__WXMSW__)
544 #define COMMAND "command.com /c echo hi"
545 #define ASYNC_COMMAND "notepad"
546 #define SHELL_COMMAND "echo hi"
547 #define REDIRECT_COMMAND COMMAND
549 #error "no command to exec"
552 wxPrintf(_T("Testing wxShell: "));
554 if ( wxShell(_T(SHELL_COMMAND
)) )
557 wxPuts(_T("ERROR."));
559 wxPrintf(_T("Testing wxExecute: "));
561 if ( wxExecute(_T(COMMAND
), wxEXEC_SYNC
) == 0 )
564 wxPuts(_T("ERROR."));
566 wxPrintf(_T("Testing async wxExecute: "));
568 int pid
= wxExecute(ASYNC_COMMAND
);
571 wxPuts(_T("Ok (command launched)."));
572 if ( wxKill(pid
) == -1 )
573 wxPuts("ERROR: failed to kill child process.");
576 wxPuts(_T("ERROR."));
578 wxPrintf(_T("Testing wxExecute with redirection:\n"));
579 wxArrayString output
;
580 if ( wxExecute(_T(REDIRECT_COMMAND
), output
) != 0 )
582 wxPuts(_T("ERROR."));
586 // don't show too much output, MAX_LINES is enough
587 static const unsigned MAX_LINES
= 20;
589 const unsigned count
= output
.size();
590 for ( unsigned n
= 0;
591 n
< (count
> MAX_LINES
? MAX_LINES
/2 : count
);
594 wxPrintf("%04u:\t%s\n", n
+ 1, output
[n
]);
597 if ( count
> MAX_LINES
)
599 wxPrintf("... skipping %u lines...\n", count
- MAX_LINES
);
601 for ( unsigned n
= count
- MAX_LINES
/2; n
< count
; n
++ )
603 wxPrintf("%04u:\t%s\n", n
+ 1, output
[n
]);
611 #endif // TEST_EXECUTE
613 // ----------------------------------------------------------------------------
615 // ----------------------------------------------------------------------------
620 #include "wx/ffile.h"
621 #include "wx/textfile.h"
623 static void TestFileRead()
625 wxPuts(_T("*** wxFile read test ***"));
627 wxFile
file(_T("testdata.fc"));
628 if ( file
.IsOpened() )
630 wxPrintf(_T("File length: %lu\n"), file
.Length());
632 wxPuts(_T("File dump:\n----------"));
634 static const size_t len
= 1024;
638 size_t nRead
= file
.Read(buf
, len
);
639 if ( nRead
== (size_t)wxInvalidOffset
)
641 wxPrintf(_T("Failed to read the file."));
645 fwrite(buf
, nRead
, 1, stdout
);
651 wxPuts(_T("----------"));
655 wxPrintf(_T("ERROR: can't open test file.\n"));
658 wxPuts(wxEmptyString
);
661 static void TestTextFileRead()
663 wxPuts(_T("*** wxTextFile read test ***"));
665 wxTextFile
file(_T("testdata.fc"));
668 wxPrintf(_T("Number of lines: %u\n"), file
.GetLineCount());
669 wxPrintf(_T("Last line: '%s'\n"), file
.GetLastLine().c_str());
673 wxPuts(_T("\nDumping the entire file:"));
674 for ( s
= file
.GetFirstLine(); !file
.Eof(); s
= file
.GetNextLine() )
676 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
678 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
680 wxPuts(_T("\nAnd now backwards:"));
681 for ( s
= file
.GetLastLine();
682 file
.GetCurrentLine() != 0;
683 s
= file
.GetPrevLine() )
685 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
687 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
691 wxPrintf(_T("ERROR: can't open '%s'\n"), file
.GetName());
694 wxPuts(wxEmptyString
);
697 static void TestFileCopy()
699 wxPuts(_T("*** Testing wxCopyFile ***"));
701 static const wxChar
*filename1
= _T("testdata.fc");
702 static const wxChar
*filename2
= _T("test2");
703 if ( !wxCopyFile(filename1
, filename2
) )
705 wxPuts(_T("ERROR: failed to copy file"));
709 wxFFile
f1(filename1
, _T("rb")),
710 f2(filename2
, _T("rb"));
712 if ( !f1
.IsOpened() || !f2
.IsOpened() )
714 wxPuts(_T("ERROR: failed to open file(s)"));
719 if ( !f1
.ReadAll(&s1
) || !f2
.ReadAll(&s2
) )
721 wxPuts(_T("ERROR: failed to read file(s)"));
725 if ( (s1
.length() != s2
.length()) ||
726 (memcmp(s1
.c_str(), s2
.c_str(), s1
.length()) != 0) )
728 wxPuts(_T("ERROR: copy error!"));
732 wxPuts(_T("File was copied ok."));
738 if ( !wxRemoveFile(filename2
) )
740 wxPuts(_T("ERROR: failed to remove the file"));
743 wxPuts(wxEmptyString
);
746 static void TestTempFile()
748 wxPuts(_T("*** wxTempFile test ***"));
751 if ( tmpFile
.Open(_T("test2")) && tmpFile
.Write(_T("the answer is 42")) )
753 if ( tmpFile
.Commit() )
754 wxPuts(_T("File committed."));
756 wxPuts(_T("ERROR: could't commit temp file."));
758 wxRemoveFile(_T("test2"));
761 wxPuts(wxEmptyString
);
766 // ----------------------------------------------------------------------------
768 // ----------------------------------------------------------------------------
772 #include "wx/confbase.h"
773 #include "wx/fileconf.h"
775 static const struct FileConfTestData
777 const wxChar
*name
; // value name
778 const wxChar
*value
; // the value from the file
781 { _T("value1"), _T("one") },
782 { _T("value2"), _T("two") },
783 { _T("novalue"), _T("default") },
786 static void TestFileConfRead()
788 wxPuts(_T("*** testing wxFileConfig loading/reading ***"));
790 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
791 _T("testdata.fc"), wxEmptyString
,
792 wxCONFIG_USE_RELATIVE_PATH
);
794 // test simple reading
795 wxPuts(_T("\nReading config file:"));
796 wxString
defValue(_T("default")), value
;
797 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
799 const FileConfTestData
& data
= fcTestData
[n
];
800 value
= fileconf
.Read(data
.name
, defValue
);
801 wxPrintf(_T("\t%s = %s "), data
.name
, value
.c_str());
802 if ( value
== data
.value
)
808 wxPrintf(_T("(ERROR: should be %s)\n"), data
.value
);
812 // test enumerating the entries
813 wxPuts(_T("\nEnumerating all root entries:"));
816 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
819 wxPrintf(_T("\t%s = %s\n"),
821 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
823 cont
= fileconf
.GetNextEntry(name
, dummy
);
826 static const wxChar
*testEntry
= _T("TestEntry");
827 wxPrintf(_T("\nTesting deletion of newly created \"Test\" entry: "));
828 fileconf
.Write(testEntry
, _T("A value"));
829 fileconf
.DeleteEntry(testEntry
);
830 wxPrintf(fileconf
.HasEntry(testEntry
) ? _T("ERROR\n") : _T("ok\n"));
833 #endif // TEST_FILECONF
835 // ----------------------------------------------------------------------------
837 // ----------------------------------------------------------------------------
841 #include "wx/filename.h"
844 static void DumpFileName(const wxChar
*desc
, const wxFileName
& fn
)
848 wxString full
= fn
.GetFullPath();
850 wxString vol
, path
, name
, ext
;
851 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
853 wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
854 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
856 wxFileName::SplitPath(full
, &path
, &name
, &ext
);
857 wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
858 path
.c_str(), name
.c_str(), ext
.c_str());
860 wxPrintf(_T("path is also:\t'%s'\n"), fn
.GetPath().c_str());
861 wxPrintf(_T("with volume: \t'%s'\n"),
862 fn
.GetPath(wxPATH_GET_VOLUME
).c_str());
863 wxPrintf(_T("with separator:\t'%s'\n"),
864 fn
.GetPath(wxPATH_GET_SEPARATOR
).c_str());
865 wxPrintf(_T("with both: \t'%s'\n"),
866 fn
.GetPath(wxPATH_GET_SEPARATOR
| wxPATH_GET_VOLUME
).c_str());
868 wxPuts(_T("The directories in the path are:"));
869 wxArrayString dirs
= fn
.GetDirs();
870 size_t count
= dirs
.GetCount();
871 for ( size_t n
= 0; n
< count
; n
++ )
873 wxPrintf(_T("\t%u: %s\n"), n
, dirs
[n
].c_str());
878 static void TestFileNameTemp()
880 wxPuts(_T("*** testing wxFileName temp file creation ***"));
882 static const wxChar
*tmpprefixes
[] =
890 _T("/tmp/foo/bar"), // this one must be an error
894 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
896 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
899 // "error" is not in upper case because it may be ok
900 wxPrintf(_T("Prefix '%s'\t-> error\n"), tmpprefixes
[n
]);
904 wxPrintf(_T("Prefix '%s'\t-> temp file '%s'\n"),
905 tmpprefixes
[n
], path
.c_str());
907 if ( !wxRemoveFile(path
) )
909 wxLogWarning(_T("Failed to remove temp file '%s'"),
916 static void TestFileNameDirManip()
918 // TODO: test AppendDir(), RemoveDir(), ...
921 static void TestFileNameComparison()
926 static void TestFileNameOperations()
931 static void TestFileNameCwd()
936 #endif // TEST_FILENAME
938 // ----------------------------------------------------------------------------
939 // wxFileName time functions
940 // ----------------------------------------------------------------------------
944 #include "wx/filename.h"
945 #include "wx/datetime.h"
947 static void TestFileGetTimes()
949 wxFileName
fn(_T("testdata.fc"));
951 wxDateTime dtAccess
, dtMod
, dtCreate
;
952 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtCreate
) )
954 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
958 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
960 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
961 wxPrintf(_T("Creation: \t%s\n"), dtCreate
.Format(fmt
).c_str());
962 wxPrintf(_T("Last read: \t%s\n"), dtAccess
.Format(fmt
).c_str());
963 wxPrintf(_T("Last write: \t%s\n"), dtMod
.Format(fmt
).c_str());
968 static void TestFileSetTimes()
970 wxFileName
fn(_T("testdata.fc"));
974 wxPrintf(_T("ERROR: Touch() failed.\n"));
979 #endif // TEST_FILETIME
981 // ----------------------------------------------------------------------------
983 // ----------------------------------------------------------------------------
988 #include "wx/utils.h" // for wxSetEnv
990 static wxLocale
gs_localeDefault(wxLANGUAGE_ENGLISH
);
992 // find the name of the language from its value
993 static const wxChar
*GetLangName(int lang
)
995 static const wxChar
*languageNames
[] =
1005 _T("ARABIC_ALGERIA"),
1006 _T("ARABIC_BAHRAIN"),
1009 _T("ARABIC_JORDAN"),
1010 _T("ARABIC_KUWAIT"),
1011 _T("ARABIC_LEBANON"),
1013 _T("ARABIC_MOROCCO"),
1016 _T("ARABIC_SAUDI_ARABIA"),
1019 _T("ARABIC_TUNISIA"),
1026 _T("AZERI_CYRILLIC"),
1041 _T("CHINESE_SIMPLIFIED"),
1042 _T("CHINESE_TRADITIONAL"),
1043 _T("CHINESE_HONGKONG"),
1044 _T("CHINESE_MACAU"),
1045 _T("CHINESE_SINGAPORE"),
1046 _T("CHINESE_TAIWAN"),
1052 _T("DUTCH_BELGIAN"),
1056 _T("ENGLISH_AUSTRALIA"),
1057 _T("ENGLISH_BELIZE"),
1058 _T("ENGLISH_BOTSWANA"),
1059 _T("ENGLISH_CANADA"),
1060 _T("ENGLISH_CARIBBEAN"),
1061 _T("ENGLISH_DENMARK"),
1063 _T("ENGLISH_JAMAICA"),
1064 _T("ENGLISH_NEW_ZEALAND"),
1065 _T("ENGLISH_PHILIPPINES"),
1066 _T("ENGLISH_SOUTH_AFRICA"),
1067 _T("ENGLISH_TRINIDAD"),
1068 _T("ENGLISH_ZIMBABWE"),
1076 _T("FRENCH_BELGIAN"),
1077 _T("FRENCH_CANADIAN"),
1078 _T("FRENCH_LUXEMBOURG"),
1079 _T("FRENCH_MONACO"),
1085 _T("GERMAN_AUSTRIAN"),
1086 _T("GERMAN_BELGIUM"),
1087 _T("GERMAN_LIECHTENSTEIN"),
1088 _T("GERMAN_LUXEMBOURG"),
1106 _T("ITALIAN_SWISS"),
1111 _T("KASHMIRI_INDIA"),
1129 _T("MALAY_BRUNEI_DARUSSALAM"),
1130 _T("MALAY_MALAYSIA"),
1140 _T("NORWEGIAN_BOKMAL"),
1141 _T("NORWEGIAN_NYNORSK"),
1148 _T("PORTUGUESE_BRAZILIAN"),
1151 _T("RHAETO_ROMANCE"),
1154 _T("RUSSIAN_UKRAINE"),
1160 _T("SERBIAN_CYRILLIC"),
1161 _T("SERBIAN_LATIN"),
1162 _T("SERBO_CROATIAN"),
1173 _T("SPANISH_ARGENTINA"),
1174 _T("SPANISH_BOLIVIA"),
1175 _T("SPANISH_CHILE"),
1176 _T("SPANISH_COLOMBIA"),
1177 _T("SPANISH_COSTA_RICA"),
1178 _T("SPANISH_DOMINICAN_REPUBLIC"),
1179 _T("SPANISH_ECUADOR"),
1180 _T("SPANISH_EL_SALVADOR"),
1181 _T("SPANISH_GUATEMALA"),
1182 _T("SPANISH_HONDURAS"),
1183 _T("SPANISH_MEXICAN"),
1184 _T("SPANISH_MODERN"),
1185 _T("SPANISH_NICARAGUA"),
1186 _T("SPANISH_PANAMA"),
1187 _T("SPANISH_PARAGUAY"),
1189 _T("SPANISH_PUERTO_RICO"),
1190 _T("SPANISH_URUGUAY"),
1192 _T("SPANISH_VENEZUELA"),
1196 _T("SWEDISH_FINLAND"),
1214 _T("URDU_PAKISTAN"),
1216 _T("UZBEK_CYRILLIC"),
1229 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1230 return languageNames
[lang
];
1232 return _T("INVALID");
1235 static void TestDefaultLang()
1237 wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
1239 static const wxChar
*langStrings
[] =
1241 NULL
, // system default
1248 _T("de_DE.iso88591"),
1250 _T("?"), // invalid lang spec
1251 _T("klingonese"), // I bet on some systems it does exist...
1254 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1255 wxLocale::GetSystemEncodingName().c_str(),
1256 wxLocale::GetSystemEncoding());
1258 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1260 const wxChar
*langStr
= langStrings
[n
];
1263 // FIXME: this doesn't do anything at all under Windows, we need
1264 // to create a new wxLocale!
1265 wxSetEnv(_T("LC_ALL"), langStr
);
1268 int lang
= gs_localeDefault
.GetSystemLanguage();
1269 wxPrintf(_T("Locale for '%s' is %s.\n"),
1270 langStr
? langStr
: _T("system default"), GetLangName(lang
));
1274 #endif // TEST_LOCALE
1276 // ----------------------------------------------------------------------------
1278 // ----------------------------------------------------------------------------
1282 #include "wx/mimetype.h"
1284 static void TestMimeEnum()
1286 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1288 wxArrayString mimetypes
;
1290 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1292 wxPrintf(_T("*** All %u known filetypes: ***\n"), count
);
1297 for ( size_t n
= 0; n
< count
; n
++ )
1299 wxFileType
*filetype
=
1300 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1303 wxPrintf(_T("nothing known about the filetype '%s'!\n"),
1304 mimetypes
[n
].c_str());
1308 filetype
->GetDescription(&desc
);
1309 filetype
->GetExtensions(exts
);
1311 filetype
->GetIcon(NULL
);
1314 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1317 extsAll
<< _T(", ");
1321 wxPrintf(_T("\t%s: %s (%s)\n"),
1322 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
1325 wxPuts(wxEmptyString
);
1328 static void TestMimeOverride()
1330 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
1332 static const wxChar
*mailcap
= _T("/tmp/mailcap");
1333 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
1335 if ( wxFile::Exists(mailcap
) )
1336 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
1338 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
1340 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
1343 if ( wxFile::Exists(mimetypes
) )
1344 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
1346 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
1348 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
1351 wxPuts(wxEmptyString
);
1354 static void TestMimeFilename()
1356 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
1358 static const wxChar
*filenames
[] =
1366 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1368 const wxString fname
= filenames
[n
];
1369 wxString ext
= fname
.AfterLast(_T('.'));
1370 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
1373 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
1378 if ( !ft
->GetDescription(&desc
) )
1379 desc
= _T("<no description>");
1382 if ( !ft
->GetOpenCommand(&cmd
,
1383 wxFileType::MessageParameters(fname
, wxEmptyString
)) )
1384 cmd
= _T("<no command available>");
1386 cmd
= wxString(_T('"')) + cmd
+ _T('"');
1388 wxPrintf(_T("To open %s (%s) do %s.\n"),
1389 fname
.c_str(), desc
.c_str(), cmd
.c_str());
1395 wxPuts(wxEmptyString
);
1398 static void TestMimeAssociate()
1400 wxPuts(_T("*** Testing creation of filetype association ***\n"));
1402 wxFileTypeInfo
ftInfo(
1403 _T("application/x-xyz"),
1404 _T("xyzview '%s'"), // open cmd
1405 _T(""), // print cmd
1406 _T("XYZ File"), // description
1407 _T(".xyz"), // extensions
1408 wxNullPtr
// end of extensions
1410 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
1412 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
1415 wxPuts(_T("ERROR: failed to create association!"));
1419 // TODO: read it back
1423 wxPuts(wxEmptyString
);
1428 // ----------------------------------------------------------------------------
1429 // module dependencies feature
1430 // ----------------------------------------------------------------------------
1434 #include "wx/module.h"
1436 class wxTestModule
: public wxModule
1439 virtual bool OnInit() { wxPrintf(_T("Load module: %s\n"), GetClassInfo()->GetClassName()); return true; }
1440 virtual void OnExit() { wxPrintf(_T("Unload module: %s\n"), GetClassInfo()->GetClassName()); }
1443 class wxTestModuleA
: public wxTestModule
1448 DECLARE_DYNAMIC_CLASS(wxTestModuleA
)
1451 class wxTestModuleB
: public wxTestModule
1456 DECLARE_DYNAMIC_CLASS(wxTestModuleB
)
1459 class wxTestModuleC
: public wxTestModule
1464 DECLARE_DYNAMIC_CLASS(wxTestModuleC
)
1467 class wxTestModuleD
: public wxTestModule
1472 DECLARE_DYNAMIC_CLASS(wxTestModuleD
)
1475 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleC
, wxModule
)
1476 wxTestModuleC::wxTestModuleC()
1478 AddDependency(CLASSINFO(wxTestModuleD
));
1481 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleA
, wxModule
)
1482 wxTestModuleA::wxTestModuleA()
1484 AddDependency(CLASSINFO(wxTestModuleB
));
1485 AddDependency(CLASSINFO(wxTestModuleD
));
1488 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleD
, wxModule
)
1489 wxTestModuleD::wxTestModuleD()
1493 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleB
, wxModule
)
1494 wxTestModuleB::wxTestModuleB()
1496 AddDependency(CLASSINFO(wxTestModuleD
));
1497 AddDependency(CLASSINFO(wxTestModuleC
));
1500 #endif // TEST_MODULE
1502 // ----------------------------------------------------------------------------
1503 // misc information functions
1504 // ----------------------------------------------------------------------------
1506 #ifdef TEST_INFO_FUNCTIONS
1508 #include "wx/utils.h"
1510 #if TEST_INTERACTIVE
1511 static void TestDiskInfo()
1513 wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
1517 wxChar pathname
[128];
1518 wxPrintf(_T("\nEnter a directory name: "));
1519 if ( !wxFgets(pathname
, WXSIZEOF(pathname
), stdin
) )
1522 // kill the last '\n'
1523 pathname
[wxStrlen(pathname
) - 1] = 0;
1525 wxLongLong total
, free
;
1526 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
1528 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
1532 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
1533 (total
/ 1024).ToString().c_str(),
1534 (free
/ 1024).ToString().c_str(),
1539 #endif // TEST_INTERACTIVE
1541 static void TestOsInfo()
1543 wxPuts(_T("*** Testing OS info functions ***\n"));
1546 wxGetOsVersion(&major
, &minor
);
1547 wxPrintf(_T("Running under: %s, version %d.%d\n"),
1548 wxGetOsDescription().c_str(), major
, minor
);
1550 wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory().ToLong());
1552 wxPrintf(_T("Host name is %s (%s).\n"),
1553 wxGetHostName().c_str(), wxGetFullHostName().c_str());
1555 wxPuts(wxEmptyString
);
1558 static void TestPlatformInfo()
1560 wxPuts(_T("*** Testing wxPlatformInfo functions ***\n"));
1562 // get this platform
1563 wxPlatformInfo plat
;
1565 wxPrintf(_T("Operating system family name is: %s\n"), plat
.GetOperatingSystemFamilyName().c_str());
1566 wxPrintf(_T("Operating system name is: %s\n"), plat
.GetOperatingSystemIdName().c_str());
1567 wxPrintf(_T("Port ID name is: %s\n"), plat
.GetPortIdName().c_str());
1568 wxPrintf(_T("Port ID short name is: %s\n"), plat
.GetPortIdShortName().c_str());
1569 wxPrintf(_T("Architecture is: %s\n"), plat
.GetArchName().c_str());
1570 wxPrintf(_T("Endianness is: %s\n"), plat
.GetEndiannessName().c_str());
1572 wxPuts(wxEmptyString
);
1575 static void TestUserInfo()
1577 wxPuts(_T("*** Testing user info functions ***\n"));
1579 wxPrintf(_T("User id is:\t%s\n"), wxGetUserId().c_str());
1580 wxPrintf(_T("User name is:\t%s\n"), wxGetUserName().c_str());
1581 wxPrintf(_T("Home dir is:\t%s\n"), wxGetHomeDir().c_str());
1582 wxPrintf(_T("Email address:\t%s\n"), wxGetEmailAddress().c_str());
1584 wxPuts(wxEmptyString
);
1587 #endif // TEST_INFO_FUNCTIONS
1589 // ----------------------------------------------------------------------------
1591 // ----------------------------------------------------------------------------
1593 #ifdef TEST_PATHLIST
1596 #define CMD_IN_PATH _T("ls")
1598 #define CMD_IN_PATH _T("command.com")
1601 static void TestPathList()
1603 wxPuts(_T("*** Testing wxPathList ***\n"));
1605 wxPathList pathlist
;
1606 pathlist
.AddEnvList(_T("PATH"));
1607 wxString path
= pathlist
.FindValidPath(CMD_IN_PATH
);
1610 wxPrintf(_T("ERROR: command not found in the path.\n"));
1614 wxPrintf(_T("Command found in the path as '%s'.\n"), path
.c_str());
1618 #endif // TEST_PATHLIST
1620 // ----------------------------------------------------------------------------
1621 // regular expressions
1622 // ----------------------------------------------------------------------------
1626 #include "wx/regex.h"
1628 static void TestRegExInteractive()
1630 wxPuts(_T("*** Testing RE interactively ***"));
1634 wxChar pattern
[128];
1635 wxPrintf(_T("\nEnter a pattern: "));
1636 if ( !wxFgets(pattern
, WXSIZEOF(pattern
), stdin
) )
1639 // kill the last '\n'
1640 pattern
[wxStrlen(pattern
) - 1] = 0;
1643 if ( !re
.Compile(pattern
) )
1651 wxPrintf(_T("Enter text to match: "));
1652 if ( !wxFgets(text
, WXSIZEOF(text
), stdin
) )
1655 // kill the last '\n'
1656 text
[wxStrlen(text
) - 1] = 0;
1658 if ( !re
.Matches(text
) )
1660 wxPrintf(_T("No match.\n"));
1664 wxPrintf(_T("Pattern matches at '%s'\n"), re
.GetMatch(text
).c_str());
1667 for ( size_t n
= 1; ; n
++ )
1669 if ( !re
.GetMatch(&start
, &len
, n
) )
1674 wxPrintf(_T("Subexpr %u matched '%s'\n"),
1675 n
, wxString(text
+ start
, len
).c_str());
1682 #endif // TEST_REGEX
1684 // ----------------------------------------------------------------------------
1686 // ----------------------------------------------------------------------------
1689 NB: this stuff was taken from the glibc test suite and modified to build
1690 in wxWidgets: if I read the copyright below properly, this shouldn't
1696 #ifdef wxTEST_PRINTF
1697 // use our functions from wxchar.cpp
1701 // NB: do _not_ use ATTRIBUTE_PRINTF here, we have some invalid formats
1702 // in the tests below
1703 int wxPrintf( const wxChar
*format
, ... );
1704 int wxSprintf( wxChar
*str
, const wxChar
*format
, ... );
1707 #include "wx/longlong.h"
1711 static void rfg1 (void);
1712 static void rfg2 (void);
1716 fmtchk (const wxChar
*fmt
)
1718 (void) wxPrintf(_T("%s:\t`"), fmt
);
1719 (void) wxPrintf(fmt
, 0x12);
1720 (void) wxPrintf(_T("'\n"));
1724 fmtst1chk (const wxChar
*fmt
)
1726 (void) wxPrintf(_T("%s:\t`"), fmt
);
1727 (void) wxPrintf(fmt
, 4, 0x12);
1728 (void) wxPrintf(_T("'\n"));
1732 fmtst2chk (const wxChar
*fmt
)
1734 (void) wxPrintf(_T("%s:\t`"), fmt
);
1735 (void) wxPrintf(fmt
, 4, 4, 0x12);
1736 (void) wxPrintf(_T("'\n"));
1739 /* This page is covered by the following copyright: */
1741 /* (C) Copyright C E Chew
1743 * Feel free to copy, use and distribute this software provided:
1745 * 1. you do not pretend that you wrote it
1746 * 2. you leave this copyright notice intact.
1750 * Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans.
1757 /* Formatted Output Test
1759 * This exercises the output formatting code.
1762 wxChar
*PointerNull
= NULL
;
1769 wxChar
*prefix
= buf
;
1772 wxPuts(_T("\nFormatted output test"));
1773 wxPrintf(_T("prefix 6d 6o 6x 6X 6u\n"));
1774 wxStrcpy(prefix
, _T("%"));
1775 for (i
= 0; i
< 2; i
++) {
1776 for (j
= 0; j
< 2; j
++) {
1777 for (k
= 0; k
< 2; k
++) {
1778 for (l
= 0; l
< 2; l
++) {
1779 wxStrcpy(prefix
, _T("%"));
1780 if (i
== 0) wxStrcat(prefix
, _T("-"));
1781 if (j
== 0) wxStrcat(prefix
, _T("+"));
1782 if (k
== 0) wxStrcat(prefix
, _T("#"));
1783 if (l
== 0) wxStrcat(prefix
, _T("0"));
1784 wxPrintf(_T("%5s |"), prefix
);
1785 wxStrcpy(tp
, prefix
);
1786 wxStrcat(tp
, _T("6d |"));
1788 wxStrcpy(tp
, prefix
);
1789 wxStrcat(tp
, _T("6o |"));
1791 wxStrcpy(tp
, prefix
);
1792 wxStrcat(tp
, _T("6x |"));
1794 wxStrcpy(tp
, prefix
);
1795 wxStrcat(tp
, _T("6X |"));
1797 wxStrcpy(tp
, prefix
);
1798 wxStrcat(tp
, _T("6u |"));
1805 wxPrintf(_T("%10s\n"), PointerNull
);
1806 wxPrintf(_T("%-10s\n"), PointerNull
);
1809 static void TestPrintf()
1811 static wxChar shortstr
[] = _T("Hi, Z.");
1812 static wxChar longstr
[] = _T("Good morning, Doctor Chandra. This is Hal. \
1813 I am ready for my first lesson today.");
1815 wxString test_format
;
1819 fmtchk(_T("%4.4x"));
1820 fmtchk(_T("%04.4x"));
1821 fmtchk(_T("%4.3x"));
1822 fmtchk(_T("%04.3x"));
1824 fmtst1chk(_T("%.*x"));
1825 fmtst1chk(_T("%0*x"));
1826 fmtst2chk(_T("%*.*x"));
1827 fmtst2chk(_T("%0*.*x"));
1829 wxString bad_format
= _T("bad format:\t\"%b\"\n");
1830 wxPrintf(bad_format
.c_str());
1831 wxPrintf(_T("nil pointer (padded):\t\"%10p\"\n"), (void *) NULL
);
1833 wxPrintf(_T("decimal negative:\t\"%d\"\n"), -2345);
1834 wxPrintf(_T("octal negative:\t\"%o\"\n"), -2345);
1835 wxPrintf(_T("hex negative:\t\"%x\"\n"), -2345);
1836 wxPrintf(_T("long decimal number:\t\"%ld\"\n"), -123456L);
1837 wxPrintf(_T("long octal negative:\t\"%lo\"\n"), -2345L);
1838 wxPrintf(_T("long unsigned decimal number:\t\"%lu\"\n"), -123456L);
1839 wxPrintf(_T("zero-padded LDN:\t\"%010ld\"\n"), -123456L);
1840 test_format
= _T("left-adjusted ZLDN:\t\"%-010ld\"\n");
1841 wxPrintf(test_format
.c_str(), -123456);
1842 wxPrintf(_T("space-padded LDN:\t\"%10ld\"\n"), -123456L);
1843 wxPrintf(_T("left-adjusted SLDN:\t\"%-10ld\"\n"), -123456L);
1845 test_format
= _T("zero-padded string:\t\"%010s\"\n");
1846 wxPrintf(test_format
.c_str(), shortstr
);
1847 test_format
= _T("left-adjusted Z string:\t\"%-010s\"\n");
1848 wxPrintf(test_format
.c_str(), shortstr
);
1849 wxPrintf(_T("space-padded string:\t\"%10s\"\n"), shortstr
);
1850 wxPrintf(_T("left-adjusted S string:\t\"%-10s\"\n"), shortstr
);
1851 wxPrintf(_T("null string:\t\"%s\"\n"), PointerNull
);
1852 wxPrintf(_T("limited string:\t\"%.22s\"\n"), longstr
);
1854 wxPrintf(_T("e-style >= 1:\t\"%e\"\n"), 12.34);
1855 wxPrintf(_T("e-style >= .1:\t\"%e\"\n"), 0.1234);
1856 wxPrintf(_T("e-style < .1:\t\"%e\"\n"), 0.001234);
1857 wxPrintf(_T("e-style big:\t\"%.60e\"\n"), 1e20
);
1858 wxPrintf(_T("e-style == .1:\t\"%e\"\n"), 0.1);
1859 wxPrintf(_T("f-style >= 1:\t\"%f\"\n"), 12.34);
1860 wxPrintf(_T("f-style >= .1:\t\"%f\"\n"), 0.1234);
1861 wxPrintf(_T("f-style < .1:\t\"%f\"\n"), 0.001234);
1862 wxPrintf(_T("g-style >= 1:\t\"%g\"\n"), 12.34);
1863 wxPrintf(_T("g-style >= .1:\t\"%g\"\n"), 0.1234);
1864 wxPrintf(_T("g-style < .1:\t\"%g\"\n"), 0.001234);
1865 wxPrintf(_T("g-style big:\t\"%.60g\"\n"), 1e20
);
1867 wxPrintf (_T(" %6.5f\n"), .099999999860301614);
1868 wxPrintf (_T(" %6.5f\n"), .1);
1869 wxPrintf (_T("x%5.4fx\n"), .5);
1871 wxPrintf (_T("%#03x\n"), 1);
1873 //wxPrintf (_T("something really insane: %.10000f\n"), 1.0);
1879 while (niter
-- != 0)
1880 wxPrintf (_T("%.17e\n"), d
/ 2);
1885 // Open Watcom cause compiler error here
1886 // Error! E173: col(24) floating-point constant too small to represent
1887 wxPrintf (_T("%15.5e\n"), 4.9406564584124654e-324);
1890 #define FORMAT _T("|%12.4f|%12.4e|%12.4g|\n")
1891 wxPrintf (FORMAT
, 0.0, 0.0, 0.0);
1892 wxPrintf (FORMAT
, 1.0, 1.0, 1.0);
1893 wxPrintf (FORMAT
, -1.0, -1.0, -1.0);
1894 wxPrintf (FORMAT
, 100.0, 100.0, 100.0);
1895 wxPrintf (FORMAT
, 1000.0, 1000.0, 1000.0);
1896 wxPrintf (FORMAT
, 10000.0, 10000.0, 10000.0);
1897 wxPrintf (FORMAT
, 12345.0, 12345.0, 12345.0);
1898 wxPrintf (FORMAT
, 100000.0, 100000.0, 100000.0);
1899 wxPrintf (FORMAT
, 123456.0, 123456.0, 123456.0);
1904 int rc
= wxSnprintf (buf
, WXSIZEOF(buf
), _T("%30s"), _T("foo"));
1906 wxPrintf(_T("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n"),
1907 rc
, WXSIZEOF(buf
), buf
);
1910 wxPrintf ("snprintf (\"%%.999999u\", 10)\n",
1911 wxSnprintf(buf2
, WXSIZEOFbuf2
), "%.999999u", 10));
1917 wxPrintf (_T("%e should be 1.234568e+06\n"), 1234567.8);
1918 wxPrintf (_T("%f should be 1234567.800000\n"), 1234567.8);
1919 wxPrintf (_T("%g should be 1.23457e+06\n"), 1234567.8);
1920 wxPrintf (_T("%g should be 123.456\n"), 123.456);
1921 wxPrintf (_T("%g should be 1e+06\n"), 1000000.0);
1922 wxPrintf (_T("%g should be 10\n"), 10.0);
1923 wxPrintf (_T("%g should be 0.02\n"), 0.02);
1927 wxPrintf(_T("%.17f\n"),(1.0/x
/10.0+1.0)*x
-x
);
1933 wxSprintf(buf
,_T("%*s%*s%*s"),-1,_T("one"),-20,_T("two"),-30,_T("three"));
1935 result
|= wxStrcmp (buf
,
1936 _T("onetwo three "));
1938 wxPuts (result
!= 0 ? _T("Test failed!") : _T("Test ok."));
1945 wxSprintf(buf
, _T("%07") wxLongLongFmtSpec
_T("o"), wxLL(040000000000));
1947 // for some reason below line fails under Borland
1948 wxPrintf (_T("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf
);
1951 if (wxStrcmp (buf
, _T("40000000000")) != 0)
1954 wxPuts (_T("\tFAILED"));
1956 wxUnusedVar(result
);
1957 wxPuts (wxEmptyString
);
1959 #endif // wxLongLong_t
1961 wxPrintf (_T("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX
+ 2, UCHAR_MAX
+ 2);
1962 wxPrintf (_T("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX
+ 2, USHRT_MAX
+ 2);
1964 wxPuts (_T("--- Should be no further output. ---"));
1973 memset (bytes
, '\xff', sizeof bytes
);
1974 wxSprintf (buf
, _T("foo%hhn\n"), &bytes
[3]);
1975 if (bytes
[0] != '\xff' || bytes
[1] != '\xff' || bytes
[2] != '\xff'
1976 || bytes
[4] != '\xff' || bytes
[5] != '\xff' || bytes
[6] != '\xff')
1978 wxPuts (_T("%hhn overwrite more bytes"));
1983 wxPuts (_T("%hhn wrote incorrect value"));
1995 wxSprintf (buf
, _T("%5.s"), _T("xyz"));
1996 if (wxStrcmp (buf
, _T(" ")) != 0)
1997 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" "));
1998 wxSprintf (buf
, _T("%5.f"), 33.3);
1999 if (wxStrcmp (buf
, _T(" 33")) != 0)
2000 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 33"));
2001 wxSprintf (buf
, _T("%8.e"), 33.3e7
);
2002 if (wxStrcmp (buf
, _T(" 3e+08")) != 0)
2003 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3e+08"));
2004 wxSprintf (buf
, _T("%8.E"), 33.3e7
);
2005 if (wxStrcmp (buf
, _T(" 3E+08")) != 0)
2006 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3E+08"));
2007 wxSprintf (buf
, _T("%.g"), 33.3);
2008 if (wxStrcmp (buf
, _T("3e+01")) != 0)
2009 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3e+01"));
2010 wxSprintf (buf
, _T("%.G"), 33.3);
2011 if (wxStrcmp (buf
, _T("3E+01")) != 0)
2012 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3E+01"));
2020 wxString test_format
;
2023 wxSprintf (buf
, _T("%.*g"), prec
, 3.3);
2024 if (wxStrcmp (buf
, _T("3")) != 0)
2025 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2027 wxSprintf (buf
, _T("%.*G"), prec
, 3.3);
2028 if (wxStrcmp (buf
, _T("3")) != 0)
2029 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2031 wxSprintf (buf
, _T("%7.*G"), prec
, 3.33);
2032 if (wxStrcmp (buf
, _T(" 3")) != 0)
2033 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3"));
2035 test_format
= _T("%04.*o");
2036 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2037 if (wxStrcmp (buf
, _T(" 041")) != 0)
2038 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 041"));
2040 test_format
= _T("%09.*u");
2041 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2042 if (wxStrcmp (buf
, _T(" 0000033")) != 0)
2043 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 0000033"));
2045 test_format
= _T("%04.*x");
2046 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2047 if (wxStrcmp (buf
, _T(" 021")) != 0)
2048 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2050 test_format
= _T("%04.*X");
2051 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2052 if (wxStrcmp (buf
, _T(" 021")) != 0)
2053 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2056 #endif // TEST_PRINTF
2058 // ----------------------------------------------------------------------------
2059 // registry and related stuff
2060 // ----------------------------------------------------------------------------
2062 // this is for MSW only
2065 #undef TEST_REGISTRY
2070 #include "wx/confbase.h"
2071 #include "wx/msw/regconf.h"
2074 static void TestRegConfWrite()
2076 wxConfig
*config
= new wxConfig(_T("myapp"));
2077 config
->SetPath(_T("/group1"));
2078 config
->Write(_T("entry1"), _T("foo"));
2079 config
->SetPath(_T("/group2"));
2080 config
->Write(_T("entry1"), _T("bar"));
2084 static void TestRegConfRead()
2086 wxRegConfig
*config
= new wxRegConfig(_T("myapp"));
2090 config
->SetPath(_T("/"));
2091 wxPuts(_T("Enumerating / subgroups:"));
2092 bool bCont
= config
->GetFirstGroup(str
, dummy
);
2096 bCont
= config
->GetNextGroup(str
, dummy
);
2100 #endif // TEST_REGCONF
2102 #ifdef TEST_REGISTRY
2104 #include "wx/msw/registry.h"
2106 // I chose this one because I liked its name, but it probably only exists under
2108 static const wxChar
*TESTKEY
=
2109 _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
2111 static void TestRegistryRead()
2113 wxPuts(_T("*** testing registry reading ***"));
2115 wxRegKey
key(TESTKEY
);
2116 wxPrintf(_T("The test key name is '%s'.\n"), key
.GetName().c_str());
2119 wxPuts(_T("ERROR: test key can't be opened, aborting test."));
2124 size_t nSubKeys
, nValues
;
2125 if ( key
.GetKeyInfo(&nSubKeys
, NULL
, &nValues
, NULL
) )
2127 wxPrintf(_T("It has %u subkeys and %u values.\n"), nSubKeys
, nValues
);
2130 wxPrintf(_T("Enumerating values:\n"));
2134 bool cont
= key
.GetFirstValue(value
, dummy
);
2137 wxPrintf(_T("Value '%s': type "), value
.c_str());
2138 switch ( key
.GetValueType(value
) )
2140 case wxRegKey::Type_None
: wxPrintf(_T("ERROR (none)")); break;
2141 case wxRegKey::Type_String
: wxPrintf(_T("SZ")); break;
2142 case wxRegKey::Type_Expand_String
: wxPrintf(_T("EXPAND_SZ")); break;
2143 case wxRegKey::Type_Binary
: wxPrintf(_T("BINARY")); break;
2144 case wxRegKey::Type_Dword
: wxPrintf(_T("DWORD")); break;
2145 case wxRegKey::Type_Multi_String
: wxPrintf(_T("MULTI_SZ")); break;
2146 default: wxPrintf(_T("other (unknown)")); break;
2149 wxPrintf(_T(", value = "));
2150 if ( key
.IsNumericValue(value
) )
2153 key
.QueryValue(value
, &val
);
2154 wxPrintf(_T("%ld"), val
);
2159 key
.QueryValue(value
, val
);
2160 wxPrintf(_T("'%s'"), val
.c_str());
2162 key
.QueryRawValue(value
, val
);
2163 wxPrintf(_T(" (raw value '%s')"), val
.c_str());
2168 cont
= key
.GetNextValue(value
, dummy
);
2172 static void TestRegistryAssociation()
2175 The second call to deleteself genertaes an error message, with a
2176 messagebox saying .flo is crucial to system operation, while the .ddf
2177 call also fails, but with no error message
2182 key
.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
2184 key
= _T("ddxf_auto_file") ;
2185 key
.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
2187 key
= _T("ddxf_auto_file") ;
2188 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
2190 key
= _T("program,0") ;
2191 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
2193 key
= _T("program \"%1\"") ;
2195 key
.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
2197 key
.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
2199 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
2201 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
2205 #endif // TEST_REGISTRY
2207 // ----------------------------------------------------------------------------
2209 // ----------------------------------------------------------------------------
2211 #ifdef TEST_SCOPEGUARD
2213 #include "wx/scopeguard.h"
2215 static void function0() { puts("function0()"); }
2216 static void function1(int n
) { printf("function1(%d)\n", n
); }
2217 static void function2(double x
, char c
) { printf("function2(%g, %c)\n", x
, c
); }
2221 void method0() { printf("method0()\n"); }
2222 void method1(int n
) { printf("method1(%d)\n", n
); }
2223 void method2(double x
, char c
) { printf("method2(%g, %c)\n", x
, c
); }
2226 static void TestScopeGuard()
2228 wxON_BLOCK_EXIT0(function0
);
2229 wxON_BLOCK_EXIT1(function1
, 17);
2230 wxON_BLOCK_EXIT2(function2
, 3.14, 'p');
2233 wxON_BLOCK_EXIT_OBJ0(obj
, Object::method0
);
2234 wxON_BLOCK_EXIT_OBJ1(obj
, Object::method1
, 7);
2235 wxON_BLOCK_EXIT_OBJ2(obj
, Object::method2
, 2.71, 'e');
2237 wxScopeGuard dismissed
= wxMakeGuard(function0
);
2238 dismissed
.Dismiss();
2243 // ----------------------------------------------------------------------------
2245 // ----------------------------------------------------------------------------
2249 #include "wx/socket.h"
2250 #include "wx/protocol/protocol.h"
2251 #include "wx/protocol/http.h"
2253 static void TestSocketServer()
2255 wxPuts(_T("*** Testing wxSocketServer ***\n"));
2257 static const int PORT
= 3000;
2262 wxSocketServer
*server
= new wxSocketServer(addr
);
2263 if ( !server
->Ok() )
2265 wxPuts(_T("ERROR: failed to bind"));
2273 wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT
);
2275 wxSocketBase
*socket
= server
->Accept();
2278 wxPuts(_T("ERROR: wxSocketServer::Accept() failed."));
2282 wxPuts(_T("Server: got a client."));
2284 server
->SetTimeout(60); // 1 min
2287 while ( !close
&& socket
->IsConnected() )
2290 wxChar ch
= _T('\0');
2293 if ( socket
->Read(&ch
, sizeof(ch
)).Error() )
2295 // don't log error if the client just close the connection
2296 if ( socket
->IsConnected() )
2298 wxPuts(_T("ERROR: in wxSocket::Read."));
2318 wxPrintf(_T("Server: got '%s'.\n"), s
.c_str());
2319 if ( s
== _T("close") )
2321 wxPuts(_T("Closing connection"));
2325 else if ( s
== _T("quit") )
2330 wxPuts(_T("Shutting down the server"));
2332 else // not a special command
2334 socket
->Write(s
.MakeUpper().c_str(), s
.length());
2335 socket
->Write("\r\n", 2);
2336 wxPrintf(_T("Server: wrote '%s'.\n"), s
.c_str());
2342 wxPuts(_T("Server: lost a client unexpectedly."));
2348 // same as "delete server" but is consistent with GUI programs
2352 static void TestSocketClient()
2354 wxPuts(_T("*** Testing wxSocketClient ***\n"));
2356 static const wxChar
*hostname
= _T("www.wxwidgets.org");
2359 addr
.Hostname(hostname
);
2362 wxPrintf(_T("--- Attempting to connect to %s:80...\n"), hostname
);
2364 wxSocketClient client
;
2365 if ( !client
.Connect(addr
) )
2367 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
2371 wxPrintf(_T("--- Connected to %s:%u...\n"),
2372 addr
.Hostname().c_str(), addr
.Service());
2376 // could use simply "GET" here I suppose
2378 wxString::Format(_T("GET http://%s/\r\n"), hostname
);
2379 client
.Write(cmdGet
, cmdGet
.length());
2380 wxPrintf(_T("--- Sent command '%s' to the server\n"),
2381 MakePrintable(cmdGet
).c_str());
2382 client
.Read(buf
, WXSIZEOF(buf
));
2383 wxPrintf(_T("--- Server replied:\n%s"), buf
);
2387 #endif // TEST_SOCKETS
2389 // ----------------------------------------------------------------------------
2391 // ----------------------------------------------------------------------------
2395 #include "wx/protocol/ftp.h"
2399 #define FTP_ANONYMOUS
2401 #ifdef FTP_ANONYMOUS
2402 static const wxChar
*directory
= _T("/pub");
2403 static const wxChar
*filename
= _T("welcome.msg");
2405 static const wxChar
*directory
= _T("/etc");
2406 static const wxChar
*filename
= _T("issue");
2409 static bool TestFtpConnect()
2411 wxPuts(_T("*** Testing FTP connect ***"));
2413 #ifdef FTP_ANONYMOUS
2414 static const wxChar
*hostname
= _T("ftp.wxwidgets.org");
2416 wxPrintf(_T("--- Attempting to connect to %s:21 anonymously...\n"), hostname
);
2417 #else // !FTP_ANONYMOUS
2418 static const wxChar
*hostname
= "localhost";
2421 wxFgets(user
, WXSIZEOF(user
), stdin
);
2422 user
[wxStrlen(user
) - 1] = '\0'; // chop off '\n'
2425 wxChar password
[256];
2426 wxPrintf(_T("Password for %s: "), password
);
2427 wxFgets(password
, WXSIZEOF(password
), stdin
);
2428 password
[wxStrlen(password
) - 1] = '\0'; // chop off '\n'
2429 ftp
.SetPassword(password
);
2431 wxPrintf(_T("--- Attempting to connect to %s:21 as %s...\n"), hostname
, user
);
2432 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
2434 if ( !ftp
.Connect(hostname
) )
2436 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
2442 wxPrintf(_T("--- Connected to %s, current directory is '%s'\n"),
2443 hostname
, ftp
.Pwd().c_str());
2450 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
2451 static void TestFtpWuFtpd()
2454 static const wxChar
*hostname
= _T("ftp.eudora.com");
2455 if ( !ftp
.Connect(hostname
) )
2457 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
2461 static const wxChar
*filename
= _T("eudora/pubs/draft-gellens-submit-09.txt");
2462 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2465 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
2469 size_t size
= in
->GetSize();
2470 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
2472 wxChar
*data
= new wxChar
[size
];
2473 if ( !in
->Read(data
, size
) )
2475 wxPuts(_T("ERROR: read error"));
2479 wxPrintf(_T("Successfully retrieved the file.\n"));
2488 static void TestFtpList()
2490 wxPuts(_T("*** Testing wxFTP file listing ***\n"));
2493 if ( !ftp
.ChDir(directory
) )
2495 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
2498 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
2500 // test NLIST and LIST
2501 wxArrayString files
;
2502 if ( !ftp
.GetFilesList(files
) )
2504 wxPuts(_T("ERROR: failed to get NLIST of files"));
2508 wxPrintf(_T("Brief list of files under '%s':\n"), ftp
.Pwd().c_str());
2509 size_t count
= files
.GetCount();
2510 for ( size_t n
= 0; n
< count
; n
++ )
2512 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
2514 wxPuts(_T("End of the file list"));
2517 if ( !ftp
.GetDirList(files
) )
2519 wxPuts(_T("ERROR: failed to get LIST of files"));
2523 wxPrintf(_T("Detailed list of files under '%s':\n"), ftp
.Pwd().c_str());
2524 size_t count
= files
.GetCount();
2525 for ( size_t n
= 0; n
< count
; n
++ )
2527 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
2529 wxPuts(_T("End of the file list"));
2532 if ( !ftp
.ChDir(_T("..")) )
2534 wxPuts(_T("ERROR: failed to cd to .."));
2537 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
2540 static void TestFtpDownload()
2542 wxPuts(_T("*** Testing wxFTP download ***\n"));
2545 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2548 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
2552 size_t size
= in
->GetSize();
2553 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
2556 wxChar
*data
= new wxChar
[size
];
2557 if ( !in
->Read(data
, size
) )
2559 wxPuts(_T("ERROR: read error"));
2563 wxPrintf(_T("\nContents of %s:\n%s\n"), filename
, data
);
2571 static void TestFtpFileSize()
2573 wxPuts(_T("*** Testing FTP SIZE command ***"));
2575 if ( !ftp
.ChDir(directory
) )
2577 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
2580 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
2582 if ( ftp
.FileExists(filename
) )
2584 int size
= ftp
.GetFileSize(filename
);
2586 wxPrintf(_T("ERROR: couldn't get size of '%s'\n"), filename
);
2588 wxPrintf(_T("Size of '%s' is %d bytes.\n"), filename
, size
);
2592 wxPrintf(_T("ERROR: '%s' doesn't exist\n"), filename
);
2596 static void TestFtpMisc()
2598 wxPuts(_T("*** Testing miscellaneous wxFTP functions ***"));
2600 if ( ftp
.SendCommand(_T("STAT")) != '2' )
2602 wxPuts(_T("ERROR: STAT failed"));
2606 wxPrintf(_T("STAT returned:\n\n%s\n"), ftp
.GetLastResult().c_str());
2609 if ( ftp
.SendCommand(_T("HELP SITE")) != '2' )
2611 wxPuts(_T("ERROR: HELP SITE failed"));
2615 wxPrintf(_T("The list of site-specific commands:\n\n%s\n"),
2616 ftp
.GetLastResult().c_str());
2620 static void TestFtpInteractive()
2622 wxPuts(_T("\n*** Interactive wxFTP test ***"));
2628 wxPrintf(_T("Enter FTP command: "));
2629 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
2632 // kill the last '\n'
2633 buf
[wxStrlen(buf
) - 1] = 0;
2635 // special handling of LIST and NLST as they require data connection
2636 wxString
start(buf
, 4);
2638 if ( start
== _T("LIST") || start
== _T("NLST") )
2641 if ( wxStrlen(buf
) > 4 )
2644 wxArrayString files
;
2645 if ( !ftp
.GetList(files
, wildcard
, start
== _T("LIST")) )
2647 wxPrintf(_T("ERROR: failed to get %s of files\n"), start
.c_str());
2651 wxPrintf(_T("--- %s of '%s' under '%s':\n"),
2652 start
.c_str(), wildcard
.c_str(), ftp
.Pwd().c_str());
2653 size_t count
= files
.GetCount();
2654 for ( size_t n
= 0; n
< count
; n
++ )
2656 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
2658 wxPuts(_T("--- End of the file list"));
2663 wxChar ch
= ftp
.SendCommand(buf
);
2664 wxPrintf(_T("Command %s"), ch
? _T("succeeded") : _T("failed"));
2667 wxPrintf(_T(" (return code %c)"), ch
);
2670 wxPrintf(_T(", server reply:\n%s\n\n"), ftp
.GetLastResult().c_str());
2674 wxPuts(_T("\n*** done ***"));
2677 static void TestFtpUpload()
2679 wxPuts(_T("*** Testing wxFTP uploading ***\n"));
2682 static const wxChar
*file1
= _T("test1");
2683 static const wxChar
*file2
= _T("test2");
2684 wxOutputStream
*out
= ftp
.GetOutputStream(file1
);
2687 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
2688 out
->Write("First hello", 11);
2692 // send a command to check the remote file
2693 if ( ftp
.SendCommand(wxString(_T("STAT ")) + file1
) != '2' )
2695 wxPrintf(_T("ERROR: STAT %s failed\n"), file1
);
2699 wxPrintf(_T("STAT %s returned:\n\n%s\n"),
2700 file1
, ftp
.GetLastResult().c_str());
2703 out
= ftp
.GetOutputStream(file2
);
2706 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
2707 out
->Write("Second hello", 12);
2714 // ----------------------------------------------------------------------------
2716 // ----------------------------------------------------------------------------
2718 #ifdef TEST_STACKWALKER
2720 #if wxUSE_STACKWALKER
2722 #include "wx/stackwalk.h"
2724 class StackDump
: public wxStackWalker
2727 StackDump(const char *argv0
)
2728 : wxStackWalker(argv0
)
2732 virtual void Walk(size_t skip
= 1)
2734 wxPuts(_T("Stack dump:"));
2736 wxStackWalker::Walk(skip
);
2740 virtual void OnStackFrame(const wxStackFrame
& frame
)
2742 printf("[%2d] ", (int) frame
.GetLevel());
2744 wxString name
= frame
.GetName();
2745 if ( !name
.empty() )
2747 printf("%-20.40s", (const char*)name
.mb_str());
2751 printf("0x%08lx", (unsigned long)frame
.GetAddress());
2754 if ( frame
.HasSourceLocation() )
2757 (const char*)frame
.GetFileName().mb_str(),
2758 (int)frame
.GetLine());
2764 for ( size_t n
= 0; frame
.GetParam(n
, &type
, &name
, &val
); n
++ )
2766 printf("\t%s %s = %s\n", (const char*)type
.mb_str(),
2767 (const char*)name
.mb_str(),
2768 (const char*)val
.mb_str());
2773 static void TestStackWalk(const char *argv0
)
2775 wxPuts(_T("*** Testing wxStackWalker ***\n"));
2777 StackDump
dump(argv0
);
2781 #endif // wxUSE_STACKWALKER
2783 #endif // TEST_STACKWALKER
2785 // ----------------------------------------------------------------------------
2787 // ----------------------------------------------------------------------------
2789 #ifdef TEST_STDPATHS
2791 #include "wx/stdpaths.h"
2792 #include "wx/wxchar.h" // wxPrintf
2794 static void TestStandardPaths()
2796 wxPuts(_T("*** Testing wxStandardPaths ***\n"));
2798 wxTheApp
->SetAppName(_T("console"));
2800 wxStandardPathsBase
& stdp
= wxStandardPaths::Get();
2801 wxPrintf(_T("Config dir (sys):\t%s\n"), stdp
.GetConfigDir().c_str());
2802 wxPrintf(_T("Config dir (user):\t%s\n"), stdp
.GetUserConfigDir().c_str());
2803 wxPrintf(_T("Data dir (sys):\t\t%s\n"), stdp
.GetDataDir().c_str());
2804 wxPrintf(_T("Data dir (sys local):\t%s\n"), stdp
.GetLocalDataDir().c_str());
2805 wxPrintf(_T("Data dir (user):\t%s\n"), stdp
.GetUserDataDir().c_str());
2806 wxPrintf(_T("Data dir (user local):\t%s\n"), stdp
.GetUserLocalDataDir().c_str());
2807 wxPrintf(_T("Documents dir:\t\t%s\n"), stdp
.GetDocumentsDir().c_str());
2808 wxPrintf(_T("Executable path:\t%s\n"), stdp
.GetExecutablePath().c_str());
2809 wxPrintf(_T("Plugins dir:\t\t%s\n"), stdp
.GetPluginsDir().c_str());
2810 wxPrintf(_T("Resources dir:\t\t%s\n"), stdp
.GetResourcesDir().c_str());
2811 wxPrintf(_T("Localized res. dir:\t%s\n"),
2812 stdp
.GetLocalizedResourcesDir(_T("fr")).c_str());
2813 wxPrintf(_T("Message catalogs dir:\t%s\n"),
2814 stdp
.GetLocalizedResourcesDir
2817 wxStandardPaths::ResourceCat_Messages
2821 #endif // TEST_STDPATHS
2823 // ----------------------------------------------------------------------------
2825 // ----------------------------------------------------------------------------
2829 #include "wx/wfstream.h"
2830 #include "wx/mstream.h"
2832 static void TestFileStream()
2834 wxPuts(_T("*** Testing wxFileInputStream ***"));
2836 static const wxString filename
= _T("testdata.fs");
2838 wxFileOutputStream
fsOut(filename
);
2839 fsOut
.Write("foo", 3);
2843 wxFileInputStream
fsIn(filename
);
2844 wxPrintf(_T("File stream size: %u\n"), fsIn
.GetSize());
2845 while ( !fsIn
.Eof() )
2847 wxPutchar(fsIn
.GetC());
2851 if ( !wxRemoveFile(filename
) )
2853 wxPrintf(_T("ERROR: failed to remove the file '%s'.\n"), filename
.c_str());
2856 wxPuts(_T("\n*** wxFileInputStream test done ***"));
2859 static void TestMemoryStream()
2861 wxPuts(_T("*** Testing wxMemoryOutputStream ***"));
2863 wxMemoryOutputStream memOutStream
;
2864 wxPrintf(_T("Initially out stream offset: %lu\n"),
2865 (unsigned long)memOutStream
.TellO());
2867 for ( const wxChar
*p
= _T("Hello, stream!"); *p
; p
++ )
2869 memOutStream
.PutC(*p
);
2872 wxPrintf(_T("Final out stream offset: %lu\n"),
2873 (unsigned long)memOutStream
.TellO());
2875 wxPuts(_T("*** Testing wxMemoryInputStream ***"));
2878 size_t len
= memOutStream
.CopyTo(buf
, WXSIZEOF(buf
));
2880 wxMemoryInputStream
memInpStream(buf
, len
);
2881 wxPrintf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
2882 while ( !memInpStream
.Eof() )
2884 wxPutchar(memInpStream
.GetC());
2887 wxPuts(_T("\n*** wxMemoryInputStream test done ***"));
2890 #endif // TEST_STREAMS
2892 // ----------------------------------------------------------------------------
2894 // ----------------------------------------------------------------------------
2898 #include "wx/stopwatch.h"
2899 #include "wx/utils.h"
2901 static void TestStopWatch()
2903 wxPuts(_T("*** Testing wxStopWatch ***\n"));
2907 wxPrintf(_T("Initially paused, after 2 seconds time is..."));
2910 wxPrintf(_T("\t%ldms\n"), sw
.Time());
2912 wxPrintf(_T("Resuming stopwatch and sleeping 3 seconds..."));
2916 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2919 wxPrintf(_T("Pausing agan and sleeping 2 more seconds..."));
2922 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2925 wxPrintf(_T("Finally resuming and sleeping 2 more seconds..."));
2928 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2931 wxPuts(_T("\nChecking for 'backwards clock' bug..."));
2932 for ( size_t n
= 0; n
< 70; n
++ )
2936 for ( size_t m
= 0; m
< 100000; m
++ )
2938 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
2940 wxPuts(_T("\ntime is negative - ERROR!"));
2948 wxPuts(_T(", ok."));
2951 #include "wx/timer.h"
2952 #include "wx/evtloop.h"
2956 wxPuts(_T("*** Testing wxTimer ***\n"));
2958 class MyTimer
: public wxTimer
2961 MyTimer() : wxTimer() { m_num
= 0; }
2963 virtual void Notify()
2965 wxPrintf(_T("%d"), m_num
++);
2970 wxPrintf(_T("... exiting the event loop"));
2973 wxEventLoop::GetActive()->Exit(0);
2974 wxPuts(_T(", ok."));
2987 timer1
.Start(100, true /* one shot */);
2989 timer1
.Start(100, true /* one shot */);
2997 #endif // TEST_TIMER
2999 // ----------------------------------------------------------------------------
3001 // ----------------------------------------------------------------------------
3005 #include "wx/vcard.h"
3007 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
3010 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
3013 wxPrintf(_T("%s%s"),
3014 wxString(_T('\t'), level
).c_str(),
3015 vcObj
->GetName().c_str());
3018 switch ( vcObj
->GetType() )
3020 case wxVCardObject::String
:
3021 case wxVCardObject::UString
:
3024 vcObj
->GetValue(&val
);
3025 value
<< _T('"') << val
<< _T('"');
3029 case wxVCardObject::Int
:
3032 vcObj
->GetValue(&i
);
3033 value
.Printf(_T("%u"), i
);
3037 case wxVCardObject::Long
:
3040 vcObj
->GetValue(&l
);
3041 value
.Printf(_T("%lu"), l
);
3045 case wxVCardObject::None
:
3048 case wxVCardObject::Object
:
3049 value
= _T("<node>");
3053 value
= _T("<unknown value type>");
3057 wxPrintf(_T(" = %s"), value
.c_str());
3060 DumpVObject(level
+ 1, *vcObj
);
3063 vcObj
= vcard
.GetNextProp(&cookie
);
3067 static void DumpVCardAddresses(const wxVCard
& vcard
)
3069 wxPuts(_T("\nShowing all addresses from vCard:\n"));
3073 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3077 int flags
= addr
->GetFlags();
3078 if ( flags
& wxVCardAddress::Domestic
)
3080 flagsStr
<< _T("domestic ");
3082 if ( flags
& wxVCardAddress::Intl
)
3084 flagsStr
<< _T("international ");
3086 if ( flags
& wxVCardAddress::Postal
)
3088 flagsStr
<< _T("postal ");
3090 if ( flags
& wxVCardAddress::Parcel
)
3092 flagsStr
<< _T("parcel ");
3094 if ( flags
& wxVCardAddress::Home
)
3096 flagsStr
<< _T("home ");
3098 if ( flags
& wxVCardAddress::Work
)
3100 flagsStr
<< _T("work ");
3103 wxPrintf(_T("Address %u:\n")
3105 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3108 addr
->GetPostOffice().c_str(),
3109 addr
->GetExtAddress().c_str(),
3110 addr
->GetStreet().c_str(),
3111 addr
->GetLocality().c_str(),
3112 addr
->GetRegion().c_str(),
3113 addr
->GetPostalCode().c_str(),
3114 addr
->GetCountry().c_str()
3118 addr
= vcard
.GetNextAddress(&cookie
);
3122 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
3124 wxPuts(_T("\nShowing all phone numbers from vCard:\n"));
3128 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
3132 int flags
= phone
->GetFlags();
3133 if ( flags
& wxVCardPhoneNumber::Voice
)
3135 flagsStr
<< _T("voice ");
3137 if ( flags
& wxVCardPhoneNumber::Fax
)
3139 flagsStr
<< _T("fax ");
3141 if ( flags
& wxVCardPhoneNumber::Cellular
)
3143 flagsStr
<< _T("cellular ");
3145 if ( flags
& wxVCardPhoneNumber::Modem
)
3147 flagsStr
<< _T("modem ");
3149 if ( flags
& wxVCardPhoneNumber::Home
)
3151 flagsStr
<< _T("home ");
3153 if ( flags
& wxVCardPhoneNumber::Work
)
3155 flagsStr
<< _T("work ");
3158 wxPrintf(_T("Phone number %u:\n")
3163 phone
->GetNumber().c_str()
3167 phone
= vcard
.GetNextPhoneNumber(&cookie
);
3171 static void TestVCardRead()
3173 wxPuts(_T("*** Testing wxVCard reading ***\n"));
3175 wxVCard
vcard(_T("vcard.vcf"));
3176 if ( !vcard
.IsOk() )
3178 wxPuts(_T("ERROR: couldn't load vCard."));
3182 // read individual vCard properties
3183 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
3187 vcObj
->GetValue(&value
);
3192 value
= _T("<none>");
3195 wxPrintf(_T("Full name retrieved directly: %s\n"), value
.c_str());
3198 if ( !vcard
.GetFullName(&value
) )
3200 value
= _T("<none>");
3203 wxPrintf(_T("Full name from wxVCard API: %s\n"), value
.c_str());
3205 // now show how to deal with multiply occurring properties
3206 DumpVCardAddresses(vcard
);
3207 DumpVCardPhoneNumbers(vcard
);
3209 // and finally show all
3210 wxPuts(_T("\nNow dumping the entire vCard:\n")
3211 "-----------------------------\n");
3213 DumpVObject(0, vcard
);
3217 static void TestVCardWrite()
3219 wxPuts(_T("*** Testing wxVCard writing ***\n"));
3222 if ( !vcard
.IsOk() )
3224 wxPuts(_T("ERROR: couldn't create vCard."));
3229 vcard
.SetName("Zeitlin", "Vadim");
3230 vcard
.SetFullName("Vadim Zeitlin");
3231 vcard
.SetOrganization("wxWidgets", "R&D");
3233 // just dump the vCard back
3234 wxPuts(_T("Entire vCard follows:\n"));
3235 wxPuts(vcard
.Write());
3239 #endif // TEST_VCARD
3241 // ----------------------------------------------------------------------------
3243 // ----------------------------------------------------------------------------
3245 #if !defined(__WIN32__) || !wxUSE_FSVOLUME
3251 #include "wx/volume.h"
3253 static const wxChar
*volumeKinds
[] =
3259 _T("network volume"),
3263 static void TestFSVolume()
3265 wxPuts(_T("*** Testing wxFSVolume class ***"));
3267 wxArrayString volumes
= wxFSVolume::GetVolumes();
3268 size_t count
= volumes
.GetCount();
3272 wxPuts(_T("ERROR: no mounted volumes?"));
3276 wxPrintf(_T("%u mounted volumes found:\n"), count
);
3278 for ( size_t n
= 0; n
< count
; n
++ )
3280 wxFSVolume
vol(volumes
[n
]);
3283 wxPuts(_T("ERROR: couldn't create volume"));
3287 wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
3289 vol
.GetDisplayName().c_str(),
3290 vol
.GetName().c_str(),
3291 volumeKinds
[vol
.GetKind()],
3292 vol
.IsWritable() ? _T("rw") : _T("ro"),
3293 vol
.GetFlags() & wxFS_VOL_REMOVABLE
? _T("removable")
3298 #endif // TEST_VOLUME
3300 // ----------------------------------------------------------------------------
3301 // wide char and Unicode support
3302 // ----------------------------------------------------------------------------
3306 #include "wx/strconv.h"
3307 #include "wx/fontenc.h"
3308 #include "wx/encconv.h"
3309 #include "wx/buffer.h"
3311 static const unsigned char utf8koi8r
[] =
3313 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
3314 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
3315 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
3316 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
3317 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
3318 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
3319 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
3322 static const unsigned char utf8iso8859_1
[] =
3324 0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e,
3325 0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65,
3326 0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65,
3327 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65,
3328 0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0
3331 static const unsigned char utf8Invalid
[] =
3333 0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30,
3334 0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6,
3335 0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88,
3336 0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70,
3340 static const struct Utf8Data
3342 const unsigned char *text
;
3344 const wxChar
*charset
;
3345 wxFontEncoding encoding
;
3348 { utf8Invalid
, WXSIZEOF(utf8Invalid
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3349 { utf8koi8r
, WXSIZEOF(utf8koi8r
), _T("koi8-r"), wxFONTENCODING_KOI8
},
3350 { utf8iso8859_1
, WXSIZEOF(utf8iso8859_1
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3353 static void TestUtf8()
3355 wxPuts(_T("*** Testing UTF8 support ***\n"));
3360 for ( size_t n
= 0; n
< WXSIZEOF(utf8data
); n
++ )
3362 const Utf8Data
& u8d
= utf8data
[n
];
3363 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)u8d
.text
,
3364 WXSIZEOF(wbuf
)) == (size_t)-1 )
3366 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3370 wxCSConv
conv(u8d
.charset
);
3371 if ( conv
.WC2MB(buf
, wbuf
, WXSIZEOF(buf
)) == (size_t)-1 )
3373 wxPrintf(_T("ERROR: conversion to %s failed.\n"), u8d
.charset
);
3377 wxPrintf(_T("String in %s: %s\n"), u8d
.charset
, buf
);
3381 wxString
s(wxConvUTF8
.cMB2WC((const char *)u8d
.text
));
3383 s
= _T("<< conversion failed >>");
3384 wxPrintf(_T("String in current cset: %s\n"), s
.c_str());
3388 wxPuts(wxEmptyString
);
3391 static void TestEncodingConverter()
3393 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
3395 // using wxEncodingConverter should give the same result as above
3398 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)utf8koi8r
,
3399 WXSIZEOF(utf8koi8r
)) == (size_t)-1 )
3401 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3405 wxEncodingConverter ec
;
3406 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
3407 ec
.Convert(wbuf
, buf
);
3408 wxPrintf(_T("The same KOI8-R string using wxEC: %s\n"), buf
);
3411 wxPuts(wxEmptyString
);
3414 #endif // TEST_WCHAR
3416 // ----------------------------------------------------------------------------
3418 // ----------------------------------------------------------------------------
3422 #include "wx/filesys.h"
3423 #include "wx/fs_zip.h"
3424 #include "wx/zipstrm.h"
3426 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
3428 static void TestZipStreamRead()
3430 wxPuts(_T("*** Testing ZIP reading ***\n"));
3432 static const wxString filename
= _T("foo");
3433 wxFFileInputStream
in(TESTFILE_ZIP
);
3434 wxZipInputStream
istr(in
);
3435 wxZipEntry
entry(filename
);
3436 istr
.OpenEntry(entry
);
3438 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
3440 wxPrintf(_T("Dumping the file '%s':\n"), filename
.c_str());
3441 while ( !istr
.Eof() )
3443 wxPutchar(istr
.GetC());
3447 wxPuts(_T("\n----- done ------"));
3450 static void DumpZipDirectory(wxFileSystem
& fs
,
3451 const wxString
& dir
,
3452 const wxString
& indent
)
3454 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
3455 TESTFILE_ZIP
, dir
.c_str());
3456 wxString wildcard
= prefix
+ _T("/*");
3458 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
3459 while ( !dirname
.empty() )
3461 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
3463 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3468 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
3470 DumpZipDirectory(fs
, dirname
,
3471 indent
+ wxString(_T(' '), 4));
3473 dirname
= fs
.FindNext();
3476 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
3477 while ( !filename
.empty() )
3479 if ( !filename
.StartsWith(prefix
, &filename
) )
3481 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3486 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
3488 filename
= fs
.FindNext();
3492 static void TestZipFileSystem()
3494 wxPuts(_T("*** Testing ZIP file system ***\n"));
3496 wxFileSystem::AddHandler(new wxZipFSHandler
);
3498 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
3500 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
3505 // ----------------------------------------------------------------------------
3507 // ----------------------------------------------------------------------------
3509 #ifdef TEST_DATETIME
3511 #include "wx/math.h"
3512 #include "wx/datetime.h"
3514 // this test miscellaneous static wxDateTime functions
3518 static void TestTimeStatic()
3520 wxPuts(_T("\n*** wxDateTime static methods test ***"));
3522 // some info about the current date
3523 int year
= wxDateTime::GetCurrentYear();
3524 wxPrintf(_T("Current year %d is %sa leap one and has %d days.\n"),
3526 wxDateTime::IsLeapYear(year
) ? "" : "not ",
3527 wxDateTime::GetNumberOfDays(year
));
3529 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
3530 wxPrintf(_T("Current month is '%s' ('%s') and it has %d days\n"),
3531 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
3532 wxDateTime::GetMonthName(month
).c_str(),
3533 wxDateTime::GetNumberOfDays(month
));
3536 // test time zones stuff
3537 static void TestTimeZones()
3539 wxPuts(_T("\n*** wxDateTime timezone test ***"));
3541 wxDateTime now
= wxDateTime::Now();
3543 wxPrintf(_T("Current GMT time:\t%s\n"), now
.Format(_T("%c"), wxDateTime::GMT0
).c_str());
3544 wxPrintf(_T("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::GMT0
).c_str());
3545 wxPrintf(_T("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::EST
).c_str());
3546 wxPrintf(_T("Current time in Paris:\t%s\n"), now
.Format(_T("%c"), wxDateTime::CET
).c_str());
3547 wxPrintf(_T(" Moscow:\t%s\n"), now
.Format(_T("%c"), wxDateTime::MSK
).c_str());
3548 wxPrintf(_T(" New York:\t%s\n"), now
.Format(_T("%c"), wxDateTime::EST
).c_str());
3550 wxPrintf(_T("%s\n"), wxDateTime::Now().Format(_T("Our timezone is %Z")).c_str());
3552 wxDateTime::Tm tm
= now
.GetTm();
3553 if ( wxDateTime(tm
) != now
)
3555 wxPrintf(_T("ERROR: got %s instead of %s\n"),
3556 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
3560 // test some minimal support for the dates outside the standard range
3561 static void TestTimeRange()
3563 wxPuts(_T("\n*** wxDateTime out-of-standard-range dates test ***"));
3565 static const wxChar
*fmt
= _T("%d-%b-%Y %H:%M:%S");
3567 wxPrintf(_T("Unix epoch:\t%s\n"),
3568 wxDateTime(2440587.5).Format(fmt
).c_str());
3569 wxPrintf(_T("Feb 29, 0: \t%s\n"),
3570 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
3571 wxPrintf(_T("JDN 0: \t%s\n"),
3572 wxDateTime(0.0).Format(fmt
).c_str());
3573 wxPrintf(_T("Jan 1, 1AD:\t%s\n"),
3574 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
3575 wxPrintf(_T("May 29, 2099:\t%s\n"),
3576 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
3579 // test DST calculations
3580 static void TestTimeDST()
3582 wxPuts(_T("\n*** wxDateTime DST test ***"));
3584 wxPrintf(_T("DST is%s in effect now.\n\n"),
3585 wxDateTime::Now().IsDST() ? wxEmptyString
: _T(" not"));
3587 for ( int year
= 1990; year
< 2005; year
++ )
3589 wxPrintf(_T("DST period in Europe for year %d: from %s to %s\n"),
3591 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
3592 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
3598 #if TEST_INTERACTIVE
3600 static void TestDateTimeInteractive()
3602 wxPuts(_T("\n*** interactive wxDateTime tests ***"));
3608 wxPrintf(_T("Enter a date: "));
3609 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
3612 // kill the last '\n'
3613 buf
[wxStrlen(buf
) - 1] = 0;
3616 const wxChar
*p
= dt
.ParseDate(buf
);
3619 wxPrintf(_T("ERROR: failed to parse the date '%s'.\n"), buf
);
3625 wxPrintf(_T("WARNING: parsed only first %u characters.\n"), p
- buf
);
3628 wxPrintf(_T("%s: day %u, week of month %u/%u, week of year %u\n"),
3629 dt
.Format(_T("%b %d, %Y")).c_str(),
3631 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
3632 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
3633 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
3636 wxPuts(_T("\n*** done ***"));
3639 #endif // TEST_INTERACTIVE
3643 static void TestTimeMS()
3645 wxPuts(_T("*** testing millisecond-resolution support in wxDateTime ***"));
3647 wxDateTime dt1
= wxDateTime::Now(),
3648 dt2
= wxDateTime::UNow();
3650 wxPrintf(_T("Now = %s\n"), dt1
.Format(_T("%H:%M:%S:%l")).c_str());
3651 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
3652 wxPrintf(_T("Dummy loop: "));
3653 for ( int i
= 0; i
< 6000; i
++ )
3655 //for ( int j = 0; j < 10; j++ )
3658 s
.Printf(_T("%g"), sqrt((float)i
));
3664 wxPuts(_T(", done"));
3667 dt2
= wxDateTime::UNow();
3668 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
3670 wxPrintf(_T("Loop executed in %s ms\n"), (dt2
- dt1
).Format(_T("%l")).c_str());
3672 wxPuts(_T("\n*** done ***"));
3675 static void TestTimeHolidays()
3677 wxPuts(_T("\n*** testing wxDateTimeHolidayAuthority ***\n"));
3679 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
3680 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
3681 dtEnd
= dtStart
.GetLastMonthDay();
3683 wxDateTimeArray hol
;
3684 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
3686 const wxChar
*format
= _T("%d-%b-%Y (%a)");
3688 wxPrintf(_T("All holidays between %s and %s:\n"),
3689 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
3691 size_t count
= hol
.GetCount();
3692 for ( size_t n
= 0; n
< count
; n
++ )
3694 wxPrintf(_T("\t%s\n"), hol
[n
].Format(format
).c_str());
3697 wxPuts(wxEmptyString
);
3700 static void TestTimeZoneBug()
3702 wxPuts(_T("\n*** testing for DST/timezone bug ***\n"));
3704 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
3705 for ( int i
= 0; i
< 31; i
++ )
3707 wxPrintf(_T("Date %s: week day %s.\n"),
3708 date
.Format(_T("%d-%m-%Y")).c_str(),
3709 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
3711 date
+= wxDateSpan::Day();
3714 wxPuts(wxEmptyString
);
3717 static void TestTimeSpanFormat()
3719 wxPuts(_T("\n*** wxTimeSpan tests ***"));
3721 static const wxChar
*formats
[] =
3723 _T("(default) %H:%M:%S"),
3724 _T("%E weeks and %D days"),
3725 _T("%l milliseconds"),
3726 _T("(with ms) %H:%M:%S:%l"),
3727 _T("100%% of minutes is %M"), // test "%%"
3728 _T("%D days and %H hours"),
3729 _T("or also %S seconds"),
3732 wxTimeSpan
ts1(1, 2, 3, 4),
3734 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
3736 wxPrintf(_T("ts1 = %s\tts2 = %s\n"),
3737 ts1
.Format(formats
[n
]).c_str(),
3738 ts2
.Format(formats
[n
]).c_str());
3741 wxPuts(wxEmptyString
);
3746 #endif // TEST_DATETIME
3748 // ----------------------------------------------------------------------------
3749 // wxTextInput/OutputStream
3750 // ----------------------------------------------------------------------------
3752 #ifdef TEST_TEXTSTREAM
3754 #include "wx/txtstrm.h"
3755 #include "wx/wfstream.h"
3757 static void TestTextInputStream()
3759 wxPuts(_T("\n*** wxTextInputStream test ***"));
3761 wxString filename
= _T("testdata.fc");
3762 wxFileInputStream
fsIn(filename
);
3765 wxPuts(_T("ERROR: couldn't open file."));
3769 wxTextInputStream
tis(fsIn
);
3774 const wxString s
= tis
.ReadLine();
3776 // line could be non empty if the last line of the file isn't
3777 // terminated with EOL
3778 if ( fsIn
.Eof() && s
.empty() )
3781 wxPrintf(_T("Line %d: %s\n"), line
++, s
.c_str());
3786 #endif // TEST_TEXTSTREAM
3788 // ----------------------------------------------------------------------------
3790 // ----------------------------------------------------------------------------
3794 #include "wx/thread.h"
3796 static size_t gs_counter
= (size_t)-1;
3797 static wxCriticalSection gs_critsect
;
3798 static wxSemaphore gs_cond
;
3800 class MyJoinableThread
: public wxThread
3803 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
3804 { m_n
= n
; Create(); }
3806 // thread execution starts here
3807 virtual ExitCode
Entry();
3813 wxThread::ExitCode
MyJoinableThread::Entry()
3815 unsigned long res
= 1;
3816 for ( size_t n
= 1; n
< m_n
; n
++ )
3820 // it's a loooong calculation :-)
3824 return (ExitCode
)res
;
3827 class MyDetachedThread
: public wxThread
3830 MyDetachedThread(size_t n
, wxChar ch
)
3834 m_cancelled
= false;
3839 // thread execution starts here
3840 virtual ExitCode
Entry();
3843 virtual void OnExit();
3846 size_t m_n
; // number of characters to write
3847 wxChar m_ch
; // character to write
3849 bool m_cancelled
; // false if we exit normally
3852 wxThread::ExitCode
MyDetachedThread::Entry()
3855 wxCriticalSectionLocker
lock(gs_critsect
);
3856 if ( gs_counter
== (size_t)-1 )
3862 for ( size_t n
= 0; n
< m_n
; n
++ )
3864 if ( TestDestroy() )
3874 wxThread::Sleep(100);
3880 void MyDetachedThread::OnExit()
3882 wxLogTrace(_T("thread"), _T("Thread %ld is in OnExit"), GetId());
3884 wxCriticalSectionLocker
lock(gs_critsect
);
3885 if ( !--gs_counter
&& !m_cancelled
)
3889 static void TestDetachedThreads()
3891 wxPuts(_T("\n*** Testing detached threads ***"));
3893 static const size_t nThreads
= 3;
3894 MyDetachedThread
*threads
[nThreads
];
3896 for ( n
= 0; n
< nThreads
; n
++ )
3898 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
3901 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
3902 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
3904 for ( n
= 0; n
< nThreads
; n
++ )
3909 // wait until all threads terminate
3912 wxPuts(wxEmptyString
);
3915 static void TestJoinableThreads()
3917 wxPuts(_T("\n*** Testing a joinable thread (a loooong calculation...) ***"));
3919 // calc 10! in the background
3920 MyJoinableThread
thread(10);
3923 wxPrintf(_T("\nThread terminated with exit code %lu.\n"),
3924 (unsigned long)thread
.Wait());
3927 static void TestThreadSuspend()
3929 wxPuts(_T("\n*** Testing thread suspend/resume functions ***"));
3931 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
3935 // this is for this demo only, in a real life program we'd use another
3936 // condition variable which would be signaled from wxThread::Entry() to
3937 // tell us that the thread really started running - but here just wait a
3938 // bit and hope that it will be enough (the problem is, of course, that
3939 // the thread might still not run when we call Pause() which will result
3941 wxThread::Sleep(300);
3943 for ( size_t n
= 0; n
< 3; n
++ )
3947 wxPuts(_T("\nThread suspended"));
3950 // don't sleep but resume immediately the first time
3951 wxThread::Sleep(300);
3953 wxPuts(_T("Going to resume the thread"));
3958 wxPuts(_T("Waiting until it terminates now"));
3960 // wait until the thread terminates
3963 wxPuts(wxEmptyString
);
3966 static void TestThreadDelete()
3968 // As above, using Sleep() is only for testing here - we must use some
3969 // synchronisation object instead to ensure that the thread is still
3970 // running when we delete it - deleting a detached thread which already
3971 // terminated will lead to a crash!
3973 wxPuts(_T("\n*** Testing thread delete function ***"));
3975 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
3979 wxPuts(_T("\nDeleted a thread which didn't start to run yet."));
3981 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
3985 wxThread::Sleep(300);
3989 wxPuts(_T("\nDeleted a running thread."));
3991 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
3995 wxThread::Sleep(300);
4001 wxPuts(_T("\nDeleted a sleeping thread."));
4003 MyJoinableThread
thread3(20);
4008 wxPuts(_T("\nDeleted a joinable thread."));
4010 MyJoinableThread
thread4(2);
4013 wxThread::Sleep(300);
4017 wxPuts(_T("\nDeleted a joinable thread which already terminated."));
4019 wxPuts(wxEmptyString
);
4022 class MyWaitingThread
: public wxThread
4025 MyWaitingThread( wxMutex
*mutex
, wxCondition
*condition
)
4028 m_condition
= condition
;
4033 virtual ExitCode
Entry()
4035 wxPrintf(_T("Thread %lu has started running.\n"), GetId());
4040 wxPrintf(_T("Thread %lu starts to wait...\n"), GetId());
4044 m_condition
->Wait();
4047 wxPrintf(_T("Thread %lu finished to wait, exiting.\n"), GetId());
4055 wxCondition
*m_condition
;
4058 static void TestThreadConditions()
4061 wxCondition
condition(mutex
);
4063 // otherwise its difficult to understand which log messages pertain to
4065 //wxLogTrace(_T("thread"), _T("Local condition var is %08x, gs_cond = %08x"),
4066 // condition.GetId(), gs_cond.GetId());
4068 // create and launch threads
4069 MyWaitingThread
*threads
[10];
4072 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
4074 threads
[n
] = new MyWaitingThread( &mutex
, &condition
);
4077 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
4082 // wait until all threads run
4083 wxPuts(_T("Main thread is waiting for the other threads to start"));
4086 size_t nRunning
= 0;
4087 while ( nRunning
< WXSIZEOF(threads
) )
4093 wxPrintf(_T("Main thread: %u already running\n"), nRunning
);
4097 wxPuts(_T("Main thread: all threads started up."));
4100 wxThread::Sleep(500);
4103 // now wake one of them up
4104 wxPrintf(_T("Main thread: about to signal the condition.\n"));
4109 wxThread::Sleep(200);
4111 // wake all the (remaining) threads up, so that they can exit
4112 wxPrintf(_T("Main thread: about to broadcast the condition.\n"));
4114 condition
.Broadcast();
4116 // give them time to terminate (dirty!)
4117 wxThread::Sleep(500);
4120 #include "wx/utils.h"
4122 class MyExecThread
: public wxThread
4125 MyExecThread(const wxString
& command
) : wxThread(wxTHREAD_JOINABLE
),
4131 virtual ExitCode
Entry()
4133 return (ExitCode
)wxExecute(m_command
, wxEXEC_SYNC
);
4140 static void TestThreadExec()
4142 wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
4144 MyExecThread
thread(_T("true"));
4147 wxPrintf(_T("Main program exit code: %ld.\n"),
4148 wxExecute(_T("false"), wxEXEC_SYNC
));
4150 wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread
.Wait());
4154 #include "wx/datetime.h"
4156 class MySemaphoreThread
: public wxThread
4159 MySemaphoreThread(int i
, wxSemaphore
*sem
)
4160 : wxThread(wxTHREAD_JOINABLE
),
4167 virtual ExitCode
Entry()
4169 wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
4170 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4174 wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
4175 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4179 wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
4180 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4192 WX_DEFINE_ARRAY_PTR(wxThread
*, ArrayThreads
);
4194 static void TestSemaphore()
4196 wxPuts(_T("*** Testing wxSemaphore class. ***"));
4198 static const int SEM_LIMIT
= 3;
4200 wxSemaphore
sem(SEM_LIMIT
, SEM_LIMIT
);
4201 ArrayThreads threads
;
4203 for ( int i
= 0; i
< 3*SEM_LIMIT
; i
++ )
4205 threads
.Add(new MySemaphoreThread(i
, &sem
));
4206 threads
.Last()->Run();
4209 for ( size_t n
= 0; n
< threads
.GetCount(); n
++ )
4216 #endif // TEST_THREADS
4218 // ----------------------------------------------------------------------------
4220 // ----------------------------------------------------------------------------
4222 #ifdef TEST_SNGLINST
4223 #include "wx/snglinst.h"
4224 #endif // TEST_SNGLINST
4226 int main(int argc
, char **argv
)
4229 wxChar
**wxArgv
= new wxChar
*[argc
+ 1];
4234 for (n
= 0; n
< argc
; n
++ )
4236 wxMB2WXbuf warg
= wxConvertMB2WX(argv
[n
]);
4237 wxArgv
[n
] = wxStrdup(warg
);
4242 #else // !wxUSE_UNICODE
4244 #endif // wxUSE_UNICODE/!wxUSE_UNICODE
4246 wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE
, "program");
4248 wxInitializer initializer
;
4251 fprintf(stderr
, "Failed to initialize the wxWidgets library, aborting.");
4256 #ifdef TEST_SNGLINST
4257 wxSingleInstanceChecker checker
;
4258 if ( checker
.Create(_T(".wxconsole.lock")) )
4260 if ( checker
.IsAnotherRunning() )
4262 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
4267 // wait some time to give time to launch another instance
4268 wxPrintf(_T("Press \"Enter\" to continue..."));
4271 else // failed to create
4273 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
4275 #endif // TEST_SNGLINST
4278 TestCmdLineConvert();
4280 #if wxUSE_CMDLINE_PARSER
4281 static const wxCmdLineEntryDesc cmdLineDesc
[] =
4283 { wxCMD_LINE_SWITCH
, "h", "help", "show this help message",
4284 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
4285 { wxCMD_LINE_SWITCH
, "v", "verbose", "be verbose" },
4286 { wxCMD_LINE_SWITCH
, "q", "quiet", "be quiet" },
4288 { wxCMD_LINE_OPTION
, "o", "output", "output file" },
4289 { wxCMD_LINE_OPTION
, "i", "input", "input dir" },
4290 { wxCMD_LINE_OPTION
, "s", "size", "output block size",
4291 wxCMD_LINE_VAL_NUMBER
},
4292 { wxCMD_LINE_OPTION
, "d", "date", "output file date",
4293 wxCMD_LINE_VAL_DATE
},
4294 { wxCMD_LINE_OPTION
, "f", "double", "output double",
4295 wxCMD_LINE_VAL_DOUBLE
},
4297 { wxCMD_LINE_PARAM
, NULL
, NULL
, "input file",
4298 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
4303 wxCmdLineParser
parser(cmdLineDesc
, argc
, wxArgv
);
4305 parser
.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
4306 wxCMD_LINE_VAL_STRING
,
4307 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
4309 switch ( parser
.Parse() )
4312 wxLogMessage(_T("Help was given, terminating."));
4316 ShowCmdLine(parser
);
4320 wxLogMessage(_T("Syntax error detected, aborting."));
4323 #endif // wxUSE_CMDLINE_PARSER
4325 #endif // TEST_CMDLINE
4337 TestDllListLoaded();
4338 #endif // TEST_DYNLIB
4342 #endif // TEST_ENVIRON
4346 #endif // TEST_EXECUTE
4348 #ifdef TEST_FILECONF
4350 #endif // TEST_FILECONF
4354 #endif // TEST_LOCALE
4357 wxPuts(_T("*** Testing wxLog ***"));
4360 for ( size_t n
= 0; n
< 8000; n
++ )
4362 s
<< (wxChar
)(_T('A') + (n
% 26));
4365 wxLogWarning(_T("The length of the string is %lu"),
4366 (unsigned long)s
.length());
4369 msg
.Printf(_T("A very very long message: '%s', the end!\n"), s
.c_str());
4371 // this one shouldn't be truncated
4374 // but this one will because log functions use fixed size buffer
4375 // (note that it doesn't need '\n' at the end neither - will be added
4377 wxLogMessage(_T("A very very long message 2: '%s', the end!"), s
.c_str());
4387 #ifdef TEST_FILENAME
4390 TestFileNameDirManip();
4391 TestFileNameComparison();
4392 TestFileNameOperations();
4393 #endif // TEST_FILENAME
4395 #ifdef TEST_FILETIME
4400 #endif // TEST_FILETIME
4403 wxLog::AddTraceMask(FTP_TRACE_MASK
);
4404 if ( TestFtpConnect() )
4414 #if TEST_INTERACTIVE
4415 TestFtpInteractive();
4418 //else: connecting to the FTP server failed
4426 //wxLog::AddTraceMask(_T("mime"));
4429 // TestMimeAssociate();
4433 #ifdef TEST_INFO_FUNCTIONS
4438 #if TEST_INTERACTIVE
4441 #endif // TEST_INFO_FUNCTIONS
4443 #ifdef TEST_PATHLIST
4445 #endif // TEST_PATHLIST
4449 #endif // TEST_PRINTF
4456 #endif // TEST_REGCONF
4458 #if defined TEST_REGEX && TEST_INTERACTIVE
4459 TestRegExInteractive();
4460 #endif // defined TEST_REGEX && TEST_INTERACTIVE
4462 #ifdef TEST_REGISTRY
4464 TestRegistryAssociation();
4465 #endif // TEST_REGISTRY
4470 #endif // TEST_SOCKETS
4477 #endif // TEST_STREAMS
4479 #ifdef TEST_TEXTSTREAM
4480 TestTextInputStream();
4481 #endif // TEST_TEXTSTREAM
4484 int nCPUs
= wxThread::GetCPUCount();
4485 wxPrintf(_T("This system has %d CPUs\n"), nCPUs
);
4487 wxThread::SetConcurrency(nCPUs
);
4489 TestJoinableThreads();
4492 TestJoinableThreads();
4493 TestDetachedThreads();
4494 TestThreadSuspend();
4496 TestThreadConditions();
4500 #endif // TEST_THREADS
4505 #endif // TEST_TIMER
4507 #ifdef TEST_DATETIME
4514 TestTimeSpanFormat();
4520 #if TEST_INTERACTIVE
4521 TestDateTimeInteractive();
4523 #endif // TEST_DATETIME
4525 #ifdef TEST_SCOPEGUARD
4529 #ifdef TEST_STACKWALKER
4530 #if wxUSE_STACKWALKER
4531 TestStackWalk(argv
[0]);
4533 #endif // TEST_STACKWALKER
4535 #ifdef TEST_STDPATHS
4536 TestStandardPaths();
4540 wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
4542 #endif // TEST_USLEEP
4547 #endif // TEST_VCARD
4551 #endif // TEST_VOLUME
4555 TestEncodingConverter();
4556 #endif // TEST_WCHAR
4559 TestZipStreamRead();
4560 TestZipFileSystem();
4565 for ( int n
= 0; n
< argc
; n
++ )
4570 #endif // wxUSE_UNICODE