1 /////////////////////////////////////////////////////////////////////////////
2 // Name: samples/console/console.cpp
3 // Purpose: A sample console (as opposed to GUI) program using wxWidgets
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
24 #include "wx/string.h"
28 #include "wx/apptrait.h"
29 #include "wx/platinfo.h"
31 // without this pragma, the stupid compiler precompiles #defines below so that
32 // changing them doesn't "take place" later!
37 // ----------------------------------------------------------------------------
38 // conditional compilation
39 // ----------------------------------------------------------------------------
42 A note about all these conditional compilation macros: this file is used
43 both as a test suite for various non-GUI wxWidgets classes and as a
44 scratchpad for quick tests. So there are two compilation modes: if you
45 define TEST_ALL all tests are run, otherwise you may enable the individual
46 tests individually in the "#else" branch below.
49 // what to test (in alphabetic order)? Define TEST_ALL to 0 to do a single
50 // test, define it to 1 to do all tests.
65 // #define TEST_FTP --FIXME! (RN)
66 #define TEST_INFO_FUNCTIONS
77 #define TEST_SCOPEGUARD
79 // #define TEST_SOCKETS --FIXME! (RN)
80 #define TEST_STACKWALKER
83 #define TEST_TEXTSTREAM
86 // #define TEST_VCARD -- don't enable this (VZ)
87 // #define TEST_VOLUME --FIXME! (RN)
94 // some tests are interactive, define this to run them
95 #ifdef TEST_INTERACTIVE
96 #undef TEST_INTERACTIVE
98 #define TEST_INTERACTIVE 1
100 #define TEST_INTERACTIVE 0
103 // ============================================================================
105 // ============================================================================
107 // ----------------------------------------------------------------------------
109 // ----------------------------------------------------------------------------
111 #if defined(TEST_SOCKETS)
113 // replace TABs with \t and CRs with \n
114 static wxString
MakePrintable(const wxChar
*s
)
117 (void)str
.Replace(_T("\t"), _T("\\t"));
118 (void)str
.Replace(_T("\n"), _T("\\n"));
119 (void)str
.Replace(_T("\r"), _T("\\r"));
124 #endif // MakePrintable() is used
126 // ----------------------------------------------------------------------------
128 // ----------------------------------------------------------------------------
132 #include "wx/cmdline.h"
133 #include "wx/datetime.h"
135 #if wxUSE_CMDLINE_PARSER
137 static void ShowCmdLine(const wxCmdLineParser
& parser
)
139 wxString s
= _T("Command line parsed successfully:\nInput files: ");
141 size_t count
= parser
.GetParamCount();
142 for ( size_t param
= 0; param
< count
; param
++ )
144 s
<< parser
.GetParam(param
) << ' ';
148 << _T("Verbose:\t") << (parser
.Found(_T("v")) ? _T("yes") : _T("no")) << '\n'
149 << _T("Quiet:\t") << (parser
.Found(_T("q")) ? _T("yes") : _T("no")) << '\n';
154 if ( parser
.Found(_T("o"), &strVal
) )
155 s
<< _T("Output file:\t") << strVal
<< '\n';
156 if ( parser
.Found(_T("i"), &strVal
) )
157 s
<< _T("Input dir:\t") << strVal
<< '\n';
158 if ( parser
.Found(_T("s"), &lVal
) )
159 s
<< _T("Size:\t") << lVal
<< '\n';
160 if ( parser
.Found(_T("d"), &dt
) )
161 s
<< _T("Date:\t") << dt
.FormatISODate() << '\n';
162 if ( parser
.Found(_T("project_name"), &strVal
) )
163 s
<< _T("Project:\t") << strVal
<< '\n';
168 #endif // wxUSE_CMDLINE_PARSER
170 static void TestCmdLineConvert()
172 static const wxChar
*cmdlines
[] =
175 _T("-a \"-bstring 1\" -c\"string 2\" \"string 3\""),
176 _T("literal \\\" and \"\""),
179 for ( size_t n
= 0; n
< WXSIZEOF(cmdlines
); n
++ )
181 const wxChar
*cmdline
= cmdlines
[n
];
182 wxPrintf(_T("Parsing: %s\n"), cmdline
);
183 wxArrayString args
= wxCmdLineParser::ConvertStringToArgs(cmdline
);
185 size_t count
= args
.GetCount();
186 wxPrintf(_T("\targc = %u\n"), count
);
187 for ( size_t arg
= 0; arg
< count
; arg
++ )
189 wxPrintf(_T("\targv[%u] = %s\n"), arg
, args
[arg
].c_str());
194 #endif // TEST_CMDLINE
196 // ----------------------------------------------------------------------------
198 // ----------------------------------------------------------------------------
205 static const wxChar
*ROOTDIR
= _T("/");
206 static const wxChar
*TESTDIR
= _T("/usr/local/share");
207 #elif defined(__WXMSW__) || defined(__DOS__) || defined(__OS2__)
208 static const wxChar
*ROOTDIR
= _T("c:\\");
209 static const wxChar
*TESTDIR
= _T("d:\\");
211 #error "don't know where the root directory is"
214 static void TestDirEnumHelper(wxDir
& dir
,
215 int flags
= wxDIR_DEFAULT
,
216 const wxString
& filespec
= wxEmptyString
)
220 if ( !dir
.IsOpened() )
223 bool cont
= dir
.GetFirst(&filename
, filespec
, flags
);
226 wxPrintf(_T("\t%s\n"), filename
.c_str());
228 cont
= dir
.GetNext(&filename
);
231 wxPuts(wxEmptyString
);
236 static void TestDirEnum()
238 wxPuts(_T("*** Testing wxDir::GetFirst/GetNext ***"));
240 wxString cwd
= wxGetCwd();
241 if ( !wxDir::Exists(cwd
) )
243 wxPrintf(_T("ERROR: current directory '%s' doesn't exist?\n"), cwd
.c_str());
248 if ( !dir
.IsOpened() )
250 wxPrintf(_T("ERROR: failed to open current directory '%s'.\n"), cwd
.c_str());
254 wxPuts(_T("Enumerating everything in current directory:"));
255 TestDirEnumHelper(dir
);
257 wxPuts(_T("Enumerating really everything in current directory:"));
258 TestDirEnumHelper(dir
, wxDIR_DEFAULT
| wxDIR_DOTDOT
);
260 wxPuts(_T("Enumerating object files in current directory:"));
261 TestDirEnumHelper(dir
, wxDIR_DEFAULT
, _T("*.o*"));
263 wxPuts(_T("Enumerating directories in current directory:"));
264 TestDirEnumHelper(dir
, wxDIR_DIRS
);
266 wxPuts(_T("Enumerating files in current directory:"));
267 TestDirEnumHelper(dir
, wxDIR_FILES
);
269 wxPuts(_T("Enumerating files including hidden in current directory:"));
270 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
274 wxPuts(_T("Enumerating everything in root directory:"));
275 TestDirEnumHelper(dir
, wxDIR_DEFAULT
);
277 wxPuts(_T("Enumerating directories in root directory:"));
278 TestDirEnumHelper(dir
, wxDIR_DIRS
);
280 wxPuts(_T("Enumerating files in root directory:"));
281 TestDirEnumHelper(dir
, wxDIR_FILES
);
283 wxPuts(_T("Enumerating files including hidden in root directory:"));
284 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
286 wxPuts(_T("Enumerating files in non existing directory:"));
287 wxDir
dirNo(_T("nosuchdir"));
288 TestDirEnumHelper(dirNo
);
293 class DirPrintTraverser
: public wxDirTraverser
296 virtual wxDirTraverseResult
OnFile(const wxString
& WXUNUSED(filename
))
298 return wxDIR_CONTINUE
;
301 virtual wxDirTraverseResult
OnDir(const wxString
& dirname
)
303 wxString path
, name
, ext
;
304 wxSplitPath(dirname
, &path
, &name
, &ext
);
307 name
<< _T('.') << ext
;
310 for ( const wxChar
*p
= path
.c_str(); *p
; p
++ )
312 if ( wxIsPathSeparator(*p
) )
316 wxPrintf(_T("%s%s\n"), indent
.c_str(), name
.c_str());
318 return wxDIR_CONTINUE
;
322 static void TestDirTraverse()
324 wxPuts(_T("*** Testing wxDir::Traverse() ***"));
328 size_t n
= wxDir::GetAllFiles(TESTDIR
, &files
);
329 wxPrintf(_T("There are %u files under '%s'\n"), n
, TESTDIR
);
332 wxPrintf(_T("First one is '%s'\n"), files
[0u].c_str());
333 wxPrintf(_T(" last one is '%s'\n"), files
[n
- 1].c_str());
336 // enum again with custom traverser
337 wxPuts(_T("Now enumerating directories:"));
339 DirPrintTraverser traverser
;
340 dir
.Traverse(traverser
, wxEmptyString
, wxDIR_DIRS
| wxDIR_HIDDEN
);
345 static void TestDirExists()
347 wxPuts(_T("*** Testing wxDir::Exists() ***"));
349 static const wxChar
*dirnames
[] =
352 #if defined(__WXMSW__)
355 _T("\\\\share\\file"),
359 _T("c:\\autoexec.bat"),
360 #elif defined(__UNIX__)
369 for ( size_t n
= 0; n
< WXSIZEOF(dirnames
); n
++ )
371 wxPrintf(_T("%-40s: %s\n"),
373 wxDir::Exists(dirnames
[n
]) ? _T("exists")
374 : _T("doesn't exist"));
382 // ----------------------------------------------------------------------------
384 // ----------------------------------------------------------------------------
388 #include "wx/dynlib.h"
390 static void TestDllLoad()
392 #if defined(__WXMSW__)
393 static const wxChar
*LIB_NAME
= _T("kernel32.dll");
394 static const wxChar
*FUNC_NAME
= _T("lstrlenA");
395 #elif defined(__UNIX__)
396 // weird: using just libc.so does *not* work!
397 static const wxChar
*LIB_NAME
= _T("/lib/libc.so.6");
398 static const wxChar
*FUNC_NAME
= _T("strlen");
400 #error "don't know how to test wxDllLoader on this platform"
403 wxPuts(_T("*** testing basic wxDynamicLibrary functions ***\n"));
405 wxDynamicLibrary
lib(LIB_NAME
);
406 if ( !lib
.IsLoaded() )
408 wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME
);
412 typedef int (wxSTDCALL
*wxStrlenType
)(const char *);
413 wxStrlenType pfnStrlen
= (wxStrlenType
)lib
.GetSymbol(FUNC_NAME
);
416 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
417 FUNC_NAME
, LIB_NAME
);
421 wxPrintf(_T("Calling %s dynamically loaded from %s "),
422 FUNC_NAME
, LIB_NAME
);
424 if ( pfnStrlen("foo") != 3 )
426 wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
430 wxPuts(_T("... ok"));
435 static const wxChar
*FUNC_NAME_AW
= _T("lstrlen");
437 typedef int (wxSTDCALL
*wxStrlenTypeAorW
)(const wxChar
*);
439 pfnStrlenAorW
= (wxStrlenTypeAorW
)lib
.GetSymbolAorW(FUNC_NAME_AW
);
440 if ( !pfnStrlenAorW
)
442 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
443 FUNC_NAME_AW
, LIB_NAME
);
447 if ( pfnStrlenAorW(_T("foobar")) != 6 )
449 wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
456 #if defined(__WXMSW__) || defined(__UNIX__)
458 static void TestDllListLoaded()
460 wxPuts(_T("*** testing wxDynamicLibrary::ListLoaded() ***\n"));
462 puts("\nLoaded modules:");
463 wxDynamicLibraryDetailsArray dlls
= wxDynamicLibrary::ListLoaded();
464 const size_t count
= dlls
.GetCount();
465 for ( size_t n
= 0; n
< count
; ++n
)
467 const wxDynamicLibraryDetails
& details
= dlls
[n
];
468 printf("%-45s", details
.GetPath().mb_str());
472 if ( details
.GetAddress(&addr
, &len
) )
474 printf(" %08lx:%08lx",
475 (unsigned long)addr
, (unsigned long)((char *)addr
+ len
));
478 printf(" %s\n", details
.GetVersion().mb_str());
484 #endif // TEST_DYNLIB
486 // ----------------------------------------------------------------------------
488 // ----------------------------------------------------------------------------
492 #include "wx/utils.h"
494 static wxString
MyGetEnv(const wxString
& var
)
497 if ( !wxGetEnv(var
, &val
) )
500 val
= wxString(_T('\'')) + val
+ _T('\'');
505 static void TestEnvironment()
507 const wxChar
*var
= _T("wxTestVar");
509 wxPuts(_T("*** testing environment access functions ***"));
511 wxPrintf(_T("Initially getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
512 wxSetEnv(var
, _T("value for wxTestVar"));
513 wxPrintf(_T("After wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
514 wxSetEnv(var
, _T("another value"));
515 wxPrintf(_T("After 2nd wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
517 wxPrintf(_T("After wxUnsetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
518 wxPrintf(_T("PATH = %s\n"), MyGetEnv(_T("PATH")).c_str());
521 #endif // TEST_ENVIRON
523 // ----------------------------------------------------------------------------
525 // ----------------------------------------------------------------------------
529 #include "wx/utils.h"
531 static void TestExecute()
533 wxPuts(_T("*** testing wxExecute ***"));
536 #define COMMAND "cat -n ../../Makefile" // "echo hi"
537 #define SHELL_COMMAND "echo hi from shell"
538 #define REDIRECT_COMMAND COMMAND // "date"
539 #elif defined(__WXMSW__)
540 #define COMMAND "command.com /c echo hi"
541 #define SHELL_COMMAND "echo hi"
542 #define REDIRECT_COMMAND COMMAND
544 #error "no command to exec"
547 wxPrintf(_T("Testing wxShell: "));
549 if ( wxShell(_T(SHELL_COMMAND
)) )
552 wxPuts(_T("ERROR."));
554 wxPrintf(_T("Testing wxExecute: "));
556 if ( wxExecute(_T(COMMAND
), true /* sync */) == 0 )
559 wxPuts(_T("ERROR."));
561 #if 0 // no, it doesn't work (yet?)
562 wxPrintf(_T("Testing async wxExecute: "));
564 if ( wxExecute(COMMAND
) != 0 )
565 wxPuts(_T("Ok (command launched)."));
567 wxPuts(_T("ERROR."));
570 wxPrintf(_T("Testing wxExecute with redirection:\n"));
571 wxArrayString output
;
572 if ( wxExecute(_T(REDIRECT_COMMAND
), output
) != 0 )
574 wxPuts(_T("ERROR."));
578 size_t count
= output
.GetCount();
579 for ( size_t n
= 0; n
< count
; n
++ )
581 wxPrintf(_T("\t%s\n"), output
[n
].c_str());
588 #endif // TEST_EXECUTE
590 // ----------------------------------------------------------------------------
592 // ----------------------------------------------------------------------------
597 #include "wx/ffile.h"
598 #include "wx/textfile.h"
600 static void TestFileRead()
602 wxPuts(_T("*** wxFile read test ***"));
604 wxFile
file(_T("testdata.fc"));
605 if ( file
.IsOpened() )
607 wxPrintf(_T("File length: %lu\n"), file
.Length());
609 wxPuts(_T("File dump:\n----------"));
611 static const size_t len
= 1024;
615 size_t nRead
= file
.Read(buf
, len
);
616 if ( nRead
== (size_t)wxInvalidOffset
)
618 wxPrintf(_T("Failed to read the file."));
622 fwrite(buf
, nRead
, 1, stdout
);
628 wxPuts(_T("----------"));
632 wxPrintf(_T("ERROR: can't open test file.\n"));
635 wxPuts(wxEmptyString
);
638 static void TestTextFileRead()
640 wxPuts(_T("*** wxTextFile read test ***"));
642 wxTextFile
file(_T("testdata.fc"));
645 wxPrintf(_T("Number of lines: %u\n"), file
.GetLineCount());
646 wxPrintf(_T("Last line: '%s'\n"), file
.GetLastLine().c_str());
650 wxPuts(_T("\nDumping the entire file:"));
651 for ( s
= file
.GetFirstLine(); !file
.Eof(); s
= file
.GetNextLine() )
653 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
655 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
657 wxPuts(_T("\nAnd now backwards:"));
658 for ( s
= file
.GetLastLine();
659 file
.GetCurrentLine() != 0;
660 s
= file
.GetPrevLine() )
662 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
664 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
668 wxPrintf(_T("ERROR: can't open '%s'\n"), file
.GetName());
671 wxPuts(wxEmptyString
);
674 static void TestFileCopy()
676 wxPuts(_T("*** Testing wxCopyFile ***"));
678 static const wxChar
*filename1
= _T("testdata.fc");
679 static const wxChar
*filename2
= _T("test2");
680 if ( !wxCopyFile(filename1
, filename2
) )
682 wxPuts(_T("ERROR: failed to copy file"));
686 wxFFile
f1(filename1
, _T("rb")),
687 f2(filename2
, _T("rb"));
689 if ( !f1
.IsOpened() || !f2
.IsOpened() )
691 wxPuts(_T("ERROR: failed to open file(s)"));
696 if ( !f1
.ReadAll(&s1
) || !f2
.ReadAll(&s2
) )
698 wxPuts(_T("ERROR: failed to read file(s)"));
702 if ( (s1
.length() != s2
.length()) ||
703 (memcmp(s1
.c_str(), s2
.c_str(), s1
.length()) != 0) )
705 wxPuts(_T("ERROR: copy error!"));
709 wxPuts(_T("File was copied ok."));
715 if ( !wxRemoveFile(filename2
) )
717 wxPuts(_T("ERROR: failed to remove the file"));
720 wxPuts(wxEmptyString
);
723 static void TestTempFile()
725 wxPuts(_T("*** wxTempFile test ***"));
728 if ( tmpFile
.Open(_T("test2")) && tmpFile
.Write(_T("the answer is 42")) )
730 if ( tmpFile
.Commit() )
731 wxPuts(_T("File committed."));
733 wxPuts(_T("ERROR: could't commit temp file."));
735 wxRemoveFile(_T("test2"));
738 wxPuts(wxEmptyString
);
743 // ----------------------------------------------------------------------------
745 // ----------------------------------------------------------------------------
749 #include "wx/confbase.h"
750 #include "wx/fileconf.h"
752 static const struct FileConfTestData
754 const wxChar
*name
; // value name
755 const wxChar
*value
; // the value from the file
758 { _T("value1"), _T("one") },
759 { _T("value2"), _T("two") },
760 { _T("novalue"), _T("default") },
763 static void TestFileConfRead()
765 wxPuts(_T("*** testing wxFileConfig loading/reading ***"));
767 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
768 _T("testdata.fc"), wxEmptyString
,
769 wxCONFIG_USE_RELATIVE_PATH
);
771 // test simple reading
772 wxPuts(_T("\nReading config file:"));
773 wxString
defValue(_T("default")), value
;
774 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
776 const FileConfTestData
& data
= fcTestData
[n
];
777 value
= fileconf
.Read(data
.name
, defValue
);
778 wxPrintf(_T("\t%s = %s "), data
.name
, value
.c_str());
779 if ( value
== data
.value
)
785 wxPrintf(_T("(ERROR: should be %s)\n"), data
.value
);
789 // test enumerating the entries
790 wxPuts(_T("\nEnumerating all root entries:"));
793 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
796 wxPrintf(_T("\t%s = %s\n"),
798 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
800 cont
= fileconf
.GetNextEntry(name
, dummy
);
803 static const wxChar
*testEntry
= _T("TestEntry");
804 wxPrintf(_T("\nTesting deletion of newly created \"Test\" entry: "));
805 fileconf
.Write(testEntry
, _T("A value"));
806 fileconf
.DeleteEntry(testEntry
);
807 wxPrintf(fileconf
.HasEntry(testEntry
) ? _T("ERROR\n") : _T("ok\n"));
810 #endif // TEST_FILECONF
812 // ----------------------------------------------------------------------------
814 // ----------------------------------------------------------------------------
818 #include "wx/filename.h"
821 static void DumpFileName(const wxChar
*desc
, const wxFileName
& fn
)
825 wxString full
= fn
.GetFullPath();
827 wxString vol
, path
, name
, ext
;
828 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
830 wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
831 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
833 wxFileName::SplitPath(full
, &path
, &name
, &ext
);
834 wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
835 path
.c_str(), name
.c_str(), ext
.c_str());
837 wxPrintf(_T("path is also:\t'%s'\n"), fn
.GetPath().c_str());
838 wxPrintf(_T("with volume: \t'%s'\n"),
839 fn
.GetPath(wxPATH_GET_VOLUME
).c_str());
840 wxPrintf(_T("with separator:\t'%s'\n"),
841 fn
.GetPath(wxPATH_GET_SEPARATOR
).c_str());
842 wxPrintf(_T("with both: \t'%s'\n"),
843 fn
.GetPath(wxPATH_GET_SEPARATOR
| wxPATH_GET_VOLUME
).c_str());
845 wxPuts(_T("The directories in the path are:"));
846 wxArrayString dirs
= fn
.GetDirs();
847 size_t count
= dirs
.GetCount();
848 for ( size_t n
= 0; n
< count
; n
++ )
850 wxPrintf(_T("\t%u: %s\n"), n
, dirs
[n
].c_str());
855 static void TestFileNameTemp()
857 wxPuts(_T("*** testing wxFileName temp file creation ***"));
859 static const wxChar
*tmpprefixes
[] =
867 _T("/tmp/foo/bar"), // this one must be an error
871 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
873 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
876 // "error" is not in upper case because it may be ok
877 wxPrintf(_T("Prefix '%s'\t-> error\n"), tmpprefixes
[n
]);
881 wxPrintf(_T("Prefix '%s'\t-> temp file '%s'\n"),
882 tmpprefixes
[n
], path
.c_str());
884 if ( !wxRemoveFile(path
) )
886 wxLogWarning(_T("Failed to remove temp file '%s'"),
893 static void TestFileNameDirManip()
895 // TODO: test AppendDir(), RemoveDir(), ...
898 static void TestFileNameComparison()
903 static void TestFileNameOperations()
908 static void TestFileNameCwd()
913 #endif // TEST_FILENAME
915 // ----------------------------------------------------------------------------
916 // wxFileName time functions
917 // ----------------------------------------------------------------------------
921 #include "wx/filename.h"
922 #include "wx/datetime.h"
924 static void TestFileGetTimes()
926 wxFileName
fn(_T("testdata.fc"));
928 wxDateTime dtAccess
, dtMod
, dtCreate
;
929 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtCreate
) )
931 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
935 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
937 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
938 wxPrintf(_T("Creation: \t%s\n"), dtCreate
.Format(fmt
).c_str());
939 wxPrintf(_T("Last read: \t%s\n"), dtAccess
.Format(fmt
).c_str());
940 wxPrintf(_T("Last write: \t%s\n"), dtMod
.Format(fmt
).c_str());
945 static void TestFileSetTimes()
947 wxFileName
fn(_T("testdata.fc"));
951 wxPrintf(_T("ERROR: Touch() failed.\n"));
956 #endif // TEST_FILETIME
958 // ----------------------------------------------------------------------------
960 // ----------------------------------------------------------------------------
965 #include "wx/utils.h" // for wxSetEnv
967 static wxLocale
gs_localeDefault(wxLANGUAGE_ENGLISH
);
969 // find the name of the language from its value
970 static const wxChar
*GetLangName(int lang
)
972 static const wxChar
*languageNames
[] =
982 _T("ARABIC_ALGERIA"),
983 _T("ARABIC_BAHRAIN"),
988 _T("ARABIC_LEBANON"),
990 _T("ARABIC_MOROCCO"),
993 _T("ARABIC_SAUDI_ARABIA"),
996 _T("ARABIC_TUNISIA"),
1003 _T("AZERI_CYRILLIC"),
1018 _T("CHINESE_SIMPLIFIED"),
1019 _T("CHINESE_TRADITIONAL"),
1020 _T("CHINESE_HONGKONG"),
1021 _T("CHINESE_MACAU"),
1022 _T("CHINESE_SINGAPORE"),
1023 _T("CHINESE_TAIWAN"),
1029 _T("DUTCH_BELGIAN"),
1033 _T("ENGLISH_AUSTRALIA"),
1034 _T("ENGLISH_BELIZE"),
1035 _T("ENGLISH_BOTSWANA"),
1036 _T("ENGLISH_CANADA"),
1037 _T("ENGLISH_CARIBBEAN"),
1038 _T("ENGLISH_DENMARK"),
1040 _T("ENGLISH_JAMAICA"),
1041 _T("ENGLISH_NEW_ZEALAND"),
1042 _T("ENGLISH_PHILIPPINES"),
1043 _T("ENGLISH_SOUTH_AFRICA"),
1044 _T("ENGLISH_TRINIDAD"),
1045 _T("ENGLISH_ZIMBABWE"),
1053 _T("FRENCH_BELGIAN"),
1054 _T("FRENCH_CANADIAN"),
1055 _T("FRENCH_LUXEMBOURG"),
1056 _T("FRENCH_MONACO"),
1062 _T("GERMAN_AUSTRIAN"),
1063 _T("GERMAN_BELGIUM"),
1064 _T("GERMAN_LIECHTENSTEIN"),
1065 _T("GERMAN_LUXEMBOURG"),
1083 _T("ITALIAN_SWISS"),
1088 _T("KASHMIRI_INDIA"),
1106 _T("MALAY_BRUNEI_DARUSSALAM"),
1107 _T("MALAY_MALAYSIA"),
1117 _T("NORWEGIAN_BOKMAL"),
1118 _T("NORWEGIAN_NYNORSK"),
1125 _T("PORTUGUESE_BRAZILIAN"),
1128 _T("RHAETO_ROMANCE"),
1131 _T("RUSSIAN_UKRAINE"),
1137 _T("SERBIAN_CYRILLIC"),
1138 _T("SERBIAN_LATIN"),
1139 _T("SERBO_CROATIAN"),
1150 _T("SPANISH_ARGENTINA"),
1151 _T("SPANISH_BOLIVIA"),
1152 _T("SPANISH_CHILE"),
1153 _T("SPANISH_COLOMBIA"),
1154 _T("SPANISH_COSTA_RICA"),
1155 _T("SPANISH_DOMINICAN_REPUBLIC"),
1156 _T("SPANISH_ECUADOR"),
1157 _T("SPANISH_EL_SALVADOR"),
1158 _T("SPANISH_GUATEMALA"),
1159 _T("SPANISH_HONDURAS"),
1160 _T("SPANISH_MEXICAN"),
1161 _T("SPANISH_MODERN"),
1162 _T("SPANISH_NICARAGUA"),
1163 _T("SPANISH_PANAMA"),
1164 _T("SPANISH_PARAGUAY"),
1166 _T("SPANISH_PUERTO_RICO"),
1167 _T("SPANISH_URUGUAY"),
1169 _T("SPANISH_VENEZUELA"),
1173 _T("SWEDISH_FINLAND"),
1191 _T("URDU_PAKISTAN"),
1193 _T("UZBEK_CYRILLIC"),
1206 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1207 return languageNames
[lang
];
1209 return _T("INVALID");
1212 static void TestDefaultLang()
1214 wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
1216 static const wxChar
*langStrings
[] =
1218 NULL
, // system default
1225 _T("de_DE.iso88591"),
1227 _T("?"), // invalid lang spec
1228 _T("klingonese"), // I bet on some systems it does exist...
1231 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1232 wxLocale::GetSystemEncodingName().c_str(),
1233 wxLocale::GetSystemEncoding());
1235 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1237 const wxChar
*langStr
= langStrings
[n
];
1240 // FIXME: this doesn't do anything at all under Windows, we need
1241 // to create a new wxLocale!
1242 wxSetEnv(_T("LC_ALL"), langStr
);
1245 int lang
= gs_localeDefault
.GetSystemLanguage();
1246 wxPrintf(_T("Locale for '%s' is %s.\n"),
1247 langStr
? langStr
: _T("system default"), GetLangName(lang
));
1251 #endif // TEST_LOCALE
1253 // ----------------------------------------------------------------------------
1255 // ----------------------------------------------------------------------------
1259 #include "wx/mimetype.h"
1261 static void TestMimeEnum()
1263 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1265 wxArrayString mimetypes
;
1267 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1269 wxPrintf(_T("*** All %u known filetypes: ***\n"), count
);
1274 for ( size_t n
= 0; n
< count
; n
++ )
1276 wxFileType
*filetype
=
1277 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1280 wxPrintf(_T("nothing known about the filetype '%s'!\n"),
1281 mimetypes
[n
].c_str());
1285 filetype
->GetDescription(&desc
);
1286 filetype
->GetExtensions(exts
);
1288 filetype
->GetIcon(NULL
);
1291 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1294 extsAll
<< _T(", ");
1298 wxPrintf(_T("\t%s: %s (%s)\n"),
1299 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
1302 wxPuts(wxEmptyString
);
1305 static void TestMimeOverride()
1307 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
1309 static const wxChar
*mailcap
= _T("/tmp/mailcap");
1310 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
1312 if ( wxFile::Exists(mailcap
) )
1313 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
1315 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
1317 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
1320 if ( wxFile::Exists(mimetypes
) )
1321 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
1323 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
1325 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
1328 wxPuts(wxEmptyString
);
1331 static void TestMimeFilename()
1333 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
1335 static const wxChar
*filenames
[] =
1343 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1345 const wxString fname
= filenames
[n
];
1346 wxString ext
= fname
.AfterLast(_T('.'));
1347 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
1350 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
1355 if ( !ft
->GetDescription(&desc
) )
1356 desc
= _T("<no description>");
1359 if ( !ft
->GetOpenCommand(&cmd
,
1360 wxFileType::MessageParameters(fname
, wxEmptyString
)) )
1361 cmd
= _T("<no command available>");
1363 cmd
= wxString(_T('"')) + cmd
+ _T('"');
1365 wxPrintf(_T("To open %s (%s) do %s.\n"),
1366 fname
.c_str(), desc
.c_str(), cmd
.c_str());
1372 wxPuts(wxEmptyString
);
1375 static void TestMimeAssociate()
1377 wxPuts(_T("*** Testing creation of filetype association ***\n"));
1379 wxFileTypeInfo
ftInfo(
1380 _T("application/x-xyz"),
1381 _T("xyzview '%s'"), // open cmd
1382 _T(""), // print cmd
1383 _T("XYZ File"), // description
1384 _T(".xyz"), // extensions
1385 NULL
// end of extensions
1387 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
1389 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
1392 wxPuts(_T("ERROR: failed to create association!"));
1396 // TODO: read it back
1400 wxPuts(wxEmptyString
);
1405 // ----------------------------------------------------------------------------
1406 // module dependencies feature
1407 // ----------------------------------------------------------------------------
1411 #include "wx/module.h"
1413 class wxTestModule
: public wxModule
1416 virtual bool OnInit() { wxPrintf(_T("Load module: %s\n"), GetClassInfo()->GetClassName()); return true; }
1417 virtual void OnExit() { wxPrintf(_T("Unload module: %s\n"), GetClassInfo()->GetClassName()); }
1420 class wxTestModuleA
: public wxTestModule
1425 DECLARE_DYNAMIC_CLASS(wxTestModuleA
)
1428 class wxTestModuleB
: public wxTestModule
1433 DECLARE_DYNAMIC_CLASS(wxTestModuleB
)
1436 class wxTestModuleC
: public wxTestModule
1441 DECLARE_DYNAMIC_CLASS(wxTestModuleC
)
1444 class wxTestModuleD
: public wxTestModule
1449 DECLARE_DYNAMIC_CLASS(wxTestModuleD
)
1452 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleC
, wxModule
)
1453 wxTestModuleC::wxTestModuleC()
1455 AddDependency(CLASSINFO(wxTestModuleD
));
1458 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleA
, wxModule
)
1459 wxTestModuleA::wxTestModuleA()
1461 AddDependency(CLASSINFO(wxTestModuleB
));
1462 AddDependency(CLASSINFO(wxTestModuleD
));
1465 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleD
, wxModule
)
1466 wxTestModuleD::wxTestModuleD()
1470 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleB
, wxModule
)
1471 wxTestModuleB::wxTestModuleB()
1473 AddDependency(CLASSINFO(wxTestModuleD
));
1474 AddDependency(CLASSINFO(wxTestModuleC
));
1477 #endif // TEST_MODULE
1479 // ----------------------------------------------------------------------------
1480 // misc information functions
1481 // ----------------------------------------------------------------------------
1483 #ifdef TEST_INFO_FUNCTIONS
1485 #include "wx/utils.h"
1487 #if TEST_INTERACTIVE
1488 static void TestDiskInfo()
1490 wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
1494 wxChar pathname
[128];
1495 wxPrintf(_T("\nEnter a directory name: "));
1496 if ( !wxFgets(pathname
, WXSIZEOF(pathname
), stdin
) )
1499 // kill the last '\n'
1500 pathname
[wxStrlen(pathname
) - 1] = 0;
1502 wxLongLong total
, free
;
1503 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
1505 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
1509 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
1510 (total
/ 1024).ToString().c_str(),
1511 (free
/ 1024).ToString().c_str(),
1516 #endif // TEST_INTERACTIVE
1518 static void TestOsInfo()
1520 wxPuts(_T("*** Testing OS info functions ***\n"));
1523 wxGetOsVersion(&major
, &minor
);
1524 wxPrintf(_T("Running under: %s, version %d.%d\n"),
1525 wxGetOsDescription().c_str(), major
, minor
);
1527 wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory().ToLong());
1529 wxPrintf(_T("Host name is %s (%s).\n"),
1530 wxGetHostName().c_str(), wxGetFullHostName().c_str());
1532 wxPuts(wxEmptyString
);
1535 static void TestPlatformInfo()
1537 wxPuts(_T("*** Testing wxPlatformInfo functions ***\n"));
1539 // get this platform
1540 wxPlatformInfo plat
;
1542 wxPrintf(_T("Operating system family name is: %s\n"), plat
.GetOperatingSystemFamilyName().c_str());
1543 wxPrintf(_T("Operating system name is: %s\n"), plat
.GetOperatingSystemIdName().c_str());
1544 wxPrintf(_T("Port ID name is: %s\n"), plat
.GetPortIdName().c_str());
1545 wxPrintf(_T("Port ID short name is: %s\n"), plat
.GetPortIdShortName().c_str());
1546 wxPrintf(_T("Architecture is: %s\n"), plat
.GetArchName().c_str());
1547 wxPrintf(_T("Endianness is: %s\n"), plat
.GetEndiannessName().c_str());
1549 wxPuts(wxEmptyString
);
1552 static void TestUserInfo()
1554 wxPuts(_T("*** Testing user info functions ***\n"));
1556 wxPrintf(_T("User id is:\t%s\n"), wxGetUserId().c_str());
1557 wxPrintf(_T("User name is:\t%s\n"), wxGetUserName().c_str());
1558 wxPrintf(_T("Home dir is:\t%s\n"), wxGetHomeDir().c_str());
1559 wxPrintf(_T("Email address:\t%s\n"), wxGetEmailAddress().c_str());
1561 wxPuts(wxEmptyString
);
1564 #endif // TEST_INFO_FUNCTIONS
1566 // ----------------------------------------------------------------------------
1568 // ----------------------------------------------------------------------------
1570 #ifdef TEST_PATHLIST
1573 #define CMD_IN_PATH _T("ls")
1575 #define CMD_IN_PATH _T("command.com")
1578 static void TestPathList()
1580 wxPuts(_T("*** Testing wxPathList ***\n"));
1582 wxPathList pathlist
;
1583 pathlist
.AddEnvList(_T("PATH"));
1584 wxString path
= pathlist
.FindValidPath(CMD_IN_PATH
);
1587 wxPrintf(_T("ERROR: command not found in the path.\n"));
1591 wxPrintf(_T("Command found in the path as '%s'.\n"), path
.c_str());
1595 #endif // TEST_PATHLIST
1597 // ----------------------------------------------------------------------------
1598 // regular expressions
1599 // ----------------------------------------------------------------------------
1603 #include "wx/regex.h"
1605 static void TestRegExInteractive()
1607 wxPuts(_T("*** Testing RE interactively ***"));
1611 wxChar pattern
[128];
1612 wxPrintf(_T("\nEnter a pattern: "));
1613 if ( !wxFgets(pattern
, WXSIZEOF(pattern
), stdin
) )
1616 // kill the last '\n'
1617 pattern
[wxStrlen(pattern
) - 1] = 0;
1620 if ( !re
.Compile(pattern
) )
1628 wxPrintf(_T("Enter text to match: "));
1629 if ( !wxFgets(text
, WXSIZEOF(text
), stdin
) )
1632 // kill the last '\n'
1633 text
[wxStrlen(text
) - 1] = 0;
1635 if ( !re
.Matches(text
) )
1637 wxPrintf(_T("No match.\n"));
1641 wxPrintf(_T("Pattern matches at '%s'\n"), re
.GetMatch(text
).c_str());
1644 for ( size_t n
= 1; ; n
++ )
1646 if ( !re
.GetMatch(&start
, &len
, n
) )
1651 wxPrintf(_T("Subexpr %u matched '%s'\n"),
1652 n
, wxString(text
+ start
, len
).c_str());
1659 #endif // TEST_REGEX
1661 // ----------------------------------------------------------------------------
1663 // ----------------------------------------------------------------------------
1673 static void TestDbOpen()
1681 // ----------------------------------------------------------------------------
1683 // ----------------------------------------------------------------------------
1686 NB: this stuff was taken from the glibc test suite and modified to build
1687 in wxWidgets: if I read the copyright below properly, this shouldn't
1693 #ifdef wxTEST_PRINTF
1694 // use our functions from wxchar.cpp
1698 // NB: do _not_ use ATTRIBUTE_PRINTF here, we have some invalid formats
1699 // in the tests below
1700 int wxPrintf( const wxChar
*format
, ... );
1701 int wxSprintf( wxChar
*str
, const wxChar
*format
, ... );
1704 #include "wx/longlong.h"
1708 static void rfg1 (void);
1709 static void rfg2 (void);
1713 fmtchk (const wxChar
*fmt
)
1715 (void) wxPrintf(_T("%s:\t`"), fmt
);
1716 (void) wxPrintf(fmt
, 0x12);
1717 (void) wxPrintf(_T("'\n"));
1721 fmtst1chk (const wxChar
*fmt
)
1723 (void) wxPrintf(_T("%s:\t`"), fmt
);
1724 (void) wxPrintf(fmt
, 4, 0x12);
1725 (void) wxPrintf(_T("'\n"));
1729 fmtst2chk (const wxChar
*fmt
)
1731 (void) wxPrintf(_T("%s:\t`"), fmt
);
1732 (void) wxPrintf(fmt
, 4, 4, 0x12);
1733 (void) wxPrintf(_T("'\n"));
1736 /* This page is covered by the following copyright: */
1738 /* (C) Copyright C E Chew
1740 * Feel free to copy, use and distribute this software provided:
1742 * 1. you do not pretend that you wrote it
1743 * 2. you leave this copyright notice intact.
1747 * Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans.
1754 /* Formatted Output Test
1756 * This exercises the output formatting code.
1759 wxChar
*PointerNull
= NULL
;
1766 wxChar
*prefix
= buf
;
1769 wxPuts(_T("\nFormatted output test"));
1770 wxPrintf(_T("prefix 6d 6o 6x 6X 6u\n"));
1771 wxStrcpy(prefix
, _T("%"));
1772 for (i
= 0; i
< 2; i
++) {
1773 for (j
= 0; j
< 2; j
++) {
1774 for (k
= 0; k
< 2; k
++) {
1775 for (l
= 0; l
< 2; l
++) {
1776 wxStrcpy(prefix
, _T("%"));
1777 if (i
== 0) wxStrcat(prefix
, _T("-"));
1778 if (j
== 0) wxStrcat(prefix
, _T("+"));
1779 if (k
== 0) wxStrcat(prefix
, _T("#"));
1780 if (l
== 0) wxStrcat(prefix
, _T("0"));
1781 wxPrintf(_T("%5s |"), prefix
);
1782 wxStrcpy(tp
, prefix
);
1783 wxStrcat(tp
, _T("6d |"));
1785 wxStrcpy(tp
, prefix
);
1786 wxStrcat(tp
, _T("6o |"));
1788 wxStrcpy(tp
, prefix
);
1789 wxStrcat(tp
, _T("6x |"));
1791 wxStrcpy(tp
, prefix
);
1792 wxStrcat(tp
, _T("6X |"));
1794 wxStrcpy(tp
, prefix
);
1795 wxStrcat(tp
, _T("6u |"));
1802 wxPrintf(_T("%10s\n"), PointerNull
);
1803 wxPrintf(_T("%-10s\n"), PointerNull
);
1806 static void TestPrintf()
1808 static wxChar shortstr
[] = _T("Hi, Z.");
1809 static wxChar longstr
[] = _T("Good morning, Doctor Chandra. This is Hal. \
1810 I am ready for my first lesson today.");
1812 wxString test_format
;
1816 fmtchk(_T("%4.4x"));
1817 fmtchk(_T("%04.4x"));
1818 fmtchk(_T("%4.3x"));
1819 fmtchk(_T("%04.3x"));
1821 fmtst1chk(_T("%.*x"));
1822 fmtst1chk(_T("%0*x"));
1823 fmtst2chk(_T("%*.*x"));
1824 fmtst2chk(_T("%0*.*x"));
1826 wxString bad_format
= _T("bad format:\t\"%b\"\n");
1827 wxPrintf(bad_format
.c_str());
1828 wxPrintf(_T("nil pointer (padded):\t\"%10p\"\n"), (void *) NULL
);
1830 wxPrintf(_T("decimal negative:\t\"%d\"\n"), -2345);
1831 wxPrintf(_T("octal negative:\t\"%o\"\n"), -2345);
1832 wxPrintf(_T("hex negative:\t\"%x\"\n"), -2345);
1833 wxPrintf(_T("long decimal number:\t\"%ld\"\n"), -123456L);
1834 wxPrintf(_T("long octal negative:\t\"%lo\"\n"), -2345L);
1835 wxPrintf(_T("long unsigned decimal number:\t\"%lu\"\n"), -123456L);
1836 wxPrintf(_T("zero-padded LDN:\t\"%010ld\"\n"), -123456L);
1837 test_format
= _T("left-adjusted ZLDN:\t\"%-010ld\"\n");
1838 wxPrintf(test_format
.c_str(), -123456);
1839 wxPrintf(_T("space-padded LDN:\t\"%10ld\"\n"), -123456L);
1840 wxPrintf(_T("left-adjusted SLDN:\t\"%-10ld\"\n"), -123456L);
1842 test_format
= _T("zero-padded string:\t\"%010s\"\n");
1843 wxPrintf(test_format
.c_str(), shortstr
);
1844 test_format
= _T("left-adjusted Z string:\t\"%-010s\"\n");
1845 wxPrintf(test_format
.c_str(), shortstr
);
1846 wxPrintf(_T("space-padded string:\t\"%10s\"\n"), shortstr
);
1847 wxPrintf(_T("left-adjusted S string:\t\"%-10s\"\n"), shortstr
);
1848 wxPrintf(_T("null string:\t\"%s\"\n"), PointerNull
);
1849 wxPrintf(_T("limited string:\t\"%.22s\"\n"), longstr
);
1851 wxPrintf(_T("e-style >= 1:\t\"%e\"\n"), 12.34);
1852 wxPrintf(_T("e-style >= .1:\t\"%e\"\n"), 0.1234);
1853 wxPrintf(_T("e-style < .1:\t\"%e\"\n"), 0.001234);
1854 wxPrintf(_T("e-style big:\t\"%.60e\"\n"), 1e20
);
1855 wxPrintf(_T("e-style == .1:\t\"%e\"\n"), 0.1);
1856 wxPrintf(_T("f-style >= 1:\t\"%f\"\n"), 12.34);
1857 wxPrintf(_T("f-style >= .1:\t\"%f\"\n"), 0.1234);
1858 wxPrintf(_T("f-style < .1:\t\"%f\"\n"), 0.001234);
1859 wxPrintf(_T("g-style >= 1:\t\"%g\"\n"), 12.34);
1860 wxPrintf(_T("g-style >= .1:\t\"%g\"\n"), 0.1234);
1861 wxPrintf(_T("g-style < .1:\t\"%g\"\n"), 0.001234);
1862 wxPrintf(_T("g-style big:\t\"%.60g\"\n"), 1e20
);
1864 wxPrintf (_T(" %6.5f\n"), .099999999860301614);
1865 wxPrintf (_T(" %6.5f\n"), .1);
1866 wxPrintf (_T("x%5.4fx\n"), .5);
1868 wxPrintf (_T("%#03x\n"), 1);
1870 //wxPrintf (_T("something really insane: %.10000f\n"), 1.0);
1876 while (niter
-- != 0)
1877 wxPrintf (_T("%.17e\n"), d
/ 2);
1882 // Open Watcom cause compiler error here
1883 // Error! E173: col(24) floating-point constant too small to represent
1884 wxPrintf (_T("%15.5e\n"), 4.9406564584124654e-324);
1887 #define FORMAT _T("|%12.4f|%12.4e|%12.4g|\n")
1888 wxPrintf (FORMAT
, 0.0, 0.0, 0.0);
1889 wxPrintf (FORMAT
, 1.0, 1.0, 1.0);
1890 wxPrintf (FORMAT
, -1.0, -1.0, -1.0);
1891 wxPrintf (FORMAT
, 100.0, 100.0, 100.0);
1892 wxPrintf (FORMAT
, 1000.0, 1000.0, 1000.0);
1893 wxPrintf (FORMAT
, 10000.0, 10000.0, 10000.0);
1894 wxPrintf (FORMAT
, 12345.0, 12345.0, 12345.0);
1895 wxPrintf (FORMAT
, 100000.0, 100000.0, 100000.0);
1896 wxPrintf (FORMAT
, 123456.0, 123456.0, 123456.0);
1901 int rc
= wxSnprintf (buf
, WXSIZEOF(buf
), _T("%30s"), _T("foo"));
1903 wxPrintf(_T("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n"),
1904 rc
, WXSIZEOF(buf
), buf
);
1907 wxPrintf ("snprintf (\"%%.999999u\", 10)\n",
1908 wxSnprintf(buf2
, WXSIZEOFbuf2
), "%.999999u", 10));
1914 wxPrintf (_T("%e should be 1.234568e+06\n"), 1234567.8);
1915 wxPrintf (_T("%f should be 1234567.800000\n"), 1234567.8);
1916 wxPrintf (_T("%g should be 1.23457e+06\n"), 1234567.8);
1917 wxPrintf (_T("%g should be 123.456\n"), 123.456);
1918 wxPrintf (_T("%g should be 1e+06\n"), 1000000.0);
1919 wxPrintf (_T("%g should be 10\n"), 10.0);
1920 wxPrintf (_T("%g should be 0.02\n"), 0.02);
1924 wxPrintf(_T("%.17f\n"),(1.0/x
/10.0+1.0)*x
-x
);
1930 wxSprintf(buf
,_T("%*s%*s%*s"),-1,_T("one"),-20,_T("two"),-30,_T("three"));
1932 result
|= wxStrcmp (buf
,
1933 _T("onetwo three "));
1935 wxPuts (result
!= 0 ? _T("Test failed!") : _T("Test ok."));
1942 wxSprintf(buf
, _T("%07") wxLongLongFmtSpec
_T("o"), wxLL(040000000000));
1944 // for some reason below line fails under Borland
1945 wxPrintf (_T("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf
);
1948 if (wxStrcmp (buf
, _T("40000000000")) != 0)
1951 wxPuts (_T("\tFAILED"));
1953 wxUnusedVar(result
);
1954 wxPuts (wxEmptyString
);
1956 #endif // wxLongLong_t
1958 wxPrintf (_T("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX
+ 2, UCHAR_MAX
+ 2);
1959 wxPrintf (_T("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX
+ 2, USHRT_MAX
+ 2);
1961 wxPuts (_T("--- Should be no further output. ---"));
1970 memset (bytes
, '\xff', sizeof bytes
);
1971 wxSprintf (buf
, _T("foo%hhn\n"), &bytes
[3]);
1972 if (bytes
[0] != '\xff' || bytes
[1] != '\xff' || bytes
[2] != '\xff'
1973 || bytes
[4] != '\xff' || bytes
[5] != '\xff' || bytes
[6] != '\xff')
1975 wxPuts (_T("%hhn overwrite more bytes"));
1980 wxPuts (_T("%hhn wrote incorrect value"));
1992 wxSprintf (buf
, _T("%5.s"), _T("xyz"));
1993 if (wxStrcmp (buf
, _T(" ")) != 0)
1994 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" "));
1995 wxSprintf (buf
, _T("%5.f"), 33.3);
1996 if (wxStrcmp (buf
, _T(" 33")) != 0)
1997 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 33"));
1998 wxSprintf (buf
, _T("%8.e"), 33.3e7
);
1999 if (wxStrcmp (buf
, _T(" 3e+08")) != 0)
2000 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3e+08"));
2001 wxSprintf (buf
, _T("%8.E"), 33.3e7
);
2002 if (wxStrcmp (buf
, _T(" 3E+08")) != 0)
2003 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3E+08"));
2004 wxSprintf (buf
, _T("%.g"), 33.3);
2005 if (wxStrcmp (buf
, _T("3e+01")) != 0)
2006 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3e+01"));
2007 wxSprintf (buf
, _T("%.G"), 33.3);
2008 if (wxStrcmp (buf
, _T("3E+01")) != 0)
2009 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3E+01"));
2017 wxString test_format
;
2020 wxSprintf (buf
, _T("%.*g"), prec
, 3.3);
2021 if (wxStrcmp (buf
, _T("3")) != 0)
2022 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2024 wxSprintf (buf
, _T("%.*G"), prec
, 3.3);
2025 if (wxStrcmp (buf
, _T("3")) != 0)
2026 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2028 wxSprintf (buf
, _T("%7.*G"), prec
, 3.33);
2029 if (wxStrcmp (buf
, _T(" 3")) != 0)
2030 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3"));
2032 test_format
= _T("%04.*o");
2033 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2034 if (wxStrcmp (buf
, _T(" 041")) != 0)
2035 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 041"));
2037 test_format
= _T("%09.*u");
2038 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2039 if (wxStrcmp (buf
, _T(" 0000033")) != 0)
2040 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 0000033"));
2042 test_format
= _T("%04.*x");
2043 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2044 if (wxStrcmp (buf
, _T(" 021")) != 0)
2045 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2047 test_format
= _T("%04.*X");
2048 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2049 if (wxStrcmp (buf
, _T(" 021")) != 0)
2050 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2053 #endif // TEST_PRINTF
2055 // ----------------------------------------------------------------------------
2056 // registry and related stuff
2057 // ----------------------------------------------------------------------------
2059 // this is for MSW only
2062 #undef TEST_REGISTRY
2067 #include "wx/confbase.h"
2068 #include "wx/msw/regconf.h"
2071 static void TestRegConfWrite()
2073 wxConfig
*config
= new wxConfig(_T("myapp"));
2074 config
->SetPath(_T("/group1"));
2075 config
->Write(_T("entry1"), _T("foo"));
2076 config
->SetPath(_T("/group2"));
2077 config
->Write(_T("entry1"), _T("bar"));
2081 static void TestRegConfRead()
2083 wxConfig
*config
= new wxConfig(_T("myapp"));
2087 config
->SetPath(_T("/"));
2088 wxPuts(_T("Enumerating / subgroups:"));
2089 bool bCont
= config
->GetFirstGroup(str
, dummy
);
2093 bCont
= config
->GetNextGroup(str
, dummy
);
2097 #endif // TEST_REGCONF
2099 #ifdef TEST_REGISTRY
2101 #include "wx/msw/registry.h"
2103 // I chose this one because I liked its name, but it probably only exists under
2105 static const wxChar
*TESTKEY
=
2106 _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
2108 static void TestRegistryRead()
2110 wxPuts(_T("*** testing registry reading ***"));
2112 wxRegKey
key(TESTKEY
);
2113 wxPrintf(_T("The test key name is '%s'.\n"), key
.GetName().c_str());
2116 wxPuts(_T("ERROR: test key can't be opened, aborting test."));
2121 size_t nSubKeys
, nValues
;
2122 if ( key
.GetKeyInfo(&nSubKeys
, NULL
, &nValues
, NULL
) )
2124 wxPrintf(_T("It has %u subkeys and %u values.\n"), nSubKeys
, nValues
);
2127 wxPrintf(_T("Enumerating values:\n"));
2131 bool cont
= key
.GetFirstValue(value
, dummy
);
2134 wxPrintf(_T("Value '%s': type "), value
.c_str());
2135 switch ( key
.GetValueType(value
) )
2137 case wxRegKey::Type_None
: wxPrintf(_T("ERROR (none)")); break;
2138 case wxRegKey::Type_String
: wxPrintf(_T("SZ")); break;
2139 case wxRegKey::Type_Expand_String
: wxPrintf(_T("EXPAND_SZ")); break;
2140 case wxRegKey::Type_Binary
: wxPrintf(_T("BINARY")); break;
2141 case wxRegKey::Type_Dword
: wxPrintf(_T("DWORD")); break;
2142 case wxRegKey::Type_Multi_String
: wxPrintf(_T("MULTI_SZ")); break;
2143 default: wxPrintf(_T("other (unknown)")); break;
2146 wxPrintf(_T(", value = "));
2147 if ( key
.IsNumericValue(value
) )
2150 key
.QueryValue(value
, &val
);
2151 wxPrintf(_T("%ld"), val
);
2156 key
.QueryValue(value
, val
);
2157 wxPrintf(_T("'%s'"), val
.c_str());
2159 key
.QueryRawValue(value
, val
);
2160 wxPrintf(_T(" (raw value '%s')"), val
.c_str());
2165 cont
= key
.GetNextValue(value
, dummy
);
2169 static void TestRegistryAssociation()
2172 The second call to deleteself genertaes an error message, with a
2173 messagebox saying .flo is crucial to system operation, while the .ddf
2174 call also fails, but with no error message
2179 key
.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
2181 key
= _T("ddxf_auto_file") ;
2182 key
.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
2184 key
= _T("ddxf_auto_file") ;
2185 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
2187 key
= _T("program,0") ;
2188 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
2190 key
= _T("program \"%1\"") ;
2192 key
.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
2194 key
.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
2196 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
2198 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
2202 #endif // TEST_REGISTRY
2204 // ----------------------------------------------------------------------------
2206 // ----------------------------------------------------------------------------
2208 #ifdef TEST_SCOPEGUARD
2210 #include "wx/scopeguard.h"
2212 static void function0() { puts("function0()"); }
2213 static void function1(int n
) { printf("function1(%d)\n", n
); }
2214 static void function2(double x
, char c
) { printf("function2(%g, %c)\n", x
, c
); }
2218 void method0() { printf("method0()\n"); }
2219 void method1(int n
) { printf("method1(%d)\n", n
); }
2220 void method2(double x
, char c
) { printf("method2(%g, %c)\n", x
, c
); }
2223 static void TestScopeGuard()
2225 wxON_BLOCK_EXIT0(function0
);
2226 wxON_BLOCK_EXIT1(function1
, 17);
2227 wxON_BLOCK_EXIT2(function2
, 3.14, 'p');
2230 wxON_BLOCK_EXIT_OBJ0(obj
, Object::method0
);
2231 wxON_BLOCK_EXIT_OBJ1(obj
, Object::method1
, 7);
2232 wxON_BLOCK_EXIT_OBJ2(obj
, Object::method2
, 2.71, 'e');
2234 wxScopeGuard dismissed
= wxMakeGuard(function0
);
2235 dismissed
.Dismiss();
2240 // ----------------------------------------------------------------------------
2242 // ----------------------------------------------------------------------------
2246 #include "wx/socket.h"
2247 #include "wx/protocol/protocol.h"
2248 #include "wx/protocol/http.h"
2250 static void TestSocketServer()
2252 wxPuts(_T("*** Testing wxSocketServer ***\n"));
2254 static const int PORT
= 3000;
2259 wxSocketServer
*server
= new wxSocketServer(addr
);
2260 if ( !server
->Ok() )
2262 wxPuts(_T("ERROR: failed to bind"));
2270 wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT
);
2272 wxSocketBase
*socket
= server
->Accept();
2275 wxPuts(_T("ERROR: wxSocketServer::Accept() failed."));
2279 wxPuts(_T("Server: got a client."));
2281 server
->SetTimeout(60); // 1 min
2284 while ( !close
&& socket
->IsConnected() )
2287 wxChar ch
= _T('\0');
2290 if ( socket
->Read(&ch
, sizeof(ch
)).Error() )
2292 // don't log error if the client just close the connection
2293 if ( socket
->IsConnected() )
2295 wxPuts(_T("ERROR: in wxSocket::Read."));
2315 wxPrintf(_T("Server: got '%s'.\n"), s
.c_str());
2316 if ( s
== _T("close") )
2318 wxPuts(_T("Closing connection"));
2322 else if ( s
== _T("quit") )
2327 wxPuts(_T("Shutting down the server"));
2329 else // not a special command
2331 socket
->Write(s
.MakeUpper().c_str(), s
.length());
2332 socket
->Write("\r\n", 2);
2333 wxPrintf(_T("Server: wrote '%s'.\n"), s
.c_str());
2339 wxPuts(_T("Server: lost a client unexpectedly."));
2345 // same as "delete server" but is consistent with GUI programs
2349 static void TestSocketClient()
2351 wxPuts(_T("*** Testing wxSocketClient ***\n"));
2353 static const wxChar
*hostname
= _T("www.wxwidgets.org");
2356 addr
.Hostname(hostname
);
2359 wxPrintf(_T("--- Attempting to connect to %s:80...\n"), hostname
);
2361 wxSocketClient client
;
2362 if ( !client
.Connect(addr
) )
2364 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
2368 wxPrintf(_T("--- Connected to %s:%u...\n"),
2369 addr
.Hostname().c_str(), addr
.Service());
2373 // could use simply "GET" here I suppose
2375 wxString::Format(_T("GET http://%s/\r\n"), hostname
);
2376 client
.Write(cmdGet
, cmdGet
.length());
2377 wxPrintf(_T("--- Sent command '%s' to the server\n"),
2378 MakePrintable(cmdGet
).c_str());
2379 client
.Read(buf
, WXSIZEOF(buf
));
2380 wxPrintf(_T("--- Server replied:\n%s"), buf
);
2384 #endif // TEST_SOCKETS
2386 // ----------------------------------------------------------------------------
2388 // ----------------------------------------------------------------------------
2392 #include "wx/protocol/ftp.h"
2396 #define FTP_ANONYMOUS
2398 #ifdef FTP_ANONYMOUS
2399 static const wxChar
*directory
= _T("/pub");
2400 static const wxChar
*filename
= _T("welcome.msg");
2402 static const wxChar
*directory
= _T("/etc");
2403 static const wxChar
*filename
= _T("issue");
2406 static bool TestFtpConnect()
2408 wxPuts(_T("*** Testing FTP connect ***"));
2410 #ifdef FTP_ANONYMOUS
2411 static const wxChar
*hostname
= _T("ftp.wxwidgets.org");
2413 wxPrintf(_T("--- Attempting to connect to %s:21 anonymously...\n"), hostname
);
2414 #else // !FTP_ANONYMOUS
2415 static const wxChar
*hostname
= "localhost";
2418 wxFgets(user
, WXSIZEOF(user
), stdin
);
2419 user
[wxStrlen(user
) - 1] = '\0'; // chop off '\n'
2422 wxChar password
[256];
2423 wxPrintf(_T("Password for %s: "), password
);
2424 wxFgets(password
, WXSIZEOF(password
), stdin
);
2425 password
[wxStrlen(password
) - 1] = '\0'; // chop off '\n'
2426 ftp
.SetPassword(password
);
2428 wxPrintf(_T("--- Attempting to connect to %s:21 as %s...\n"), hostname
, user
);
2429 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
2431 if ( !ftp
.Connect(hostname
) )
2433 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
2439 wxPrintf(_T("--- Connected to %s, current directory is '%s'\n"),
2440 hostname
, ftp
.Pwd().c_str());
2447 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
2448 static void TestFtpWuFtpd()
2451 static const wxChar
*hostname
= _T("ftp.eudora.com");
2452 if ( !ftp
.Connect(hostname
) )
2454 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
2458 static const wxChar
*filename
= _T("eudora/pubs/draft-gellens-submit-09.txt");
2459 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2462 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
2466 size_t size
= in
->GetSize();
2467 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
2469 wxChar
*data
= new wxChar
[size
];
2470 if ( !in
->Read(data
, size
) )
2472 wxPuts(_T("ERROR: read error"));
2476 wxPrintf(_T("Successfully retrieved the file.\n"));
2485 static void TestFtpList()
2487 wxPuts(_T("*** Testing wxFTP file listing ***\n"));
2490 if ( !ftp
.ChDir(directory
) )
2492 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
2495 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
2497 // test NLIST and LIST
2498 wxArrayString files
;
2499 if ( !ftp
.GetFilesList(files
) )
2501 wxPuts(_T("ERROR: failed to get NLIST of files"));
2505 wxPrintf(_T("Brief list of files under '%s':\n"), ftp
.Pwd().c_str());
2506 size_t count
= files
.GetCount();
2507 for ( size_t n
= 0; n
< count
; n
++ )
2509 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
2511 wxPuts(_T("End of the file list"));
2514 if ( !ftp
.GetDirList(files
) )
2516 wxPuts(_T("ERROR: failed to get LIST of files"));
2520 wxPrintf(_T("Detailed list of files under '%s':\n"), ftp
.Pwd().c_str());
2521 size_t count
= files
.GetCount();
2522 for ( size_t n
= 0; n
< count
; n
++ )
2524 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
2526 wxPuts(_T("End of the file list"));
2529 if ( !ftp
.ChDir(_T("..")) )
2531 wxPuts(_T("ERROR: failed to cd to .."));
2534 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
2537 static void TestFtpDownload()
2539 wxPuts(_T("*** Testing wxFTP download ***\n"));
2542 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2545 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
2549 size_t size
= in
->GetSize();
2550 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
2553 wxChar
*data
= new wxChar
[size
];
2554 if ( !in
->Read(data
, size
) )
2556 wxPuts(_T("ERROR: read error"));
2560 wxPrintf(_T("\nContents of %s:\n%s\n"), filename
, data
);
2568 static void TestFtpFileSize()
2570 wxPuts(_T("*** Testing FTP SIZE command ***"));
2572 if ( !ftp
.ChDir(directory
) )
2574 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
2577 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
2579 if ( ftp
.FileExists(filename
) )
2581 int size
= ftp
.GetFileSize(filename
);
2583 wxPrintf(_T("ERROR: couldn't get size of '%s'\n"), filename
);
2585 wxPrintf(_T("Size of '%s' is %d bytes.\n"), filename
, size
);
2589 wxPrintf(_T("ERROR: '%s' doesn't exist\n"), filename
);
2593 static void TestFtpMisc()
2595 wxPuts(_T("*** Testing miscellaneous wxFTP functions ***"));
2597 if ( ftp
.SendCommand(_T("STAT")) != '2' )
2599 wxPuts(_T("ERROR: STAT failed"));
2603 wxPrintf(_T("STAT returned:\n\n%s\n"), ftp
.GetLastResult().c_str());
2606 if ( ftp
.SendCommand(_T("HELP SITE")) != '2' )
2608 wxPuts(_T("ERROR: HELP SITE failed"));
2612 wxPrintf(_T("The list of site-specific commands:\n\n%s\n"),
2613 ftp
.GetLastResult().c_str());
2617 static void TestFtpInteractive()
2619 wxPuts(_T("\n*** Interactive wxFTP test ***"));
2625 wxPrintf(_T("Enter FTP command: "));
2626 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
2629 // kill the last '\n'
2630 buf
[wxStrlen(buf
) - 1] = 0;
2632 // special handling of LIST and NLST as they require data connection
2633 wxString
start(buf
, 4);
2635 if ( start
== _T("LIST") || start
== _T("NLST") )
2638 if ( wxStrlen(buf
) > 4 )
2641 wxArrayString files
;
2642 if ( !ftp
.GetList(files
, wildcard
, start
== _T("LIST")) )
2644 wxPrintf(_T("ERROR: failed to get %s of files\n"), start
.c_str());
2648 wxPrintf(_T("--- %s of '%s' under '%s':\n"),
2649 start
.c_str(), wildcard
.c_str(), ftp
.Pwd().c_str());
2650 size_t count
= files
.GetCount();
2651 for ( size_t n
= 0; n
< count
; n
++ )
2653 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
2655 wxPuts(_T("--- End of the file list"));
2660 wxChar ch
= ftp
.SendCommand(buf
);
2661 wxPrintf(_T("Command %s"), ch
? _T("succeeded") : _T("failed"));
2664 wxPrintf(_T(" (return code %c)"), ch
);
2667 wxPrintf(_T(", server reply:\n%s\n\n"), ftp
.GetLastResult().c_str());
2671 wxPuts(_T("\n*** done ***"));
2674 static void TestFtpUpload()
2676 wxPuts(_T("*** Testing wxFTP uploading ***\n"));
2679 static const wxChar
*file1
= _T("test1");
2680 static const wxChar
*file2
= _T("test2");
2681 wxOutputStream
*out
= ftp
.GetOutputStream(file1
);
2684 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
2685 out
->Write("First hello", 11);
2689 // send a command to check the remote file
2690 if ( ftp
.SendCommand(wxString(_T("STAT ")) + file1
) != '2' )
2692 wxPrintf(_T("ERROR: STAT %s failed\n"), file1
);
2696 wxPrintf(_T("STAT %s returned:\n\n%s\n"),
2697 file1
, ftp
.GetLastResult().c_str());
2700 out
= ftp
.GetOutputStream(file2
);
2703 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
2704 out
->Write("Second hello", 12);
2711 // ----------------------------------------------------------------------------
2713 // ----------------------------------------------------------------------------
2715 #ifdef TEST_STACKWALKER
2717 #if wxUSE_STACKWALKER
2719 #include "wx/stackwalk.h"
2721 class StackDump
: public wxStackWalker
2724 StackDump(const char *argv0
)
2725 : wxStackWalker(argv0
)
2729 virtual void Walk(size_t skip
= 1)
2731 wxPuts(_T("Stack dump:"));
2733 wxStackWalker::Walk(skip
);
2737 virtual void OnStackFrame(const wxStackFrame
& frame
)
2739 printf("[%2d] ", frame
.GetLevel());
2741 wxString name
= frame
.GetName();
2742 if ( !name
.empty() )
2744 printf("%-20.40s", name
.mb_str());
2748 printf("0x%08lx", (unsigned long)frame
.GetAddress());
2751 if ( frame
.HasSourceLocation() )
2754 frame
.GetFileName().mb_str(),
2761 for ( size_t n
= 0; frame
.GetParam(n
, &type
, &name
, &val
); n
++ )
2763 printf("\t%s %s = %s\n", type
.mb_str(), name
.mb_str(), val
.mb_str());
2768 static void TestStackWalk(const char *argv0
)
2770 wxPuts(_T("*** Testing wxStackWalker ***\n"));
2772 StackDump
dump(argv0
);
2776 #endif // wxUSE_STACKWALKER
2778 #endif // TEST_STACKWALKER
2780 // ----------------------------------------------------------------------------
2782 // ----------------------------------------------------------------------------
2784 #ifdef TEST_STDPATHS
2786 #include "wx/stdpaths.h"
2787 #include "wx/wxchar.h" // wxPrintf
2789 static void TestStandardPaths()
2791 wxPuts(_T("*** Testing wxStandardPaths ***\n"));
2793 wxTheApp
->SetAppName(_T("console"));
2795 wxStandardPathsBase
& stdp
= wxStandardPaths::Get();
2796 wxPrintf(_T("Config dir (sys):\t%s\n"), stdp
.GetConfigDir().c_str());
2797 wxPrintf(_T("Config dir (user):\t%s\n"), stdp
.GetUserConfigDir().c_str());
2798 wxPrintf(_T("Data dir (sys):\t\t%s\n"), stdp
.GetDataDir().c_str());
2799 wxPrintf(_T("Data dir (sys local):\t%s\n"), stdp
.GetLocalDataDir().c_str());
2800 wxPrintf(_T("Data dir (user):\t%s\n"), stdp
.GetUserDataDir().c_str());
2801 wxPrintf(_T("Data dir (user local):\t%s\n"), stdp
.GetUserLocalDataDir().c_str());
2802 wxPrintf(_T("Documents dir:\t\t%s\n"), stdp
.GetDocumentsDir().c_str());
2803 wxPrintf(_T("Executable path:\t%s\n"), stdp
.GetExecutablePath().c_str());
2804 wxPrintf(_T("Plugins dir:\t\t%s\n"), stdp
.GetPluginsDir().c_str());
2805 wxPrintf(_T("Resources dir:\t\t%s\n"), stdp
.GetResourcesDir().c_str());
2806 wxPrintf(_T("Localized res. dir:\t%s\n"),
2807 stdp
.GetLocalizedResourcesDir(_T("fr")).c_str());
2808 wxPrintf(_T("Message catalogs dir:\t%s\n"),
2809 stdp
.GetLocalizedResourcesDir
2812 wxStandardPaths::ResourceCat_Messages
2816 #endif // TEST_STDPATHS
2818 // ----------------------------------------------------------------------------
2820 // ----------------------------------------------------------------------------
2824 #include "wx/wfstream.h"
2825 #include "wx/mstream.h"
2827 static void TestFileStream()
2829 wxPuts(_T("*** Testing wxFileInputStream ***"));
2831 static const wxString filename
= _T("testdata.fs");
2833 wxFileOutputStream
fsOut(filename
);
2834 fsOut
.Write("foo", 3);
2838 wxFileInputStream
fsIn(filename
);
2839 wxPrintf(_T("File stream size: %u\n"), fsIn
.GetSize());
2840 while ( !fsIn
.Eof() )
2842 wxPutchar(fsIn
.GetC());
2846 if ( !wxRemoveFile(filename
) )
2848 wxPrintf(_T("ERROR: failed to remove the file '%s'.\n"), filename
.c_str());
2851 wxPuts(_T("\n*** wxFileInputStream test done ***"));
2854 static void TestMemoryStream()
2856 wxPuts(_T("*** Testing wxMemoryOutputStream ***"));
2858 wxMemoryOutputStream memOutStream
;
2859 wxPrintf(_T("Initially out stream offset: %lu\n"),
2860 (unsigned long)memOutStream
.TellO());
2862 for ( const wxChar
*p
= _T("Hello, stream!"); *p
; p
++ )
2864 memOutStream
.PutC(*p
);
2867 wxPrintf(_T("Final out stream offset: %lu\n"),
2868 (unsigned long)memOutStream
.TellO());
2870 wxPuts(_T("*** Testing wxMemoryInputStream ***"));
2873 size_t len
= memOutStream
.CopyTo(buf
, WXSIZEOF(buf
));
2875 wxMemoryInputStream
memInpStream(buf
, len
);
2876 wxPrintf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
2877 while ( !memInpStream
.Eof() )
2879 wxPutchar(memInpStream
.GetC());
2882 wxPuts(_T("\n*** wxMemoryInputStream test done ***"));
2885 #endif // TEST_STREAMS
2887 // ----------------------------------------------------------------------------
2889 // ----------------------------------------------------------------------------
2893 #include "wx/stopwatch.h"
2894 #include "wx/utils.h"
2896 static void TestStopWatch()
2898 wxPuts(_T("*** Testing wxStopWatch ***\n"));
2902 wxPrintf(_T("Initially paused, after 2 seconds time is..."));
2905 wxPrintf(_T("\t%ldms\n"), sw
.Time());
2907 wxPrintf(_T("Resuming stopwatch and sleeping 3 seconds..."));
2911 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2914 wxPrintf(_T("Pausing agan and sleeping 2 more seconds..."));
2917 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2920 wxPrintf(_T("Finally resuming and sleeping 2 more seconds..."));
2923 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2926 wxPuts(_T("\nChecking for 'backwards clock' bug..."));
2927 for ( size_t n
= 0; n
< 70; n
++ )
2931 for ( size_t m
= 0; m
< 100000; m
++ )
2933 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
2935 wxPuts(_T("\ntime is negative - ERROR!"));
2943 wxPuts(_T(", ok."));
2946 #include "wx/timer.h"
2947 #include "wx/evtloop.h"
2951 wxPuts(_T("*** Testing wxTimer ***\n"));
2953 class MyTimer
: public wxTimer
2956 MyTimer() : wxTimer() { m_num
= 0; }
2958 virtual void Notify()
2960 wxPrintf(_T("%d"), m_num
++);
2964 wxPrintf(_T("... exiting the event loop"));
2967 wxEventLoop::GetActive()->Exit(0);
2968 wxPuts(_T(", ok."));
2986 #endif // TEST_TIMER
2988 // ----------------------------------------------------------------------------
2990 // ----------------------------------------------------------------------------
2994 #include "wx/vcard.h"
2996 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
2999 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
3002 wxPrintf(_T("%s%s"),
3003 wxString(_T('\t'), level
).c_str(),
3004 vcObj
->GetName().c_str());
3007 switch ( vcObj
->GetType() )
3009 case wxVCardObject::String
:
3010 case wxVCardObject::UString
:
3013 vcObj
->GetValue(&val
);
3014 value
<< _T('"') << val
<< _T('"');
3018 case wxVCardObject::Int
:
3021 vcObj
->GetValue(&i
);
3022 value
.Printf(_T("%u"), i
);
3026 case wxVCardObject::Long
:
3029 vcObj
->GetValue(&l
);
3030 value
.Printf(_T("%lu"), l
);
3034 case wxVCardObject::None
:
3037 case wxVCardObject::Object
:
3038 value
= _T("<node>");
3042 value
= _T("<unknown value type>");
3046 wxPrintf(_T(" = %s"), value
.c_str());
3049 DumpVObject(level
+ 1, *vcObj
);
3052 vcObj
= vcard
.GetNextProp(&cookie
);
3056 static void DumpVCardAddresses(const wxVCard
& vcard
)
3058 wxPuts(_T("\nShowing all addresses from vCard:\n"));
3062 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3066 int flags
= addr
->GetFlags();
3067 if ( flags
& wxVCardAddress::Domestic
)
3069 flagsStr
<< _T("domestic ");
3071 if ( flags
& wxVCardAddress::Intl
)
3073 flagsStr
<< _T("international ");
3075 if ( flags
& wxVCardAddress::Postal
)
3077 flagsStr
<< _T("postal ");
3079 if ( flags
& wxVCardAddress::Parcel
)
3081 flagsStr
<< _T("parcel ");
3083 if ( flags
& wxVCardAddress::Home
)
3085 flagsStr
<< _T("home ");
3087 if ( flags
& wxVCardAddress::Work
)
3089 flagsStr
<< _T("work ");
3092 wxPrintf(_T("Address %u:\n")
3094 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3097 addr
->GetPostOffice().c_str(),
3098 addr
->GetExtAddress().c_str(),
3099 addr
->GetStreet().c_str(),
3100 addr
->GetLocality().c_str(),
3101 addr
->GetRegion().c_str(),
3102 addr
->GetPostalCode().c_str(),
3103 addr
->GetCountry().c_str()
3107 addr
= vcard
.GetNextAddress(&cookie
);
3111 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
3113 wxPuts(_T("\nShowing all phone numbers from vCard:\n"));
3117 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
3121 int flags
= phone
->GetFlags();
3122 if ( flags
& wxVCardPhoneNumber::Voice
)
3124 flagsStr
<< _T("voice ");
3126 if ( flags
& wxVCardPhoneNumber::Fax
)
3128 flagsStr
<< _T("fax ");
3130 if ( flags
& wxVCardPhoneNumber::Cellular
)
3132 flagsStr
<< _T("cellular ");
3134 if ( flags
& wxVCardPhoneNumber::Modem
)
3136 flagsStr
<< _T("modem ");
3138 if ( flags
& wxVCardPhoneNumber::Home
)
3140 flagsStr
<< _T("home ");
3142 if ( flags
& wxVCardPhoneNumber::Work
)
3144 flagsStr
<< _T("work ");
3147 wxPrintf(_T("Phone number %u:\n")
3152 phone
->GetNumber().c_str()
3156 phone
= vcard
.GetNextPhoneNumber(&cookie
);
3160 static void TestVCardRead()
3162 wxPuts(_T("*** Testing wxVCard reading ***\n"));
3164 wxVCard
vcard(_T("vcard.vcf"));
3165 if ( !vcard
.IsOk() )
3167 wxPuts(_T("ERROR: couldn't load vCard."));
3171 // read individual vCard properties
3172 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
3176 vcObj
->GetValue(&value
);
3181 value
= _T("<none>");
3184 wxPrintf(_T("Full name retrieved directly: %s\n"), value
.c_str());
3187 if ( !vcard
.GetFullName(&value
) )
3189 value
= _T("<none>");
3192 wxPrintf(_T("Full name from wxVCard API: %s\n"), value
.c_str());
3194 // now show how to deal with multiply occurring properties
3195 DumpVCardAddresses(vcard
);
3196 DumpVCardPhoneNumbers(vcard
);
3198 // and finally show all
3199 wxPuts(_T("\nNow dumping the entire vCard:\n")
3200 "-----------------------------\n");
3202 DumpVObject(0, vcard
);
3206 static void TestVCardWrite()
3208 wxPuts(_T("*** Testing wxVCard writing ***\n"));
3211 if ( !vcard
.IsOk() )
3213 wxPuts(_T("ERROR: couldn't create vCard."));
3218 vcard
.SetName("Zeitlin", "Vadim");
3219 vcard
.SetFullName("Vadim Zeitlin");
3220 vcard
.SetOrganization("wxWidgets", "R&D");
3222 // just dump the vCard back
3223 wxPuts(_T("Entire vCard follows:\n"));
3224 wxPuts(vcard
.Write());
3228 #endif // TEST_VCARD
3230 // ----------------------------------------------------------------------------
3232 // ----------------------------------------------------------------------------
3234 #if !defined(__WIN32__) || !wxUSE_FSVOLUME
3240 #include "wx/volume.h"
3242 static const wxChar
*volumeKinds
[] =
3248 _T("network volume"),
3252 static void TestFSVolume()
3254 wxPuts(_T("*** Testing wxFSVolume class ***"));
3256 wxArrayString volumes
= wxFSVolume::GetVolumes();
3257 size_t count
= volumes
.GetCount();
3261 wxPuts(_T("ERROR: no mounted volumes?"));
3265 wxPrintf(_T("%u mounted volumes found:\n"), count
);
3267 for ( size_t n
= 0; n
< count
; n
++ )
3269 wxFSVolume
vol(volumes
[n
]);
3272 wxPuts(_T("ERROR: couldn't create volume"));
3276 wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
3278 vol
.GetDisplayName().c_str(),
3279 vol
.GetName().c_str(),
3280 volumeKinds
[vol
.GetKind()],
3281 vol
.IsWritable() ? _T("rw") : _T("ro"),
3282 vol
.GetFlags() & wxFS_VOL_REMOVABLE
? _T("removable")
3287 #endif // TEST_VOLUME
3289 // ----------------------------------------------------------------------------
3290 // wide char and Unicode support
3291 // ----------------------------------------------------------------------------
3295 #include "wx/strconv.h"
3296 #include "wx/fontenc.h"
3297 #include "wx/encconv.h"
3298 #include "wx/buffer.h"
3300 static const unsigned char utf8koi8r
[] =
3302 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
3303 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
3304 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
3305 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
3306 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
3307 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
3308 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
3311 static const unsigned char utf8iso8859_1
[] =
3313 0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e,
3314 0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65,
3315 0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65,
3316 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65,
3317 0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0
3320 static const unsigned char utf8Invalid
[] =
3322 0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30,
3323 0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6,
3324 0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88,
3325 0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70,
3329 static const struct Utf8Data
3331 const unsigned char *text
;
3333 const wxChar
*charset
;
3334 wxFontEncoding encoding
;
3337 { utf8Invalid
, WXSIZEOF(utf8Invalid
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3338 { utf8koi8r
, WXSIZEOF(utf8koi8r
), _T("koi8-r"), wxFONTENCODING_KOI8
},
3339 { utf8iso8859_1
, WXSIZEOF(utf8iso8859_1
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3342 static void TestUtf8()
3344 wxPuts(_T("*** Testing UTF8 support ***\n"));
3349 for ( size_t n
= 0; n
< WXSIZEOF(utf8data
); n
++ )
3351 const Utf8Data
& u8d
= utf8data
[n
];
3352 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)u8d
.text
,
3353 WXSIZEOF(wbuf
)) == (size_t)-1 )
3355 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3359 wxCSConv
conv(u8d
.charset
);
3360 if ( conv
.WC2MB(buf
, wbuf
, WXSIZEOF(buf
)) == (size_t)-1 )
3362 wxPrintf(_T("ERROR: conversion to %s failed.\n"), u8d
.charset
);
3366 wxPrintf(_T("String in %s: %s\n"), u8d
.charset
, buf
);
3370 wxString
s(wxConvUTF8
.cMB2WC((const char *)u8d
.text
));
3372 s
= _T("<< conversion failed >>");
3373 wxPrintf(_T("String in current cset: %s\n"), s
.c_str());
3377 wxPuts(wxEmptyString
);
3380 static void TestEncodingConverter()
3382 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
3384 // using wxEncodingConverter should give the same result as above
3387 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)utf8koi8r
,
3388 WXSIZEOF(utf8koi8r
)) == (size_t)-1 )
3390 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3394 wxEncodingConverter ec
;
3395 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
3396 ec
.Convert(wbuf
, buf
);
3397 wxPrintf(_T("The same KOI8-R string using wxEC: %s\n"), buf
);
3400 wxPuts(wxEmptyString
);
3403 #endif // TEST_WCHAR
3405 // ----------------------------------------------------------------------------
3407 // ----------------------------------------------------------------------------
3411 #include "wx/filesys.h"
3412 #include "wx/fs_zip.h"
3413 #include "wx/zipstrm.h"
3415 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
3417 static void TestZipStreamRead()
3419 wxPuts(_T("*** Testing ZIP reading ***\n"));
3421 static const wxString filename
= _T("foo");
3422 wxZipInputStream
istr(TESTFILE_ZIP
, filename
);
3423 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
3425 wxPrintf(_T("Dumping the file '%s':\n"), filename
.c_str());
3426 while ( !istr
.Eof() )
3428 wxPutchar(istr
.GetC());
3432 wxPuts(_T("\n----- done ------"));
3435 static void DumpZipDirectory(wxFileSystem
& fs
,
3436 const wxString
& dir
,
3437 const wxString
& indent
)
3439 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
3440 TESTFILE_ZIP
, dir
.c_str());
3441 wxString wildcard
= prefix
+ _T("/*");
3443 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
3444 while ( !dirname
.empty() )
3446 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
3448 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3453 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
3455 DumpZipDirectory(fs
, dirname
,
3456 indent
+ wxString(_T(' '), 4));
3458 dirname
= fs
.FindNext();
3461 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
3462 while ( !filename
.empty() )
3464 if ( !filename
.StartsWith(prefix
, &filename
) )
3466 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3471 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
3473 filename
= fs
.FindNext();
3477 static void TestZipFileSystem()
3479 wxPuts(_T("*** Testing ZIP file system ***\n"));
3481 wxFileSystem::AddHandler(new wxZipFSHandler
);
3483 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
3485 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
3490 // ----------------------------------------------------------------------------
3492 // ----------------------------------------------------------------------------
3494 #ifdef TEST_DATETIME
3496 #include "wx/math.h"
3497 #include "wx/datetime.h"
3499 // this test miscellaneous static wxDateTime functions
3503 static void TestTimeStatic()
3505 wxPuts(_T("\n*** wxDateTime static methods test ***"));
3507 // some info about the current date
3508 int year
= wxDateTime::GetCurrentYear();
3509 wxPrintf(_T("Current year %d is %sa leap one and has %d days.\n"),
3511 wxDateTime::IsLeapYear(year
) ? "" : "not ",
3512 wxDateTime::GetNumberOfDays(year
));
3514 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
3515 wxPrintf(_T("Current month is '%s' ('%s') and it has %d days\n"),
3516 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
3517 wxDateTime::GetMonthName(month
).c_str(),
3518 wxDateTime::GetNumberOfDays(month
));
3521 // test time zones stuff
3522 static void TestTimeZones()
3524 wxPuts(_T("\n*** wxDateTime timezone test ***"));
3526 wxDateTime now
= wxDateTime::Now();
3528 wxPrintf(_T("Current GMT time:\t%s\n"), now
.Format(_T("%c"), wxDateTime::GMT0
).c_str());
3529 wxPrintf(_T("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::GMT0
).c_str());
3530 wxPrintf(_T("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::EST
).c_str());
3531 wxPrintf(_T("Current time in Paris:\t%s\n"), now
.Format(_T("%c"), wxDateTime::CET
).c_str());
3532 wxPrintf(_T(" Moscow:\t%s\n"), now
.Format(_T("%c"), wxDateTime::MSK
).c_str());
3533 wxPrintf(_T(" New York:\t%s\n"), now
.Format(_T("%c"), wxDateTime::EST
).c_str());
3535 wxPrintf(_T("%s\n"), wxDateTime::Now().Format(_T("Our timezone is %Z")).c_str());
3537 wxDateTime::Tm tm
= now
.GetTm();
3538 if ( wxDateTime(tm
) != now
)
3540 wxPrintf(_T("ERROR: got %s instead of %s\n"),
3541 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
3545 // test some minimal support for the dates outside the standard range
3546 static void TestTimeRange()
3548 wxPuts(_T("\n*** wxDateTime out-of-standard-range dates test ***"));
3550 static const wxChar
*fmt
= _T("%d-%b-%Y %H:%M:%S");
3552 wxPrintf(_T("Unix epoch:\t%s\n"),
3553 wxDateTime(2440587.5).Format(fmt
).c_str());
3554 wxPrintf(_T("Feb 29, 0: \t%s\n"),
3555 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
3556 wxPrintf(_T("JDN 0: \t%s\n"),
3557 wxDateTime(0.0).Format(fmt
).c_str());
3558 wxPrintf(_T("Jan 1, 1AD:\t%s\n"),
3559 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
3560 wxPrintf(_T("May 29, 2099:\t%s\n"),
3561 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
3564 // test DST calculations
3565 static void TestTimeDST()
3567 wxPuts(_T("\n*** wxDateTime DST test ***"));
3569 wxPrintf(_T("DST is%s in effect now.\n\n"),
3570 wxDateTime::Now().IsDST() ? wxEmptyString
: _T(" not"));
3572 for ( int year
= 1990; year
< 2005; year
++ )
3574 wxPrintf(_T("DST period in Europe for year %d: from %s to %s\n"),
3576 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
3577 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
3583 #if TEST_INTERACTIVE
3585 static void TestDateTimeInteractive()
3587 wxPuts(_T("\n*** interactive wxDateTime tests ***"));
3593 wxPrintf(_T("Enter a date: "));
3594 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
3597 // kill the last '\n'
3598 buf
[wxStrlen(buf
) - 1] = 0;
3601 const wxChar
*p
= dt
.ParseDate(buf
);
3604 wxPrintf(_T("ERROR: failed to parse the date '%s'.\n"), buf
);
3610 wxPrintf(_T("WARNING: parsed only first %u characters.\n"), p
- buf
);
3613 wxPrintf(_T("%s: day %u, week of month %u/%u, week of year %u\n"),
3614 dt
.Format(_T("%b %d, %Y")).c_str(),
3616 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
3617 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
3618 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
3621 wxPuts(_T("\n*** done ***"));
3624 #endif // TEST_INTERACTIVE
3628 static void TestTimeMS()
3630 wxPuts(_T("*** testing millisecond-resolution support in wxDateTime ***"));
3632 wxDateTime dt1
= wxDateTime::Now(),
3633 dt2
= wxDateTime::UNow();
3635 wxPrintf(_T("Now = %s\n"), dt1
.Format(_T("%H:%M:%S:%l")).c_str());
3636 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
3637 wxPrintf(_T("Dummy loop: "));
3638 for ( int i
= 0; i
< 6000; i
++ )
3640 //for ( int j = 0; j < 10; j++ )
3643 s
.Printf(_T("%g"), sqrt((float)i
));
3649 wxPuts(_T(", done"));
3652 dt2
= wxDateTime::UNow();
3653 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
3655 wxPrintf(_T("Loop executed in %s ms\n"), (dt2
- dt1
).Format(_T("%l")).c_str());
3657 wxPuts(_T("\n*** done ***"));
3660 static void TestTimeHolidays()
3662 wxPuts(_T("\n*** testing wxDateTimeHolidayAuthority ***\n"));
3664 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
3665 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
3666 dtEnd
= dtStart
.GetLastMonthDay();
3668 wxDateTimeArray hol
;
3669 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
3671 const wxChar
*format
= _T("%d-%b-%Y (%a)");
3673 wxPrintf(_T("All holidays between %s and %s:\n"),
3674 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
3676 size_t count
= hol
.GetCount();
3677 for ( size_t n
= 0; n
< count
; n
++ )
3679 wxPrintf(_T("\t%s\n"), hol
[n
].Format(format
).c_str());
3682 wxPuts(wxEmptyString
);
3685 static void TestTimeZoneBug()
3687 wxPuts(_T("\n*** testing for DST/timezone bug ***\n"));
3689 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
3690 for ( int i
= 0; i
< 31; i
++ )
3692 wxPrintf(_T("Date %s: week day %s.\n"),
3693 date
.Format(_T("%d-%m-%Y")).c_str(),
3694 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
3696 date
+= wxDateSpan::Day();
3699 wxPuts(wxEmptyString
);
3702 static void TestTimeSpanFormat()
3704 wxPuts(_T("\n*** wxTimeSpan tests ***"));
3706 static const wxChar
*formats
[] =
3708 _T("(default) %H:%M:%S"),
3709 _T("%E weeks and %D days"),
3710 _T("%l milliseconds"),
3711 _T("(with ms) %H:%M:%S:%l"),
3712 _T("100%% of minutes is %M"), // test "%%"
3713 _T("%D days and %H hours"),
3714 _T("or also %S seconds"),
3717 wxTimeSpan
ts1(1, 2, 3, 4),
3719 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
3721 wxPrintf(_T("ts1 = %s\tts2 = %s\n"),
3722 ts1
.Format(formats
[n
]).c_str(),
3723 ts2
.Format(formats
[n
]).c_str());
3726 wxPuts(wxEmptyString
);
3731 #endif // TEST_DATETIME
3733 // ----------------------------------------------------------------------------
3734 // wxTextInput/OutputStream
3735 // ----------------------------------------------------------------------------
3737 #ifdef TEST_TEXTSTREAM
3739 #include "wx/txtstrm.h"
3740 #include "wx/wfstream.h"
3742 static void TestTextInputStream()
3744 wxPuts(_T("\n*** wxTextInputStream test ***"));
3746 wxString filename
= _T("testdata.fc");
3747 wxFileInputStream
fsIn(filename
);
3750 wxPuts(_T("ERROR: couldn't open file."));
3754 wxTextInputStream
tis(fsIn
);
3759 const wxString s
= tis
.ReadLine();
3761 // line could be non empty if the last line of the file isn't
3762 // terminated with EOL
3763 if ( fsIn
.Eof() && s
.empty() )
3766 wxPrintf(_T("Line %d: %s\n"), line
++, s
.c_str());
3771 #endif // TEST_TEXTSTREAM
3773 // ----------------------------------------------------------------------------
3775 // ----------------------------------------------------------------------------
3779 #include "wx/thread.h"
3781 static size_t gs_counter
= (size_t)-1;
3782 static wxCriticalSection gs_critsect
;
3783 static wxSemaphore gs_cond
;
3785 class MyJoinableThread
: public wxThread
3788 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
3789 { m_n
= n
; Create(); }
3791 // thread execution starts here
3792 virtual ExitCode
Entry();
3798 wxThread::ExitCode
MyJoinableThread::Entry()
3800 unsigned long res
= 1;
3801 for ( size_t n
= 1; n
< m_n
; n
++ )
3805 // it's a loooong calculation :-)
3809 return (ExitCode
)res
;
3812 class MyDetachedThread
: public wxThread
3815 MyDetachedThread(size_t n
, wxChar ch
)
3819 m_cancelled
= false;
3824 // thread execution starts here
3825 virtual ExitCode
Entry();
3828 virtual void OnExit();
3831 size_t m_n
; // number of characters to write
3832 wxChar m_ch
; // character to write
3834 bool m_cancelled
; // false if we exit normally
3837 wxThread::ExitCode
MyDetachedThread::Entry()
3840 wxCriticalSectionLocker
lock(gs_critsect
);
3841 if ( gs_counter
== (size_t)-1 )
3847 for ( size_t n
= 0; n
< m_n
; n
++ )
3849 if ( TestDestroy() )
3859 wxThread::Sleep(100);
3865 void MyDetachedThread::OnExit()
3867 wxLogTrace(_T("thread"), _T("Thread %ld is in OnExit"), GetId());
3869 wxCriticalSectionLocker
lock(gs_critsect
);
3870 if ( !--gs_counter
&& !m_cancelled
)
3874 static void TestDetachedThreads()
3876 wxPuts(_T("\n*** Testing detached threads ***"));
3878 static const size_t nThreads
= 3;
3879 MyDetachedThread
*threads
[nThreads
];
3881 for ( n
= 0; n
< nThreads
; n
++ )
3883 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
3886 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
3887 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
3889 for ( n
= 0; n
< nThreads
; n
++ )
3894 // wait until all threads terminate
3897 wxPuts(wxEmptyString
);
3900 static void TestJoinableThreads()
3902 wxPuts(_T("\n*** Testing a joinable thread (a loooong calculation...) ***"));
3904 // calc 10! in the background
3905 MyJoinableThread
thread(10);
3908 wxPrintf(_T("\nThread terminated with exit code %lu.\n"),
3909 (unsigned long)thread
.Wait());
3912 static void TestThreadSuspend()
3914 wxPuts(_T("\n*** Testing thread suspend/resume functions ***"));
3916 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
3920 // this is for this demo only, in a real life program we'd use another
3921 // condition variable which would be signaled from wxThread::Entry() to
3922 // tell us that the thread really started running - but here just wait a
3923 // bit and hope that it will be enough (the problem is, of course, that
3924 // the thread might still not run when we call Pause() which will result
3926 wxThread::Sleep(300);
3928 for ( size_t n
= 0; n
< 3; n
++ )
3932 wxPuts(_T("\nThread suspended"));
3935 // don't sleep but resume immediately the first time
3936 wxThread::Sleep(300);
3938 wxPuts(_T("Going to resume the thread"));
3943 wxPuts(_T("Waiting until it terminates now"));
3945 // wait until the thread terminates
3948 wxPuts(wxEmptyString
);
3951 static void TestThreadDelete()
3953 // As above, using Sleep() is only for testing here - we must use some
3954 // synchronisation object instead to ensure that the thread is still
3955 // running when we delete it - deleting a detached thread which already
3956 // terminated will lead to a crash!
3958 wxPuts(_T("\n*** Testing thread delete function ***"));
3960 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
3964 wxPuts(_T("\nDeleted a thread which didn't start to run yet."));
3966 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
3970 wxThread::Sleep(300);
3974 wxPuts(_T("\nDeleted a running thread."));
3976 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
3980 wxThread::Sleep(300);
3986 wxPuts(_T("\nDeleted a sleeping thread."));
3988 MyJoinableThread
thread3(20);
3993 wxPuts(_T("\nDeleted a joinable thread."));
3995 MyJoinableThread
thread4(2);
3998 wxThread::Sleep(300);
4002 wxPuts(_T("\nDeleted a joinable thread which already terminated."));
4004 wxPuts(wxEmptyString
);
4007 class MyWaitingThread
: public wxThread
4010 MyWaitingThread( wxMutex
*mutex
, wxCondition
*condition
)
4013 m_condition
= condition
;
4018 virtual ExitCode
Entry()
4020 wxPrintf(_T("Thread %lu has started running.\n"), GetId());
4025 wxPrintf(_T("Thread %lu starts to wait...\n"), GetId());
4029 m_condition
->Wait();
4032 wxPrintf(_T("Thread %lu finished to wait, exiting.\n"), GetId());
4040 wxCondition
*m_condition
;
4043 static void TestThreadConditions()
4046 wxCondition
condition(mutex
);
4048 // otherwise its difficult to understand which log messages pertain to
4050 //wxLogTrace(_T("thread"), _T("Local condition var is %08x, gs_cond = %08x"),
4051 // condition.GetId(), gs_cond.GetId());
4053 // create and launch threads
4054 MyWaitingThread
*threads
[10];
4057 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
4059 threads
[n
] = new MyWaitingThread( &mutex
, &condition
);
4062 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
4067 // wait until all threads run
4068 wxPuts(_T("Main thread is waiting for the other threads to start"));
4071 size_t nRunning
= 0;
4072 while ( nRunning
< WXSIZEOF(threads
) )
4078 wxPrintf(_T("Main thread: %u already running\n"), nRunning
);
4082 wxPuts(_T("Main thread: all threads started up."));
4085 wxThread::Sleep(500);
4088 // now wake one of them up
4089 wxPrintf(_T("Main thread: about to signal the condition.\n"));
4094 wxThread::Sleep(200);
4096 // wake all the (remaining) threads up, so that they can exit
4097 wxPrintf(_T("Main thread: about to broadcast the condition.\n"));
4099 condition
.Broadcast();
4101 // give them time to terminate (dirty!)
4102 wxThread::Sleep(500);
4105 #include "wx/utils.h"
4107 class MyExecThread
: public wxThread
4110 MyExecThread(const wxString
& command
) : wxThread(wxTHREAD_JOINABLE
),
4116 virtual ExitCode
Entry()
4118 return (ExitCode
)wxExecute(m_command
, wxEXEC_SYNC
);
4125 static void TestThreadExec()
4127 wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
4129 MyExecThread
thread(_T("true"));
4132 wxPrintf(_T("Main program exit code: %ld.\n"),
4133 wxExecute(_T("false"), wxEXEC_SYNC
));
4135 wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread
.Wait());
4139 #include "wx/datetime.h"
4141 class MySemaphoreThread
: public wxThread
4144 MySemaphoreThread(int i
, wxSemaphore
*sem
)
4145 : wxThread(wxTHREAD_JOINABLE
),
4152 virtual ExitCode
Entry()
4154 wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
4155 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4159 wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
4160 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4164 wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
4165 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4177 WX_DEFINE_ARRAY_PTR(wxThread
*, ArrayThreads
);
4179 static void TestSemaphore()
4181 wxPuts(_T("*** Testing wxSemaphore class. ***"));
4183 static const int SEM_LIMIT
= 3;
4185 wxSemaphore
sem(SEM_LIMIT
, SEM_LIMIT
);
4186 ArrayThreads threads
;
4188 for ( int i
= 0; i
< 3*SEM_LIMIT
; i
++ )
4190 threads
.Add(new MySemaphoreThread(i
, &sem
));
4191 threads
.Last()->Run();
4194 for ( size_t n
= 0; n
< threads
.GetCount(); n
++ )
4201 #endif // TEST_THREADS
4203 // ----------------------------------------------------------------------------
4205 // ----------------------------------------------------------------------------
4207 #ifdef TEST_SNGLINST
4208 #include "wx/snglinst.h"
4209 #endif // TEST_SNGLINST
4211 int main(int argc
, char **argv
)
4214 wxChar
**wxArgv
= new wxChar
*[argc
+ 1];
4219 for (n
= 0; n
< argc
; n
++ )
4221 wxMB2WXbuf warg
= wxConvertMB2WX(argv
[n
]);
4222 wxArgv
[n
] = wxStrdup(warg
);
4227 #else // !wxUSE_UNICODE
4229 #endif // wxUSE_UNICODE/!wxUSE_UNICODE
4231 wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE
, "program");
4233 wxInitializer initializer
;
4236 fprintf(stderr
, "Failed to initialize the wxWidgets library, aborting.");
4241 #ifdef TEST_SNGLINST
4242 wxSingleInstanceChecker checker
;
4243 if ( checker
.Create(_T(".wxconsole.lock")) )
4245 if ( checker
.IsAnotherRunning() )
4247 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
4252 // wait some time to give time to launch another instance
4253 wxPrintf(_T("Press \"Enter\" to continue..."));
4256 else // failed to create
4258 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
4260 #endif // TEST_SNGLINST
4263 TestCmdLineConvert();
4265 #if wxUSE_CMDLINE_PARSER
4266 static const wxCmdLineEntryDesc cmdLineDesc
[] =
4268 { wxCMD_LINE_SWITCH
, _T("h"), _T("help"), _T("show this help message"),
4269 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
4270 { wxCMD_LINE_SWITCH
, _T("v"), _T("verbose"), _T("be verbose") },
4271 { wxCMD_LINE_SWITCH
, _T("q"), _T("quiet"), _T("be quiet") },
4273 { wxCMD_LINE_OPTION
, _T("o"), _T("output"), _T("output file") },
4274 { wxCMD_LINE_OPTION
, _T("i"), _T("input"), _T("input dir") },
4275 { wxCMD_LINE_OPTION
, _T("s"), _T("size"), _T("output block size"),
4276 wxCMD_LINE_VAL_NUMBER
},
4277 { wxCMD_LINE_OPTION
, _T("d"), _T("date"), _T("output file date"),
4278 wxCMD_LINE_VAL_DATE
},
4280 { wxCMD_LINE_PARAM
, NULL
, NULL
, _T("input file"),
4281 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
4286 wxCmdLineParser
parser(cmdLineDesc
, argc
, wxArgv
);
4288 parser
.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
4289 wxCMD_LINE_VAL_STRING
,
4290 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
4292 switch ( parser
.Parse() )
4295 wxLogMessage(_T("Help was given, terminating."));
4299 ShowCmdLine(parser
);
4303 wxLogMessage(_T("Syntax error detected, aborting."));
4306 #endif // wxUSE_CMDLINE_PARSER
4308 #endif // TEST_CMDLINE
4320 TestDllListLoaded();
4321 #endif // TEST_DYNLIB
4325 #endif // TEST_ENVIRON
4329 #endif // TEST_EXECUTE
4331 #ifdef TEST_FILECONF
4333 #endif // TEST_FILECONF
4337 #endif // TEST_LOCALE
4340 wxPuts(_T("*** Testing wxLog ***"));
4343 for ( size_t n
= 0; n
< 8000; n
++ )
4345 s
<< (wxChar
)(_T('A') + (n
% 26));
4348 wxLogWarning(_T("The length of the string is %lu"),
4349 (unsigned long)s
.length());
4352 msg
.Printf(_T("A very very long message: '%s', the end!\n"), s
.c_str());
4354 // this one shouldn't be truncated
4357 // but this one will because log functions use fixed size buffer
4358 // (note that it doesn't need '\n' at the end neither - will be added
4360 wxLogMessage(_T("A very very long message 2: '%s', the end!"), s
.c_str());
4370 #ifdef TEST_FILENAME
4373 TestFileNameDirManip();
4374 TestFileNameComparison();
4375 TestFileNameOperations();
4376 #endif // TEST_FILENAME
4378 #ifdef TEST_FILETIME
4383 #endif // TEST_FILETIME
4386 wxLog::AddTraceMask(FTP_TRACE_MASK
);
4387 if ( TestFtpConnect() )
4397 #if TEST_INTERACTIVE
4398 TestFtpInteractive();
4401 //else: connecting to the FTP server failed
4409 wxLog::AddTraceMask(_T("mime"));
4414 TestMimeAssociate();
4418 #ifdef TEST_INFO_FUNCTIONS
4423 #if TEST_INTERACTIVE
4426 #endif // TEST_INFO_FUNCTIONS
4428 #ifdef TEST_PATHLIST
4430 #endif // TEST_PATHLIST
4438 #endif // TEST_PRINTF
4445 #endif // TEST_REGCONF
4447 #if defined TEST_REGEX && TEST_INTERACTIVE
4448 TestRegExInteractive();
4449 #endif // defined TEST_REGEX && TEST_INTERACTIVE
4451 #ifdef TEST_REGISTRY
4453 TestRegistryAssociation();
4454 #endif // TEST_REGISTRY
4459 #endif // TEST_SOCKETS
4466 #endif // TEST_STREAMS
4468 #ifdef TEST_TEXTSTREAM
4469 TestTextInputStream();
4470 #endif // TEST_TEXTSTREAM
4473 int nCPUs
= wxThread::GetCPUCount();
4474 wxPrintf(_T("This system has %d CPUs\n"), nCPUs
);
4476 wxThread::SetConcurrency(nCPUs
);
4478 TestJoinableThreads();
4481 TestJoinableThreads();
4482 TestDetachedThreads();
4483 TestThreadSuspend();
4485 TestThreadConditions();
4489 #endif // TEST_THREADS
4494 #endif // TEST_TIMER
4496 #ifdef TEST_DATETIME
4503 TestTimeSpanFormat();
4509 #if TEST_INTERACTIVE
4510 TestDateTimeInteractive();
4512 #endif // TEST_DATETIME
4514 #ifdef TEST_SCOPEGUARD
4518 #ifdef TEST_STACKWALKER
4519 #if wxUSE_STACKWALKER
4520 TestStackWalk(argv
[0]);
4522 #endif // TEST_STACKWALKER
4524 #ifdef TEST_STDPATHS
4525 TestStandardPaths();
4529 wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
4531 #endif // TEST_USLEEP
4536 #endif // TEST_VCARD
4540 #endif // TEST_VOLUME
4544 TestEncodingConverter();
4545 #endif // TEST_WCHAR
4548 TestZipStreamRead();
4549 TestZipFileSystem();
4554 for ( int n
= 0; n
< argc
; n
++ )
4559 #endif // wxUSE_UNICODE