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", 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", 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 wxConfig
*config
= new wxConfig(_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] ", frame
.GetLevel());
2744 wxString name
= frame
.GetName();
2745 if ( !name
.empty() )
2747 printf("%-20.40s", name
.mb_str());
2751 printf("0x%08lx", (unsigned long)frame
.GetAddress());
2754 if ( frame
.HasSourceLocation() )
2757 frame
.GetFileName().mb_str(),
2764 for ( size_t n
= 0; frame
.GetParam(n
, &type
, &name
, &val
); n
++ )
2766 printf("\t%s %s = %s\n", type
.mb_str(), name
.mb_str(), val
.mb_str());
2771 static void TestStackWalk(const char *argv0
)
2773 wxPuts(_T("*** Testing wxStackWalker ***\n"));
2775 StackDump
dump(argv0
);
2779 #endif // wxUSE_STACKWALKER
2781 #endif // TEST_STACKWALKER
2783 // ----------------------------------------------------------------------------
2785 // ----------------------------------------------------------------------------
2787 #ifdef TEST_STDPATHS
2789 #include "wx/stdpaths.h"
2790 #include "wx/wxchar.h" // wxPrintf
2792 static void TestStandardPaths()
2794 wxPuts(_T("*** Testing wxStandardPaths ***\n"));
2796 wxTheApp
->SetAppName(_T("console"));
2798 wxStandardPathsBase
& stdp
= wxStandardPaths::Get();
2799 wxPrintf(_T("Config dir (sys):\t%s\n"), stdp
.GetConfigDir().c_str());
2800 wxPrintf(_T("Config dir (user):\t%s\n"), stdp
.GetUserConfigDir().c_str());
2801 wxPrintf(_T("Data dir (sys):\t\t%s\n"), stdp
.GetDataDir().c_str());
2802 wxPrintf(_T("Data dir (sys local):\t%s\n"), stdp
.GetLocalDataDir().c_str());
2803 wxPrintf(_T("Data dir (user):\t%s\n"), stdp
.GetUserDataDir().c_str());
2804 wxPrintf(_T("Data dir (user local):\t%s\n"), stdp
.GetUserLocalDataDir().c_str());
2805 wxPrintf(_T("Documents dir:\t\t%s\n"), stdp
.GetDocumentsDir().c_str());
2806 wxPrintf(_T("Executable path:\t%s\n"), stdp
.GetExecutablePath().c_str());
2807 wxPrintf(_T("Plugins dir:\t\t%s\n"), stdp
.GetPluginsDir().c_str());
2808 wxPrintf(_T("Resources dir:\t\t%s\n"), stdp
.GetResourcesDir().c_str());
2809 wxPrintf(_T("Localized res. dir:\t%s\n"),
2810 stdp
.GetLocalizedResourcesDir(_T("fr")).c_str());
2811 wxPrintf(_T("Message catalogs dir:\t%s\n"),
2812 stdp
.GetLocalizedResourcesDir
2815 wxStandardPaths::ResourceCat_Messages
2819 #endif // TEST_STDPATHS
2821 // ----------------------------------------------------------------------------
2823 // ----------------------------------------------------------------------------
2827 #include "wx/wfstream.h"
2828 #include "wx/mstream.h"
2830 static void TestFileStream()
2832 wxPuts(_T("*** Testing wxFileInputStream ***"));
2834 static const wxString filename
= _T("testdata.fs");
2836 wxFileOutputStream
fsOut(filename
);
2837 fsOut
.Write("foo", 3);
2841 wxFileInputStream
fsIn(filename
);
2842 wxPrintf(_T("File stream size: %u\n"), fsIn
.GetSize());
2843 while ( !fsIn
.Eof() )
2845 wxPutchar(fsIn
.GetC());
2849 if ( !wxRemoveFile(filename
) )
2851 wxPrintf(_T("ERROR: failed to remove the file '%s'.\n"), filename
.c_str());
2854 wxPuts(_T("\n*** wxFileInputStream test done ***"));
2857 static void TestMemoryStream()
2859 wxPuts(_T("*** Testing wxMemoryOutputStream ***"));
2861 wxMemoryOutputStream memOutStream
;
2862 wxPrintf(_T("Initially out stream offset: %lu\n"),
2863 (unsigned long)memOutStream
.TellO());
2865 for ( const wxChar
*p
= _T("Hello, stream!"); *p
; p
++ )
2867 memOutStream
.PutC(*p
);
2870 wxPrintf(_T("Final out stream offset: %lu\n"),
2871 (unsigned long)memOutStream
.TellO());
2873 wxPuts(_T("*** Testing wxMemoryInputStream ***"));
2876 size_t len
= memOutStream
.CopyTo(buf
, WXSIZEOF(buf
));
2878 wxMemoryInputStream
memInpStream(buf
, len
);
2879 wxPrintf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
2880 while ( !memInpStream
.Eof() )
2882 wxPutchar(memInpStream
.GetC());
2885 wxPuts(_T("\n*** wxMemoryInputStream test done ***"));
2888 #endif // TEST_STREAMS
2890 // ----------------------------------------------------------------------------
2892 // ----------------------------------------------------------------------------
2896 #include "wx/stopwatch.h"
2897 #include "wx/utils.h"
2899 static void TestStopWatch()
2901 wxPuts(_T("*** Testing wxStopWatch ***\n"));
2905 wxPrintf(_T("Initially paused, after 2 seconds time is..."));
2908 wxPrintf(_T("\t%ldms\n"), sw
.Time());
2910 wxPrintf(_T("Resuming stopwatch and sleeping 3 seconds..."));
2914 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2917 wxPrintf(_T("Pausing agan and sleeping 2 more seconds..."));
2920 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2923 wxPrintf(_T("Finally resuming and sleeping 2 more seconds..."));
2926 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2929 wxPuts(_T("\nChecking for 'backwards clock' bug..."));
2930 for ( size_t n
= 0; n
< 70; n
++ )
2934 for ( size_t m
= 0; m
< 100000; m
++ )
2936 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
2938 wxPuts(_T("\ntime is negative - ERROR!"));
2946 wxPuts(_T(", ok."));
2949 #include "wx/timer.h"
2950 #include "wx/evtloop.h"
2954 wxPuts(_T("*** Testing wxTimer ***\n"));
2956 class MyTimer
: public wxTimer
2959 MyTimer() : wxTimer() { m_num
= 0; }
2961 virtual void Notify()
2963 wxPrintf(_T("%d"), m_num
++);
2968 wxPrintf(_T("... exiting the event loop"));
2971 wxEventLoop::GetActive()->Exit(0);
2972 wxPuts(_T(", ok."));
2985 timer1
.Start(100, true /* one shot */);
2987 timer1
.Start(100, true /* one shot */);
2995 #endif // TEST_TIMER
2997 // ----------------------------------------------------------------------------
2999 // ----------------------------------------------------------------------------
3003 #include "wx/vcard.h"
3005 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
3008 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
3011 wxPrintf(_T("%s%s"),
3012 wxString(_T('\t'), level
).c_str(),
3013 vcObj
->GetName().c_str());
3016 switch ( vcObj
->GetType() )
3018 case wxVCardObject::String
:
3019 case wxVCardObject::UString
:
3022 vcObj
->GetValue(&val
);
3023 value
<< _T('"') << val
<< _T('"');
3027 case wxVCardObject::Int
:
3030 vcObj
->GetValue(&i
);
3031 value
.Printf(_T("%u"), i
);
3035 case wxVCardObject::Long
:
3038 vcObj
->GetValue(&l
);
3039 value
.Printf(_T("%lu"), l
);
3043 case wxVCardObject::None
:
3046 case wxVCardObject::Object
:
3047 value
= _T("<node>");
3051 value
= _T("<unknown value type>");
3055 wxPrintf(_T(" = %s"), value
.c_str());
3058 DumpVObject(level
+ 1, *vcObj
);
3061 vcObj
= vcard
.GetNextProp(&cookie
);
3065 static void DumpVCardAddresses(const wxVCard
& vcard
)
3067 wxPuts(_T("\nShowing all addresses from vCard:\n"));
3071 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3075 int flags
= addr
->GetFlags();
3076 if ( flags
& wxVCardAddress::Domestic
)
3078 flagsStr
<< _T("domestic ");
3080 if ( flags
& wxVCardAddress::Intl
)
3082 flagsStr
<< _T("international ");
3084 if ( flags
& wxVCardAddress::Postal
)
3086 flagsStr
<< _T("postal ");
3088 if ( flags
& wxVCardAddress::Parcel
)
3090 flagsStr
<< _T("parcel ");
3092 if ( flags
& wxVCardAddress::Home
)
3094 flagsStr
<< _T("home ");
3096 if ( flags
& wxVCardAddress::Work
)
3098 flagsStr
<< _T("work ");
3101 wxPrintf(_T("Address %u:\n")
3103 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3106 addr
->GetPostOffice().c_str(),
3107 addr
->GetExtAddress().c_str(),
3108 addr
->GetStreet().c_str(),
3109 addr
->GetLocality().c_str(),
3110 addr
->GetRegion().c_str(),
3111 addr
->GetPostalCode().c_str(),
3112 addr
->GetCountry().c_str()
3116 addr
= vcard
.GetNextAddress(&cookie
);
3120 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
3122 wxPuts(_T("\nShowing all phone numbers from vCard:\n"));
3126 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
3130 int flags
= phone
->GetFlags();
3131 if ( flags
& wxVCardPhoneNumber::Voice
)
3133 flagsStr
<< _T("voice ");
3135 if ( flags
& wxVCardPhoneNumber::Fax
)
3137 flagsStr
<< _T("fax ");
3139 if ( flags
& wxVCardPhoneNumber::Cellular
)
3141 flagsStr
<< _T("cellular ");
3143 if ( flags
& wxVCardPhoneNumber::Modem
)
3145 flagsStr
<< _T("modem ");
3147 if ( flags
& wxVCardPhoneNumber::Home
)
3149 flagsStr
<< _T("home ");
3151 if ( flags
& wxVCardPhoneNumber::Work
)
3153 flagsStr
<< _T("work ");
3156 wxPrintf(_T("Phone number %u:\n")
3161 phone
->GetNumber().c_str()
3165 phone
= vcard
.GetNextPhoneNumber(&cookie
);
3169 static void TestVCardRead()
3171 wxPuts(_T("*** Testing wxVCard reading ***\n"));
3173 wxVCard
vcard(_T("vcard.vcf"));
3174 if ( !vcard
.IsOk() )
3176 wxPuts(_T("ERROR: couldn't load vCard."));
3180 // read individual vCard properties
3181 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
3185 vcObj
->GetValue(&value
);
3190 value
= _T("<none>");
3193 wxPrintf(_T("Full name retrieved directly: %s\n"), value
.c_str());
3196 if ( !vcard
.GetFullName(&value
) )
3198 value
= _T("<none>");
3201 wxPrintf(_T("Full name from wxVCard API: %s\n"), value
.c_str());
3203 // now show how to deal with multiply occurring properties
3204 DumpVCardAddresses(vcard
);
3205 DumpVCardPhoneNumbers(vcard
);
3207 // and finally show all
3208 wxPuts(_T("\nNow dumping the entire vCard:\n")
3209 "-----------------------------\n");
3211 DumpVObject(0, vcard
);
3215 static void TestVCardWrite()
3217 wxPuts(_T("*** Testing wxVCard writing ***\n"));
3220 if ( !vcard
.IsOk() )
3222 wxPuts(_T("ERROR: couldn't create vCard."));
3227 vcard
.SetName("Zeitlin", "Vadim");
3228 vcard
.SetFullName("Vadim Zeitlin");
3229 vcard
.SetOrganization("wxWidgets", "R&D");
3231 // just dump the vCard back
3232 wxPuts(_T("Entire vCard follows:\n"));
3233 wxPuts(vcard
.Write());
3237 #endif // TEST_VCARD
3239 // ----------------------------------------------------------------------------
3241 // ----------------------------------------------------------------------------
3243 #if !defined(__WIN32__) || !wxUSE_FSVOLUME
3249 #include "wx/volume.h"
3251 static const wxChar
*volumeKinds
[] =
3257 _T("network volume"),
3261 static void TestFSVolume()
3263 wxPuts(_T("*** Testing wxFSVolume class ***"));
3265 wxArrayString volumes
= wxFSVolume::GetVolumes();
3266 size_t count
= volumes
.GetCount();
3270 wxPuts(_T("ERROR: no mounted volumes?"));
3274 wxPrintf(_T("%u mounted volumes found:\n"), count
);
3276 for ( size_t n
= 0; n
< count
; n
++ )
3278 wxFSVolume
vol(volumes
[n
]);
3281 wxPuts(_T("ERROR: couldn't create volume"));
3285 wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
3287 vol
.GetDisplayName().c_str(),
3288 vol
.GetName().c_str(),
3289 volumeKinds
[vol
.GetKind()],
3290 vol
.IsWritable() ? _T("rw") : _T("ro"),
3291 vol
.GetFlags() & wxFS_VOL_REMOVABLE
? _T("removable")
3296 #endif // TEST_VOLUME
3298 // ----------------------------------------------------------------------------
3299 // wide char and Unicode support
3300 // ----------------------------------------------------------------------------
3304 #include "wx/strconv.h"
3305 #include "wx/fontenc.h"
3306 #include "wx/encconv.h"
3307 #include "wx/buffer.h"
3309 static const unsigned char utf8koi8r
[] =
3311 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
3312 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
3313 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
3314 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
3315 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
3316 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
3317 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
3320 static const unsigned char utf8iso8859_1
[] =
3322 0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e,
3323 0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65,
3324 0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65,
3325 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65,
3326 0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0
3329 static const unsigned char utf8Invalid
[] =
3331 0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30,
3332 0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6,
3333 0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88,
3334 0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70,
3338 static const struct Utf8Data
3340 const unsigned char *text
;
3342 const wxChar
*charset
;
3343 wxFontEncoding encoding
;
3346 { utf8Invalid
, WXSIZEOF(utf8Invalid
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3347 { utf8koi8r
, WXSIZEOF(utf8koi8r
), _T("koi8-r"), wxFONTENCODING_KOI8
},
3348 { utf8iso8859_1
, WXSIZEOF(utf8iso8859_1
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3351 static void TestUtf8()
3353 wxPuts(_T("*** Testing UTF8 support ***\n"));
3358 for ( size_t n
= 0; n
< WXSIZEOF(utf8data
); n
++ )
3360 const Utf8Data
& u8d
= utf8data
[n
];
3361 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)u8d
.text
,
3362 WXSIZEOF(wbuf
)) == (size_t)-1 )
3364 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3368 wxCSConv
conv(u8d
.charset
);
3369 if ( conv
.WC2MB(buf
, wbuf
, WXSIZEOF(buf
)) == (size_t)-1 )
3371 wxPrintf(_T("ERROR: conversion to %s failed.\n"), u8d
.charset
);
3375 wxPrintf(_T("String in %s: %s\n"), u8d
.charset
, buf
);
3379 wxString
s(wxConvUTF8
.cMB2WC((const char *)u8d
.text
));
3381 s
= _T("<< conversion failed >>");
3382 wxPrintf(_T("String in current cset: %s\n"), s
.c_str());
3386 wxPuts(wxEmptyString
);
3389 static void TestEncodingConverter()
3391 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
3393 // using wxEncodingConverter should give the same result as above
3396 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)utf8koi8r
,
3397 WXSIZEOF(utf8koi8r
)) == (size_t)-1 )
3399 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3403 wxEncodingConverter ec
;
3404 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
3405 ec
.Convert(wbuf
, buf
);
3406 wxPrintf(_T("The same KOI8-R string using wxEC: %s\n"), buf
);
3409 wxPuts(wxEmptyString
);
3412 #endif // TEST_WCHAR
3414 // ----------------------------------------------------------------------------
3416 // ----------------------------------------------------------------------------
3420 #include "wx/filesys.h"
3421 #include "wx/fs_zip.h"
3422 #include "wx/zipstrm.h"
3424 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
3426 static void TestZipStreamRead()
3428 wxPuts(_T("*** Testing ZIP reading ***\n"));
3430 static const wxString filename
= _T("foo");
3431 wxZipInputStream
istr(TESTFILE_ZIP
, filename
);
3432 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
3434 wxPrintf(_T("Dumping the file '%s':\n"), filename
.c_str());
3435 while ( !istr
.Eof() )
3437 wxPutchar(istr
.GetC());
3441 wxPuts(_T("\n----- done ------"));
3444 static void DumpZipDirectory(wxFileSystem
& fs
,
3445 const wxString
& dir
,
3446 const wxString
& indent
)
3448 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
3449 TESTFILE_ZIP
, dir
.c_str());
3450 wxString wildcard
= prefix
+ _T("/*");
3452 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
3453 while ( !dirname
.empty() )
3455 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
3457 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3462 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
3464 DumpZipDirectory(fs
, dirname
,
3465 indent
+ wxString(_T(' '), 4));
3467 dirname
= fs
.FindNext();
3470 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
3471 while ( !filename
.empty() )
3473 if ( !filename
.StartsWith(prefix
, &filename
) )
3475 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3480 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
3482 filename
= fs
.FindNext();
3486 static void TestZipFileSystem()
3488 wxPuts(_T("*** Testing ZIP file system ***\n"));
3490 wxFileSystem::AddHandler(new wxZipFSHandler
);
3492 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
3494 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
3499 // ----------------------------------------------------------------------------
3501 // ----------------------------------------------------------------------------
3503 #ifdef TEST_DATETIME
3505 #include "wx/math.h"
3506 #include "wx/datetime.h"
3508 // this test miscellaneous static wxDateTime functions
3512 static void TestTimeStatic()
3514 wxPuts(_T("\n*** wxDateTime static methods test ***"));
3516 // some info about the current date
3517 int year
= wxDateTime::GetCurrentYear();
3518 wxPrintf(_T("Current year %d is %sa leap one and has %d days.\n"),
3520 wxDateTime::IsLeapYear(year
) ? "" : "not ",
3521 wxDateTime::GetNumberOfDays(year
));
3523 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
3524 wxPrintf(_T("Current month is '%s' ('%s') and it has %d days\n"),
3525 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
3526 wxDateTime::GetMonthName(month
).c_str(),
3527 wxDateTime::GetNumberOfDays(month
));
3530 // test time zones stuff
3531 static void TestTimeZones()
3533 wxPuts(_T("\n*** wxDateTime timezone test ***"));
3535 wxDateTime now
= wxDateTime::Now();
3537 wxPrintf(_T("Current GMT time:\t%s\n"), now
.Format(_T("%c"), wxDateTime::GMT0
).c_str());
3538 wxPrintf(_T("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::GMT0
).c_str());
3539 wxPrintf(_T("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::EST
).c_str());
3540 wxPrintf(_T("Current time in Paris:\t%s\n"), now
.Format(_T("%c"), wxDateTime::CET
).c_str());
3541 wxPrintf(_T(" Moscow:\t%s\n"), now
.Format(_T("%c"), wxDateTime::MSK
).c_str());
3542 wxPrintf(_T(" New York:\t%s\n"), now
.Format(_T("%c"), wxDateTime::EST
).c_str());
3544 wxPrintf(_T("%s\n"), wxDateTime::Now().Format(_T("Our timezone is %Z")).c_str());
3546 wxDateTime::Tm tm
= now
.GetTm();
3547 if ( wxDateTime(tm
) != now
)
3549 wxPrintf(_T("ERROR: got %s instead of %s\n"),
3550 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
3554 // test some minimal support for the dates outside the standard range
3555 static void TestTimeRange()
3557 wxPuts(_T("\n*** wxDateTime out-of-standard-range dates test ***"));
3559 static const wxChar
*fmt
= _T("%d-%b-%Y %H:%M:%S");
3561 wxPrintf(_T("Unix epoch:\t%s\n"),
3562 wxDateTime(2440587.5).Format(fmt
).c_str());
3563 wxPrintf(_T("Feb 29, 0: \t%s\n"),
3564 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
3565 wxPrintf(_T("JDN 0: \t%s\n"),
3566 wxDateTime(0.0).Format(fmt
).c_str());
3567 wxPrintf(_T("Jan 1, 1AD:\t%s\n"),
3568 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
3569 wxPrintf(_T("May 29, 2099:\t%s\n"),
3570 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
3573 // test DST calculations
3574 static void TestTimeDST()
3576 wxPuts(_T("\n*** wxDateTime DST test ***"));
3578 wxPrintf(_T("DST is%s in effect now.\n\n"),
3579 wxDateTime::Now().IsDST() ? wxEmptyString
: _T(" not"));
3581 for ( int year
= 1990; year
< 2005; year
++ )
3583 wxPrintf(_T("DST period in Europe for year %d: from %s to %s\n"),
3585 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
3586 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
3592 #if TEST_INTERACTIVE
3594 static void TestDateTimeInteractive()
3596 wxPuts(_T("\n*** interactive wxDateTime tests ***"));
3602 wxPrintf(_T("Enter a date: "));
3603 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
3606 // kill the last '\n'
3607 buf
[wxStrlen(buf
) - 1] = 0;
3610 const wxChar
*p
= dt
.ParseDate(buf
);
3613 wxPrintf(_T("ERROR: failed to parse the date '%s'.\n"), buf
);
3619 wxPrintf(_T("WARNING: parsed only first %u characters.\n"), p
- buf
);
3622 wxPrintf(_T("%s: day %u, week of month %u/%u, week of year %u\n"),
3623 dt
.Format(_T("%b %d, %Y")).c_str(),
3625 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
3626 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
3627 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
3630 wxPuts(_T("\n*** done ***"));
3633 #endif // TEST_INTERACTIVE
3637 static void TestTimeMS()
3639 wxPuts(_T("*** testing millisecond-resolution support in wxDateTime ***"));
3641 wxDateTime dt1
= wxDateTime::Now(),
3642 dt2
= wxDateTime::UNow();
3644 wxPrintf(_T("Now = %s\n"), dt1
.Format(_T("%H:%M:%S:%l")).c_str());
3645 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
3646 wxPrintf(_T("Dummy loop: "));
3647 for ( int i
= 0; i
< 6000; i
++ )
3649 //for ( int j = 0; j < 10; j++ )
3652 s
.Printf(_T("%g"), sqrt((float)i
));
3658 wxPuts(_T(", done"));
3661 dt2
= wxDateTime::UNow();
3662 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
3664 wxPrintf(_T("Loop executed in %s ms\n"), (dt2
- dt1
).Format(_T("%l")).c_str());
3666 wxPuts(_T("\n*** done ***"));
3669 static void TestTimeHolidays()
3671 wxPuts(_T("\n*** testing wxDateTimeHolidayAuthority ***\n"));
3673 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
3674 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
3675 dtEnd
= dtStart
.GetLastMonthDay();
3677 wxDateTimeArray hol
;
3678 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
3680 const wxChar
*format
= _T("%d-%b-%Y (%a)");
3682 wxPrintf(_T("All holidays between %s and %s:\n"),
3683 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
3685 size_t count
= hol
.GetCount();
3686 for ( size_t n
= 0; n
< count
; n
++ )
3688 wxPrintf(_T("\t%s\n"), hol
[n
].Format(format
).c_str());
3691 wxPuts(wxEmptyString
);
3694 static void TestTimeZoneBug()
3696 wxPuts(_T("\n*** testing for DST/timezone bug ***\n"));
3698 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
3699 for ( int i
= 0; i
< 31; i
++ )
3701 wxPrintf(_T("Date %s: week day %s.\n"),
3702 date
.Format(_T("%d-%m-%Y")).c_str(),
3703 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
3705 date
+= wxDateSpan::Day();
3708 wxPuts(wxEmptyString
);
3711 static void TestTimeSpanFormat()
3713 wxPuts(_T("\n*** wxTimeSpan tests ***"));
3715 static const wxChar
*formats
[] =
3717 _T("(default) %H:%M:%S"),
3718 _T("%E weeks and %D days"),
3719 _T("%l milliseconds"),
3720 _T("(with ms) %H:%M:%S:%l"),
3721 _T("100%% of minutes is %M"), // test "%%"
3722 _T("%D days and %H hours"),
3723 _T("or also %S seconds"),
3726 wxTimeSpan
ts1(1, 2, 3, 4),
3728 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
3730 wxPrintf(_T("ts1 = %s\tts2 = %s\n"),
3731 ts1
.Format(formats
[n
]).c_str(),
3732 ts2
.Format(formats
[n
]).c_str());
3735 wxPuts(wxEmptyString
);
3740 #endif // TEST_DATETIME
3742 // ----------------------------------------------------------------------------
3743 // wxTextInput/OutputStream
3744 // ----------------------------------------------------------------------------
3746 #ifdef TEST_TEXTSTREAM
3748 #include "wx/txtstrm.h"
3749 #include "wx/wfstream.h"
3751 static void TestTextInputStream()
3753 wxPuts(_T("\n*** wxTextInputStream test ***"));
3755 wxString filename
= _T("testdata.fc");
3756 wxFileInputStream
fsIn(filename
);
3759 wxPuts(_T("ERROR: couldn't open file."));
3763 wxTextInputStream
tis(fsIn
);
3768 const wxString s
= tis
.ReadLine();
3770 // line could be non empty if the last line of the file isn't
3771 // terminated with EOL
3772 if ( fsIn
.Eof() && s
.empty() )
3775 wxPrintf(_T("Line %d: %s\n"), line
++, s
.c_str());
3780 #endif // TEST_TEXTSTREAM
3782 // ----------------------------------------------------------------------------
3784 // ----------------------------------------------------------------------------
3788 #include "wx/thread.h"
3790 static size_t gs_counter
= (size_t)-1;
3791 static wxCriticalSection gs_critsect
;
3792 static wxSemaphore gs_cond
;
3794 class MyJoinableThread
: public wxThread
3797 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
3798 { m_n
= n
; Create(); }
3800 // thread execution starts here
3801 virtual ExitCode
Entry();
3807 wxThread::ExitCode
MyJoinableThread::Entry()
3809 unsigned long res
= 1;
3810 for ( size_t n
= 1; n
< m_n
; n
++ )
3814 // it's a loooong calculation :-)
3818 return (ExitCode
)res
;
3821 class MyDetachedThread
: public wxThread
3824 MyDetachedThread(size_t n
, wxChar ch
)
3828 m_cancelled
= false;
3833 // thread execution starts here
3834 virtual ExitCode
Entry();
3837 virtual void OnExit();
3840 size_t m_n
; // number of characters to write
3841 wxChar m_ch
; // character to write
3843 bool m_cancelled
; // false if we exit normally
3846 wxThread::ExitCode
MyDetachedThread::Entry()
3849 wxCriticalSectionLocker
lock(gs_critsect
);
3850 if ( gs_counter
== (size_t)-1 )
3856 for ( size_t n
= 0; n
< m_n
; n
++ )
3858 if ( TestDestroy() )
3868 wxThread::Sleep(100);
3874 void MyDetachedThread::OnExit()
3876 wxLogTrace(_T("thread"), _T("Thread %ld is in OnExit"), GetId());
3878 wxCriticalSectionLocker
lock(gs_critsect
);
3879 if ( !--gs_counter
&& !m_cancelled
)
3883 static void TestDetachedThreads()
3885 wxPuts(_T("\n*** Testing detached threads ***"));
3887 static const size_t nThreads
= 3;
3888 MyDetachedThread
*threads
[nThreads
];
3890 for ( n
= 0; n
< nThreads
; n
++ )
3892 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
3895 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
3896 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
3898 for ( n
= 0; n
< nThreads
; n
++ )
3903 // wait until all threads terminate
3906 wxPuts(wxEmptyString
);
3909 static void TestJoinableThreads()
3911 wxPuts(_T("\n*** Testing a joinable thread (a loooong calculation...) ***"));
3913 // calc 10! in the background
3914 MyJoinableThread
thread(10);
3917 wxPrintf(_T("\nThread terminated with exit code %lu.\n"),
3918 (unsigned long)thread
.Wait());
3921 static void TestThreadSuspend()
3923 wxPuts(_T("\n*** Testing thread suspend/resume functions ***"));
3925 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
3929 // this is for this demo only, in a real life program we'd use another
3930 // condition variable which would be signaled from wxThread::Entry() to
3931 // tell us that the thread really started running - but here just wait a
3932 // bit and hope that it will be enough (the problem is, of course, that
3933 // the thread might still not run when we call Pause() which will result
3935 wxThread::Sleep(300);
3937 for ( size_t n
= 0; n
< 3; n
++ )
3941 wxPuts(_T("\nThread suspended"));
3944 // don't sleep but resume immediately the first time
3945 wxThread::Sleep(300);
3947 wxPuts(_T("Going to resume the thread"));
3952 wxPuts(_T("Waiting until it terminates now"));
3954 // wait until the thread terminates
3957 wxPuts(wxEmptyString
);
3960 static void TestThreadDelete()
3962 // As above, using Sleep() is only for testing here - we must use some
3963 // synchronisation object instead to ensure that the thread is still
3964 // running when we delete it - deleting a detached thread which already
3965 // terminated will lead to a crash!
3967 wxPuts(_T("\n*** Testing thread delete function ***"));
3969 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
3973 wxPuts(_T("\nDeleted a thread which didn't start to run yet."));
3975 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
3979 wxThread::Sleep(300);
3983 wxPuts(_T("\nDeleted a running thread."));
3985 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
3989 wxThread::Sleep(300);
3995 wxPuts(_T("\nDeleted a sleeping thread."));
3997 MyJoinableThread
thread3(20);
4002 wxPuts(_T("\nDeleted a joinable thread."));
4004 MyJoinableThread
thread4(2);
4007 wxThread::Sleep(300);
4011 wxPuts(_T("\nDeleted a joinable thread which already terminated."));
4013 wxPuts(wxEmptyString
);
4016 class MyWaitingThread
: public wxThread
4019 MyWaitingThread( wxMutex
*mutex
, wxCondition
*condition
)
4022 m_condition
= condition
;
4027 virtual ExitCode
Entry()
4029 wxPrintf(_T("Thread %lu has started running.\n"), GetId());
4034 wxPrintf(_T("Thread %lu starts to wait...\n"), GetId());
4038 m_condition
->Wait();
4041 wxPrintf(_T("Thread %lu finished to wait, exiting.\n"), GetId());
4049 wxCondition
*m_condition
;
4052 static void TestThreadConditions()
4055 wxCondition
condition(mutex
);
4057 // otherwise its difficult to understand which log messages pertain to
4059 //wxLogTrace(_T("thread"), _T("Local condition var is %08x, gs_cond = %08x"),
4060 // condition.GetId(), gs_cond.GetId());
4062 // create and launch threads
4063 MyWaitingThread
*threads
[10];
4066 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
4068 threads
[n
] = new MyWaitingThread( &mutex
, &condition
);
4071 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
4076 // wait until all threads run
4077 wxPuts(_T("Main thread is waiting for the other threads to start"));
4080 size_t nRunning
= 0;
4081 while ( nRunning
< WXSIZEOF(threads
) )
4087 wxPrintf(_T("Main thread: %u already running\n"), nRunning
);
4091 wxPuts(_T("Main thread: all threads started up."));
4094 wxThread::Sleep(500);
4097 // now wake one of them up
4098 wxPrintf(_T("Main thread: about to signal the condition.\n"));
4103 wxThread::Sleep(200);
4105 // wake all the (remaining) threads up, so that they can exit
4106 wxPrintf(_T("Main thread: about to broadcast the condition.\n"));
4108 condition
.Broadcast();
4110 // give them time to terminate (dirty!)
4111 wxThread::Sleep(500);
4114 #include "wx/utils.h"
4116 class MyExecThread
: public wxThread
4119 MyExecThread(const wxString
& command
) : wxThread(wxTHREAD_JOINABLE
),
4125 virtual ExitCode
Entry()
4127 return (ExitCode
)wxExecute(m_command
, wxEXEC_SYNC
);
4134 static void TestThreadExec()
4136 wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
4138 MyExecThread
thread(_T("true"));
4141 wxPrintf(_T("Main program exit code: %ld.\n"),
4142 wxExecute(_T("false"), wxEXEC_SYNC
));
4144 wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread
.Wait());
4148 #include "wx/datetime.h"
4150 class MySemaphoreThread
: public wxThread
4153 MySemaphoreThread(int i
, wxSemaphore
*sem
)
4154 : wxThread(wxTHREAD_JOINABLE
),
4161 virtual ExitCode
Entry()
4163 wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
4164 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4168 wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
4169 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4173 wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
4174 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4186 WX_DEFINE_ARRAY_PTR(wxThread
*, ArrayThreads
);
4188 static void TestSemaphore()
4190 wxPuts(_T("*** Testing wxSemaphore class. ***"));
4192 static const int SEM_LIMIT
= 3;
4194 wxSemaphore
sem(SEM_LIMIT
, SEM_LIMIT
);
4195 ArrayThreads threads
;
4197 for ( int i
= 0; i
< 3*SEM_LIMIT
; i
++ )
4199 threads
.Add(new MySemaphoreThread(i
, &sem
));
4200 threads
.Last()->Run();
4203 for ( size_t n
= 0; n
< threads
.GetCount(); n
++ )
4210 #endif // TEST_THREADS
4212 // ----------------------------------------------------------------------------
4214 // ----------------------------------------------------------------------------
4216 #ifdef TEST_SNGLINST
4217 #include "wx/snglinst.h"
4218 #endif // TEST_SNGLINST
4220 int main(int argc
, char **argv
)
4223 wxChar
**wxArgv
= new wxChar
*[argc
+ 1];
4228 for (n
= 0; n
< argc
; n
++ )
4230 wxMB2WXbuf warg
= wxConvertMB2WX(argv
[n
]);
4231 wxArgv
[n
] = wxStrdup(warg
);
4236 #else // !wxUSE_UNICODE
4238 #endif // wxUSE_UNICODE/!wxUSE_UNICODE
4240 wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE
, "program");
4242 wxInitializer initializer
;
4245 fprintf(stderr
, "Failed to initialize the wxWidgets library, aborting.");
4250 #ifdef TEST_SNGLINST
4251 wxSingleInstanceChecker checker
;
4252 if ( checker
.Create(_T(".wxconsole.lock")) )
4254 if ( checker
.IsAnotherRunning() )
4256 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
4261 // wait some time to give time to launch another instance
4262 wxPrintf(_T("Press \"Enter\" to continue..."));
4265 else // failed to create
4267 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
4269 #endif // TEST_SNGLINST
4272 TestCmdLineConvert();
4274 #if wxUSE_CMDLINE_PARSER
4275 static const wxCmdLineEntryDesc cmdLineDesc
[] =
4277 { wxCMD_LINE_SWITCH
, "h", "help", "show this help message",
4278 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
4279 { wxCMD_LINE_SWITCH
, "v", "verbose", "be verbose" },
4280 { wxCMD_LINE_SWITCH
, "q", "quiet", "be quiet" },
4282 { wxCMD_LINE_OPTION
, "o", "output", "output file" },
4283 { wxCMD_LINE_OPTION
, "i", "input", "input dir" },
4284 { wxCMD_LINE_OPTION
, "s", "size", "output block size",
4285 wxCMD_LINE_VAL_NUMBER
},
4286 { wxCMD_LINE_OPTION
, "d", "date", "output file date",
4287 wxCMD_LINE_VAL_DATE
},
4288 { wxCMD_LINE_OPTION
, "f", "double", "output double",
4289 wxCMD_LINE_VAL_DOUBLE
},
4291 { wxCMD_LINE_PARAM
, NULL
, NULL
, "input file",
4292 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
4297 wxCmdLineParser
parser(cmdLineDesc
, argc
, wxArgv
);
4299 parser
.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
4300 wxCMD_LINE_VAL_STRING
,
4301 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
4303 switch ( parser
.Parse() )
4306 wxLogMessage(_T("Help was given, terminating."));
4310 ShowCmdLine(parser
);
4314 wxLogMessage(_T("Syntax error detected, aborting."));
4317 #endif // wxUSE_CMDLINE_PARSER
4319 #endif // TEST_CMDLINE
4331 TestDllListLoaded();
4332 #endif // TEST_DYNLIB
4336 #endif // TEST_ENVIRON
4340 #endif // TEST_EXECUTE
4342 #ifdef TEST_FILECONF
4344 #endif // TEST_FILECONF
4348 #endif // TEST_LOCALE
4351 wxPuts(_T("*** Testing wxLog ***"));
4354 for ( size_t n
= 0; n
< 8000; n
++ )
4356 s
<< (wxChar
)(_T('A') + (n
% 26));
4359 wxLogWarning(_T("The length of the string is %lu"),
4360 (unsigned long)s
.length());
4363 msg
.Printf(_T("A very very long message: '%s', the end!\n"), s
.c_str());
4365 // this one shouldn't be truncated
4368 // but this one will because log functions use fixed size buffer
4369 // (note that it doesn't need '\n' at the end neither - will be added
4371 wxLogMessage(_T("A very very long message 2: '%s', the end!"), s
.c_str());
4381 #ifdef TEST_FILENAME
4384 TestFileNameDirManip();
4385 TestFileNameComparison();
4386 TestFileNameOperations();
4387 #endif // TEST_FILENAME
4389 #ifdef TEST_FILETIME
4394 #endif // TEST_FILETIME
4397 wxLog::AddTraceMask(FTP_TRACE_MASK
);
4398 if ( TestFtpConnect() )
4408 #if TEST_INTERACTIVE
4409 TestFtpInteractive();
4412 //else: connecting to the FTP server failed
4420 //wxLog::AddTraceMask(_T("mime"));
4423 // TestMimeAssociate();
4427 #ifdef TEST_INFO_FUNCTIONS
4432 #if TEST_INTERACTIVE
4435 #endif // TEST_INFO_FUNCTIONS
4437 #ifdef TEST_PATHLIST
4439 #endif // TEST_PATHLIST
4443 #endif // TEST_PRINTF
4450 #endif // TEST_REGCONF
4452 #if defined TEST_REGEX && TEST_INTERACTIVE
4453 TestRegExInteractive();
4454 #endif // defined TEST_REGEX && TEST_INTERACTIVE
4456 #ifdef TEST_REGISTRY
4458 TestRegistryAssociation();
4459 #endif // TEST_REGISTRY
4464 #endif // TEST_SOCKETS
4471 #endif // TEST_STREAMS
4473 #ifdef TEST_TEXTSTREAM
4474 TestTextInputStream();
4475 #endif // TEST_TEXTSTREAM
4478 int nCPUs
= wxThread::GetCPUCount();
4479 wxPrintf(_T("This system has %d CPUs\n"), nCPUs
);
4481 wxThread::SetConcurrency(nCPUs
);
4483 TestJoinableThreads();
4486 TestJoinableThreads();
4487 TestDetachedThreads();
4488 TestThreadSuspend();
4490 TestThreadConditions();
4494 #endif // TEST_THREADS
4499 #endif // TEST_TIMER
4501 #ifdef TEST_DATETIME
4508 TestTimeSpanFormat();
4514 #if TEST_INTERACTIVE
4515 TestDateTimeInteractive();
4517 #endif // TEST_DATETIME
4519 #ifdef TEST_SCOPEGUARD
4523 #ifdef TEST_STACKWALKER
4524 #if wxUSE_STACKWALKER
4525 TestStackWalk(argv
[0]);
4527 #endif // TEST_STACKWALKER
4529 #ifdef TEST_STDPATHS
4530 TestStandardPaths();
4534 wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
4536 #endif // TEST_USLEEP
4541 #endif // TEST_VCARD
4545 #endif // TEST_VOLUME
4549 TestEncodingConverter();
4550 #endif // TEST_WCHAR
4553 TestZipStreamRead();
4554 TestZipFileSystem();
4559 for ( int n
= 0; n
< argc
; n
++ )
4564 #endif // wxUSE_UNICODE