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"
26 #include "wx/filename.h"
29 #include "wx/apptrait.h"
30 #include "wx/platinfo.h"
31 #include "wx/wxchar.h"
33 // without this pragma, the stupid compiler precompiles #defines below so that
34 // changing them doesn't "take place" later!
39 // ----------------------------------------------------------------------------
40 // conditional compilation
41 // ----------------------------------------------------------------------------
44 A note about all these conditional compilation macros: this file is used
45 both as a test suite for various non-GUI wxWidgets classes and as a
46 scratchpad for quick tests. So there are two compilation modes: if you
47 define TEST_ALL all tests are run, otherwise you may enable the individual
48 tests individually in the "#else" branch below.
51 // what to test (in alphabetic order)? Define TEST_ALL to 0 to do a single
52 // test, define it to 1 to do all tests.
67 // #define TEST_FTP --FIXME! (RN)
68 #define TEST_INFO_FUNCTIONS
78 #define TEST_SCOPEGUARD
80 // #define TEST_SOCKETS --FIXME! (RN)
81 #define TEST_STACKWALKER
84 #define TEST_TEXTSTREAM
87 // #define TEST_VCARD -- don't enable this (VZ)
88 // #define TEST_VOLUME --FIXME! (RN)
95 // some tests are interactive, define this to run them
96 #ifdef TEST_INTERACTIVE
97 #undef TEST_INTERACTIVE
99 #define TEST_INTERACTIVE 1
101 #define TEST_INTERACTIVE 0
104 // ============================================================================
106 // ============================================================================
108 // ----------------------------------------------------------------------------
110 // ----------------------------------------------------------------------------
112 #if defined(TEST_SOCKETS)
114 // replace TABs with \t and CRs with \n
115 static wxString
MakePrintable(const wxChar
*s
)
118 (void)str
.Replace(_T("\t"), _T("\\t"));
119 (void)str
.Replace(_T("\n"), _T("\\n"));
120 (void)str
.Replace(_T("\r"), _T("\\r"));
125 #endif // MakePrintable() is used
127 // ----------------------------------------------------------------------------
129 // ----------------------------------------------------------------------------
133 #include "wx/cmdline.h"
134 #include "wx/datetime.h"
136 #if wxUSE_CMDLINE_PARSER
138 static void ShowCmdLine(const wxCmdLineParser
& parser
)
140 wxString s
= _T("Command line parsed successfully:\nInput files: ");
142 size_t count
= parser
.GetParamCount();
143 for ( size_t param
= 0; param
< count
; param
++ )
145 s
<< parser
.GetParam(param
) << ' ';
149 << _T("Verbose:\t") << (parser
.Found(_T("v")) ? _T("yes") : _T("no")) << '\n'
150 << _T("Quiet:\t") << (parser
.Found(_T("q")) ? _T("yes") : _T("no")) << '\n';
156 if ( parser
.Found(_T("o"), &strVal
) )
157 s
<< _T("Output file:\t") << strVal
<< '\n';
158 if ( parser
.Found(_T("i"), &strVal
) )
159 s
<< _T("Input dir:\t") << strVal
<< '\n';
160 if ( parser
.Found(_T("s"), &lVal
) )
161 s
<< _T("Size:\t") << lVal
<< '\n';
162 if ( parser
.Found(_T("f"), &dVal
) )
163 s
<< _T("Double:\t") << dVal
<< '\n';
164 if ( parser
.Found(_T("d"), &dt
) )
165 s
<< _T("Date:\t") << dt
.FormatISODate() << '\n';
166 if ( parser
.Found(_T("project_name"), &strVal
) )
167 s
<< _T("Project:\t") << strVal
<< '\n';
172 #endif // wxUSE_CMDLINE_PARSER
174 static void TestCmdLineConvert()
176 static const wxChar
*cmdlines
[] =
179 _T("-a \"-bstring 1\" -c\"string 2\" \"string 3\""),
180 _T("literal \\\" and \"\""),
183 for ( size_t n
= 0; n
< WXSIZEOF(cmdlines
); n
++ )
185 const wxChar
*cmdline
= cmdlines
[n
];
186 wxPrintf(_T("Parsing: %s\n"), cmdline
);
187 wxArrayString args
= wxCmdLineParser::ConvertStringToArgs(cmdline
);
189 size_t count
= args
.GetCount();
190 wxPrintf(_T("\targc = %u\n"), count
);
191 for ( size_t arg
= 0; arg
< count
; arg
++ )
193 wxPrintf(_T("\targv[%u] = %s\n"), arg
, args
[arg
].c_str());
198 #endif // TEST_CMDLINE
200 // ----------------------------------------------------------------------------
202 // ----------------------------------------------------------------------------
209 static const wxChar
*ROOTDIR
= _T("/");
210 static const wxChar
*TESTDIR
= _T("/usr/local/share");
211 #elif defined(__WXMSW__) || defined(__DOS__) || defined(__OS2__)
212 static const wxChar
*ROOTDIR
= _T("c:\\");
213 static const wxChar
*TESTDIR
= _T("d:\\");
215 #error "don't know where the root directory is"
218 static void TestDirEnumHelper(wxDir
& dir
,
219 int flags
= wxDIR_DEFAULT
,
220 const wxString
& filespec
= wxEmptyString
)
224 if ( !dir
.IsOpened() )
227 bool cont
= dir
.GetFirst(&filename
, filespec
, flags
);
230 wxPrintf(_T("\t%s\n"), filename
.c_str());
232 cont
= dir
.GetNext(&filename
);
235 wxPuts(wxEmptyString
);
240 static void TestDirEnum()
242 wxPuts(_T("*** Testing wxDir::GetFirst/GetNext ***"));
244 wxString cwd
= wxGetCwd();
245 if ( !wxDir::Exists(cwd
) )
247 wxPrintf(_T("ERROR: current directory '%s' doesn't exist?\n"), cwd
.c_str());
252 if ( !dir
.IsOpened() )
254 wxPrintf(_T("ERROR: failed to open current directory '%s'.\n"), cwd
.c_str());
258 wxPuts(_T("Enumerating everything in current directory:"));
259 TestDirEnumHelper(dir
);
261 wxPuts(_T("Enumerating really everything in current directory:"));
262 TestDirEnumHelper(dir
, wxDIR_DEFAULT
| wxDIR_DOTDOT
);
264 wxPuts(_T("Enumerating object files in current directory:"));
265 TestDirEnumHelper(dir
, wxDIR_DEFAULT
, _T("*.o*"));
267 wxPuts(_T("Enumerating directories in current directory:"));
268 TestDirEnumHelper(dir
, wxDIR_DIRS
);
270 wxPuts(_T("Enumerating files in current directory:"));
271 TestDirEnumHelper(dir
, wxDIR_FILES
);
273 wxPuts(_T("Enumerating files including hidden in current directory:"));
274 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
278 wxPuts(_T("Enumerating everything in root directory:"));
279 TestDirEnumHelper(dir
, wxDIR_DEFAULT
);
281 wxPuts(_T("Enumerating directories in root directory:"));
282 TestDirEnumHelper(dir
, wxDIR_DIRS
);
284 wxPuts(_T("Enumerating files in root directory:"));
285 TestDirEnumHelper(dir
, wxDIR_FILES
);
287 wxPuts(_T("Enumerating files including hidden in root directory:"));
288 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
290 wxPuts(_T("Enumerating files in non existing directory:"));
291 wxDir
dirNo(_T("nosuchdir"));
292 TestDirEnumHelper(dirNo
);
297 class DirPrintTraverser
: public wxDirTraverser
300 virtual wxDirTraverseResult
OnFile(const wxString
& WXUNUSED(filename
))
302 return wxDIR_CONTINUE
;
305 virtual wxDirTraverseResult
OnDir(const wxString
& dirname
)
307 wxString path
, name
, ext
;
308 wxFileName::SplitPath(dirname
, &path
, &name
, &ext
);
311 name
<< _T('.') << ext
;
314 for ( const wxChar
*p
= path
.c_str(); *p
; p
++ )
316 if ( wxIsPathSeparator(*p
) )
320 wxPrintf(_T("%s%s\n"), indent
.c_str(), name
.c_str());
322 return wxDIR_CONTINUE
;
326 static void TestDirTraverse()
328 wxPuts(_T("*** Testing wxDir::Traverse() ***"));
332 size_t n
= wxDir::GetAllFiles(TESTDIR
, &files
);
333 wxPrintf(_T("There are %u files under '%s'\n"), n
, TESTDIR
);
336 wxPrintf(_T("First one is '%s'\n"), files
[0u].c_str());
337 wxPrintf(_T(" last one is '%s'\n"), files
[n
- 1].c_str());
340 // enum again with custom traverser
341 wxPuts(_T("Now enumerating directories:"));
343 DirPrintTraverser traverser
;
344 dir
.Traverse(traverser
, wxEmptyString
, wxDIR_DIRS
| wxDIR_HIDDEN
);
349 static void TestDirExists()
351 wxPuts(_T("*** Testing wxDir::Exists() ***"));
353 static const wxChar
*dirnames
[] =
356 #if defined(__WXMSW__)
359 _T("\\\\share\\file"),
363 _T("c:\\autoexec.bat"),
364 #elif defined(__UNIX__)
373 for ( size_t n
= 0; n
< WXSIZEOF(dirnames
); n
++ )
375 wxPrintf(_T("%-40s: %s\n"),
377 wxDir::Exists(dirnames
[n
]) ? _T("exists")
378 : _T("doesn't exist"));
386 // ----------------------------------------------------------------------------
388 // ----------------------------------------------------------------------------
392 #include "wx/dynlib.h"
394 static void TestDllLoad()
396 #if defined(__WXMSW__)
397 static const wxChar
*LIB_NAME
= _T("kernel32.dll");
398 static const wxChar
*FUNC_NAME
= _T("lstrlenA");
399 #elif defined(__UNIX__)
400 // weird: using just libc.so does *not* work!
401 static const wxChar
*LIB_NAME
= _T("/lib/libc.so.6");
402 static const wxChar
*FUNC_NAME
= _T("strlen");
404 #error "don't know how to test wxDllLoader on this platform"
407 wxPuts(_T("*** testing basic wxDynamicLibrary functions ***\n"));
409 wxDynamicLibrary
lib(LIB_NAME
);
410 if ( !lib
.IsLoaded() )
412 wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME
);
416 typedef int (wxSTDCALL
*wxStrlenType
)(const char *);
417 wxStrlenType pfnStrlen
= (wxStrlenType
)lib
.GetSymbol(FUNC_NAME
);
420 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
421 FUNC_NAME
, LIB_NAME
);
425 wxPrintf(_T("Calling %s dynamically loaded from %s "),
426 FUNC_NAME
, LIB_NAME
);
428 if ( pfnStrlen("foo") != 3 )
430 wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
434 wxPuts(_T("... ok"));
439 static const wxChar
*FUNC_NAME_AW
= _T("lstrlen");
441 typedef int (wxSTDCALL
*wxStrlenTypeAorW
)(const wxChar
*);
443 pfnStrlenAorW
= (wxStrlenTypeAorW
)lib
.GetSymbolAorW(FUNC_NAME_AW
);
444 if ( !pfnStrlenAorW
)
446 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
447 FUNC_NAME_AW
, LIB_NAME
);
451 if ( pfnStrlenAorW(_T("foobar")) != 6 )
453 wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
460 #if defined(__WXMSW__) || defined(__UNIX__)
462 static void TestDllListLoaded()
464 wxPuts(_T("*** testing wxDynamicLibrary::ListLoaded() ***\n"));
466 puts("\nLoaded modules:");
467 wxDynamicLibraryDetailsArray dlls
= wxDynamicLibrary::ListLoaded();
468 const size_t count
= dlls
.GetCount();
469 for ( size_t n
= 0; n
< count
; ++n
)
471 const wxDynamicLibraryDetails
& details
= dlls
[n
];
472 printf("%-45s", (const char *)details
.GetPath().mb_str());
476 if ( details
.GetAddress(&addr
, &len
) )
478 printf(" %08lx:%08lx",
479 (unsigned long)addr
, (unsigned long)((char *)addr
+ len
));
482 printf(" %s\n", (const char *)details
.GetVersion().mb_str());
488 #endif // TEST_DYNLIB
490 // ----------------------------------------------------------------------------
492 // ----------------------------------------------------------------------------
496 #include "wx/utils.h"
498 static wxString
MyGetEnv(const wxString
& var
)
501 if ( !wxGetEnv(var
, &val
) )
504 val
= wxString(_T('\'')) + val
+ _T('\'');
509 static void TestEnvironment()
511 const wxChar
*var
= _T("wxTestVar");
513 wxPuts(_T("*** testing environment access functions ***"));
515 wxPrintf(_T("Initially getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
516 wxSetEnv(var
, _T("value for wxTestVar"));
517 wxPrintf(_T("After wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
518 wxSetEnv(var
, _T("another value"));
519 wxPrintf(_T("After 2nd wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
521 wxPrintf(_T("After wxUnsetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
522 wxPrintf(_T("PATH = %s\n"), MyGetEnv(_T("PATH")).c_str());
525 #endif // TEST_ENVIRON
527 // ----------------------------------------------------------------------------
529 // ----------------------------------------------------------------------------
533 #include "wx/utils.h"
535 static void TestExecute()
537 wxPuts(_T("*** testing wxExecute ***"));
540 #define COMMAND "echo hi"
541 #define ASYNC_COMMAND "xclock"
542 #define SHELL_COMMAND "echo hi from shell"
543 #define REDIRECT_COMMAND "cat -n Makefile"
544 #elif defined(__WXMSW__)
545 #define COMMAND "command.com /c echo hi"
546 #define ASYNC_COMMAND "notepad"
547 #define SHELL_COMMAND "echo hi"
548 #define REDIRECT_COMMAND COMMAND
550 #error "no command to exec"
553 wxPrintf(_T("Testing wxShell: "));
555 if ( wxShell(_T(SHELL_COMMAND
)) )
558 wxPuts(_T("ERROR."));
560 wxPrintf(_T("Testing wxExecute: "));
562 if ( wxExecute(_T(COMMAND
), wxEXEC_SYNC
) == 0 )
565 wxPuts(_T("ERROR."));
567 wxPrintf(_T("Testing async wxExecute: "));
569 int pid
= wxExecute(ASYNC_COMMAND
);
572 wxPuts(_T("Ok (command launched)."));
573 if ( wxKill(pid
) == -1 )
574 wxPuts("ERROR: failed to kill child process.");
577 wxPuts(_T("ERROR."));
579 wxPrintf(_T("Testing wxExecute with redirection:\n"));
580 wxArrayString output
;
581 if ( wxExecute(_T(REDIRECT_COMMAND
), output
) != 0 )
583 wxPuts(_T("ERROR."));
587 // don't show too much output, MAX_LINES is enough
588 static const unsigned MAX_LINES
= 20;
590 const unsigned count
= output
.size();
591 for ( unsigned n
= 0;
592 n
< (count
> MAX_LINES
? MAX_LINES
/2 : count
);
595 wxPrintf("%04u:\t%s\n", n
+ 1, output
[n
]);
598 if ( count
> MAX_LINES
)
600 wxPrintf("... skipping %u lines...\n", count
- MAX_LINES
);
602 for ( unsigned n
= count
- MAX_LINES
/2; n
< count
; n
++ )
604 wxPrintf("%04u:\t%s\n", n
+ 1, output
[n
]);
612 #endif // TEST_EXECUTE
614 // ----------------------------------------------------------------------------
616 // ----------------------------------------------------------------------------
621 #include "wx/ffile.h"
622 #include "wx/textfile.h"
624 static void TestFileRead()
626 wxPuts(_T("*** wxFile read test ***"));
628 wxFile
file(_T("testdata.fc"));
629 if ( file
.IsOpened() )
631 wxPrintf(_T("File length: %lu\n"), file
.Length());
633 wxPuts(_T("File dump:\n----------"));
635 static const size_t len
= 1024;
639 size_t nRead
= file
.Read(buf
, len
);
640 if ( nRead
== (size_t)wxInvalidOffset
)
642 wxPrintf(_T("Failed to read the file."));
646 fwrite(buf
, nRead
, 1, stdout
);
652 wxPuts(_T("----------"));
656 wxPrintf(_T("ERROR: can't open test file.\n"));
659 wxPuts(wxEmptyString
);
662 static void TestTextFileRead()
664 wxPuts(_T("*** wxTextFile read test ***"));
666 wxTextFile
file(_T("testdata.fc"));
669 wxPrintf(_T("Number of lines: %u\n"), file
.GetLineCount());
670 wxPrintf(_T("Last line: '%s'\n"), file
.GetLastLine().c_str());
674 wxPuts(_T("\nDumping the entire file:"));
675 for ( s
= file
.GetFirstLine(); !file
.Eof(); s
= file
.GetNextLine() )
677 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
679 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
681 wxPuts(_T("\nAnd now backwards:"));
682 for ( s
= file
.GetLastLine();
683 file
.GetCurrentLine() != 0;
684 s
= file
.GetPrevLine() )
686 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
688 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
692 wxPrintf(_T("ERROR: can't open '%s'\n"), file
.GetName());
695 wxPuts(wxEmptyString
);
698 static void TestFileCopy()
700 wxPuts(_T("*** Testing wxCopyFile ***"));
702 static const wxChar
*filename1
= _T("testdata.fc");
703 static const wxChar
*filename2
= _T("test2");
704 if ( !wxCopyFile(filename1
, filename2
) )
706 wxPuts(_T("ERROR: failed to copy file"));
710 wxFFile
f1(filename1
, _T("rb")),
711 f2(filename2
, _T("rb"));
713 if ( !f1
.IsOpened() || !f2
.IsOpened() )
715 wxPuts(_T("ERROR: failed to open file(s)"));
720 if ( !f1
.ReadAll(&s1
) || !f2
.ReadAll(&s2
) )
722 wxPuts(_T("ERROR: failed to read file(s)"));
726 if ( (s1
.length() != s2
.length()) ||
727 (memcmp(s1
.c_str(), s2
.c_str(), s1
.length()) != 0) )
729 wxPuts(_T("ERROR: copy error!"));
733 wxPuts(_T("File was copied ok."));
739 if ( !wxRemoveFile(filename2
) )
741 wxPuts(_T("ERROR: failed to remove the file"));
744 wxPuts(wxEmptyString
);
747 static void TestTempFile()
749 wxPuts(_T("*** wxTempFile test ***"));
752 if ( tmpFile
.Open(_T("test2")) && tmpFile
.Write(_T("the answer is 42")) )
754 if ( tmpFile
.Commit() )
755 wxPuts(_T("File committed."));
757 wxPuts(_T("ERROR: could't commit temp file."));
759 wxRemoveFile(_T("test2"));
762 wxPuts(wxEmptyString
);
767 // ----------------------------------------------------------------------------
769 // ----------------------------------------------------------------------------
773 #include "wx/confbase.h"
774 #include "wx/fileconf.h"
776 static const struct FileConfTestData
778 const wxChar
*name
; // value name
779 const wxChar
*value
; // the value from the file
782 { _T("value1"), _T("one") },
783 { _T("value2"), _T("two") },
784 { _T("novalue"), _T("default") },
787 static void TestFileConfRead()
789 wxPuts(_T("*** testing wxFileConfig loading/reading ***"));
791 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
792 _T("testdata.fc"), wxEmptyString
,
793 wxCONFIG_USE_RELATIVE_PATH
);
795 // test simple reading
796 wxPuts(_T("\nReading config file:"));
797 wxString
defValue(_T("default")), value
;
798 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
800 const FileConfTestData
& data
= fcTestData
[n
];
801 value
= fileconf
.Read(data
.name
, defValue
);
802 wxPrintf(_T("\t%s = %s "), data
.name
, value
.c_str());
803 if ( value
== data
.value
)
809 wxPrintf(_T("(ERROR: should be %s)\n"), data
.value
);
813 // test enumerating the entries
814 wxPuts(_T("\nEnumerating all root entries:"));
817 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
820 wxPrintf(_T("\t%s = %s\n"),
822 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
824 cont
= fileconf
.GetNextEntry(name
, dummy
);
827 static const wxChar
*testEntry
= _T("TestEntry");
828 wxPrintf(_T("\nTesting deletion of newly created \"Test\" entry: "));
829 fileconf
.Write(testEntry
, _T("A value"));
830 fileconf
.DeleteEntry(testEntry
);
831 wxPrintf(fileconf
.HasEntry(testEntry
) ? _T("ERROR\n") : _T("ok\n"));
834 #endif // TEST_FILECONF
836 // ----------------------------------------------------------------------------
838 // ----------------------------------------------------------------------------
842 #include "wx/filename.h"
845 static void DumpFileName(const wxChar
*desc
, const wxFileName
& fn
)
849 wxString full
= fn
.GetFullPath();
851 wxString vol
, path
, name
, ext
;
852 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
854 wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
855 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
857 wxFileName::SplitPath(full
, &path
, &name
, &ext
);
858 wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
859 path
.c_str(), name
.c_str(), ext
.c_str());
861 wxPrintf(_T("path is also:\t'%s'\n"), fn
.GetPath().c_str());
862 wxPrintf(_T("with volume: \t'%s'\n"),
863 fn
.GetPath(wxPATH_GET_VOLUME
).c_str());
864 wxPrintf(_T("with separator:\t'%s'\n"),
865 fn
.GetPath(wxPATH_GET_SEPARATOR
).c_str());
866 wxPrintf(_T("with both: \t'%s'\n"),
867 fn
.GetPath(wxPATH_GET_SEPARATOR
| wxPATH_GET_VOLUME
).c_str());
869 wxPuts(_T("The directories in the path are:"));
870 wxArrayString dirs
= fn
.GetDirs();
871 size_t count
= dirs
.GetCount();
872 for ( size_t n
= 0; n
< count
; n
++ )
874 wxPrintf(_T("\t%u: %s\n"), n
, dirs
[n
].c_str());
879 static void TestFileNameTemp()
881 wxPuts(_T("*** testing wxFileName temp file creation ***"));
883 static const wxChar
*tmpprefixes
[] =
891 _T("/tmp/foo/bar"), // this one must be an error
895 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
897 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
900 // "error" is not in upper case because it may be ok
901 wxPrintf(_T("Prefix '%s'\t-> error\n"), tmpprefixes
[n
]);
905 wxPrintf(_T("Prefix '%s'\t-> temp file '%s'\n"),
906 tmpprefixes
[n
], path
.c_str());
908 if ( !wxRemoveFile(path
) )
910 wxLogWarning(_T("Failed to remove temp file '%s'"),
917 static void TestFileNameDirManip()
919 // TODO: test AppendDir(), RemoveDir(), ...
922 static void TestFileNameComparison()
927 static void TestFileNameOperations()
932 static void TestFileNameCwd()
937 #endif // TEST_FILENAME
939 // ----------------------------------------------------------------------------
940 // wxFileName time functions
941 // ----------------------------------------------------------------------------
945 #include "wx/filename.h"
946 #include "wx/datetime.h"
948 static void TestFileGetTimes()
950 wxFileName
fn(_T("testdata.fc"));
952 wxDateTime dtAccess
, dtMod
, dtCreate
;
953 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtCreate
) )
955 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
959 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
961 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
962 wxPrintf(_T("Creation: \t%s\n"), dtCreate
.Format(fmt
).c_str());
963 wxPrintf(_T("Last read: \t%s\n"), dtAccess
.Format(fmt
).c_str());
964 wxPrintf(_T("Last write: \t%s\n"), dtMod
.Format(fmt
).c_str());
969 static void TestFileSetTimes()
971 wxFileName
fn(_T("testdata.fc"));
975 wxPrintf(_T("ERROR: Touch() failed.\n"));
980 #endif // TEST_FILETIME
982 // ----------------------------------------------------------------------------
984 // ----------------------------------------------------------------------------
989 #include "wx/utils.h" // for wxSetEnv
991 static wxLocale gs_localeDefault
;
992 // NOTE: don't init it here as it needs a wxAppTraits object
993 // and thus must be init-ed after creation of the wxInitializer
994 // class in the main()
996 // find the name of the language from its value
997 static const wxChar
*GetLangName(int lang
)
999 static const wxChar
*languageNames
[] =
1009 _T("ARABIC_ALGERIA"),
1010 _T("ARABIC_BAHRAIN"),
1013 _T("ARABIC_JORDAN"),
1014 _T("ARABIC_KUWAIT"),
1015 _T("ARABIC_LEBANON"),
1017 _T("ARABIC_MOROCCO"),
1020 _T("ARABIC_SAUDI_ARABIA"),
1023 _T("ARABIC_TUNISIA"),
1030 _T("AZERI_CYRILLIC"),
1045 _T("CHINESE_SIMPLIFIED"),
1046 _T("CHINESE_TRADITIONAL"),
1047 _T("CHINESE_HONGKONG"),
1048 _T("CHINESE_MACAU"),
1049 _T("CHINESE_SINGAPORE"),
1050 _T("CHINESE_TAIWAN"),
1056 _T("DUTCH_BELGIAN"),
1060 _T("ENGLISH_AUSTRALIA"),
1061 _T("ENGLISH_BELIZE"),
1062 _T("ENGLISH_BOTSWANA"),
1063 _T("ENGLISH_CANADA"),
1064 _T("ENGLISH_CARIBBEAN"),
1065 _T("ENGLISH_DENMARK"),
1067 _T("ENGLISH_JAMAICA"),
1068 _T("ENGLISH_NEW_ZEALAND"),
1069 _T("ENGLISH_PHILIPPINES"),
1070 _T("ENGLISH_SOUTH_AFRICA"),
1071 _T("ENGLISH_TRINIDAD"),
1072 _T("ENGLISH_ZIMBABWE"),
1080 _T("FRENCH_BELGIAN"),
1081 _T("FRENCH_CANADIAN"),
1082 _T("FRENCH_LUXEMBOURG"),
1083 _T("FRENCH_MONACO"),
1089 _T("GERMAN_AUSTRIAN"),
1090 _T("GERMAN_BELGIUM"),
1091 _T("GERMAN_LIECHTENSTEIN"),
1092 _T("GERMAN_LUXEMBOURG"),
1110 _T("ITALIAN_SWISS"),
1115 _T("KASHMIRI_INDIA"),
1133 _T("MALAY_BRUNEI_DARUSSALAM"),
1134 _T("MALAY_MALAYSIA"),
1144 _T("NORWEGIAN_BOKMAL"),
1145 _T("NORWEGIAN_NYNORSK"),
1152 _T("PORTUGUESE_BRAZILIAN"),
1155 _T("RHAETO_ROMANCE"),
1158 _T("RUSSIAN_UKRAINE"),
1164 _T("SERBIAN_CYRILLIC"),
1165 _T("SERBIAN_LATIN"),
1166 _T("SERBO_CROATIAN"),
1177 _T("SPANISH_ARGENTINA"),
1178 _T("SPANISH_BOLIVIA"),
1179 _T("SPANISH_CHILE"),
1180 _T("SPANISH_COLOMBIA"),
1181 _T("SPANISH_COSTA_RICA"),
1182 _T("SPANISH_DOMINICAN_REPUBLIC"),
1183 _T("SPANISH_ECUADOR"),
1184 _T("SPANISH_EL_SALVADOR"),
1185 _T("SPANISH_GUATEMALA"),
1186 _T("SPANISH_HONDURAS"),
1187 _T("SPANISH_MEXICAN"),
1188 _T("SPANISH_MODERN"),
1189 _T("SPANISH_NICARAGUA"),
1190 _T("SPANISH_PANAMA"),
1191 _T("SPANISH_PARAGUAY"),
1193 _T("SPANISH_PUERTO_RICO"),
1194 _T("SPANISH_URUGUAY"),
1196 _T("SPANISH_VENEZUELA"),
1200 _T("SWEDISH_FINLAND"),
1218 _T("URDU_PAKISTAN"),
1220 _T("UZBEK_CYRILLIC"),
1233 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1234 return languageNames
[lang
];
1236 return _T("INVALID");
1239 static void TestDefaultLang()
1241 wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
1243 gs_localeDefault
.Init(wxLANGUAGE_ENGLISH
);
1245 static const wxChar
*langStrings
[] =
1247 NULL
, // system default
1254 _T("de_DE.iso88591"),
1256 _T("?"), // invalid lang spec
1257 _T("klingonese"), // I bet on some systems it does exist...
1260 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1261 wxLocale::GetSystemEncodingName().c_str(),
1262 wxLocale::GetSystemEncoding());
1264 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1266 const wxChar
*langStr
= langStrings
[n
];
1269 // FIXME: this doesn't do anything at all under Windows, we need
1270 // to create a new wxLocale!
1271 wxSetEnv(_T("LC_ALL"), langStr
);
1274 int lang
= gs_localeDefault
.GetSystemLanguage();
1275 wxPrintf(_T("Locale for '%s' is %s.\n"),
1276 langStr
? langStr
: _T("system default"), GetLangName(lang
));
1280 #endif // TEST_LOCALE
1282 // ----------------------------------------------------------------------------
1284 // ----------------------------------------------------------------------------
1288 #include "wx/mimetype.h"
1290 static void TestMimeEnum()
1292 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1294 wxArrayString mimetypes
;
1296 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1298 wxPrintf(_T("*** All %u known filetypes: ***\n"), count
);
1303 for ( size_t n
= 0; n
< count
; n
++ )
1305 wxFileType
*filetype
=
1306 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1309 wxPrintf(_T("nothing known about the filetype '%s'!\n"),
1310 mimetypes
[n
].c_str());
1314 filetype
->GetDescription(&desc
);
1315 filetype
->GetExtensions(exts
);
1317 filetype
->GetIcon(NULL
);
1320 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1323 extsAll
<< _T(", ");
1327 wxPrintf(_T("\t%s: %s (%s)\n"),
1328 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
1331 wxPuts(wxEmptyString
);
1334 static void TestMimeFilename()
1336 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
1338 static const wxChar
*filenames
[] =
1346 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1348 const wxString fname
= filenames
[n
];
1349 wxString ext
= fname
.AfterLast(_T('.'));
1350 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
1353 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
1358 if ( !ft
->GetDescription(&desc
) )
1359 desc
= _T("<no description>");
1362 if ( !ft
->GetOpenCommand(&cmd
,
1363 wxFileType::MessageParameters(fname
, wxEmptyString
)) )
1364 cmd
= _T("<no command available>");
1366 cmd
= wxString(_T('"')) + cmd
+ _T('"');
1368 wxPrintf(_T("To open %s (%s) do %s.\n"),
1369 fname
.c_str(), desc
.c_str(), cmd
.c_str());
1375 wxPuts(wxEmptyString
);
1378 // these tests were broken by wxMimeTypesManager changes, temporarily disabling
1381 static void TestMimeOverride()
1383 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
1385 static const wxChar
*mailcap
= _T("/tmp/mailcap");
1386 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
1388 if ( wxFile::Exists(mailcap
) )
1389 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
1391 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
1393 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
1396 if ( wxFile::Exists(mimetypes
) )
1397 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
1399 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
1401 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
1404 wxPuts(wxEmptyString
);
1407 static void TestMimeAssociate()
1409 wxPuts(_T("*** Testing creation of filetype association ***\n"));
1411 wxFileTypeInfo
ftInfo(
1412 _T("application/x-xyz"),
1413 _T("xyzview '%s'"), // open cmd
1414 _T(""), // print cmd
1415 _T("XYZ File"), // description
1416 _T(".xyz"), // extensions
1417 wxNullPtr
// end of extensions
1419 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
1421 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
1424 wxPuts(_T("ERROR: failed to create association!"));
1428 // TODO: read it back
1432 wxPuts(wxEmptyString
);
1439 // ----------------------------------------------------------------------------
1440 // module dependencies feature
1441 // ----------------------------------------------------------------------------
1445 #include "wx/module.h"
1447 class wxTestModule
: public wxModule
1450 virtual bool OnInit() { wxPrintf(_T("Load module: %s\n"), GetClassInfo()->GetClassName()); return true; }
1451 virtual void OnExit() { wxPrintf(_T("Unload module: %s\n"), GetClassInfo()->GetClassName()); }
1454 class wxTestModuleA
: public wxTestModule
1459 DECLARE_DYNAMIC_CLASS(wxTestModuleA
)
1462 class wxTestModuleB
: public wxTestModule
1467 DECLARE_DYNAMIC_CLASS(wxTestModuleB
)
1470 class wxTestModuleC
: public wxTestModule
1475 DECLARE_DYNAMIC_CLASS(wxTestModuleC
)
1478 class wxTestModuleD
: public wxTestModule
1483 DECLARE_DYNAMIC_CLASS(wxTestModuleD
)
1486 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleC
, wxModule
)
1487 wxTestModuleC::wxTestModuleC()
1489 AddDependency(CLASSINFO(wxTestModuleD
));
1492 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleA
, wxModule
)
1493 wxTestModuleA::wxTestModuleA()
1495 AddDependency(CLASSINFO(wxTestModuleB
));
1496 AddDependency(CLASSINFO(wxTestModuleD
));
1499 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleD
, wxModule
)
1500 wxTestModuleD::wxTestModuleD()
1504 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleB
, wxModule
)
1505 wxTestModuleB::wxTestModuleB()
1507 AddDependency(CLASSINFO(wxTestModuleD
));
1508 AddDependency(CLASSINFO(wxTestModuleC
));
1511 #endif // TEST_MODULE
1513 // ----------------------------------------------------------------------------
1514 // misc information functions
1515 // ----------------------------------------------------------------------------
1517 #ifdef TEST_INFO_FUNCTIONS
1519 #include "wx/utils.h"
1521 #if TEST_INTERACTIVE
1522 static void TestDiskInfo()
1524 wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
1528 wxChar pathname
[128];
1529 wxPrintf(_T("\nEnter a directory name: "));
1530 if ( !wxFgets(pathname
, WXSIZEOF(pathname
), stdin
) )
1533 // kill the last '\n'
1534 pathname
[wxStrlen(pathname
) - 1] = 0;
1536 wxLongLong total
, free
;
1537 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
1539 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
1543 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
1544 (total
/ 1024).ToString().c_str(),
1545 (free
/ 1024).ToString().c_str(),
1550 #endif // TEST_INTERACTIVE
1552 static void TestOsInfo()
1554 wxPuts(_T("*** Testing OS info functions ***\n"));
1557 wxGetOsVersion(&major
, &minor
);
1558 wxPrintf(_T("Running under: %s, version %d.%d\n"),
1559 wxGetOsDescription().c_str(), major
, minor
);
1561 wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory().ToLong());
1563 wxPrintf(_T("Host name is %s (%s).\n"),
1564 wxGetHostName().c_str(), wxGetFullHostName().c_str());
1566 wxPuts(wxEmptyString
);
1569 static void TestPlatformInfo()
1571 wxPuts(_T("*** Testing wxPlatformInfo functions ***\n"));
1573 // get this platform
1574 wxPlatformInfo plat
;
1576 wxPrintf(_T("Operating system family name is: %s\n"), plat
.GetOperatingSystemFamilyName().c_str());
1577 wxPrintf(_T("Operating system name is: %s\n"), plat
.GetOperatingSystemIdName().c_str());
1578 wxPrintf(_T("Port ID name is: %s\n"), plat
.GetPortIdName().c_str());
1579 wxPrintf(_T("Port ID short name is: %s\n"), plat
.GetPortIdShortName().c_str());
1580 wxPrintf(_T("Architecture is: %s\n"), plat
.GetArchName().c_str());
1581 wxPrintf(_T("Endianness is: %s\n"), plat
.GetEndiannessName().c_str());
1583 wxPuts(wxEmptyString
);
1586 static void TestUserInfo()
1588 wxPuts(_T("*** Testing user info functions ***\n"));
1590 wxPrintf(_T("User id is:\t%s\n"), wxGetUserId().c_str());
1591 wxPrintf(_T("User name is:\t%s\n"), wxGetUserName().c_str());
1592 wxPrintf(_T("Home dir is:\t%s\n"), wxGetHomeDir().c_str());
1593 wxPrintf(_T("Email address:\t%s\n"), wxGetEmailAddress().c_str());
1595 wxPuts(wxEmptyString
);
1598 #endif // TEST_INFO_FUNCTIONS
1600 // ----------------------------------------------------------------------------
1602 // ----------------------------------------------------------------------------
1604 #ifdef TEST_PATHLIST
1607 #define CMD_IN_PATH _T("ls")
1609 #define CMD_IN_PATH _T("command.com")
1612 static void TestPathList()
1614 wxPuts(_T("*** Testing wxPathList ***\n"));
1616 wxPathList pathlist
;
1617 pathlist
.AddEnvList(_T("PATH"));
1618 wxString path
= pathlist
.FindValidPath(CMD_IN_PATH
);
1621 wxPrintf(_T("ERROR: command not found in the path.\n"));
1625 wxPrintf(_T("Command found in the path as '%s'.\n"), path
.c_str());
1629 #endif // TEST_PATHLIST
1631 // ----------------------------------------------------------------------------
1632 // regular expressions
1633 // ----------------------------------------------------------------------------
1637 #include "wx/regex.h"
1639 static void TestRegExInteractive()
1641 wxPuts(_T("*** Testing RE interactively ***"));
1645 wxChar pattern
[128];
1646 wxPrintf(_T("\nEnter a pattern: "));
1647 if ( !wxFgets(pattern
, WXSIZEOF(pattern
), stdin
) )
1650 // kill the last '\n'
1651 pattern
[wxStrlen(pattern
) - 1] = 0;
1654 if ( !re
.Compile(pattern
) )
1662 wxPrintf(_T("Enter text to match: "));
1663 if ( !wxFgets(text
, WXSIZEOF(text
), stdin
) )
1666 // kill the last '\n'
1667 text
[wxStrlen(text
) - 1] = 0;
1669 if ( !re
.Matches(text
) )
1671 wxPrintf(_T("No match.\n"));
1675 wxPrintf(_T("Pattern matches at '%s'\n"), re
.GetMatch(text
).c_str());
1678 for ( size_t n
= 1; ; n
++ )
1680 if ( !re
.GetMatch(&start
, &len
, n
) )
1685 wxPrintf(_T("Subexpr %u matched '%s'\n"),
1686 n
, wxString(text
+ start
, len
).c_str());
1693 #endif // TEST_REGEX
1695 // ----------------------------------------------------------------------------
1697 // ----------------------------------------------------------------------------
1700 NB: this stuff was taken from the glibc test suite and modified to build
1701 in wxWidgets: if I read the copyright below properly, this shouldn't
1707 #ifdef wxTEST_PRINTF
1708 // use our functions from wxchar.cpp
1712 // NB: do _not_ use ATTRIBUTE_PRINTF here, we have some invalid formats
1713 // in the tests below
1714 int wxPrintf( const wxChar
*format
, ... );
1715 int wxSprintf( wxChar
*str
, const wxChar
*format
, ... );
1718 #include "wx/longlong.h"
1722 static void rfg1 (void);
1723 static void rfg2 (void);
1727 fmtchk (const wxChar
*fmt
)
1729 (void) wxPrintf(_T("%s:\t`"), fmt
);
1730 (void) wxPrintf(fmt
, 0x12);
1731 (void) wxPrintf(_T("'\n"));
1735 fmtst1chk (const wxChar
*fmt
)
1737 (void) wxPrintf(_T("%s:\t`"), fmt
);
1738 (void) wxPrintf(fmt
, 4, 0x12);
1739 (void) wxPrintf(_T("'\n"));
1743 fmtst2chk (const wxChar
*fmt
)
1745 (void) wxPrintf(_T("%s:\t`"), fmt
);
1746 (void) wxPrintf(fmt
, 4, 4, 0x12);
1747 (void) wxPrintf(_T("'\n"));
1750 /* This page is covered by the following copyright: */
1752 /* (C) Copyright C E Chew
1754 * Feel free to copy, use and distribute this software provided:
1756 * 1. you do not pretend that you wrote it
1757 * 2. you leave this copyright notice intact.
1761 * Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans.
1768 /* Formatted Output Test
1770 * This exercises the output formatting code.
1773 wxChar
*PointerNull
= NULL
;
1780 wxChar
*prefix
= buf
;
1783 wxPuts(_T("\nFormatted output test"));
1784 wxPrintf(_T("prefix 6d 6o 6x 6X 6u\n"));
1785 wxStrcpy(prefix
, _T("%"));
1786 for (i
= 0; i
< 2; i
++) {
1787 for (j
= 0; j
< 2; j
++) {
1788 for (k
= 0; k
< 2; k
++) {
1789 for (l
= 0; l
< 2; l
++) {
1790 wxStrcpy(prefix
, _T("%"));
1791 if (i
== 0) wxStrcat(prefix
, _T("-"));
1792 if (j
== 0) wxStrcat(prefix
, _T("+"));
1793 if (k
== 0) wxStrcat(prefix
, _T("#"));
1794 if (l
== 0) wxStrcat(prefix
, _T("0"));
1795 wxPrintf(_T("%5s |"), prefix
);
1796 wxStrcpy(tp
, prefix
);
1797 wxStrcat(tp
, _T("6d |"));
1799 wxStrcpy(tp
, prefix
);
1800 wxStrcat(tp
, _T("6o |"));
1802 wxStrcpy(tp
, prefix
);
1803 wxStrcat(tp
, _T("6x |"));
1805 wxStrcpy(tp
, prefix
);
1806 wxStrcat(tp
, _T("6X |"));
1808 wxStrcpy(tp
, prefix
);
1809 wxStrcat(tp
, _T("6u |"));
1816 wxPrintf(_T("%10s\n"), PointerNull
);
1817 wxPrintf(_T("%-10s\n"), PointerNull
);
1820 static void TestPrintf()
1822 static wxChar shortstr
[] = _T("Hi, Z.");
1823 static wxChar longstr
[] = _T("Good morning, Doctor Chandra. This is Hal. \
1824 I am ready for my first lesson today.");
1826 wxString test_format
;
1830 fmtchk(_T("%4.4x"));
1831 fmtchk(_T("%04.4x"));
1832 fmtchk(_T("%4.3x"));
1833 fmtchk(_T("%04.3x"));
1835 fmtst1chk(_T("%.*x"));
1836 fmtst1chk(_T("%0*x"));
1837 fmtst2chk(_T("%*.*x"));
1838 fmtst2chk(_T("%0*.*x"));
1840 wxString bad_format
= _T("bad format:\t\"%b\"\n");
1841 wxPrintf(bad_format
.c_str());
1842 wxPrintf(_T("nil pointer (padded):\t\"%10p\"\n"), (void *) NULL
);
1844 wxPrintf(_T("decimal negative:\t\"%d\"\n"), -2345);
1845 wxPrintf(_T("octal negative:\t\"%o\"\n"), -2345);
1846 wxPrintf(_T("hex negative:\t\"%x\"\n"), -2345);
1847 wxPrintf(_T("long decimal number:\t\"%ld\"\n"), -123456L);
1848 wxPrintf(_T("long octal negative:\t\"%lo\"\n"), -2345L);
1849 wxPrintf(_T("long unsigned decimal number:\t\"%lu\"\n"), -123456L);
1850 wxPrintf(_T("zero-padded LDN:\t\"%010ld\"\n"), -123456L);
1851 test_format
= _T("left-adjusted ZLDN:\t\"%-010ld\"\n");
1852 wxPrintf(test_format
.c_str(), -123456);
1853 wxPrintf(_T("space-padded LDN:\t\"%10ld\"\n"), -123456L);
1854 wxPrintf(_T("left-adjusted SLDN:\t\"%-10ld\"\n"), -123456L);
1856 test_format
= _T("zero-padded string:\t\"%010s\"\n");
1857 wxPrintf(test_format
.c_str(), shortstr
);
1858 test_format
= _T("left-adjusted Z string:\t\"%-010s\"\n");
1859 wxPrintf(test_format
.c_str(), shortstr
);
1860 wxPrintf(_T("space-padded string:\t\"%10s\"\n"), shortstr
);
1861 wxPrintf(_T("left-adjusted S string:\t\"%-10s\"\n"), shortstr
);
1862 wxPrintf(_T("null string:\t\"%s\"\n"), PointerNull
);
1863 wxPrintf(_T("limited string:\t\"%.22s\"\n"), longstr
);
1865 wxPrintf(_T("e-style >= 1:\t\"%e\"\n"), 12.34);
1866 wxPrintf(_T("e-style >= .1:\t\"%e\"\n"), 0.1234);
1867 wxPrintf(_T("e-style < .1:\t\"%e\"\n"), 0.001234);
1868 wxPrintf(_T("e-style big:\t\"%.60e\"\n"), 1e20
);
1869 wxPrintf(_T("e-style == .1:\t\"%e\"\n"), 0.1);
1870 wxPrintf(_T("f-style >= 1:\t\"%f\"\n"), 12.34);
1871 wxPrintf(_T("f-style >= .1:\t\"%f\"\n"), 0.1234);
1872 wxPrintf(_T("f-style < .1:\t\"%f\"\n"), 0.001234);
1873 wxPrintf(_T("g-style >= 1:\t\"%g\"\n"), 12.34);
1874 wxPrintf(_T("g-style >= .1:\t\"%g\"\n"), 0.1234);
1875 wxPrintf(_T("g-style < .1:\t\"%g\"\n"), 0.001234);
1876 wxPrintf(_T("g-style big:\t\"%.60g\"\n"), 1e20
);
1878 wxPrintf (_T(" %6.5f\n"), .099999999860301614);
1879 wxPrintf (_T(" %6.5f\n"), .1);
1880 wxPrintf (_T("x%5.4fx\n"), .5);
1882 wxPrintf (_T("%#03x\n"), 1);
1884 //wxPrintf (_T("something really insane: %.10000f\n"), 1.0);
1890 while (niter
-- != 0)
1891 wxPrintf (_T("%.17e\n"), d
/ 2);
1896 // Open Watcom cause compiler error here
1897 // Error! E173: col(24) floating-point constant too small to represent
1898 wxPrintf (_T("%15.5e\n"), 4.9406564584124654e-324);
1901 #define FORMAT _T("|%12.4f|%12.4e|%12.4g|\n")
1902 wxPrintf (FORMAT
, 0.0, 0.0, 0.0);
1903 wxPrintf (FORMAT
, 1.0, 1.0, 1.0);
1904 wxPrintf (FORMAT
, -1.0, -1.0, -1.0);
1905 wxPrintf (FORMAT
, 100.0, 100.0, 100.0);
1906 wxPrintf (FORMAT
, 1000.0, 1000.0, 1000.0);
1907 wxPrintf (FORMAT
, 10000.0, 10000.0, 10000.0);
1908 wxPrintf (FORMAT
, 12345.0, 12345.0, 12345.0);
1909 wxPrintf (FORMAT
, 100000.0, 100000.0, 100000.0);
1910 wxPrintf (FORMAT
, 123456.0, 123456.0, 123456.0);
1915 int rc
= wxSnprintf (buf
, WXSIZEOF(buf
), _T("%30s"), _T("foo"));
1917 wxPrintf(_T("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n"),
1918 rc
, WXSIZEOF(buf
), buf
);
1921 wxPrintf ("snprintf (\"%%.999999u\", 10)\n",
1922 wxSnprintf(buf2
, WXSIZEOFbuf2
), "%.999999u", 10));
1928 wxPrintf (_T("%e should be 1.234568e+06\n"), 1234567.8);
1929 wxPrintf (_T("%f should be 1234567.800000\n"), 1234567.8);
1930 wxPrintf (_T("%g should be 1.23457e+06\n"), 1234567.8);
1931 wxPrintf (_T("%g should be 123.456\n"), 123.456);
1932 wxPrintf (_T("%g should be 1e+06\n"), 1000000.0);
1933 wxPrintf (_T("%g should be 10\n"), 10.0);
1934 wxPrintf (_T("%g should be 0.02\n"), 0.02);
1938 wxPrintf(_T("%.17f\n"),(1.0/x
/10.0+1.0)*x
-x
);
1944 wxSprintf(buf
,_T("%*s%*s%*s"),-1,_T("one"),-20,_T("two"),-30,_T("three"));
1946 result
|= wxStrcmp (buf
,
1947 _T("onetwo three "));
1949 wxPuts (result
!= 0 ? _T("Test failed!") : _T("Test ok."));
1956 wxSprintf(buf
, _T("%07") wxLongLongFmtSpec
_T("o"), wxLL(040000000000));
1958 // for some reason below line fails under Borland
1959 wxPrintf (_T("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf
);
1962 if (wxStrcmp (buf
, _T("40000000000")) != 0)
1965 wxPuts (_T("\tFAILED"));
1967 wxUnusedVar(result
);
1968 wxPuts (wxEmptyString
);
1970 #endif // wxLongLong_t
1972 wxPrintf (_T("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX
+ 2, UCHAR_MAX
+ 2);
1973 wxPrintf (_T("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX
+ 2, USHRT_MAX
+ 2);
1975 wxPuts (_T("--- Should be no further output. ---"));
1984 memset (bytes
, '\xff', sizeof bytes
);
1985 wxSprintf (buf
, _T("foo%hhn\n"), &bytes
[3]);
1986 if (bytes
[0] != '\xff' || bytes
[1] != '\xff' || bytes
[2] != '\xff'
1987 || bytes
[4] != '\xff' || bytes
[5] != '\xff' || bytes
[6] != '\xff')
1989 wxPuts (_T("%hhn overwrite more bytes"));
1994 wxPuts (_T("%hhn wrote incorrect value"));
2006 wxSprintf (buf
, _T("%5.s"), _T("xyz"));
2007 if (wxStrcmp (buf
, _T(" ")) != 0)
2008 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" "));
2009 wxSprintf (buf
, _T("%5.f"), 33.3);
2010 if (wxStrcmp (buf
, _T(" 33")) != 0)
2011 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 33"));
2012 wxSprintf (buf
, _T("%8.e"), 33.3e7
);
2013 if (wxStrcmp (buf
, _T(" 3e+08")) != 0)
2014 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3e+08"));
2015 wxSprintf (buf
, _T("%8.E"), 33.3e7
);
2016 if (wxStrcmp (buf
, _T(" 3E+08")) != 0)
2017 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3E+08"));
2018 wxSprintf (buf
, _T("%.g"), 33.3);
2019 if (wxStrcmp (buf
, _T("3e+01")) != 0)
2020 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3e+01"));
2021 wxSprintf (buf
, _T("%.G"), 33.3);
2022 if (wxStrcmp (buf
, _T("3E+01")) != 0)
2023 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3E+01"));
2031 wxString test_format
;
2034 wxSprintf (buf
, _T("%.*g"), prec
, 3.3);
2035 if (wxStrcmp (buf
, _T("3")) != 0)
2036 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2038 wxSprintf (buf
, _T("%.*G"), prec
, 3.3);
2039 if (wxStrcmp (buf
, _T("3")) != 0)
2040 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2042 wxSprintf (buf
, _T("%7.*G"), prec
, 3.33);
2043 if (wxStrcmp (buf
, _T(" 3")) != 0)
2044 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3"));
2046 test_format
= _T("%04.*o");
2047 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2048 if (wxStrcmp (buf
, _T(" 041")) != 0)
2049 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 041"));
2051 test_format
= _T("%09.*u");
2052 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2053 if (wxStrcmp (buf
, _T(" 0000033")) != 0)
2054 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 0000033"));
2056 test_format
= _T("%04.*x");
2057 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2058 if (wxStrcmp (buf
, _T(" 021")) != 0)
2059 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2061 test_format
= _T("%04.*X");
2062 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2063 if (wxStrcmp (buf
, _T(" 021")) != 0)
2064 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2067 #endif // TEST_PRINTF
2069 // ----------------------------------------------------------------------------
2070 // registry and related stuff
2071 // ----------------------------------------------------------------------------
2073 // this is for MSW only
2076 #undef TEST_REGISTRY
2081 #include "wx/confbase.h"
2082 #include "wx/msw/regconf.h"
2085 static void TestRegConfWrite()
2087 wxConfig
*config
= new wxConfig(_T("myapp"));
2088 config
->SetPath(_T("/group1"));
2089 config
->Write(_T("entry1"), _T("foo"));
2090 config
->SetPath(_T("/group2"));
2091 config
->Write(_T("entry1"), _T("bar"));
2095 static void TestRegConfRead()
2097 wxRegConfig
*config
= new wxRegConfig(_T("myapp"));
2101 config
->SetPath(_T("/"));
2102 wxPuts(_T("Enumerating / subgroups:"));
2103 bool bCont
= config
->GetFirstGroup(str
, dummy
);
2107 bCont
= config
->GetNextGroup(str
, dummy
);
2111 #endif // TEST_REGCONF
2113 #ifdef TEST_REGISTRY
2115 #include "wx/msw/registry.h"
2117 // I chose this one because I liked its name, but it probably only exists under
2119 static const wxChar
*TESTKEY
=
2120 _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
2122 static void TestRegistryRead()
2124 wxPuts(_T("*** testing registry reading ***"));
2126 wxRegKey
key(TESTKEY
);
2127 wxPrintf(_T("The test key name is '%s'.\n"), key
.GetName().c_str());
2130 wxPuts(_T("ERROR: test key can't be opened, aborting test."));
2135 size_t nSubKeys
, nValues
;
2136 if ( key
.GetKeyInfo(&nSubKeys
, NULL
, &nValues
, NULL
) )
2138 wxPrintf(_T("It has %u subkeys and %u values.\n"), nSubKeys
, nValues
);
2141 wxPrintf(_T("Enumerating values:\n"));
2145 bool cont
= key
.GetFirstValue(value
, dummy
);
2148 wxPrintf(_T("Value '%s': type "), value
.c_str());
2149 switch ( key
.GetValueType(value
) )
2151 case wxRegKey::Type_None
: wxPrintf(_T("ERROR (none)")); break;
2152 case wxRegKey::Type_String
: wxPrintf(_T("SZ")); break;
2153 case wxRegKey::Type_Expand_String
: wxPrintf(_T("EXPAND_SZ")); break;
2154 case wxRegKey::Type_Binary
: wxPrintf(_T("BINARY")); break;
2155 case wxRegKey::Type_Dword
: wxPrintf(_T("DWORD")); break;
2156 case wxRegKey::Type_Multi_String
: wxPrintf(_T("MULTI_SZ")); break;
2157 default: wxPrintf(_T("other (unknown)")); break;
2160 wxPrintf(_T(", value = "));
2161 if ( key
.IsNumericValue(value
) )
2164 key
.QueryValue(value
, &val
);
2165 wxPrintf(_T("%ld"), val
);
2170 key
.QueryValue(value
, val
);
2171 wxPrintf(_T("'%s'"), val
.c_str());
2173 key
.QueryRawValue(value
, val
);
2174 wxPrintf(_T(" (raw value '%s')"), val
.c_str());
2179 cont
= key
.GetNextValue(value
, dummy
);
2183 static void TestRegistryAssociation()
2186 The second call to deleteself genertaes an error message, with a
2187 messagebox saying .flo is crucial to system operation, while the .ddf
2188 call also fails, but with no error message
2193 key
.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
2195 key
= _T("ddxf_auto_file") ;
2196 key
.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
2198 key
= _T("ddxf_auto_file") ;
2199 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
2201 key
= _T("program,0") ;
2202 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
2204 key
= _T("program \"%1\"") ;
2206 key
.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
2208 key
.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
2210 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
2212 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
2216 #endif // TEST_REGISTRY
2218 // ----------------------------------------------------------------------------
2220 // ----------------------------------------------------------------------------
2222 #ifdef TEST_SCOPEGUARD
2224 #include "wx/scopeguard.h"
2226 static void function0() { puts("function0()"); }
2227 static void function1(int n
) { printf("function1(%d)\n", n
); }
2228 static void function2(double x
, char c
) { printf("function2(%g, %c)\n", x
, c
); }
2232 void method0() { printf("method0()\n"); }
2233 void method1(int n
) { printf("method1(%d)\n", n
); }
2234 void method2(double x
, char c
) { printf("method2(%g, %c)\n", x
, c
); }
2237 static void TestScopeGuard()
2239 wxON_BLOCK_EXIT0(function0
);
2240 wxON_BLOCK_EXIT1(function1
, 17);
2241 wxON_BLOCK_EXIT2(function2
, 3.14, 'p');
2244 wxON_BLOCK_EXIT_OBJ0(obj
, Object::method0
);
2245 wxON_BLOCK_EXIT_OBJ1(obj
, Object::method1
, 7);
2246 wxON_BLOCK_EXIT_OBJ2(obj
, Object::method2
, 2.71, 'e');
2248 wxScopeGuard dismissed
= wxMakeGuard(function0
);
2249 dismissed
.Dismiss();
2254 // ----------------------------------------------------------------------------
2256 // ----------------------------------------------------------------------------
2260 #include "wx/socket.h"
2261 #include "wx/protocol/protocol.h"
2262 #include "wx/protocol/http.h"
2264 static void TestSocketServer()
2266 wxPuts(_T("*** Testing wxSocketServer ***\n"));
2268 static const int PORT
= 3000;
2273 wxSocketServer
*server
= new wxSocketServer(addr
);
2274 if ( !server
->Ok() )
2276 wxPuts(_T("ERROR: failed to bind"));
2284 wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT
);
2286 wxSocketBase
*socket
= server
->Accept();
2289 wxPuts(_T("ERROR: wxSocketServer::Accept() failed."));
2293 wxPuts(_T("Server: got a client."));
2295 server
->SetTimeout(60); // 1 min
2298 while ( !close
&& socket
->IsConnected() )
2301 wxChar ch
= _T('\0');
2304 if ( socket
->Read(&ch
, sizeof(ch
)).Error() )
2306 // don't log error if the client just close the connection
2307 if ( socket
->IsConnected() )
2309 wxPuts(_T("ERROR: in wxSocket::Read."));
2329 wxPrintf(_T("Server: got '%s'.\n"), s
.c_str());
2330 if ( s
== _T("close") )
2332 wxPuts(_T("Closing connection"));
2336 else if ( s
== _T("quit") )
2341 wxPuts(_T("Shutting down the server"));
2343 else // not a special command
2345 socket
->Write(s
.MakeUpper().c_str(), s
.length());
2346 socket
->Write("\r\n", 2);
2347 wxPrintf(_T("Server: wrote '%s'.\n"), s
.c_str());
2353 wxPuts(_T("Server: lost a client unexpectedly."));
2359 // same as "delete server" but is consistent with GUI programs
2363 static void TestSocketClient()
2365 wxPuts(_T("*** Testing wxSocketClient ***\n"));
2367 static const wxChar
*hostname
= _T("www.wxwidgets.org");
2370 addr
.Hostname(hostname
);
2373 wxPrintf(_T("--- Attempting to connect to %s:80...\n"), hostname
);
2375 wxSocketClient client
;
2376 if ( !client
.Connect(addr
) )
2378 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
2382 wxPrintf(_T("--- Connected to %s:%u...\n"),
2383 addr
.Hostname().c_str(), addr
.Service());
2387 // could use simply "GET" here I suppose
2389 wxString::Format(_T("GET http://%s/\r\n"), hostname
);
2390 client
.Write(cmdGet
, cmdGet
.length());
2391 wxPrintf(_T("--- Sent command '%s' to the server\n"),
2392 MakePrintable(cmdGet
).c_str());
2393 client
.Read(buf
, WXSIZEOF(buf
));
2394 wxPrintf(_T("--- Server replied:\n%s"), buf
);
2398 #endif // TEST_SOCKETS
2400 // ----------------------------------------------------------------------------
2402 // ----------------------------------------------------------------------------
2406 #include "wx/protocol/ftp.h"
2410 #define FTP_ANONYMOUS
2412 #ifdef FTP_ANONYMOUS
2413 static const wxChar
*directory
= _T("/pub");
2414 static const wxChar
*filename
= _T("welcome.msg");
2416 static const wxChar
*directory
= _T("/etc");
2417 static const wxChar
*filename
= _T("issue");
2420 static bool TestFtpConnect()
2422 wxPuts(_T("*** Testing FTP connect ***"));
2424 #ifdef FTP_ANONYMOUS
2425 static const wxChar
*hostname
= _T("ftp.wxwidgets.org");
2427 wxPrintf(_T("--- Attempting to connect to %s:21 anonymously...\n"), hostname
);
2428 #else // !FTP_ANONYMOUS
2429 static const wxChar
*hostname
= "localhost";
2432 wxFgets(user
, WXSIZEOF(user
), stdin
);
2433 user
[wxStrlen(user
) - 1] = '\0'; // chop off '\n'
2436 wxChar password
[256];
2437 wxPrintf(_T("Password for %s: "), password
);
2438 wxFgets(password
, WXSIZEOF(password
), stdin
);
2439 password
[wxStrlen(password
) - 1] = '\0'; // chop off '\n'
2440 ftp
.SetPassword(password
);
2442 wxPrintf(_T("--- Attempting to connect to %s:21 as %s...\n"), hostname
, user
);
2443 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
2445 if ( !ftp
.Connect(hostname
) )
2447 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
2453 wxPrintf(_T("--- Connected to %s, current directory is '%s'\n"),
2454 hostname
, ftp
.Pwd().c_str());
2461 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
2462 static void TestFtpWuFtpd()
2465 static const wxChar
*hostname
= _T("ftp.eudora.com");
2466 if ( !ftp
.Connect(hostname
) )
2468 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
2472 static const wxChar
*filename
= _T("eudora/pubs/draft-gellens-submit-09.txt");
2473 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2476 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
2480 size_t size
= in
->GetSize();
2481 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
2483 wxChar
*data
= new wxChar
[size
];
2484 if ( !in
->Read(data
, size
) )
2486 wxPuts(_T("ERROR: read error"));
2490 wxPrintf(_T("Successfully retrieved the file.\n"));
2499 static void TestFtpList()
2501 wxPuts(_T("*** Testing wxFTP file listing ***\n"));
2504 if ( !ftp
.ChDir(directory
) )
2506 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
2509 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
2511 // test NLIST and LIST
2512 wxArrayString files
;
2513 if ( !ftp
.GetFilesList(files
) )
2515 wxPuts(_T("ERROR: failed to get NLIST of files"));
2519 wxPrintf(_T("Brief list of files under '%s':\n"), ftp
.Pwd().c_str());
2520 size_t count
= files
.GetCount();
2521 for ( size_t n
= 0; n
< count
; n
++ )
2523 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
2525 wxPuts(_T("End of the file list"));
2528 if ( !ftp
.GetDirList(files
) )
2530 wxPuts(_T("ERROR: failed to get LIST of files"));
2534 wxPrintf(_T("Detailed list of files under '%s':\n"), ftp
.Pwd().c_str());
2535 size_t count
= files
.GetCount();
2536 for ( size_t n
= 0; n
< count
; n
++ )
2538 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
2540 wxPuts(_T("End of the file list"));
2543 if ( !ftp
.ChDir(_T("..")) )
2545 wxPuts(_T("ERROR: failed to cd to .."));
2548 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
2551 static void TestFtpDownload()
2553 wxPuts(_T("*** Testing wxFTP download ***\n"));
2556 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2559 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
2563 size_t size
= in
->GetSize();
2564 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
2567 wxChar
*data
= new wxChar
[size
];
2568 if ( !in
->Read(data
, size
) )
2570 wxPuts(_T("ERROR: read error"));
2574 wxPrintf(_T("\nContents of %s:\n%s\n"), filename
, data
);
2582 static void TestFtpFileSize()
2584 wxPuts(_T("*** Testing FTP SIZE command ***"));
2586 if ( !ftp
.ChDir(directory
) )
2588 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
2591 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
2593 if ( ftp
.FileExists(filename
) )
2595 int size
= ftp
.GetFileSize(filename
);
2597 wxPrintf(_T("ERROR: couldn't get size of '%s'\n"), filename
);
2599 wxPrintf(_T("Size of '%s' is %d bytes.\n"), filename
, size
);
2603 wxPrintf(_T("ERROR: '%s' doesn't exist\n"), filename
);
2607 static void TestFtpMisc()
2609 wxPuts(_T("*** Testing miscellaneous wxFTP functions ***"));
2611 if ( ftp
.SendCommand(_T("STAT")) != '2' )
2613 wxPuts(_T("ERROR: STAT failed"));
2617 wxPrintf(_T("STAT returned:\n\n%s\n"), ftp
.GetLastResult().c_str());
2620 if ( ftp
.SendCommand(_T("HELP SITE")) != '2' )
2622 wxPuts(_T("ERROR: HELP SITE failed"));
2626 wxPrintf(_T("The list of site-specific commands:\n\n%s\n"),
2627 ftp
.GetLastResult().c_str());
2631 static void TestFtpInteractive()
2633 wxPuts(_T("\n*** Interactive wxFTP test ***"));
2639 wxPrintf(_T("Enter FTP command: "));
2640 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
2643 // kill the last '\n'
2644 buf
[wxStrlen(buf
) - 1] = 0;
2646 // special handling of LIST and NLST as they require data connection
2647 wxString
start(buf
, 4);
2649 if ( start
== _T("LIST") || start
== _T("NLST") )
2652 if ( wxStrlen(buf
) > 4 )
2655 wxArrayString files
;
2656 if ( !ftp
.GetList(files
, wildcard
, start
== _T("LIST")) )
2658 wxPrintf(_T("ERROR: failed to get %s of files\n"), start
.c_str());
2662 wxPrintf(_T("--- %s of '%s' under '%s':\n"),
2663 start
.c_str(), wildcard
.c_str(), ftp
.Pwd().c_str());
2664 size_t count
= files
.GetCount();
2665 for ( size_t n
= 0; n
< count
; n
++ )
2667 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
2669 wxPuts(_T("--- End of the file list"));
2674 wxChar ch
= ftp
.SendCommand(buf
);
2675 wxPrintf(_T("Command %s"), ch
? _T("succeeded") : _T("failed"));
2678 wxPrintf(_T(" (return code %c)"), ch
);
2681 wxPrintf(_T(", server reply:\n%s\n\n"), ftp
.GetLastResult().c_str());
2685 wxPuts(_T("\n*** done ***"));
2688 static void TestFtpUpload()
2690 wxPuts(_T("*** Testing wxFTP uploading ***\n"));
2693 static const wxChar
*file1
= _T("test1");
2694 static const wxChar
*file2
= _T("test2");
2695 wxOutputStream
*out
= ftp
.GetOutputStream(file1
);
2698 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
2699 out
->Write("First hello", 11);
2703 // send a command to check the remote file
2704 if ( ftp
.SendCommand(wxString(_T("STAT ")) + file1
) != '2' )
2706 wxPrintf(_T("ERROR: STAT %s failed\n"), file1
);
2710 wxPrintf(_T("STAT %s returned:\n\n%s\n"),
2711 file1
, ftp
.GetLastResult().c_str());
2714 out
= ftp
.GetOutputStream(file2
);
2717 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
2718 out
->Write("Second hello", 12);
2725 // ----------------------------------------------------------------------------
2727 // ----------------------------------------------------------------------------
2729 #ifdef TEST_STACKWALKER
2731 #if wxUSE_STACKWALKER
2733 #include "wx/stackwalk.h"
2735 class StackDump
: public wxStackWalker
2738 StackDump(const char *argv0
)
2739 : wxStackWalker(argv0
)
2743 virtual void Walk(size_t skip
= 1)
2745 wxPuts(_T("Stack dump:"));
2747 wxStackWalker::Walk(skip
);
2751 virtual void OnStackFrame(const wxStackFrame
& frame
)
2753 printf("[%2d] ", (int) frame
.GetLevel());
2755 wxString name
= frame
.GetName();
2756 if ( !name
.empty() )
2758 printf("%-20.40s", (const char*)name
.mb_str());
2762 printf("0x%08lx", (unsigned long)frame
.GetAddress());
2765 if ( frame
.HasSourceLocation() )
2768 (const char*)frame
.GetFileName().mb_str(),
2769 (int)frame
.GetLine());
2775 for ( size_t n
= 0; frame
.GetParam(n
, &type
, &name
, &val
); n
++ )
2777 printf("\t%s %s = %s\n", (const char*)type
.mb_str(),
2778 (const char*)name
.mb_str(),
2779 (const char*)val
.mb_str());
2784 static void TestStackWalk(const char *argv0
)
2786 wxPuts(_T("*** Testing wxStackWalker ***\n"));
2788 StackDump
dump(argv0
);
2792 #endif // wxUSE_STACKWALKER
2794 #endif // TEST_STACKWALKER
2796 // ----------------------------------------------------------------------------
2798 // ----------------------------------------------------------------------------
2800 #ifdef TEST_STDPATHS
2802 #include "wx/stdpaths.h"
2803 #include "wx/wxchar.h" // wxPrintf
2805 static void TestStandardPaths()
2807 wxPuts(_T("*** Testing wxStandardPaths ***\n"));
2809 wxTheApp
->SetAppName(_T("console"));
2811 wxStandardPathsBase
& stdp
= wxStandardPaths::Get();
2812 wxPrintf(_T("Config dir (sys):\t%s\n"), stdp
.GetConfigDir().c_str());
2813 wxPrintf(_T("Config dir (user):\t%s\n"), stdp
.GetUserConfigDir().c_str());
2814 wxPrintf(_T("Data dir (sys):\t\t%s\n"), stdp
.GetDataDir().c_str());
2815 wxPrintf(_T("Data dir (sys local):\t%s\n"), stdp
.GetLocalDataDir().c_str());
2816 wxPrintf(_T("Data dir (user):\t%s\n"), stdp
.GetUserDataDir().c_str());
2817 wxPrintf(_T("Data dir (user local):\t%s\n"), stdp
.GetUserLocalDataDir().c_str());
2818 wxPrintf(_T("Documents dir:\t\t%s\n"), stdp
.GetDocumentsDir().c_str());
2819 wxPrintf(_T("Executable path:\t%s\n"), stdp
.GetExecutablePath().c_str());
2820 wxPrintf(_T("Plugins dir:\t\t%s\n"), stdp
.GetPluginsDir().c_str());
2821 wxPrintf(_T("Resources dir:\t\t%s\n"), stdp
.GetResourcesDir().c_str());
2822 wxPrintf(_T("Localized res. dir:\t%s\n"),
2823 stdp
.GetLocalizedResourcesDir(_T("fr")).c_str());
2824 wxPrintf(_T("Message catalogs dir:\t%s\n"),
2825 stdp
.GetLocalizedResourcesDir
2828 wxStandardPaths::ResourceCat_Messages
2832 #endif // TEST_STDPATHS
2834 // ----------------------------------------------------------------------------
2836 // ----------------------------------------------------------------------------
2840 #include "wx/wfstream.h"
2841 #include "wx/mstream.h"
2843 static void TestFileStream()
2845 wxPuts(_T("*** Testing wxFileInputStream ***"));
2847 static const wxString filename
= _T("testdata.fs");
2849 wxFileOutputStream
fsOut(filename
);
2850 fsOut
.Write("foo", 3);
2854 wxFileInputStream
fsIn(filename
);
2855 wxPrintf(_T("File stream size: %u\n"), fsIn
.GetSize());
2856 while ( !fsIn
.Eof() )
2858 wxPutchar(fsIn
.GetC());
2862 if ( !wxRemoveFile(filename
) )
2864 wxPrintf(_T("ERROR: failed to remove the file '%s'.\n"), filename
.c_str());
2867 wxPuts(_T("\n*** wxFileInputStream test done ***"));
2870 static void TestMemoryStream()
2872 wxPuts(_T("*** Testing wxMemoryOutputStream ***"));
2874 wxMemoryOutputStream memOutStream
;
2875 wxPrintf(_T("Initially out stream offset: %lu\n"),
2876 (unsigned long)memOutStream
.TellO());
2878 for ( const wxChar
*p
= _T("Hello, stream!"); *p
; p
++ )
2880 memOutStream
.PutC(*p
);
2883 wxPrintf(_T("Final out stream offset: %lu\n"),
2884 (unsigned long)memOutStream
.TellO());
2886 wxPuts(_T("*** Testing wxMemoryInputStream ***"));
2889 size_t len
= memOutStream
.CopyTo(buf
, WXSIZEOF(buf
));
2891 wxMemoryInputStream
memInpStream(buf
, len
);
2892 wxPrintf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
2893 while ( !memInpStream
.Eof() )
2895 wxPutchar(memInpStream
.GetC());
2898 wxPuts(_T("\n*** wxMemoryInputStream test done ***"));
2901 #endif // TEST_STREAMS
2903 // ----------------------------------------------------------------------------
2905 // ----------------------------------------------------------------------------
2909 #include "wx/stopwatch.h"
2910 #include "wx/utils.h"
2912 static void TestStopWatch()
2914 wxPuts(_T("*** Testing wxStopWatch ***\n"));
2918 wxPrintf(_T("Initially paused, after 2 seconds time is..."));
2921 wxPrintf(_T("\t%ldms\n"), sw
.Time());
2923 wxPrintf(_T("Resuming stopwatch and sleeping 3 seconds..."));
2927 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2930 wxPrintf(_T("Pausing agan and sleeping 2 more seconds..."));
2933 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2936 wxPrintf(_T("Finally resuming and sleeping 2 more seconds..."));
2939 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2942 wxPuts(_T("\nChecking for 'backwards clock' bug..."));
2943 for ( size_t n
= 0; n
< 70; n
++ )
2947 for ( size_t m
= 0; m
< 100000; m
++ )
2949 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
2951 wxPuts(_T("\ntime is negative - ERROR!"));
2959 wxPuts(_T(", ok."));
2962 #include "wx/timer.h"
2963 #include "wx/evtloop.h"
2967 wxPuts(_T("*** Testing wxTimer ***\n"));
2969 class MyTimer
: public wxTimer
2972 MyTimer() : wxTimer() { m_num
= 0; }
2974 virtual void Notify()
2976 wxPrintf(_T("%d"), m_num
++);
2981 wxPrintf(_T("... exiting the event loop"));
2984 wxEventLoop::GetActive()->Exit(0);
2985 wxPuts(_T(", ok."));
2998 timer1
.Start(100, true /* one shot */);
3000 timer1
.Start(100, true /* one shot */);
3008 #endif // TEST_TIMER
3010 // ----------------------------------------------------------------------------
3012 // ----------------------------------------------------------------------------
3016 #include "wx/vcard.h"
3018 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
3021 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
3024 wxPrintf(_T("%s%s"),
3025 wxString(_T('\t'), level
).c_str(),
3026 vcObj
->GetName().c_str());
3029 switch ( vcObj
->GetType() )
3031 case wxVCardObject::String
:
3032 case wxVCardObject::UString
:
3035 vcObj
->GetValue(&val
);
3036 value
<< _T('"') << val
<< _T('"');
3040 case wxVCardObject::Int
:
3043 vcObj
->GetValue(&i
);
3044 value
.Printf(_T("%u"), i
);
3048 case wxVCardObject::Long
:
3051 vcObj
->GetValue(&l
);
3052 value
.Printf(_T("%lu"), l
);
3056 case wxVCardObject::None
:
3059 case wxVCardObject::Object
:
3060 value
= _T("<node>");
3064 value
= _T("<unknown value type>");
3068 wxPrintf(_T(" = %s"), value
.c_str());
3071 DumpVObject(level
+ 1, *vcObj
);
3074 vcObj
= vcard
.GetNextProp(&cookie
);
3078 static void DumpVCardAddresses(const wxVCard
& vcard
)
3080 wxPuts(_T("\nShowing all addresses from vCard:\n"));
3084 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3088 int flags
= addr
->GetFlags();
3089 if ( flags
& wxVCardAddress::Domestic
)
3091 flagsStr
<< _T("domestic ");
3093 if ( flags
& wxVCardAddress::Intl
)
3095 flagsStr
<< _T("international ");
3097 if ( flags
& wxVCardAddress::Postal
)
3099 flagsStr
<< _T("postal ");
3101 if ( flags
& wxVCardAddress::Parcel
)
3103 flagsStr
<< _T("parcel ");
3105 if ( flags
& wxVCardAddress::Home
)
3107 flagsStr
<< _T("home ");
3109 if ( flags
& wxVCardAddress::Work
)
3111 flagsStr
<< _T("work ");
3114 wxPrintf(_T("Address %u:\n")
3116 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3119 addr
->GetPostOffice().c_str(),
3120 addr
->GetExtAddress().c_str(),
3121 addr
->GetStreet().c_str(),
3122 addr
->GetLocality().c_str(),
3123 addr
->GetRegion().c_str(),
3124 addr
->GetPostalCode().c_str(),
3125 addr
->GetCountry().c_str()
3129 addr
= vcard
.GetNextAddress(&cookie
);
3133 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
3135 wxPuts(_T("\nShowing all phone numbers from vCard:\n"));
3139 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
3143 int flags
= phone
->GetFlags();
3144 if ( flags
& wxVCardPhoneNumber::Voice
)
3146 flagsStr
<< _T("voice ");
3148 if ( flags
& wxVCardPhoneNumber::Fax
)
3150 flagsStr
<< _T("fax ");
3152 if ( flags
& wxVCardPhoneNumber::Cellular
)
3154 flagsStr
<< _T("cellular ");
3156 if ( flags
& wxVCardPhoneNumber::Modem
)
3158 flagsStr
<< _T("modem ");
3160 if ( flags
& wxVCardPhoneNumber::Home
)
3162 flagsStr
<< _T("home ");
3164 if ( flags
& wxVCardPhoneNumber::Work
)
3166 flagsStr
<< _T("work ");
3169 wxPrintf(_T("Phone number %u:\n")
3174 phone
->GetNumber().c_str()
3178 phone
= vcard
.GetNextPhoneNumber(&cookie
);
3182 static void TestVCardRead()
3184 wxPuts(_T("*** Testing wxVCard reading ***\n"));
3186 wxVCard
vcard(_T("vcard.vcf"));
3187 if ( !vcard
.IsOk() )
3189 wxPuts(_T("ERROR: couldn't load vCard."));
3193 // read individual vCard properties
3194 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
3198 vcObj
->GetValue(&value
);
3203 value
= _T("<none>");
3206 wxPrintf(_T("Full name retrieved directly: %s\n"), value
.c_str());
3209 if ( !vcard
.GetFullName(&value
) )
3211 value
= _T("<none>");
3214 wxPrintf(_T("Full name from wxVCard API: %s\n"), value
.c_str());
3216 // now show how to deal with multiply occurring properties
3217 DumpVCardAddresses(vcard
);
3218 DumpVCardPhoneNumbers(vcard
);
3220 // and finally show all
3221 wxPuts(_T("\nNow dumping the entire vCard:\n")
3222 "-----------------------------\n");
3224 DumpVObject(0, vcard
);
3228 static void TestVCardWrite()
3230 wxPuts(_T("*** Testing wxVCard writing ***\n"));
3233 if ( !vcard
.IsOk() )
3235 wxPuts(_T("ERROR: couldn't create vCard."));
3240 vcard
.SetName("Zeitlin", "Vadim");
3241 vcard
.SetFullName("Vadim Zeitlin");
3242 vcard
.SetOrganization("wxWidgets", "R&D");
3244 // just dump the vCard back
3245 wxPuts(_T("Entire vCard follows:\n"));
3246 wxPuts(vcard
.Write());
3250 #endif // TEST_VCARD
3252 // ----------------------------------------------------------------------------
3254 // ----------------------------------------------------------------------------
3256 #if !defined(__WIN32__) || !wxUSE_FSVOLUME
3262 #include "wx/volume.h"
3264 static const wxChar
*volumeKinds
[] =
3270 _T("network volume"),
3274 static void TestFSVolume()
3276 wxPuts(_T("*** Testing wxFSVolume class ***"));
3278 wxArrayString volumes
= wxFSVolume::GetVolumes();
3279 size_t count
= volumes
.GetCount();
3283 wxPuts(_T("ERROR: no mounted volumes?"));
3287 wxPrintf(_T("%u mounted volumes found:\n"), count
);
3289 for ( size_t n
= 0; n
< count
; n
++ )
3291 wxFSVolume
vol(volumes
[n
]);
3294 wxPuts(_T("ERROR: couldn't create volume"));
3298 wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
3300 vol
.GetDisplayName().c_str(),
3301 vol
.GetName().c_str(),
3302 volumeKinds
[vol
.GetKind()],
3303 vol
.IsWritable() ? _T("rw") : _T("ro"),
3304 vol
.GetFlags() & wxFS_VOL_REMOVABLE
? _T("removable")
3309 #endif // TEST_VOLUME
3311 // ----------------------------------------------------------------------------
3312 // wide char and Unicode support
3313 // ----------------------------------------------------------------------------
3317 #include "wx/strconv.h"
3318 #include "wx/fontenc.h"
3319 #include "wx/encconv.h"
3320 #include "wx/buffer.h"
3322 static const unsigned char utf8koi8r
[] =
3324 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
3325 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
3326 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
3327 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
3328 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
3329 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
3330 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
3333 static const unsigned char utf8iso8859_1
[] =
3335 0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e,
3336 0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65,
3337 0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65,
3338 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65,
3339 0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0
3342 static const unsigned char utf8Invalid
[] =
3344 0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30,
3345 0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6,
3346 0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88,
3347 0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70,
3351 static const struct Utf8Data
3353 const unsigned char *text
;
3355 const wxChar
*charset
;
3356 wxFontEncoding encoding
;
3359 { utf8Invalid
, WXSIZEOF(utf8Invalid
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3360 { utf8koi8r
, WXSIZEOF(utf8koi8r
), _T("koi8-r"), wxFONTENCODING_KOI8
},
3361 { utf8iso8859_1
, WXSIZEOF(utf8iso8859_1
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3364 static void TestUtf8()
3366 wxPuts(_T("*** Testing UTF8 support ***\n"));
3371 for ( size_t n
= 0; n
< WXSIZEOF(utf8data
); n
++ )
3373 const Utf8Data
& u8d
= utf8data
[n
];
3374 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)u8d
.text
,
3375 WXSIZEOF(wbuf
)) == (size_t)-1 )
3377 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3381 wxCSConv
conv(u8d
.charset
);
3382 if ( conv
.WC2MB(buf
, wbuf
, WXSIZEOF(buf
)) == (size_t)-1 )
3384 wxPrintf(_T("ERROR: conversion to %s failed.\n"), u8d
.charset
);
3388 wxPrintf(_T("String in %s: %s\n"), u8d
.charset
, buf
);
3392 wxString
s(wxConvUTF8
.cMB2WC((const char *)u8d
.text
));
3394 s
= _T("<< conversion failed >>");
3395 wxPrintf(_T("String in current cset: %s\n"), s
.c_str());
3399 wxPuts(wxEmptyString
);
3402 static void TestEncodingConverter()
3404 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
3406 // using wxEncodingConverter should give the same result as above
3409 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)utf8koi8r
,
3410 WXSIZEOF(utf8koi8r
)) == (size_t)-1 )
3412 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3416 wxEncodingConverter ec
;
3417 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
3418 ec
.Convert(wbuf
, buf
);
3419 wxPrintf(_T("The same KOI8-R string using wxEC: %s\n"), buf
);
3422 wxPuts(wxEmptyString
);
3425 #endif // TEST_WCHAR
3427 // ----------------------------------------------------------------------------
3429 // ----------------------------------------------------------------------------
3433 #include "wx/filesys.h"
3434 #include "wx/fs_zip.h"
3435 #include "wx/zipstrm.h"
3437 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
3439 static void TestZipStreamRead()
3441 wxPuts(_T("*** Testing ZIP reading ***\n"));
3443 static const wxString filename
= _T("foo");
3444 wxFFileInputStream
in(TESTFILE_ZIP
);
3445 wxZipInputStream
istr(in
);
3446 wxZipEntry
entry(filename
);
3447 istr
.OpenEntry(entry
);
3449 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
3451 wxPrintf(_T("Dumping the file '%s':\n"), filename
.c_str());
3452 while ( !istr
.Eof() )
3454 wxPutchar(istr
.GetC());
3458 wxPuts(_T("\n----- done ------"));
3461 static void DumpZipDirectory(wxFileSystem
& fs
,
3462 const wxString
& dir
,
3463 const wxString
& indent
)
3465 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
3466 TESTFILE_ZIP
, dir
.c_str());
3467 wxString wildcard
= prefix
+ _T("/*");
3469 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
3470 while ( !dirname
.empty() )
3472 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
3474 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3479 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
3481 DumpZipDirectory(fs
, dirname
,
3482 indent
+ wxString(_T(' '), 4));
3484 dirname
= fs
.FindNext();
3487 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
3488 while ( !filename
.empty() )
3490 if ( !filename
.StartsWith(prefix
, &filename
) )
3492 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3497 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
3499 filename
= fs
.FindNext();
3503 static void TestZipFileSystem()
3505 wxPuts(_T("*** Testing ZIP file system ***\n"));
3507 wxFileSystem::AddHandler(new wxZipFSHandler
);
3509 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
3511 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
3516 // ----------------------------------------------------------------------------
3518 // ----------------------------------------------------------------------------
3520 #ifdef TEST_DATETIME
3522 #include "wx/math.h"
3523 #include "wx/datetime.h"
3525 // this test miscellaneous static wxDateTime functions
3529 static void TestTimeStatic()
3531 wxPuts(_T("\n*** wxDateTime static methods test ***"));
3533 // some info about the current date
3534 int year
= wxDateTime::GetCurrentYear();
3535 wxPrintf(_T("Current year %d is %sa leap one and has %d days.\n"),
3537 wxDateTime::IsLeapYear(year
) ? "" : "not ",
3538 wxDateTime::GetNumberOfDays(year
));
3540 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
3541 wxPrintf(_T("Current month is '%s' ('%s') and it has %d days\n"),
3542 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
3543 wxDateTime::GetMonthName(month
).c_str(),
3544 wxDateTime::GetNumberOfDays(month
));
3547 // test time zones stuff
3548 static void TestTimeZones()
3550 wxPuts(_T("\n*** wxDateTime timezone test ***"));
3552 wxDateTime now
= wxDateTime::Now();
3554 wxPrintf(_T("Current GMT time:\t%s\n"), now
.Format(_T("%c"), wxDateTime::GMT0
).c_str());
3555 wxPrintf(_T("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::GMT0
).c_str());
3556 wxPrintf(_T("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::EST
).c_str());
3557 wxPrintf(_T("Current time in Paris:\t%s\n"), now
.Format(_T("%c"), wxDateTime::CET
).c_str());
3558 wxPrintf(_T(" Moscow:\t%s\n"), now
.Format(_T("%c"), wxDateTime::MSK
).c_str());
3559 wxPrintf(_T(" New York:\t%s\n"), now
.Format(_T("%c"), wxDateTime::EST
).c_str());
3561 wxPrintf(_T("%s\n"), wxDateTime::Now().Format(_T("Our timezone is %Z")).c_str());
3563 wxDateTime::Tm tm
= now
.GetTm();
3564 if ( wxDateTime(tm
) != now
)
3566 wxPrintf(_T("ERROR: got %s instead of %s\n"),
3567 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
3571 // test some minimal support for the dates outside the standard range
3572 static void TestTimeRange()
3574 wxPuts(_T("\n*** wxDateTime out-of-standard-range dates test ***"));
3576 static const wxChar
*fmt
= _T("%d-%b-%Y %H:%M:%S");
3578 wxPrintf(_T("Unix epoch:\t%s\n"),
3579 wxDateTime(2440587.5).Format(fmt
).c_str());
3580 wxPrintf(_T("Feb 29, 0: \t%s\n"),
3581 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
3582 wxPrintf(_T("JDN 0: \t%s\n"),
3583 wxDateTime(0.0).Format(fmt
).c_str());
3584 wxPrintf(_T("Jan 1, 1AD:\t%s\n"),
3585 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
3586 wxPrintf(_T("May 29, 2099:\t%s\n"),
3587 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
3590 // test DST calculations
3591 static void TestTimeDST()
3593 wxPuts(_T("\n*** wxDateTime DST test ***"));
3595 wxPrintf(_T("DST is%s in effect now.\n\n"),
3596 wxDateTime::Now().IsDST() ? wxEmptyString
: _T(" not"));
3598 for ( int year
= 1990; year
< 2005; year
++ )
3600 wxPrintf(_T("DST period in Europe for year %d: from %s to %s\n"),
3602 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
3603 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
3609 #if TEST_INTERACTIVE
3611 static void TestDateTimeInteractive()
3613 wxPuts(_T("\n*** interactive wxDateTime tests ***"));
3619 wxPrintf(_T("Enter a date: "));
3620 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
3623 // kill the last '\n'
3624 buf
[wxStrlen(buf
) - 1] = 0;
3627 const wxChar
*p
= dt
.ParseDate(buf
);
3630 wxPrintf(_T("ERROR: failed to parse the date '%s'.\n"), buf
);
3636 wxPrintf(_T("WARNING: parsed only first %u characters.\n"), p
- buf
);
3639 wxPrintf(_T("%s: day %u, week of month %u/%u, week of year %u\n"),
3640 dt
.Format(_T("%b %d, %Y")).c_str(),
3642 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
3643 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
3644 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
3647 wxPuts(_T("\n*** done ***"));
3650 #endif // TEST_INTERACTIVE
3654 static void TestTimeMS()
3656 wxPuts(_T("*** testing millisecond-resolution support in wxDateTime ***"));
3658 wxDateTime dt1
= wxDateTime::Now(),
3659 dt2
= wxDateTime::UNow();
3661 wxPrintf(_T("Now = %s\n"), dt1
.Format(_T("%H:%M:%S:%l")).c_str());
3662 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
3663 wxPrintf(_T("Dummy loop: "));
3664 for ( int i
= 0; i
< 6000; i
++ )
3666 //for ( int j = 0; j < 10; j++ )
3669 s
.Printf(_T("%g"), sqrt((float)i
));
3675 wxPuts(_T(", done"));
3678 dt2
= wxDateTime::UNow();
3679 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
3681 wxPrintf(_T("Loop executed in %s ms\n"), (dt2
- dt1
).Format(_T("%l")).c_str());
3683 wxPuts(_T("\n*** done ***"));
3686 static void TestTimeHolidays()
3688 wxPuts(_T("\n*** testing wxDateTimeHolidayAuthority ***\n"));
3690 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
3691 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
3692 dtEnd
= dtStart
.GetLastMonthDay();
3694 wxDateTimeArray hol
;
3695 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
3697 const wxChar
*format
= _T("%d-%b-%Y (%a)");
3699 wxPrintf(_T("All holidays between %s and %s:\n"),
3700 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
3702 size_t count
= hol
.GetCount();
3703 for ( size_t n
= 0; n
< count
; n
++ )
3705 wxPrintf(_T("\t%s\n"), hol
[n
].Format(format
).c_str());
3708 wxPuts(wxEmptyString
);
3711 static void TestTimeZoneBug()
3713 wxPuts(_T("\n*** testing for DST/timezone bug ***\n"));
3715 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
3716 for ( int i
= 0; i
< 31; i
++ )
3718 wxPrintf(_T("Date %s: week day %s.\n"),
3719 date
.Format(_T("%d-%m-%Y")).c_str(),
3720 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
3722 date
+= wxDateSpan::Day();
3725 wxPuts(wxEmptyString
);
3728 static void TestTimeSpanFormat()
3730 wxPuts(_T("\n*** wxTimeSpan tests ***"));
3732 static const wxChar
*formats
[] =
3734 _T("(default) %H:%M:%S"),
3735 _T("%E weeks and %D days"),
3736 _T("%l milliseconds"),
3737 _T("(with ms) %H:%M:%S:%l"),
3738 _T("100%% of minutes is %M"), // test "%%"
3739 _T("%D days and %H hours"),
3740 _T("or also %S seconds"),
3743 wxTimeSpan
ts1(1, 2, 3, 4),
3745 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
3747 wxPrintf(_T("ts1 = %s\tts2 = %s\n"),
3748 ts1
.Format(formats
[n
]).c_str(),
3749 ts2
.Format(formats
[n
]).c_str());
3752 wxPuts(wxEmptyString
);
3757 #endif // TEST_DATETIME
3759 // ----------------------------------------------------------------------------
3760 // wxTextInput/OutputStream
3761 // ----------------------------------------------------------------------------
3763 #ifdef TEST_TEXTSTREAM
3765 #include "wx/txtstrm.h"
3766 #include "wx/wfstream.h"
3768 static void TestTextInputStream()
3770 wxPuts(_T("\n*** wxTextInputStream test ***"));
3772 wxString filename
= _T("testdata.fc");
3773 wxFileInputStream
fsIn(filename
);
3776 wxPuts(_T("ERROR: couldn't open file."));
3780 wxTextInputStream
tis(fsIn
);
3785 const wxString s
= tis
.ReadLine();
3787 // line could be non empty if the last line of the file isn't
3788 // terminated with EOL
3789 if ( fsIn
.Eof() && s
.empty() )
3792 wxPrintf(_T("Line %d: %s\n"), line
++, s
.c_str());
3797 #endif // TEST_TEXTSTREAM
3799 // ----------------------------------------------------------------------------
3801 // ----------------------------------------------------------------------------
3805 #include "wx/thread.h"
3807 static size_t gs_counter
= (size_t)-1;
3808 static wxCriticalSection gs_critsect
;
3809 static wxSemaphore gs_cond
;
3811 class MyJoinableThread
: public wxThread
3814 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
3815 { m_n
= n
; Create(); }
3817 // thread execution starts here
3818 virtual ExitCode
Entry();
3824 wxThread::ExitCode
MyJoinableThread::Entry()
3826 unsigned long res
= 1;
3827 for ( size_t n
= 1; n
< m_n
; n
++ )
3831 // it's a loooong calculation :-)
3835 return (ExitCode
)res
;
3838 class MyDetachedThread
: public wxThread
3841 MyDetachedThread(size_t n
, wxChar ch
)
3845 m_cancelled
= false;
3850 // thread execution starts here
3851 virtual ExitCode
Entry();
3854 virtual void OnExit();
3857 size_t m_n
; // number of characters to write
3858 wxChar m_ch
; // character to write
3860 bool m_cancelled
; // false if we exit normally
3863 wxThread::ExitCode
MyDetachedThread::Entry()
3866 wxCriticalSectionLocker
lock(gs_critsect
);
3867 if ( gs_counter
== (size_t)-1 )
3873 for ( size_t n
= 0; n
< m_n
; n
++ )
3875 if ( TestDestroy() )
3885 wxThread::Sleep(100);
3891 void MyDetachedThread::OnExit()
3893 wxLogTrace(_T("thread"), _T("Thread %ld is in OnExit"), GetId());
3895 wxCriticalSectionLocker
lock(gs_critsect
);
3896 if ( !--gs_counter
&& !m_cancelled
)
3900 static void TestDetachedThreads()
3902 wxPuts(_T("\n*** Testing detached threads ***"));
3904 static const size_t nThreads
= 3;
3905 MyDetachedThread
*threads
[nThreads
];
3907 for ( n
= 0; n
< nThreads
; n
++ )
3909 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
3912 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
3913 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
3915 for ( n
= 0; n
< nThreads
; n
++ )
3920 // wait until all threads terminate
3923 wxPuts(wxEmptyString
);
3926 static void TestJoinableThreads()
3928 wxPuts(_T("\n*** Testing a joinable thread (a loooong calculation...) ***"));
3930 // calc 10! in the background
3931 MyJoinableThread
thread(10);
3934 wxPrintf(_T("\nThread terminated with exit code %lu.\n"),
3935 (unsigned long)thread
.Wait());
3938 static void TestThreadSuspend()
3940 wxPuts(_T("\n*** Testing thread suspend/resume functions ***"));
3942 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
3946 // this is for this demo only, in a real life program we'd use another
3947 // condition variable which would be signaled from wxThread::Entry() to
3948 // tell us that the thread really started running - but here just wait a
3949 // bit and hope that it will be enough (the problem is, of course, that
3950 // the thread might still not run when we call Pause() which will result
3952 wxThread::Sleep(300);
3954 for ( size_t n
= 0; n
< 3; n
++ )
3958 wxPuts(_T("\nThread suspended"));
3961 // don't sleep but resume immediately the first time
3962 wxThread::Sleep(300);
3964 wxPuts(_T("Going to resume the thread"));
3969 wxPuts(_T("Waiting until it terminates now"));
3971 // wait until the thread terminates
3974 wxPuts(wxEmptyString
);
3977 static void TestThreadDelete()
3979 // As above, using Sleep() is only for testing here - we must use some
3980 // synchronisation object instead to ensure that the thread is still
3981 // running when we delete it - deleting a detached thread which already
3982 // terminated will lead to a crash!
3984 wxPuts(_T("\n*** Testing thread delete function ***"));
3986 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
3990 wxPuts(_T("\nDeleted a thread which didn't start to run yet."));
3992 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
3996 wxThread::Sleep(300);
4000 wxPuts(_T("\nDeleted a running thread."));
4002 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
4006 wxThread::Sleep(300);
4012 wxPuts(_T("\nDeleted a sleeping thread."));
4014 MyJoinableThread
thread3(20);
4019 wxPuts(_T("\nDeleted a joinable thread."));
4021 MyJoinableThread
thread4(2);
4024 wxThread::Sleep(300);
4028 wxPuts(_T("\nDeleted a joinable thread which already terminated."));
4030 wxPuts(wxEmptyString
);
4033 class MyWaitingThread
: public wxThread
4036 MyWaitingThread( wxMutex
*mutex
, wxCondition
*condition
)
4039 m_condition
= condition
;
4044 virtual ExitCode
Entry()
4046 wxPrintf(_T("Thread %lu has started running.\n"), GetId());
4051 wxPrintf(_T("Thread %lu starts to wait...\n"), GetId());
4055 m_condition
->Wait();
4058 wxPrintf(_T("Thread %lu finished to wait, exiting.\n"), GetId());
4066 wxCondition
*m_condition
;
4069 static void TestThreadConditions()
4072 wxCondition
condition(mutex
);
4074 // otherwise its difficult to understand which log messages pertain to
4076 //wxLogTrace(_T("thread"), _T("Local condition var is %08x, gs_cond = %08x"),
4077 // condition.GetId(), gs_cond.GetId());
4079 // create and launch threads
4080 MyWaitingThread
*threads
[10];
4083 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
4085 threads
[n
] = new MyWaitingThread( &mutex
, &condition
);
4088 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
4093 // wait until all threads run
4094 wxPuts(_T("Main thread is waiting for the other threads to start"));
4097 size_t nRunning
= 0;
4098 while ( nRunning
< WXSIZEOF(threads
) )
4104 wxPrintf(_T("Main thread: %u already running\n"), nRunning
);
4108 wxPuts(_T("Main thread: all threads started up."));
4111 wxThread::Sleep(500);
4114 // now wake one of them up
4115 wxPrintf(_T("Main thread: about to signal the condition.\n"));
4120 wxThread::Sleep(200);
4122 // wake all the (remaining) threads up, so that they can exit
4123 wxPrintf(_T("Main thread: about to broadcast the condition.\n"));
4125 condition
.Broadcast();
4127 // give them time to terminate (dirty!)
4128 wxThread::Sleep(500);
4131 #include "wx/utils.h"
4133 class MyExecThread
: public wxThread
4136 MyExecThread(const wxString
& command
) : wxThread(wxTHREAD_JOINABLE
),
4142 virtual ExitCode
Entry()
4144 return (ExitCode
)wxExecute(m_command
, wxEXEC_SYNC
);
4151 static void TestThreadExec()
4153 wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
4155 MyExecThread
thread(_T("true"));
4158 wxPrintf(_T("Main program exit code: %ld.\n"),
4159 wxExecute(_T("false"), wxEXEC_SYNC
));
4161 wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread
.Wait());
4165 #include "wx/datetime.h"
4167 class MySemaphoreThread
: public wxThread
4170 MySemaphoreThread(int i
, wxSemaphore
*sem
)
4171 : wxThread(wxTHREAD_JOINABLE
),
4178 virtual ExitCode
Entry()
4180 wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
4181 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4185 wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
4186 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4190 wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
4191 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4203 WX_DEFINE_ARRAY_PTR(wxThread
*, ArrayThreads
);
4205 static void TestSemaphore()
4207 wxPuts(_T("*** Testing wxSemaphore class. ***"));
4209 static const int SEM_LIMIT
= 3;
4211 wxSemaphore
sem(SEM_LIMIT
, SEM_LIMIT
);
4212 ArrayThreads threads
;
4214 for ( int i
= 0; i
< 3*SEM_LIMIT
; i
++ )
4216 threads
.Add(new MySemaphoreThread(i
, &sem
));
4217 threads
.Last()->Run();
4220 for ( size_t n
= 0; n
< threads
.GetCount(); n
++ )
4227 #endif // TEST_THREADS
4229 // ----------------------------------------------------------------------------
4231 // ----------------------------------------------------------------------------
4233 #ifdef TEST_SNGLINST
4234 #include "wx/snglinst.h"
4235 #endif // TEST_SNGLINST
4237 int main(int argc
, char **argv
)
4240 wxChar
**wxArgv
= new wxChar
*[argc
+ 1];
4245 for (n
= 0; n
< argc
; n
++ )
4247 wxMB2WXbuf warg
= wxConvertMB2WX(argv
[n
]);
4248 wxArgv
[n
] = wxStrdup(warg
);
4253 #else // !wxUSE_UNICODE
4255 #endif // wxUSE_UNICODE/!wxUSE_UNICODE
4257 wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE
, "program");
4259 wxInitializer initializer
;
4262 fprintf(stderr
, "Failed to initialize the wxWidgets library, aborting.");
4267 #ifdef TEST_SNGLINST
4268 wxSingleInstanceChecker checker
;
4269 if ( checker
.Create(_T(".wxconsole.lock")) )
4271 if ( checker
.IsAnotherRunning() )
4273 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
4278 // wait some time to give time to launch another instance
4279 wxPrintf(_T("Press \"Enter\" to continue..."));
4282 else // failed to create
4284 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
4286 #endif // TEST_SNGLINST
4289 TestCmdLineConvert();
4291 #if wxUSE_CMDLINE_PARSER
4292 static const wxCmdLineEntryDesc cmdLineDesc
[] =
4294 { wxCMD_LINE_SWITCH
, "h", "help", "show this help message",
4295 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
4296 { wxCMD_LINE_SWITCH
, "v", "verbose", "be verbose" },
4297 { wxCMD_LINE_SWITCH
, "q", "quiet", "be quiet" },
4299 { wxCMD_LINE_OPTION
, "o", "output", "output file" },
4300 { wxCMD_LINE_OPTION
, "i", "input", "input dir" },
4301 { wxCMD_LINE_OPTION
, "s", "size", "output block size",
4302 wxCMD_LINE_VAL_NUMBER
},
4303 { wxCMD_LINE_OPTION
, "d", "date", "output file date",
4304 wxCMD_LINE_VAL_DATE
},
4305 { wxCMD_LINE_OPTION
, "f", "double", "output double",
4306 wxCMD_LINE_VAL_DOUBLE
},
4308 { wxCMD_LINE_PARAM
, NULL
, NULL
, "input file",
4309 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
4314 wxCmdLineParser
parser(cmdLineDesc
, argc
, wxArgv
);
4316 parser
.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
4317 wxCMD_LINE_VAL_STRING
,
4318 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
4320 switch ( parser
.Parse() )
4323 wxLogMessage(_T("Help was given, terminating."));
4327 ShowCmdLine(parser
);
4331 wxLogMessage(_T("Syntax error detected, aborting."));
4334 #endif // wxUSE_CMDLINE_PARSER
4336 #endif // TEST_CMDLINE
4348 TestDllListLoaded();
4349 #endif // TEST_DYNLIB
4353 #endif // TEST_ENVIRON
4357 #endif // TEST_EXECUTE
4359 #ifdef TEST_FILECONF
4361 #endif // TEST_FILECONF
4365 #endif // TEST_LOCALE
4368 wxPuts(_T("*** Testing wxLog ***"));
4371 for ( size_t n
= 0; n
< 8000; n
++ )
4373 s
<< (wxChar
)(_T('A') + (n
% 26));
4376 wxLogWarning(_T("The length of the string is %lu"),
4377 (unsigned long)s
.length());
4380 msg
.Printf(_T("A very very long message: '%s', the end!\n"), s
.c_str());
4382 // this one shouldn't be truncated
4385 // but this one will because log functions use fixed size buffer
4386 // (note that it doesn't need '\n' at the end neither - will be added
4388 wxLogMessage(_T("A very very long message 2: '%s', the end!"), s
.c_str());
4398 #ifdef TEST_FILENAME
4401 TestFileNameDirManip();
4402 TestFileNameComparison();
4403 TestFileNameOperations();
4404 #endif // TEST_FILENAME
4406 #ifdef TEST_FILETIME
4411 #endif // TEST_FILETIME
4414 wxLog::AddTraceMask(FTP_TRACE_MASK
);
4415 if ( TestFtpConnect() )
4425 #if TEST_INTERACTIVE
4426 TestFtpInteractive();
4429 //else: connecting to the FTP server failed
4437 //wxLog::AddTraceMask(_T("mime"));
4441 TestMimeAssociate();
4446 #ifdef TEST_INFO_FUNCTIONS
4451 #if TEST_INTERACTIVE
4454 #endif // TEST_INFO_FUNCTIONS
4456 #ifdef TEST_PATHLIST
4458 #endif // TEST_PATHLIST
4462 #endif // TEST_PRINTF
4469 #endif // TEST_REGCONF
4471 #if defined TEST_REGEX && TEST_INTERACTIVE
4472 TestRegExInteractive();
4473 #endif // defined TEST_REGEX && TEST_INTERACTIVE
4475 #ifdef TEST_REGISTRY
4477 TestRegistryAssociation();
4478 #endif // TEST_REGISTRY
4483 #endif // TEST_SOCKETS
4490 #endif // TEST_STREAMS
4492 #ifdef TEST_TEXTSTREAM
4493 TestTextInputStream();
4494 #endif // TEST_TEXTSTREAM
4497 int nCPUs
= wxThread::GetCPUCount();
4498 wxPrintf(_T("This system has %d CPUs\n"), nCPUs
);
4500 wxThread::SetConcurrency(nCPUs
);
4502 TestJoinableThreads();
4505 TestJoinableThreads();
4506 TestDetachedThreads();
4507 TestThreadSuspend();
4509 TestThreadConditions();
4513 #endif // TEST_THREADS
4518 #endif // TEST_TIMER
4520 #ifdef TEST_DATETIME
4527 TestTimeSpanFormat();
4533 #if TEST_INTERACTIVE
4534 TestDateTimeInteractive();
4536 #endif // TEST_DATETIME
4538 #ifdef TEST_SCOPEGUARD
4542 #ifdef TEST_STACKWALKER
4543 #if wxUSE_STACKWALKER
4544 TestStackWalk(argv
[0]);
4546 #endif // TEST_STACKWALKER
4548 #ifdef TEST_STDPATHS
4549 TestStandardPaths();
4553 wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
4555 #endif // TEST_USLEEP
4560 #endif // TEST_VCARD
4564 #endif // TEST_VOLUME
4568 TestEncodingConverter();
4569 #endif // TEST_WCHAR
4572 TestZipStreamRead();
4573 TestZipFileSystem();
4578 for ( int n
= 0; n
< argc
; n
++ )
4583 #endif // wxUSE_UNICODE