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)
91 #define TEST_INFO_FUNCTIONS
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("Input 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
);
725 // ----------------------------------------------------------------------------
727 // ----------------------------------------------------------------------------
731 #include "wx/confbase.h"
732 #include "wx/fileconf.h"
734 static const struct FileConfTestData
736 const wxChar
*name
; // value name
737 const wxChar
*value
; // the value from the file
740 { _T("value1"), _T("one") },
741 { _T("value2"), _T("two") },
742 { _T("novalue"), _T("default") },
745 static void TestFileConfRead()
747 wxPuts(_T("*** testing wxFileConfig loading/reading ***"));
749 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
750 _T("testdata.fc"), wxEmptyString
,
751 wxCONFIG_USE_RELATIVE_PATH
);
753 // test simple reading
754 wxPuts(_T("\nReading config file:"));
755 wxString
defValue(_T("default")), value
;
756 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
758 const FileConfTestData
& data
= fcTestData
[n
];
759 value
= fileconf
.Read(data
.name
, defValue
);
760 wxPrintf(_T("\t%s = %s "), data
.name
, value
.c_str());
761 if ( value
== data
.value
)
767 wxPrintf(_T("(ERROR: should be %s)\n"), data
.value
);
771 // test enumerating the entries
772 wxPuts(_T("\nEnumerating all root entries:"));
775 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
778 wxPrintf(_T("\t%s = %s\n"),
780 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
782 cont
= fileconf
.GetNextEntry(name
, dummy
);
785 static const wxChar
*testEntry
= _T("TestEntry");
786 wxPrintf(_T("\nTesting deletion of newly created \"Test\" entry: "));
787 fileconf
.Write(testEntry
, _T("A value"));
788 fileconf
.DeleteEntry(testEntry
);
789 wxPrintf(fileconf
.HasEntry(testEntry
) ? _T("ERROR\n") : _T("ok\n"));
792 #endif // TEST_FILECONF
794 // ----------------------------------------------------------------------------
796 // ----------------------------------------------------------------------------
800 #include "wx/filename.h"
803 static void DumpFileName(const wxChar
*desc
, const wxFileName
& fn
)
807 wxString full
= fn
.GetFullPath();
809 wxString vol
, path
, name
, ext
;
810 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
812 wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
813 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
815 wxFileName::SplitPath(full
, &path
, &name
, &ext
);
816 wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
817 path
.c_str(), name
.c_str(), ext
.c_str());
819 wxPrintf(_T("path is also:\t'%s'\n"), fn
.GetPath().c_str());
820 wxPrintf(_T("with volume: \t'%s'\n"),
821 fn
.GetPath(wxPATH_GET_VOLUME
).c_str());
822 wxPrintf(_T("with separator:\t'%s'\n"),
823 fn
.GetPath(wxPATH_GET_SEPARATOR
).c_str());
824 wxPrintf(_T("with both: \t'%s'\n"),
825 fn
.GetPath(wxPATH_GET_SEPARATOR
| wxPATH_GET_VOLUME
).c_str());
827 wxPuts(_T("The directories in the path are:"));
828 wxArrayString dirs
= fn
.GetDirs();
829 size_t count
= dirs
.GetCount();
830 for ( size_t n
= 0; n
< count
; n
++ )
832 wxPrintf(_T("\t%u: %s\n"), n
, dirs
[n
].c_str());
837 static void TestFileNameTemp()
839 wxPuts(_T("*** testing wxFileName temp file creation ***"));
841 static const wxChar
*tmpprefixes
[] =
849 _T("/tmp/foo/bar"), // this one must be an error
853 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
855 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
858 // "error" is not in upper case because it may be ok
859 wxPrintf(_T("Prefix '%s'\t-> error\n"), tmpprefixes
[n
]);
863 wxPrintf(_T("Prefix '%s'\t-> temp file '%s'\n"),
864 tmpprefixes
[n
], path
.c_str());
866 if ( !wxRemoveFile(path
) )
868 wxLogWarning(_T("Failed to remove temp file '%s'"),
875 static void TestFileNameDirManip()
877 // TODO: test AppendDir(), RemoveDir(), ...
880 static void TestFileNameComparison()
885 static void TestFileNameOperations()
890 static void TestFileNameCwd()
895 #endif // TEST_FILENAME
897 // ----------------------------------------------------------------------------
898 // wxFileName time functions
899 // ----------------------------------------------------------------------------
903 #include "wx/filename.h"
904 #include "wx/datetime.h"
906 static void TestFileGetTimes()
908 wxFileName
fn(_T("testdata.fc"));
910 wxDateTime dtAccess
, dtMod
, dtCreate
;
911 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtCreate
) )
913 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
917 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
919 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
920 wxPrintf(_T("Creation: \t%s\n"), dtCreate
.Format(fmt
).c_str());
921 wxPrintf(_T("Last read: \t%s\n"), dtAccess
.Format(fmt
).c_str());
922 wxPrintf(_T("Last write: \t%s\n"), dtMod
.Format(fmt
).c_str());
927 static void TestFileSetTimes()
929 wxFileName
fn(_T("testdata.fc"));
933 wxPrintf(_T("ERROR: Touch() failed.\n"));
938 #endif // TEST_FILETIME
940 // ----------------------------------------------------------------------------
942 // ----------------------------------------------------------------------------
947 #include "wx/utils.h" // for wxSetEnv
949 static wxLocale
gs_localeDefault(wxLANGUAGE_ENGLISH
);
951 // find the name of the language from its value
952 static const wxChar
*GetLangName(int lang
)
954 static const wxChar
*languageNames
[] =
964 _T("ARABIC_ALGERIA"),
965 _T("ARABIC_BAHRAIN"),
970 _T("ARABIC_LEBANON"),
972 _T("ARABIC_MOROCCO"),
975 _T("ARABIC_SAUDI_ARABIA"),
978 _T("ARABIC_TUNISIA"),
985 _T("AZERI_CYRILLIC"),
1000 _T("CHINESE_SIMPLIFIED"),
1001 _T("CHINESE_TRADITIONAL"),
1002 _T("CHINESE_HONGKONG"),
1003 _T("CHINESE_MACAU"),
1004 _T("CHINESE_SINGAPORE"),
1005 _T("CHINESE_TAIWAN"),
1011 _T("DUTCH_BELGIAN"),
1015 _T("ENGLISH_AUSTRALIA"),
1016 _T("ENGLISH_BELIZE"),
1017 _T("ENGLISH_BOTSWANA"),
1018 _T("ENGLISH_CANADA"),
1019 _T("ENGLISH_CARIBBEAN"),
1020 _T("ENGLISH_DENMARK"),
1022 _T("ENGLISH_JAMAICA"),
1023 _T("ENGLISH_NEW_ZEALAND"),
1024 _T("ENGLISH_PHILIPPINES"),
1025 _T("ENGLISH_SOUTH_AFRICA"),
1026 _T("ENGLISH_TRINIDAD"),
1027 _T("ENGLISH_ZIMBABWE"),
1035 _T("FRENCH_BELGIAN"),
1036 _T("FRENCH_CANADIAN"),
1037 _T("FRENCH_LUXEMBOURG"),
1038 _T("FRENCH_MONACO"),
1044 _T("GERMAN_AUSTRIAN"),
1045 _T("GERMAN_BELGIUM"),
1046 _T("GERMAN_LIECHTENSTEIN"),
1047 _T("GERMAN_LUXEMBOURG"),
1065 _T("ITALIAN_SWISS"),
1070 _T("KASHMIRI_INDIA"),
1088 _T("MALAY_BRUNEI_DARUSSALAM"),
1089 _T("MALAY_MALAYSIA"),
1099 _T("NORWEGIAN_BOKMAL"),
1100 _T("NORWEGIAN_NYNORSK"),
1107 _T("PORTUGUESE_BRAZILIAN"),
1110 _T("RHAETO_ROMANCE"),
1113 _T("RUSSIAN_UKRAINE"),
1119 _T("SERBIAN_CYRILLIC"),
1120 _T("SERBIAN_LATIN"),
1121 _T("SERBO_CROATIAN"),
1132 _T("SPANISH_ARGENTINA"),
1133 _T("SPANISH_BOLIVIA"),
1134 _T("SPANISH_CHILE"),
1135 _T("SPANISH_COLOMBIA"),
1136 _T("SPANISH_COSTA_RICA"),
1137 _T("SPANISH_DOMINICAN_REPUBLIC"),
1138 _T("SPANISH_ECUADOR"),
1139 _T("SPANISH_EL_SALVADOR"),
1140 _T("SPANISH_GUATEMALA"),
1141 _T("SPANISH_HONDURAS"),
1142 _T("SPANISH_MEXICAN"),
1143 _T("SPANISH_MODERN"),
1144 _T("SPANISH_NICARAGUA"),
1145 _T("SPANISH_PANAMA"),
1146 _T("SPANISH_PARAGUAY"),
1148 _T("SPANISH_PUERTO_RICO"),
1149 _T("SPANISH_URUGUAY"),
1151 _T("SPANISH_VENEZUELA"),
1155 _T("SWEDISH_FINLAND"),
1173 _T("URDU_PAKISTAN"),
1175 _T("UZBEK_CYRILLIC"),
1188 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1189 return languageNames
[lang
];
1191 return _T("INVALID");
1194 static void TestDefaultLang()
1196 wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
1198 static const wxChar
*langStrings
[] =
1200 NULL
, // system default
1207 _T("de_DE.iso88591"),
1209 _T("?"), // invalid lang spec
1210 _T("klingonese"), // I bet on some systems it does exist...
1213 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1214 wxLocale::GetSystemEncodingName().c_str(),
1215 wxLocale::GetSystemEncoding());
1217 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1219 const wxChar
*langStr
= langStrings
[n
];
1222 // FIXME: this doesn't do anything at all under Windows, we need
1223 // to create a new wxLocale!
1224 wxSetEnv(_T("LC_ALL"), langStr
);
1227 int lang
= gs_localeDefault
.GetSystemLanguage();
1228 wxPrintf(_T("Locale for '%s' is %s.\n"),
1229 langStr
? langStr
: _T("system default"), GetLangName(lang
));
1233 #endif // TEST_LOCALE
1235 // ----------------------------------------------------------------------------
1237 // ----------------------------------------------------------------------------
1241 #include "wx/mimetype.h"
1243 static void TestMimeEnum()
1245 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1247 wxArrayString mimetypes
;
1249 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1251 wxPrintf(_T("*** All %u known filetypes: ***\n"), count
);
1256 for ( size_t n
= 0; n
< count
; n
++ )
1258 wxFileType
*filetype
=
1259 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1262 wxPrintf(_T("nothing known about the filetype '%s'!\n"),
1263 mimetypes
[n
].c_str());
1267 filetype
->GetDescription(&desc
);
1268 filetype
->GetExtensions(exts
);
1270 filetype
->GetIcon(NULL
);
1273 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1276 extsAll
<< _T(", ");
1280 wxPrintf(_T("\t%s: %s (%s)\n"),
1281 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
1284 wxPuts(wxEmptyString
);
1287 static void TestMimeOverride()
1289 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
1291 static const wxChar
*mailcap
= _T("/tmp/mailcap");
1292 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
1294 if ( wxFile::Exists(mailcap
) )
1295 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
1297 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
1299 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
1302 if ( wxFile::Exists(mimetypes
) )
1303 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
1305 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
1307 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
1310 wxPuts(wxEmptyString
);
1313 static void TestMimeFilename()
1315 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
1317 static const wxChar
*filenames
[] =
1325 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1327 const wxString fname
= filenames
[n
];
1328 wxString ext
= fname
.AfterLast(_T('.'));
1329 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
1332 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
1337 if ( !ft
->GetDescription(&desc
) )
1338 desc
= _T("<no description>");
1341 if ( !ft
->GetOpenCommand(&cmd
,
1342 wxFileType::MessageParameters(fname
, wxEmptyString
)) )
1343 cmd
= _T("<no command available>");
1345 cmd
= wxString(_T('"')) + cmd
+ _T('"');
1347 wxPrintf(_T("To open %s (%s) do %s.\n"),
1348 fname
.c_str(), desc
.c_str(), cmd
.c_str());
1354 wxPuts(wxEmptyString
);
1357 static void TestMimeAssociate()
1359 wxPuts(_T("*** Testing creation of filetype association ***\n"));
1361 wxFileTypeInfo
ftInfo(
1362 _T("application/x-xyz"),
1363 _T("xyzview '%s'"), // open cmd
1364 _T(""), // print cmd
1365 _T("XYZ File"), // description
1366 _T(".xyz"), // extensions
1367 NULL
// end of extensions
1369 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
1371 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
1374 wxPuts(_T("ERROR: failed to create association!"));
1378 // TODO: read it back
1382 wxPuts(wxEmptyString
);
1387 // ----------------------------------------------------------------------------
1388 // module dependencies feature
1389 // ----------------------------------------------------------------------------
1393 #include "wx/module.h"
1395 class wxTestModule
: public wxModule
1398 virtual bool OnInit() { wxPrintf(_T("Load module: %s\n"), GetClassInfo()->GetClassName()); return true; }
1399 virtual void OnExit() { wxPrintf(_T("Unload module: %s\n"), GetClassInfo()->GetClassName()); }
1402 class wxTestModuleA
: public wxTestModule
1407 DECLARE_DYNAMIC_CLASS(wxTestModuleA
)
1410 class wxTestModuleB
: public wxTestModule
1415 DECLARE_DYNAMIC_CLASS(wxTestModuleB
)
1418 class wxTestModuleC
: public wxTestModule
1423 DECLARE_DYNAMIC_CLASS(wxTestModuleC
)
1426 class wxTestModuleD
: public wxTestModule
1431 DECLARE_DYNAMIC_CLASS(wxTestModuleD
)
1434 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleC
, wxModule
)
1435 wxTestModuleC::wxTestModuleC()
1437 AddDependency(CLASSINFO(wxTestModuleD
));
1440 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleA
, wxModule
)
1441 wxTestModuleA::wxTestModuleA()
1443 AddDependency(CLASSINFO(wxTestModuleB
));
1444 AddDependency(CLASSINFO(wxTestModuleD
));
1447 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleD
, wxModule
)
1448 wxTestModuleD::wxTestModuleD()
1452 IMPLEMENT_DYNAMIC_CLASS(wxTestModuleB
, wxModule
)
1453 wxTestModuleB::wxTestModuleB()
1455 AddDependency(CLASSINFO(wxTestModuleD
));
1456 AddDependency(CLASSINFO(wxTestModuleC
));
1459 #endif // TEST_MODULE
1461 // ----------------------------------------------------------------------------
1462 // misc information functions
1463 // ----------------------------------------------------------------------------
1465 #ifdef TEST_INFO_FUNCTIONS
1467 #include "wx/utils.h"
1469 static void TestDiskInfo()
1471 wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
1475 wxChar pathname
[128];
1476 wxPrintf(_T("\nEnter a directory name: "));
1477 if ( !wxFgets(pathname
, WXSIZEOF(pathname
), stdin
) )
1480 // kill the last '\n'
1481 pathname
[wxStrlen(pathname
) - 1] = 0;
1483 wxLongLong total
, free
;
1484 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
1486 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
1490 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
1491 (total
/ 1024).ToString().c_str(),
1492 (free
/ 1024).ToString().c_str(),
1498 static void TestOsInfo()
1500 wxPuts(_T("*** Testing OS info functions ***\n"));
1503 wxGetOsVersion(&major
, &minor
);
1504 wxPrintf(_T("Running under: %s, version %d.%d\n"),
1505 wxGetOsDescription().c_str(), major
, minor
);
1507 wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory().ToLong());
1509 wxPrintf(_T("Host name is %s (%s).\n"),
1510 wxGetHostName().c_str(), wxGetFullHostName().c_str());
1512 wxPuts(wxEmptyString
);
1515 static void TestPlatformInfo()
1517 wxPuts(_T("*** Testing wxPlatformInfo functions ***\n"));
1519 // get this platform
1520 wxPlatformInfo plat
;
1522 wxPrintf(_T("Operating system family name is: %s\n"), plat
.GetOperatingSystemFamilyName().c_str());
1523 wxPrintf(_T("Operating system name is: %s\n"), plat
.GetOperatingSystemIdName().c_str());
1524 wxPrintf(_T("Port ID name is: %s\n"), plat
.GetPortIdName().c_str());
1525 wxPrintf(_T("Port ID short name is: %s\n"), plat
.GetPortIdShortName().c_str());
1526 wxPrintf(_T("Architecture is: %s\n"), plat
.GetArchName().c_str());
1527 wxPrintf(_T("Endianness is: %s\n"), plat
.GetEndiannessName().c_str());
1529 wxPuts(wxEmptyString
);
1532 static void TestUserInfo()
1534 wxPuts(_T("*** Testing user info functions ***\n"));
1536 wxPrintf(_T("User id is:\t%s\n"), wxGetUserId().c_str());
1537 wxPrintf(_T("User name is:\t%s\n"), wxGetUserName().c_str());
1538 wxPrintf(_T("Home dir is:\t%s\n"), wxGetHomeDir().c_str());
1539 wxPrintf(_T("Email address:\t%s\n"), wxGetEmailAddress().c_str());
1541 wxPuts(wxEmptyString
);
1544 #endif // TEST_INFO_FUNCTIONS
1546 // ----------------------------------------------------------------------------
1548 // ----------------------------------------------------------------------------
1550 #ifdef TEST_PATHLIST
1553 #define CMD_IN_PATH _T("ls")
1555 #define CMD_IN_PATH _T("command.com")
1558 static void TestPathList()
1560 wxPuts(_T("*** Testing wxPathList ***\n"));
1562 wxPathList pathlist
;
1563 pathlist
.AddEnvList(_T("PATH"));
1564 wxString path
= pathlist
.FindValidPath(CMD_IN_PATH
);
1567 wxPrintf(_T("ERROR: command not found in the path.\n"));
1571 wxPrintf(_T("Command found in the path as '%s'.\n"), path
.c_str());
1575 #endif // TEST_PATHLIST
1577 // ----------------------------------------------------------------------------
1578 // regular expressions
1579 // ----------------------------------------------------------------------------
1583 #include "wx/regex.h"
1585 static void TestRegExInteractive()
1587 wxPuts(_T("*** Testing RE interactively ***"));
1591 wxChar pattern
[128];
1592 wxPrintf(_T("\nEnter a pattern: "));
1593 if ( !wxFgets(pattern
, WXSIZEOF(pattern
), stdin
) )
1596 // kill the last '\n'
1597 pattern
[wxStrlen(pattern
) - 1] = 0;
1600 if ( !re
.Compile(pattern
) )
1608 wxPrintf(_T("Enter text to match: "));
1609 if ( !wxFgets(text
, WXSIZEOF(text
), stdin
) )
1612 // kill the last '\n'
1613 text
[wxStrlen(text
) - 1] = 0;
1615 if ( !re
.Matches(text
) )
1617 wxPrintf(_T("No match.\n"));
1621 wxPrintf(_T("Pattern matches at '%s'\n"), re
.GetMatch(text
).c_str());
1624 for ( size_t n
= 1; ; n
++ )
1626 if ( !re
.GetMatch(&start
, &len
, n
) )
1631 wxPrintf(_T("Subexpr %u matched '%s'\n"),
1632 n
, wxString(text
+ start
, len
).c_str());
1639 #endif // TEST_REGEX
1641 // ----------------------------------------------------------------------------
1643 // ----------------------------------------------------------------------------
1653 static void TestDbOpen()
1661 // ----------------------------------------------------------------------------
1663 // ----------------------------------------------------------------------------
1666 NB: this stuff was taken from the glibc test suite and modified to build
1667 in wxWidgets: if I read the copyright below properly, this shouldn't
1673 #ifdef wxTEST_PRINTF
1674 // use our functions from wxchar.cpp
1678 // NB: do _not_ use ATTRIBUTE_PRINTF here, we have some invalid formats
1679 // in the tests below
1680 int wxPrintf( const wxChar
*format
, ... );
1681 int wxSprintf( wxChar
*str
, const wxChar
*format
, ... );
1684 #include "wx/longlong.h"
1688 static void rfg1 (void);
1689 static void rfg2 (void);
1693 fmtchk (const wxChar
*fmt
)
1695 (void) wxPrintf(_T("%s:\t`"), fmt
);
1696 (void) wxPrintf(fmt
, 0x12);
1697 (void) wxPrintf(_T("'\n"));
1701 fmtst1chk (const wxChar
*fmt
)
1703 (void) wxPrintf(_T("%s:\t`"), fmt
);
1704 (void) wxPrintf(fmt
, 4, 0x12);
1705 (void) wxPrintf(_T("'\n"));
1709 fmtst2chk (const wxChar
*fmt
)
1711 (void) wxPrintf(_T("%s:\t`"), fmt
);
1712 (void) wxPrintf(fmt
, 4, 4, 0x12);
1713 (void) wxPrintf(_T("'\n"));
1716 /* This page is covered by the following copyright: */
1718 /* (C) Copyright C E Chew
1720 * Feel free to copy, use and distribute this software provided:
1722 * 1. you do not pretend that you wrote it
1723 * 2. you leave this copyright notice intact.
1727 * Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans.
1734 /* Formatted Output Test
1736 * This exercises the output formatting code.
1739 wxChar
*PointerNull
= NULL
;
1746 wxChar
*prefix
= buf
;
1749 wxPuts(_T("\nFormatted output test"));
1750 wxPrintf(_T("prefix 6d 6o 6x 6X 6u\n"));
1751 wxStrcpy(prefix
, _T("%"));
1752 for (i
= 0; i
< 2; i
++) {
1753 for (j
= 0; j
< 2; j
++) {
1754 for (k
= 0; k
< 2; k
++) {
1755 for (l
= 0; l
< 2; l
++) {
1756 wxStrcpy(prefix
, _T("%"));
1757 if (i
== 0) wxStrcat(prefix
, _T("-"));
1758 if (j
== 0) wxStrcat(prefix
, _T("+"));
1759 if (k
== 0) wxStrcat(prefix
, _T("#"));
1760 if (l
== 0) wxStrcat(prefix
, _T("0"));
1761 wxPrintf(_T("%5s |"), prefix
);
1762 wxStrcpy(tp
, prefix
);
1763 wxStrcat(tp
, _T("6d |"));
1765 wxStrcpy(tp
, prefix
);
1766 wxStrcat(tp
, _T("6o |"));
1768 wxStrcpy(tp
, prefix
);
1769 wxStrcat(tp
, _T("6x |"));
1771 wxStrcpy(tp
, prefix
);
1772 wxStrcat(tp
, _T("6X |"));
1774 wxStrcpy(tp
, prefix
);
1775 wxStrcat(tp
, _T("6u |"));
1782 wxPrintf(_T("%10s\n"), PointerNull
);
1783 wxPrintf(_T("%-10s\n"), PointerNull
);
1786 static void TestPrintf()
1788 static wxChar shortstr
[] = _T("Hi, Z.");
1789 static wxChar longstr
[] = _T("Good morning, Doctor Chandra. This is Hal. \
1790 I am ready for my first lesson today.");
1792 wxString test_format
;
1796 fmtchk(_T("%4.4x"));
1797 fmtchk(_T("%04.4x"));
1798 fmtchk(_T("%4.3x"));
1799 fmtchk(_T("%04.3x"));
1801 fmtst1chk(_T("%.*x"));
1802 fmtst1chk(_T("%0*x"));
1803 fmtst2chk(_T("%*.*x"));
1804 fmtst2chk(_T("%0*.*x"));
1806 wxString bad_format
= _T("bad format:\t\"%b\"\n");
1807 wxPrintf(bad_format
.c_str());
1808 wxPrintf(_T("nil pointer (padded):\t\"%10p\"\n"), (void *) NULL
);
1810 wxPrintf(_T("decimal negative:\t\"%d\"\n"), -2345);
1811 wxPrintf(_T("octal negative:\t\"%o\"\n"), -2345);
1812 wxPrintf(_T("hex negative:\t\"%x\"\n"), -2345);
1813 wxPrintf(_T("long decimal number:\t\"%ld\"\n"), -123456L);
1814 wxPrintf(_T("long octal negative:\t\"%lo\"\n"), -2345L);
1815 wxPrintf(_T("long unsigned decimal number:\t\"%lu\"\n"), -123456L);
1816 wxPrintf(_T("zero-padded LDN:\t\"%010ld\"\n"), -123456L);
1817 test_format
= _T("left-adjusted ZLDN:\t\"%-010ld\"\n");
1818 wxPrintf(test_format
.c_str(), -123456);
1819 wxPrintf(_T("space-padded LDN:\t\"%10ld\"\n"), -123456L);
1820 wxPrintf(_T("left-adjusted SLDN:\t\"%-10ld\"\n"), -123456L);
1822 test_format
= _T("zero-padded string:\t\"%010s\"\n");
1823 wxPrintf(test_format
.c_str(), shortstr
);
1824 test_format
= _T("left-adjusted Z string:\t\"%-010s\"\n");
1825 wxPrintf(test_format
.c_str(), shortstr
);
1826 wxPrintf(_T("space-padded string:\t\"%10s\"\n"), shortstr
);
1827 wxPrintf(_T("left-adjusted S string:\t\"%-10s\"\n"), shortstr
);
1828 wxPrintf(_T("null string:\t\"%s\"\n"), PointerNull
);
1829 wxPrintf(_T("limited string:\t\"%.22s\"\n"), longstr
);
1831 wxPrintf(_T("e-style >= 1:\t\"%e\"\n"), 12.34);
1832 wxPrintf(_T("e-style >= .1:\t\"%e\"\n"), 0.1234);
1833 wxPrintf(_T("e-style < .1:\t\"%e\"\n"), 0.001234);
1834 wxPrintf(_T("e-style big:\t\"%.60e\"\n"), 1e20
);
1835 wxPrintf(_T("e-style == .1:\t\"%e\"\n"), 0.1);
1836 wxPrintf(_T("f-style >= 1:\t\"%f\"\n"), 12.34);
1837 wxPrintf(_T("f-style >= .1:\t\"%f\"\n"), 0.1234);
1838 wxPrintf(_T("f-style < .1:\t\"%f\"\n"), 0.001234);
1839 wxPrintf(_T("g-style >= 1:\t\"%g\"\n"), 12.34);
1840 wxPrintf(_T("g-style >= .1:\t\"%g\"\n"), 0.1234);
1841 wxPrintf(_T("g-style < .1:\t\"%g\"\n"), 0.001234);
1842 wxPrintf(_T("g-style big:\t\"%.60g\"\n"), 1e20
);
1844 wxPrintf (_T(" %6.5f\n"), .099999999860301614);
1845 wxPrintf (_T(" %6.5f\n"), .1);
1846 wxPrintf (_T("x%5.4fx\n"), .5);
1848 wxPrintf (_T("%#03x\n"), 1);
1850 //wxPrintf (_T("something really insane: %.10000f\n"), 1.0);
1856 while (niter
-- != 0)
1857 wxPrintf (_T("%.17e\n"), d
/ 2);
1862 // Open Watcom cause compiler error here
1863 // Error! E173: col(24) floating-point constant too small to represent
1864 wxPrintf (_T("%15.5e\n"), 4.9406564584124654e-324);
1867 #define FORMAT _T("|%12.4f|%12.4e|%12.4g|\n")
1868 wxPrintf (FORMAT
, 0.0, 0.0, 0.0);
1869 wxPrintf (FORMAT
, 1.0, 1.0, 1.0);
1870 wxPrintf (FORMAT
, -1.0, -1.0, -1.0);
1871 wxPrintf (FORMAT
, 100.0, 100.0, 100.0);
1872 wxPrintf (FORMAT
, 1000.0, 1000.0, 1000.0);
1873 wxPrintf (FORMAT
, 10000.0, 10000.0, 10000.0);
1874 wxPrintf (FORMAT
, 12345.0, 12345.0, 12345.0);
1875 wxPrintf (FORMAT
, 100000.0, 100000.0, 100000.0);
1876 wxPrintf (FORMAT
, 123456.0, 123456.0, 123456.0);
1881 int rc
= wxSnprintf (buf
, WXSIZEOF(buf
), _T("%30s"), _T("foo"));
1883 wxPrintf(_T("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n"),
1884 rc
, WXSIZEOF(buf
), buf
);
1887 wxPrintf ("snprintf (\"%%.999999u\", 10)\n",
1888 wxSnprintf(buf2
, WXSIZEOFbuf2
), "%.999999u", 10));
1894 wxPrintf (_T("%e should be 1.234568e+06\n"), 1234567.8);
1895 wxPrintf (_T("%f should be 1234567.800000\n"), 1234567.8);
1896 wxPrintf (_T("%g should be 1.23457e+06\n"), 1234567.8);
1897 wxPrintf (_T("%g should be 123.456\n"), 123.456);
1898 wxPrintf (_T("%g should be 1e+06\n"), 1000000.0);
1899 wxPrintf (_T("%g should be 10\n"), 10.0);
1900 wxPrintf (_T("%g should be 0.02\n"), 0.02);
1904 wxPrintf(_T("%.17f\n"),(1.0/x
/10.0+1.0)*x
-x
);
1910 wxSprintf(buf
,_T("%*s%*s%*s"),-1,_T("one"),-20,_T("two"),-30,_T("three"));
1912 result
|= wxStrcmp (buf
,
1913 _T("onetwo three "));
1915 wxPuts (result
!= 0 ? _T("Test failed!") : _T("Test ok."));
1922 wxSprintf(buf
, _T("%07") wxLongLongFmtSpec
_T("o"), wxLL(040000000000));
1924 // for some reason below line fails under Borland
1925 wxPrintf (_T("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf
);
1928 if (wxStrcmp (buf
, _T("40000000000")) != 0)
1931 wxPuts (_T("\tFAILED"));
1933 wxUnusedVar(result
);
1934 wxPuts (wxEmptyString
);
1936 #endif // wxLongLong_t
1938 wxPrintf (_T("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX
+ 2, UCHAR_MAX
+ 2);
1939 wxPrintf (_T("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX
+ 2, USHRT_MAX
+ 2);
1941 wxPuts (_T("--- Should be no further output. ---"));
1950 memset (bytes
, '\xff', sizeof bytes
);
1951 wxSprintf (buf
, _T("foo%hhn\n"), &bytes
[3]);
1952 if (bytes
[0] != '\xff' || bytes
[1] != '\xff' || bytes
[2] != '\xff'
1953 || bytes
[4] != '\xff' || bytes
[5] != '\xff' || bytes
[6] != '\xff')
1955 wxPuts (_T("%hhn overwrite more bytes"));
1960 wxPuts (_T("%hhn wrote incorrect value"));
1972 wxSprintf (buf
, _T("%5.s"), _T("xyz"));
1973 if (wxStrcmp (buf
, _T(" ")) != 0)
1974 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" "));
1975 wxSprintf (buf
, _T("%5.f"), 33.3);
1976 if (wxStrcmp (buf
, _T(" 33")) != 0)
1977 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 33"));
1978 wxSprintf (buf
, _T("%8.e"), 33.3e7
);
1979 if (wxStrcmp (buf
, _T(" 3e+08")) != 0)
1980 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3e+08"));
1981 wxSprintf (buf
, _T("%8.E"), 33.3e7
);
1982 if (wxStrcmp (buf
, _T(" 3E+08")) != 0)
1983 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3E+08"));
1984 wxSprintf (buf
, _T("%.g"), 33.3);
1985 if (wxStrcmp (buf
, _T("3e+01")) != 0)
1986 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3e+01"));
1987 wxSprintf (buf
, _T("%.G"), 33.3);
1988 if (wxStrcmp (buf
, _T("3E+01")) != 0)
1989 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3E+01"));
1997 wxString test_format
;
2000 wxSprintf (buf
, _T("%.*g"), prec
, 3.3);
2001 if (wxStrcmp (buf
, _T("3")) != 0)
2002 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2004 wxSprintf (buf
, _T("%.*G"), prec
, 3.3);
2005 if (wxStrcmp (buf
, _T("3")) != 0)
2006 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2008 wxSprintf (buf
, _T("%7.*G"), prec
, 3.33);
2009 if (wxStrcmp (buf
, _T(" 3")) != 0)
2010 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3"));
2012 test_format
= _T("%04.*o");
2013 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2014 if (wxStrcmp (buf
, _T(" 041")) != 0)
2015 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 041"));
2017 test_format
= _T("%09.*u");
2018 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2019 if (wxStrcmp (buf
, _T(" 0000033")) != 0)
2020 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 0000033"));
2022 test_format
= _T("%04.*x");
2023 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2024 if (wxStrcmp (buf
, _T(" 021")) != 0)
2025 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2027 test_format
= _T("%04.*X");
2028 wxSprintf (buf
, test_format
.c_str(), prec
, 33);
2029 if (wxStrcmp (buf
, _T(" 021")) != 0)
2030 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2033 #endif // TEST_PRINTF
2035 // ----------------------------------------------------------------------------
2036 // registry and related stuff
2037 // ----------------------------------------------------------------------------
2039 // this is for MSW only
2042 #undef TEST_REGISTRY
2047 #include "wx/confbase.h"
2048 #include "wx/msw/regconf.h"
2051 static void TestRegConfWrite()
2053 wxConfig
*config
= new wxConfig(_T("myapp"));
2054 config
->SetPath(_T("/group1"));
2055 config
->Write(_T("entry1"), _T("foo"));
2056 config
->SetPath(_T("/group2"));
2057 config
->Write(_T("entry1"), _T("bar"));
2061 static void TestRegConfRead()
2063 wxConfig
*config
= new wxConfig(_T("myapp"));
2067 config
->SetPath(_T("/"));
2068 wxPuts(_T("Enumerating / subgroups:"));
2069 bool bCont
= config
->GetFirstGroup(str
, dummy
);
2073 bCont
= config
->GetNextGroup(str
, dummy
);
2077 #endif // TEST_REGCONF
2079 #ifdef TEST_REGISTRY
2081 #include "wx/msw/registry.h"
2083 // I chose this one because I liked its name, but it probably only exists under
2085 static const wxChar
*TESTKEY
=
2086 _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
2088 static void TestRegistryRead()
2090 wxPuts(_T("*** testing registry reading ***"));
2092 wxRegKey
key(TESTKEY
);
2093 wxPrintf(_T("The test key name is '%s'.\n"), key
.GetName().c_str());
2096 wxPuts(_T("ERROR: test key can't be opened, aborting test."));
2101 size_t nSubKeys
, nValues
;
2102 if ( key
.GetKeyInfo(&nSubKeys
, NULL
, &nValues
, NULL
) )
2104 wxPrintf(_T("It has %u subkeys and %u values.\n"), nSubKeys
, nValues
);
2107 wxPrintf(_T("Enumerating values:\n"));
2111 bool cont
= key
.GetFirstValue(value
, dummy
);
2114 wxPrintf(_T("Value '%s': type "), value
.c_str());
2115 switch ( key
.GetValueType(value
) )
2117 case wxRegKey::Type_None
: wxPrintf(_T("ERROR (none)")); break;
2118 case wxRegKey::Type_String
: wxPrintf(_T("SZ")); break;
2119 case wxRegKey::Type_Expand_String
: wxPrintf(_T("EXPAND_SZ")); break;
2120 case wxRegKey::Type_Binary
: wxPrintf(_T("BINARY")); break;
2121 case wxRegKey::Type_Dword
: wxPrintf(_T("DWORD")); break;
2122 case wxRegKey::Type_Multi_String
: wxPrintf(_T("MULTI_SZ")); break;
2123 default: wxPrintf(_T("other (unknown)")); break;
2126 wxPrintf(_T(", value = "));
2127 if ( key
.IsNumericValue(value
) )
2130 key
.QueryValue(value
, &val
);
2131 wxPrintf(_T("%ld"), val
);
2136 key
.QueryValue(value
, val
);
2137 wxPrintf(_T("'%s'"), val
.c_str());
2139 key
.QueryRawValue(value
, val
);
2140 wxPrintf(_T(" (raw value '%s')"), val
.c_str());
2145 cont
= key
.GetNextValue(value
, dummy
);
2149 static void TestRegistryAssociation()
2152 The second call to deleteself genertaes an error message, with a
2153 messagebox saying .flo is crucial to system operation, while the .ddf
2154 call also fails, but with no error message
2159 key
.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
2161 key
= _T("ddxf_auto_file") ;
2162 key
.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
2164 key
= _T("ddxf_auto_file") ;
2165 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
2167 key
= _T("program,0") ;
2168 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
2170 key
= _T("program \"%1\"") ;
2172 key
.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
2174 key
.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
2176 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
2178 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
2182 #endif // TEST_REGISTRY
2184 // ----------------------------------------------------------------------------
2186 // ----------------------------------------------------------------------------
2188 #ifdef TEST_SCOPEGUARD
2190 #include "wx/scopeguard.h"
2192 static void function0() { puts("function0()"); }
2193 static void function1(int n
) { printf("function1(%d)\n", n
); }
2194 static void function2(double x
, char c
) { printf("function2(%g, %c)\n", x
, c
); }
2198 void method0() { printf("method0()\n"); }
2199 void method1(int n
) { printf("method1(%d)\n", n
); }
2200 void method2(double x
, char c
) { printf("method2(%g, %c)\n", x
, c
); }
2203 static void TestScopeGuard()
2205 wxON_BLOCK_EXIT0(function0
);
2206 wxON_BLOCK_EXIT1(function1
, 17);
2207 wxON_BLOCK_EXIT2(function2
, 3.14, 'p');
2210 wxON_BLOCK_EXIT_OBJ0(obj
, Object::method0
);
2211 wxON_BLOCK_EXIT_OBJ1(obj
, Object::method1
, 7);
2212 wxON_BLOCK_EXIT_OBJ2(obj
, Object::method2
, 2.71, 'e');
2214 wxScopeGuard dismissed
= wxMakeGuard(function0
);
2215 dismissed
.Dismiss();
2220 // ----------------------------------------------------------------------------
2222 // ----------------------------------------------------------------------------
2226 #include "wx/socket.h"
2227 #include "wx/protocol/protocol.h"
2228 #include "wx/protocol/http.h"
2230 static void TestSocketServer()
2232 wxPuts(_T("*** Testing wxSocketServer ***\n"));
2234 static const int PORT
= 3000;
2239 wxSocketServer
*server
= new wxSocketServer(addr
);
2240 if ( !server
->Ok() )
2242 wxPuts(_T("ERROR: failed to bind"));
2250 wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT
);
2252 wxSocketBase
*socket
= server
->Accept();
2255 wxPuts(_T("ERROR: wxSocketServer::Accept() failed."));
2259 wxPuts(_T("Server: got a client."));
2261 server
->SetTimeout(60); // 1 min
2264 while ( !close
&& socket
->IsConnected() )
2267 wxChar ch
= _T('\0');
2270 if ( socket
->Read(&ch
, sizeof(ch
)).Error() )
2272 // don't log error if the client just close the connection
2273 if ( socket
->IsConnected() )
2275 wxPuts(_T("ERROR: in wxSocket::Read."));
2295 wxPrintf(_T("Server: got '%s'.\n"), s
.c_str());
2296 if ( s
== _T("close") )
2298 wxPuts(_T("Closing connection"));
2302 else if ( s
== _T("quit") )
2307 wxPuts(_T("Shutting down the server"));
2309 else // not a special command
2311 socket
->Write(s
.MakeUpper().c_str(), s
.length());
2312 socket
->Write("\r\n", 2);
2313 wxPrintf(_T("Server: wrote '%s'.\n"), s
.c_str());
2319 wxPuts(_T("Server: lost a client unexpectedly."));
2325 // same as "delete server" but is consistent with GUI programs
2329 static void TestSocketClient()
2331 wxPuts(_T("*** Testing wxSocketClient ***\n"));
2333 static const wxChar
*hostname
= _T("www.wxwidgets.org");
2336 addr
.Hostname(hostname
);
2339 wxPrintf(_T("--- Attempting to connect to %s:80...\n"), hostname
);
2341 wxSocketClient client
;
2342 if ( !client
.Connect(addr
) )
2344 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
2348 wxPrintf(_T("--- Connected to %s:%u...\n"),
2349 addr
.Hostname().c_str(), addr
.Service());
2353 // could use simply "GET" here I suppose
2355 wxString::Format(_T("GET http://%s/\r\n"), hostname
);
2356 client
.Write(cmdGet
, cmdGet
.length());
2357 wxPrintf(_T("--- Sent command '%s' to the server\n"),
2358 MakePrintable(cmdGet
).c_str());
2359 client
.Read(buf
, WXSIZEOF(buf
));
2360 wxPrintf(_T("--- Server replied:\n%s"), buf
);
2364 #endif // TEST_SOCKETS
2366 // ----------------------------------------------------------------------------
2368 // ----------------------------------------------------------------------------
2372 #include "wx/protocol/ftp.h"
2376 #define FTP_ANONYMOUS
2378 #ifdef FTP_ANONYMOUS
2379 static const wxChar
*directory
= _T("/pub");
2380 static const wxChar
*filename
= _T("welcome.msg");
2382 static const wxChar
*directory
= _T("/etc");
2383 static const wxChar
*filename
= _T("issue");
2386 static bool TestFtpConnect()
2388 wxPuts(_T("*** Testing FTP connect ***"));
2390 #ifdef FTP_ANONYMOUS
2391 static const wxChar
*hostname
= _T("ftp.wxwidgets.org");
2393 wxPrintf(_T("--- Attempting to connect to %s:21 anonymously...\n"), hostname
);
2394 #else // !FTP_ANONYMOUS
2395 static const wxChar
*hostname
= "localhost";
2398 wxFgets(user
, WXSIZEOF(user
), stdin
);
2399 user
[wxStrlen(user
) - 1] = '\0'; // chop off '\n'
2402 wxChar password
[256];
2403 wxPrintf(_T("Password for %s: "), password
);
2404 wxFgets(password
, WXSIZEOF(password
), stdin
);
2405 password
[wxStrlen(password
) - 1] = '\0'; // chop off '\n'
2406 ftp
.SetPassword(password
);
2408 wxPrintf(_T("--- Attempting to connect to %s:21 as %s...\n"), hostname
, user
);
2409 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
2411 if ( !ftp
.Connect(hostname
) )
2413 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
2419 wxPrintf(_T("--- Connected to %s, current directory is '%s'\n"),
2420 hostname
, ftp
.Pwd().c_str());
2427 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
2428 static void TestFtpWuFtpd()
2431 static const wxChar
*hostname
= _T("ftp.eudora.com");
2432 if ( !ftp
.Connect(hostname
) )
2434 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
2438 static const wxChar
*filename
= _T("eudora/pubs/draft-gellens-submit-09.txt");
2439 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2442 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
2446 size_t size
= in
->GetSize();
2447 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
2449 wxChar
*data
= new wxChar
[size
];
2450 if ( !in
->Read(data
, size
) )
2452 wxPuts(_T("ERROR: read error"));
2456 wxPrintf(_T("Successfully retrieved the file.\n"));
2465 static void TestFtpList()
2467 wxPuts(_T("*** Testing wxFTP file listing ***\n"));
2470 if ( !ftp
.ChDir(directory
) )
2472 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
2475 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
2477 // test NLIST and LIST
2478 wxArrayString files
;
2479 if ( !ftp
.GetFilesList(files
) )
2481 wxPuts(_T("ERROR: failed to get NLIST of files"));
2485 wxPrintf(_T("Brief list of files under '%s':\n"), ftp
.Pwd().c_str());
2486 size_t count
= files
.GetCount();
2487 for ( size_t n
= 0; n
< count
; n
++ )
2489 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
2491 wxPuts(_T("End of the file list"));
2494 if ( !ftp
.GetDirList(files
) )
2496 wxPuts(_T("ERROR: failed to get LIST of files"));
2500 wxPrintf(_T("Detailed list of files under '%s':\n"), ftp
.Pwd().c_str());
2501 size_t count
= files
.GetCount();
2502 for ( size_t n
= 0; n
< count
; n
++ )
2504 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
2506 wxPuts(_T("End of the file list"));
2509 if ( !ftp
.ChDir(_T("..")) )
2511 wxPuts(_T("ERROR: failed to cd to .."));
2514 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
2517 static void TestFtpDownload()
2519 wxPuts(_T("*** Testing wxFTP download ***\n"));
2522 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2525 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
2529 size_t size
= in
->GetSize();
2530 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
2533 wxChar
*data
= new wxChar
[size
];
2534 if ( !in
->Read(data
, size
) )
2536 wxPuts(_T("ERROR: read error"));
2540 wxPrintf(_T("\nContents of %s:\n%s\n"), filename
, data
);
2548 static void TestFtpFileSize()
2550 wxPuts(_T("*** Testing FTP SIZE command ***"));
2552 if ( !ftp
.ChDir(directory
) )
2554 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
2557 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
2559 if ( ftp
.FileExists(filename
) )
2561 int size
= ftp
.GetFileSize(filename
);
2563 wxPrintf(_T("ERROR: couldn't get size of '%s'\n"), filename
);
2565 wxPrintf(_T("Size of '%s' is %d bytes.\n"), filename
, size
);
2569 wxPrintf(_T("ERROR: '%s' doesn't exist\n"), filename
);
2573 static void TestFtpMisc()
2575 wxPuts(_T("*** Testing miscellaneous wxFTP functions ***"));
2577 if ( ftp
.SendCommand(_T("STAT")) != '2' )
2579 wxPuts(_T("ERROR: STAT failed"));
2583 wxPrintf(_T("STAT returned:\n\n%s\n"), ftp
.GetLastResult().c_str());
2586 if ( ftp
.SendCommand(_T("HELP SITE")) != '2' )
2588 wxPuts(_T("ERROR: HELP SITE failed"));
2592 wxPrintf(_T("The list of site-specific commands:\n\n%s\n"),
2593 ftp
.GetLastResult().c_str());
2597 static void TestFtpInteractive()
2599 wxPuts(_T("\n*** Interactive wxFTP test ***"));
2605 wxPrintf(_T("Enter FTP command: "));
2606 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
2609 // kill the last '\n'
2610 buf
[wxStrlen(buf
) - 1] = 0;
2612 // special handling of LIST and NLST as they require data connection
2613 wxString
start(buf
, 4);
2615 if ( start
== _T("LIST") || start
== _T("NLST") )
2618 if ( wxStrlen(buf
) > 4 )
2621 wxArrayString files
;
2622 if ( !ftp
.GetList(files
, wildcard
, start
== _T("LIST")) )
2624 wxPrintf(_T("ERROR: failed to get %s of files\n"), start
.c_str());
2628 wxPrintf(_T("--- %s of '%s' under '%s':\n"),
2629 start
.c_str(), wildcard
.c_str(), ftp
.Pwd().c_str());
2630 size_t count
= files
.GetCount();
2631 for ( size_t n
= 0; n
< count
; n
++ )
2633 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
2635 wxPuts(_T("--- End of the file list"));
2640 wxChar ch
= ftp
.SendCommand(buf
);
2641 wxPrintf(_T("Command %s"), ch
? _T("succeeded") : _T("failed"));
2644 wxPrintf(_T(" (return code %c)"), ch
);
2647 wxPrintf(_T(", server reply:\n%s\n\n"), ftp
.GetLastResult().c_str());
2651 wxPuts(_T("\n*** done ***"));
2654 static void TestFtpUpload()
2656 wxPuts(_T("*** Testing wxFTP uploading ***\n"));
2659 static const wxChar
*file1
= _T("test1");
2660 static const wxChar
*file2
= _T("test2");
2661 wxOutputStream
*out
= ftp
.GetOutputStream(file1
);
2664 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
2665 out
->Write("First hello", 11);
2669 // send a command to check the remote file
2670 if ( ftp
.SendCommand(wxString(_T("STAT ")) + file1
) != '2' )
2672 wxPrintf(_T("ERROR: STAT %s failed\n"), file1
);
2676 wxPrintf(_T("STAT %s returned:\n\n%s\n"),
2677 file1
, ftp
.GetLastResult().c_str());
2680 out
= ftp
.GetOutputStream(file2
);
2683 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
2684 out
->Write("Second hello", 12);
2691 // ----------------------------------------------------------------------------
2693 // ----------------------------------------------------------------------------
2695 #ifdef TEST_STACKWALKER
2697 #if wxUSE_STACKWALKER
2699 #include "wx/stackwalk.h"
2701 class StackDump
: public wxStackWalker
2704 StackDump(const char *argv0
)
2705 : wxStackWalker(argv0
)
2709 virtual void Walk(size_t skip
= 1)
2711 wxPuts(_T("Stack dump:"));
2713 wxStackWalker::Walk(skip
);
2717 virtual void OnStackFrame(const wxStackFrame
& frame
)
2719 printf("[%2d] ", frame
.GetLevel());
2721 wxString name
= frame
.GetName();
2722 if ( !name
.empty() )
2724 printf("%-20.40s", name
.mb_str());
2728 printf("0x%08lx", (unsigned long)frame
.GetAddress());
2731 if ( frame
.HasSourceLocation() )
2734 frame
.GetFileName().mb_str(),
2741 for ( size_t n
= 0; frame
.GetParam(n
, &type
, &name
, &val
); n
++ )
2743 printf("\t%s %s = %s\n", type
.mb_str(), name
.mb_str(), val
.mb_str());
2748 static void TestStackWalk(const char *argv0
)
2750 wxPuts(_T("*** Testing wxStackWalker ***\n"));
2752 StackDump
dump(argv0
);
2756 #endif // wxUSE_STACKWALKER
2758 #endif // TEST_STACKWALKER
2760 // ----------------------------------------------------------------------------
2762 // ----------------------------------------------------------------------------
2764 #ifdef TEST_STDPATHS
2766 #include "wx/stdpaths.h"
2768 static void TestStandardPaths()
2770 wxPuts(_T("*** Testing wxStandardPaths ***\n"));
2772 wxTheApp
->SetAppName(_T("console"));
2774 wxStandardPathsBase
& stdp
= wxStandardPaths::Get();
2775 wxPrintf(_T("Config dir (sys):\t%s\n"), stdp
.GetConfigDir().c_str());
2776 wxPrintf(_T("Config dir (user):\t%s\n"), stdp
.GetUserConfigDir().c_str());
2777 wxPrintf(_T("Data dir (sys):\t\t%s\n"), stdp
.GetDataDir().c_str());
2778 wxPrintf(_T("Data dir (sys local):\t%s\n"), stdp
.GetLocalDataDir().c_str());
2779 wxPrintf(_T("Data dir (user):\t%s\n"), stdp
.GetUserDataDir().c_str());
2780 wxPrintf(_T("Data dir (user local):\t%s\n"), stdp
.GetUserLocalDataDir().c_str());
2781 wxPrintf(_T("Documents dir:\t\t%s\n"), stdp
.GetDocumentsDir().c_str());
2782 wxPrintf(_T("Plugins dir:\t\t%s\n"), stdp
.GetPluginsDir().c_str());
2783 wxPrintf(_T("Resources dir:\t\t%s\n"), stdp
.GetResourcesDir().c_str());
2784 wxPrintf(_T("Localized res. dir:\t%s\n"),
2785 stdp
.GetLocalizedResourcesDir(_T("fr")).c_str());
2786 wxPrintf(_T("Message catalogs dir:\t%s\n"),
2787 stdp
.GetLocalizedResourcesDir
2790 wxStandardPaths::ResourceCat_Messages
2794 #endif // TEST_STDPATHS
2796 // ----------------------------------------------------------------------------
2798 // ----------------------------------------------------------------------------
2802 #include "wx/wfstream.h"
2803 #include "wx/mstream.h"
2805 static void TestFileStream()
2807 wxPuts(_T("*** Testing wxFileInputStream ***"));
2809 static const wxString filename
= _T("testdata.fs");
2811 wxFileOutputStream
fsOut(filename
);
2812 fsOut
.Write("foo", 3);
2815 wxFileInputStream
fsIn(filename
);
2816 wxPrintf(_T("File stream size: %u\n"), fsIn
.GetSize());
2817 while ( !fsIn
.Eof() )
2819 wxPutchar(fsIn
.GetC());
2822 if ( !wxRemoveFile(filename
) )
2824 wxPrintf(_T("ERROR: failed to remove the file '%s'.\n"), filename
.c_str());
2827 wxPuts(_T("\n*** wxFileInputStream test done ***"));
2830 static void TestMemoryStream()
2832 wxPuts(_T("*** Testing wxMemoryOutputStream ***"));
2834 wxMemoryOutputStream memOutStream
;
2835 wxPrintf(_T("Initially out stream offset: %lu\n"),
2836 (unsigned long)memOutStream
.TellO());
2838 for ( const wxChar
*p
= _T("Hello, stream!"); *p
; p
++ )
2840 memOutStream
.PutC(*p
);
2843 wxPrintf(_T("Final out stream offset: %lu\n"),
2844 (unsigned long)memOutStream
.TellO());
2846 wxPuts(_T("*** Testing wxMemoryInputStream ***"));
2849 size_t len
= memOutStream
.CopyTo(buf
, WXSIZEOF(buf
));
2851 wxMemoryInputStream
memInpStream(buf
, len
);
2852 wxPrintf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
2853 while ( !memInpStream
.Eof() )
2855 wxPutchar(memInpStream
.GetC());
2858 wxPuts(_T("\n*** wxMemoryInputStream test done ***"));
2861 #endif // TEST_STREAMS
2863 // ----------------------------------------------------------------------------
2865 // ----------------------------------------------------------------------------
2869 #include "wx/stopwatch.h"
2870 #include "wx/utils.h"
2872 static void TestStopWatch()
2874 wxPuts(_T("*** Testing wxStopWatch ***\n"));
2878 wxPrintf(_T("Initially paused, after 2 seconds time is..."));
2881 wxPrintf(_T("\t%ldms\n"), sw
.Time());
2883 wxPrintf(_T("Resuming stopwatch and sleeping 3 seconds..."));
2887 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2890 wxPrintf(_T("Pausing agan and sleeping 2 more seconds..."));
2893 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2896 wxPrintf(_T("Finally resuming and sleeping 2 more seconds..."));
2899 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
2902 wxPuts(_T("\nChecking for 'backwards clock' bug..."));
2903 for ( size_t n
= 0; n
< 70; n
++ )
2907 for ( size_t m
= 0; m
< 100000; m
++ )
2909 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
2911 wxPuts(_T("\ntime is negative - ERROR!"));
2919 wxPuts(_T(", ok."));
2922 #endif // TEST_TIMER
2924 // ----------------------------------------------------------------------------
2926 // ----------------------------------------------------------------------------
2930 #include "wx/vcard.h"
2932 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
2935 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
2938 wxPrintf(_T("%s%s"),
2939 wxString(_T('\t'), level
).c_str(),
2940 vcObj
->GetName().c_str());
2943 switch ( vcObj
->GetType() )
2945 case wxVCardObject::String
:
2946 case wxVCardObject::UString
:
2949 vcObj
->GetValue(&val
);
2950 value
<< _T('"') << val
<< _T('"');
2954 case wxVCardObject::Int
:
2957 vcObj
->GetValue(&i
);
2958 value
.Printf(_T("%u"), i
);
2962 case wxVCardObject::Long
:
2965 vcObj
->GetValue(&l
);
2966 value
.Printf(_T("%lu"), l
);
2970 case wxVCardObject::None
:
2973 case wxVCardObject::Object
:
2974 value
= _T("<node>");
2978 value
= _T("<unknown value type>");
2982 wxPrintf(_T(" = %s"), value
.c_str());
2985 DumpVObject(level
+ 1, *vcObj
);
2988 vcObj
= vcard
.GetNextProp(&cookie
);
2992 static void DumpVCardAddresses(const wxVCard
& vcard
)
2994 wxPuts(_T("\nShowing all addresses from vCard:\n"));
2998 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3002 int flags
= addr
->GetFlags();
3003 if ( flags
& wxVCardAddress::Domestic
)
3005 flagsStr
<< _T("domestic ");
3007 if ( flags
& wxVCardAddress::Intl
)
3009 flagsStr
<< _T("international ");
3011 if ( flags
& wxVCardAddress::Postal
)
3013 flagsStr
<< _T("postal ");
3015 if ( flags
& wxVCardAddress::Parcel
)
3017 flagsStr
<< _T("parcel ");
3019 if ( flags
& wxVCardAddress::Home
)
3021 flagsStr
<< _T("home ");
3023 if ( flags
& wxVCardAddress::Work
)
3025 flagsStr
<< _T("work ");
3028 wxPrintf(_T("Address %u:\n")
3030 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3033 addr
->GetPostOffice().c_str(),
3034 addr
->GetExtAddress().c_str(),
3035 addr
->GetStreet().c_str(),
3036 addr
->GetLocality().c_str(),
3037 addr
->GetRegion().c_str(),
3038 addr
->GetPostalCode().c_str(),
3039 addr
->GetCountry().c_str()
3043 addr
= vcard
.GetNextAddress(&cookie
);
3047 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
3049 wxPuts(_T("\nShowing all phone numbers from vCard:\n"));
3053 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
3057 int flags
= phone
->GetFlags();
3058 if ( flags
& wxVCardPhoneNumber::Voice
)
3060 flagsStr
<< _T("voice ");
3062 if ( flags
& wxVCardPhoneNumber::Fax
)
3064 flagsStr
<< _T("fax ");
3066 if ( flags
& wxVCardPhoneNumber::Cellular
)
3068 flagsStr
<< _T("cellular ");
3070 if ( flags
& wxVCardPhoneNumber::Modem
)
3072 flagsStr
<< _T("modem ");
3074 if ( flags
& wxVCardPhoneNumber::Home
)
3076 flagsStr
<< _T("home ");
3078 if ( flags
& wxVCardPhoneNumber::Work
)
3080 flagsStr
<< _T("work ");
3083 wxPrintf(_T("Phone number %u:\n")
3088 phone
->GetNumber().c_str()
3092 phone
= vcard
.GetNextPhoneNumber(&cookie
);
3096 static void TestVCardRead()
3098 wxPuts(_T("*** Testing wxVCard reading ***\n"));
3100 wxVCard
vcard(_T("vcard.vcf"));
3101 if ( !vcard
.IsOk() )
3103 wxPuts(_T("ERROR: couldn't load vCard."));
3107 // read individual vCard properties
3108 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
3112 vcObj
->GetValue(&value
);
3117 value
= _T("<none>");
3120 wxPrintf(_T("Full name retrieved directly: %s\n"), value
.c_str());
3123 if ( !vcard
.GetFullName(&value
) )
3125 value
= _T("<none>");
3128 wxPrintf(_T("Full name from wxVCard API: %s\n"), value
.c_str());
3130 // now show how to deal with multiply occurring properties
3131 DumpVCardAddresses(vcard
);
3132 DumpVCardPhoneNumbers(vcard
);
3134 // and finally show all
3135 wxPuts(_T("\nNow dumping the entire vCard:\n")
3136 "-----------------------------\n");
3138 DumpVObject(0, vcard
);
3142 static void TestVCardWrite()
3144 wxPuts(_T("*** Testing wxVCard writing ***\n"));
3147 if ( !vcard
.IsOk() )
3149 wxPuts(_T("ERROR: couldn't create vCard."));
3154 vcard
.SetName("Zeitlin", "Vadim");
3155 vcard
.SetFullName("Vadim Zeitlin");
3156 vcard
.SetOrganization("wxWidgets", "R&D");
3158 // just dump the vCard back
3159 wxPuts(_T("Entire vCard follows:\n"));
3160 wxPuts(vcard
.Write());
3164 #endif // TEST_VCARD
3166 // ----------------------------------------------------------------------------
3168 // ----------------------------------------------------------------------------
3170 #if !defined(__WIN32__) || !wxUSE_FSVOLUME
3176 #include "wx/volume.h"
3178 static const wxChar
*volumeKinds
[] =
3184 _T("network volume"),
3188 static void TestFSVolume()
3190 wxPuts(_T("*** Testing wxFSVolume class ***"));
3192 wxArrayString volumes
= wxFSVolume::GetVolumes();
3193 size_t count
= volumes
.GetCount();
3197 wxPuts(_T("ERROR: no mounted volumes?"));
3201 wxPrintf(_T("%u mounted volumes found:\n"), count
);
3203 for ( size_t n
= 0; n
< count
; n
++ )
3205 wxFSVolume
vol(volumes
[n
]);
3208 wxPuts(_T("ERROR: couldn't create volume"));
3212 wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
3214 vol
.GetDisplayName().c_str(),
3215 vol
.GetName().c_str(),
3216 volumeKinds
[vol
.GetKind()],
3217 vol
.IsWritable() ? _T("rw") : _T("ro"),
3218 vol
.GetFlags() & wxFS_VOL_REMOVABLE
? _T("removable")
3223 #endif // TEST_VOLUME
3225 // ----------------------------------------------------------------------------
3226 // wide char and Unicode support
3227 // ----------------------------------------------------------------------------
3231 #include "wx/strconv.h"
3232 #include "wx/fontenc.h"
3233 #include "wx/encconv.h"
3234 #include "wx/buffer.h"
3236 static const unsigned char utf8koi8r
[] =
3238 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
3239 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
3240 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
3241 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
3242 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
3243 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
3244 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
3247 static const unsigned char utf8iso8859_1
[] =
3249 0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e,
3250 0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65,
3251 0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65,
3252 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65,
3253 0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0
3256 static const unsigned char utf8Invalid
[] =
3258 0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30,
3259 0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6,
3260 0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88,
3261 0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70,
3265 static const struct Utf8Data
3267 const unsigned char *text
;
3269 const wxChar
*charset
;
3270 wxFontEncoding encoding
;
3273 { utf8Invalid
, WXSIZEOF(utf8Invalid
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3274 { utf8koi8r
, WXSIZEOF(utf8koi8r
), _T("koi8-r"), wxFONTENCODING_KOI8
},
3275 { utf8iso8859_1
, WXSIZEOF(utf8iso8859_1
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3278 static void TestUtf8()
3280 wxPuts(_T("*** Testing UTF8 support ***\n"));
3285 for ( size_t n
= 0; n
< WXSIZEOF(utf8data
); n
++ )
3287 const Utf8Data
& u8d
= utf8data
[n
];
3288 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)u8d
.text
,
3289 WXSIZEOF(wbuf
)) == (size_t)-1 )
3291 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3295 wxCSConv
conv(u8d
.charset
);
3296 if ( conv
.WC2MB(buf
, wbuf
, WXSIZEOF(buf
)) == (size_t)-1 )
3298 wxPrintf(_T("ERROR: conversion to %s failed.\n"), u8d
.charset
);
3302 wxPrintf(_T("String in %s: %s\n"), u8d
.charset
, buf
);
3306 wxString
s(wxConvUTF8
.cMB2WC((const char *)u8d
.text
));
3308 s
= _T("<< conversion failed >>");
3309 wxPrintf(_T("String in current cset: %s\n"), s
.c_str());
3313 wxPuts(wxEmptyString
);
3316 static void TestEncodingConverter()
3318 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
3320 // using wxEncodingConverter should give the same result as above
3323 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)utf8koi8r
,
3324 WXSIZEOF(utf8koi8r
)) == (size_t)-1 )
3326 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3330 wxEncodingConverter ec
;
3331 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
3332 ec
.Convert(wbuf
, buf
);
3333 wxPrintf(_T("The same KOI8-R string using wxEC: %s\n"), buf
);
3336 wxPuts(wxEmptyString
);
3339 #endif // TEST_WCHAR
3341 // ----------------------------------------------------------------------------
3343 // ----------------------------------------------------------------------------
3347 #include "wx/filesys.h"
3348 #include "wx/fs_zip.h"
3349 #include "wx/zipstrm.h"
3351 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
3353 static void TestZipStreamRead()
3355 wxPuts(_T("*** Testing ZIP reading ***\n"));
3357 static const wxString filename
= _T("foo");
3358 wxZipInputStream
istr(TESTFILE_ZIP
, filename
);
3359 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
3361 wxPrintf(_T("Dumping the file '%s':\n"), filename
.c_str());
3362 while ( !istr
.Eof() )
3364 wxPutchar(istr
.GetC());
3368 wxPuts(_T("\n----- done ------"));
3371 static void DumpZipDirectory(wxFileSystem
& fs
,
3372 const wxString
& dir
,
3373 const wxString
& indent
)
3375 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
3376 TESTFILE_ZIP
, dir
.c_str());
3377 wxString wildcard
= prefix
+ _T("/*");
3379 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
3380 while ( !dirname
.empty() )
3382 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
3384 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3389 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
3391 DumpZipDirectory(fs
, dirname
,
3392 indent
+ wxString(_T(' '), 4));
3394 dirname
= fs
.FindNext();
3397 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
3398 while ( !filename
.empty() )
3400 if ( !filename
.StartsWith(prefix
, &filename
) )
3402 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3407 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
3409 filename
= fs
.FindNext();
3413 static void TestZipFileSystem()
3415 wxPuts(_T("*** Testing ZIP file system ***\n"));
3417 wxFileSystem::AddHandler(new wxZipFSHandler
);
3419 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
3421 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
3426 // ----------------------------------------------------------------------------
3428 // ----------------------------------------------------------------------------
3430 #ifdef TEST_DATETIME
3432 #include "wx/math.h"
3433 #include "wx/datetime.h"
3435 // this test miscellaneous static wxDateTime functions
3439 static void TestTimeStatic()
3441 wxPuts(_T("\n*** wxDateTime static methods test ***"));
3443 // some info about the current date
3444 int year
= wxDateTime::GetCurrentYear();
3445 wxPrintf(_T("Current year %d is %sa leap one and has %d days.\n"),
3447 wxDateTime::IsLeapYear(year
) ? "" : "not ",
3448 wxDateTime::GetNumberOfDays(year
));
3450 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
3451 wxPrintf(_T("Current month is '%s' ('%s') and it has %d days\n"),
3452 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
3453 wxDateTime::GetMonthName(month
).c_str(),
3454 wxDateTime::GetNumberOfDays(month
));
3457 // test time zones stuff
3458 static void TestTimeZones()
3460 wxPuts(_T("\n*** wxDateTime timezone test ***"));
3462 wxDateTime now
= wxDateTime::Now();
3464 wxPrintf(_T("Current GMT time:\t%s\n"), now
.Format(_T("%c"), wxDateTime::GMT0
).c_str());
3465 wxPrintf(_T("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::GMT0
).c_str());
3466 wxPrintf(_T("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::EST
).c_str());
3467 wxPrintf(_T("Current time in Paris:\t%s\n"), now
.Format(_T("%c"), wxDateTime::CET
).c_str());
3468 wxPrintf(_T(" Moscow:\t%s\n"), now
.Format(_T("%c"), wxDateTime::MSK
).c_str());
3469 wxPrintf(_T(" New York:\t%s\n"), now
.Format(_T("%c"), wxDateTime::EST
).c_str());
3471 wxPrintf(_T("%s\n"), wxDateTime::Now().Format(_T("Our timezone is %Z")).c_str());
3473 wxDateTime::Tm tm
= now
.GetTm();
3474 if ( wxDateTime(tm
) != now
)
3476 wxPrintf(_T("ERROR: got %s instead of %s\n"),
3477 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
3481 // test some minimal support for the dates outside the standard range
3482 static void TestTimeRange()
3484 wxPuts(_T("\n*** wxDateTime out-of-standard-range dates test ***"));
3486 static const wxChar
*fmt
= _T("%d-%b-%Y %H:%M:%S");
3488 wxPrintf(_T("Unix epoch:\t%s\n"),
3489 wxDateTime(2440587.5).Format(fmt
).c_str());
3490 wxPrintf(_T("Feb 29, 0: \t%s\n"),
3491 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
3492 wxPrintf(_T("JDN 0: \t%s\n"),
3493 wxDateTime(0.0).Format(fmt
).c_str());
3494 wxPrintf(_T("Jan 1, 1AD:\t%s\n"),
3495 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
3496 wxPrintf(_T("May 29, 2099:\t%s\n"),
3497 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
3500 // test DST calculations
3501 static void TestTimeDST()
3503 wxPuts(_T("\n*** wxDateTime DST test ***"));
3505 wxPrintf(_T("DST is%s in effect now.\n\n"),
3506 wxDateTime::Now().IsDST() ? wxEmptyString
: _T(" not"));
3508 for ( int year
= 1990; year
< 2005; year
++ )
3510 wxPrintf(_T("DST period in Europe for year %d: from %s to %s\n"),
3512 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
3513 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
3519 #if TEST_INTERACTIVE
3521 static void TestDateTimeInteractive()
3523 wxPuts(_T("\n*** interactive wxDateTime tests ***"));
3529 wxPrintf(_T("Enter a date: "));
3530 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
3533 // kill the last '\n'
3534 buf
[wxStrlen(buf
) - 1] = 0;
3537 const wxChar
*p
= dt
.ParseDate(buf
);
3540 wxPrintf(_T("ERROR: failed to parse the date '%s'.\n"), buf
);
3546 wxPrintf(_T("WARNING: parsed only first %u characters.\n"), p
- buf
);
3549 wxPrintf(_T("%s: day %u, week of month %u/%u, week of year %u\n"),
3550 dt
.Format(_T("%b %d, %Y")).c_str(),
3552 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
3553 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
3554 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
3557 wxPuts(_T("\n*** done ***"));
3560 #endif // TEST_INTERACTIVE
3564 static void TestTimeMS()
3566 wxPuts(_T("*** testing millisecond-resolution support in wxDateTime ***"));
3568 wxDateTime dt1
= wxDateTime::Now(),
3569 dt2
= wxDateTime::UNow();
3571 wxPrintf(_T("Now = %s\n"), dt1
.Format(_T("%H:%M:%S:%l")).c_str());
3572 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
3573 wxPrintf(_T("Dummy loop: "));
3574 for ( int i
= 0; i
< 6000; i
++ )
3576 //for ( int j = 0; j < 10; j++ )
3579 s
.Printf(_T("%g"), sqrt((float)i
));
3585 wxPuts(_T(", done"));
3588 dt2
= wxDateTime::UNow();
3589 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
3591 wxPrintf(_T("Loop executed in %s ms\n"), (dt2
- dt1
).Format(_T("%l")).c_str());
3593 wxPuts(_T("\n*** done ***"));
3596 static void TestTimeHolidays()
3598 wxPuts(_T("\n*** testing wxDateTimeHolidayAuthority ***\n"));
3600 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
3601 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
3602 dtEnd
= dtStart
.GetLastMonthDay();
3604 wxDateTimeArray hol
;
3605 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
3607 const wxChar
*format
= _T("%d-%b-%Y (%a)");
3609 wxPrintf(_T("All holidays between %s and %s:\n"),
3610 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
3612 size_t count
= hol
.GetCount();
3613 for ( size_t n
= 0; n
< count
; n
++ )
3615 wxPrintf(_T("\t%s\n"), hol
[n
].Format(format
).c_str());
3618 wxPuts(wxEmptyString
);
3621 static void TestTimeZoneBug()
3623 wxPuts(_T("\n*** testing for DST/timezone bug ***\n"));
3625 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
3626 for ( int i
= 0; i
< 31; i
++ )
3628 wxPrintf(_T("Date %s: week day %s.\n"),
3629 date
.Format(_T("%d-%m-%Y")).c_str(),
3630 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
3632 date
+= wxDateSpan::Day();
3635 wxPuts(wxEmptyString
);
3638 static void TestTimeSpanFormat()
3640 wxPuts(_T("\n*** wxTimeSpan tests ***"));
3642 static const wxChar
*formats
[] =
3644 _T("(default) %H:%M:%S"),
3645 _T("%E weeks and %D days"),
3646 _T("%l milliseconds"),
3647 _T("(with ms) %H:%M:%S:%l"),
3648 _T("100%% of minutes is %M"), // test "%%"
3649 _T("%D days and %H hours"),
3650 _T("or also %S seconds"),
3653 wxTimeSpan
ts1(1, 2, 3, 4),
3655 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
3657 wxPrintf(_T("ts1 = %s\tts2 = %s\n"),
3658 ts1
.Format(formats
[n
]).c_str(),
3659 ts2
.Format(formats
[n
]).c_str());
3662 wxPuts(wxEmptyString
);
3667 #endif // TEST_DATETIME
3669 // ----------------------------------------------------------------------------
3670 // wxTextInput/OutputStream
3671 // ----------------------------------------------------------------------------
3673 #ifdef TEST_TEXTSTREAM
3675 #include "wx/txtstrm.h"
3676 #include "wx/wfstream.h"
3678 static void TestTextInputStream()
3680 wxPuts(_T("\n*** wxTextInputStream test ***"));
3682 wxString filename
= _T("testdata.fc");
3683 wxFileInputStream
fsIn(filename
);
3686 wxPuts(_T("ERROR: couldn't open file."));
3690 wxTextInputStream
tis(fsIn
);
3695 const wxString s
= tis
.ReadLine();
3697 // line could be non empty if the last line of the file isn't
3698 // terminated with EOL
3699 if ( fsIn
.Eof() && s
.empty() )
3702 wxPrintf(_T("Line %d: %s\n"), line
++, s
.c_str());
3707 #endif // TEST_TEXTSTREAM
3709 // ----------------------------------------------------------------------------
3711 // ----------------------------------------------------------------------------
3715 #include "wx/thread.h"
3717 static size_t gs_counter
= (size_t)-1;
3718 static wxCriticalSection gs_critsect
;
3719 static wxSemaphore gs_cond
;
3721 class MyJoinableThread
: public wxThread
3724 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
3725 { m_n
= n
; Create(); }
3727 // thread execution starts here
3728 virtual ExitCode
Entry();
3734 wxThread::ExitCode
MyJoinableThread::Entry()
3736 unsigned long res
= 1;
3737 for ( size_t n
= 1; n
< m_n
; n
++ )
3741 // it's a loooong calculation :-)
3745 return (ExitCode
)res
;
3748 class MyDetachedThread
: public wxThread
3751 MyDetachedThread(size_t n
, wxChar ch
)
3755 m_cancelled
= false;
3760 // thread execution starts here
3761 virtual ExitCode
Entry();
3764 virtual void OnExit();
3767 size_t m_n
; // number of characters to write
3768 wxChar m_ch
; // character to write
3770 bool m_cancelled
; // false if we exit normally
3773 wxThread::ExitCode
MyDetachedThread::Entry()
3776 wxCriticalSectionLocker
lock(gs_critsect
);
3777 if ( gs_counter
== (size_t)-1 )
3783 for ( size_t n
= 0; n
< m_n
; n
++ )
3785 if ( TestDestroy() )
3795 wxThread::Sleep(100);
3801 void MyDetachedThread::OnExit()
3803 wxLogTrace(_T("thread"), _T("Thread %ld is in OnExit"), GetId());
3805 wxCriticalSectionLocker
lock(gs_critsect
);
3806 if ( !--gs_counter
&& !m_cancelled
)
3810 static void TestDetachedThreads()
3812 wxPuts(_T("\n*** Testing detached threads ***"));
3814 static const size_t nThreads
= 3;
3815 MyDetachedThread
*threads
[nThreads
];
3817 for ( n
= 0; n
< nThreads
; n
++ )
3819 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
3822 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
3823 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
3825 for ( n
= 0; n
< nThreads
; n
++ )
3830 // wait until all threads terminate
3833 wxPuts(wxEmptyString
);
3836 static void TestJoinableThreads()
3838 wxPuts(_T("\n*** Testing a joinable thread (a loooong calculation...) ***"));
3840 // calc 10! in the background
3841 MyJoinableThread
thread(10);
3844 wxPrintf(_T("\nThread terminated with exit code %lu.\n"),
3845 (unsigned long)thread
.Wait());
3848 static void TestThreadSuspend()
3850 wxPuts(_T("\n*** Testing thread suspend/resume functions ***"));
3852 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
3856 // this is for this demo only, in a real life program we'd use another
3857 // condition variable which would be signaled from wxThread::Entry() to
3858 // tell us that the thread really started running - but here just wait a
3859 // bit and hope that it will be enough (the problem is, of course, that
3860 // the thread might still not run when we call Pause() which will result
3862 wxThread::Sleep(300);
3864 for ( size_t n
= 0; n
< 3; n
++ )
3868 wxPuts(_T("\nThread suspended"));
3871 // don't sleep but resume immediately the first time
3872 wxThread::Sleep(300);
3874 wxPuts(_T("Going to resume the thread"));
3879 wxPuts(_T("Waiting until it terminates now"));
3881 // wait until the thread terminates
3884 wxPuts(wxEmptyString
);
3887 static void TestThreadDelete()
3889 // As above, using Sleep() is only for testing here - we must use some
3890 // synchronisation object instead to ensure that the thread is still
3891 // running when we delete it - deleting a detached thread which already
3892 // terminated will lead to a crash!
3894 wxPuts(_T("\n*** Testing thread delete function ***"));
3896 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
3900 wxPuts(_T("\nDeleted a thread which didn't start to run yet."));
3902 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
3906 wxThread::Sleep(300);
3910 wxPuts(_T("\nDeleted a running thread."));
3912 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
3916 wxThread::Sleep(300);
3922 wxPuts(_T("\nDeleted a sleeping thread."));
3924 MyJoinableThread
thread3(20);
3929 wxPuts(_T("\nDeleted a joinable thread."));
3931 MyJoinableThread
thread4(2);
3934 wxThread::Sleep(300);
3938 wxPuts(_T("\nDeleted a joinable thread which already terminated."));
3940 wxPuts(wxEmptyString
);
3943 class MyWaitingThread
: public wxThread
3946 MyWaitingThread( wxMutex
*mutex
, wxCondition
*condition
)
3949 m_condition
= condition
;
3954 virtual ExitCode
Entry()
3956 wxPrintf(_T("Thread %lu has started running.\n"), GetId());
3961 wxPrintf(_T("Thread %lu starts to wait...\n"), GetId());
3965 m_condition
->Wait();
3968 wxPrintf(_T("Thread %lu finished to wait, exiting.\n"), GetId());
3976 wxCondition
*m_condition
;
3979 static void TestThreadConditions()
3982 wxCondition
condition(mutex
);
3984 // otherwise its difficult to understand which log messages pertain to
3986 //wxLogTrace(_T("thread"), _T("Local condition var is %08x, gs_cond = %08x"),
3987 // condition.GetId(), gs_cond.GetId());
3989 // create and launch threads
3990 MyWaitingThread
*threads
[10];
3993 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
3995 threads
[n
] = new MyWaitingThread( &mutex
, &condition
);
3998 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
4003 // wait until all threads run
4004 wxPuts(_T("Main thread is waiting for the other threads to start"));
4007 size_t nRunning
= 0;
4008 while ( nRunning
< WXSIZEOF(threads
) )
4014 wxPrintf(_T("Main thread: %u already running\n"), nRunning
);
4018 wxPuts(_T("Main thread: all threads started up."));
4021 wxThread::Sleep(500);
4024 // now wake one of them up
4025 wxPrintf(_T("Main thread: about to signal the condition.\n"));
4030 wxThread::Sleep(200);
4032 // wake all the (remaining) threads up, so that they can exit
4033 wxPrintf(_T("Main thread: about to broadcast the condition.\n"));
4035 condition
.Broadcast();
4037 // give them time to terminate (dirty!)
4038 wxThread::Sleep(500);
4041 #include "wx/utils.h"
4043 class MyExecThread
: public wxThread
4046 MyExecThread(const wxString
& command
) : wxThread(wxTHREAD_JOINABLE
),
4052 virtual ExitCode
Entry()
4054 return (ExitCode
)wxExecute(m_command
, wxEXEC_SYNC
);
4061 static void TestThreadExec()
4063 wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
4065 MyExecThread
thread(_T("true"));
4068 wxPrintf(_T("Main program exit code: %ld.\n"),
4069 wxExecute(_T("false"), wxEXEC_SYNC
));
4071 wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread
.Wait());
4075 #include "wx/datetime.h"
4077 class MySemaphoreThread
: public wxThread
4080 MySemaphoreThread(int i
, wxSemaphore
*sem
)
4081 : wxThread(wxTHREAD_JOINABLE
),
4088 virtual ExitCode
Entry()
4090 wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
4091 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4095 wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
4096 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4100 wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
4101 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
4113 WX_DEFINE_ARRAY_PTR(wxThread
*, ArrayThreads
);
4115 static void TestSemaphore()
4117 wxPuts(_T("*** Testing wxSemaphore class. ***"));
4119 static const int SEM_LIMIT
= 3;
4121 wxSemaphore
sem(SEM_LIMIT
, SEM_LIMIT
);
4122 ArrayThreads threads
;
4124 for ( int i
= 0; i
< 3*SEM_LIMIT
; i
++ )
4126 threads
.Add(new MySemaphoreThread(i
, &sem
));
4127 threads
.Last()->Run();
4130 for ( size_t n
= 0; n
< threads
.GetCount(); n
++ )
4137 #endif // TEST_THREADS
4139 // ----------------------------------------------------------------------------
4141 // ----------------------------------------------------------------------------
4143 #ifdef TEST_SNGLINST
4144 #include "wx/snglinst.h"
4145 #endif // TEST_SNGLINST
4147 int main(int argc
, char **argv
)
4150 wxChar
**wxArgv
= new wxChar
*[argc
+ 1];
4155 for (n
= 0; n
< argc
; n
++ )
4157 wxMB2WXbuf warg
= wxConvertMB2WX(argv
[n
]);
4158 wxArgv
[n
] = wxStrdup(warg
);
4163 #else // !wxUSE_UNICODE
4165 #endif // wxUSE_UNICODE/!wxUSE_UNICODE
4167 wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE
, "program");
4169 wxInitializer initializer
;
4172 fprintf(stderr
, "Failed to initialize the wxWidgets library, aborting.");
4177 #ifdef TEST_SNGLINST
4178 wxSingleInstanceChecker checker
;
4179 if ( checker
.Create(_T(".wxconsole.lock")) )
4181 if ( checker
.IsAnotherRunning() )
4183 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
4188 // wait some time to give time to launch another instance
4189 wxPrintf(_T("Press \"Enter\" to continue..."));
4192 else // failed to create
4194 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
4196 #endif // TEST_SNGLINST
4199 TestCmdLineConvert();
4201 #if wxUSE_CMDLINE_PARSER
4202 static const wxCmdLineEntryDesc cmdLineDesc
[] =
4204 { wxCMD_LINE_SWITCH
, _T("h"), _T("help"), _T("show this help message"),
4205 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
4206 { wxCMD_LINE_SWITCH
, _T("v"), _T("verbose"), _T("be verbose") },
4207 { wxCMD_LINE_SWITCH
, _T("q"), _T("quiet"), _T("be quiet") },
4209 { wxCMD_LINE_OPTION
, _T("o"), _T("output"), _T("output file") },
4210 { wxCMD_LINE_OPTION
, _T("i"), _T("input"), _T("input dir") },
4211 { wxCMD_LINE_OPTION
, _T("s"), _T("size"), _T("output block size"),
4212 wxCMD_LINE_VAL_NUMBER
},
4213 { wxCMD_LINE_OPTION
, _T("d"), _T("date"), _T("output file date"),
4214 wxCMD_LINE_VAL_DATE
},
4216 { wxCMD_LINE_PARAM
, NULL
, NULL
, _T("input file"),
4217 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
4222 wxCmdLineParser
parser(cmdLineDesc
, argc
, wxArgv
);
4224 parser
.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
4225 wxCMD_LINE_VAL_STRING
,
4226 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
4228 switch ( parser
.Parse() )
4231 wxLogMessage(_T("Help was given, terminating."));
4235 ShowCmdLine(parser
);
4239 wxLogMessage(_T("Syntax error detected, aborting."));
4242 #endif // wxUSE_CMDLINE_PARSER
4244 #endif // TEST_CMDLINE
4256 TestDllListLoaded();
4257 #endif // TEST_DYNLIB
4261 #endif // TEST_ENVIRON
4265 #endif // TEST_EXECUTE
4267 #ifdef TEST_FILECONF
4269 #endif // TEST_FILECONF
4273 #endif // TEST_LOCALE
4276 wxPuts(_T("*** Testing wxLog ***"));
4279 for ( size_t n
= 0; n
< 8000; n
++ )
4281 s
<< (wxChar
)(_T('A') + (n
% 26));
4284 wxLogWarning(_T("The length of the string is %lu"),
4285 (unsigned long)s
.length());
4288 msg
.Printf(_T("A very very long message: '%s', the end!\n"), s
.c_str());
4290 // this one shouldn't be truncated
4293 // but this one will because log functions use fixed size buffer
4294 // (note that it doesn't need '\n' at the end neither - will be added
4296 wxLogMessage(_T("A very very long message 2: '%s', the end!"), s
.c_str());
4305 #ifdef TEST_FILENAME
4308 TestFileNameDirManip();
4309 TestFileNameComparison();
4310 TestFileNameOperations();
4311 #endif // TEST_FILENAME
4313 #ifdef TEST_FILETIME
4318 #endif // TEST_FILETIME
4321 wxLog::AddTraceMask(FTP_TRACE_MASK
);
4322 if ( TestFtpConnect() )
4332 #if TEST_INTERACTIVE
4333 TestFtpInteractive();
4336 //else: connecting to the FTP server failed
4344 wxLog::AddTraceMask(_T("mime"));
4348 TestMimeAssociate();
4353 #ifdef TEST_INFO_FUNCTIONS
4358 #if TEST_INTERACTIVE
4361 #endif // TEST_INFO_FUNCTIONS
4363 #ifdef TEST_PATHLIST
4365 #endif // TEST_PATHLIST
4373 #endif // TEST_PRINTF
4380 #endif // TEST_REGCONF
4382 #if defined TEST_REGEX && TEST_INTERACTIVE
4383 TestRegExInteractive();
4384 #endif // defined TEST_REGEX && TEST_INTERACTIVE
4386 #ifdef TEST_REGISTRY
4388 TestRegistryAssociation();
4389 #endif // TEST_REGISTRY
4394 #endif // TEST_SOCKETS
4401 #endif // TEST_STREAMS
4403 #ifdef TEST_TEXTSTREAM
4404 TestTextInputStream();
4405 #endif // TEST_TEXTSTREAM
4408 int nCPUs
= wxThread::GetCPUCount();
4409 wxPrintf(_T("This system has %d CPUs\n"), nCPUs
);
4411 wxThread::SetConcurrency(nCPUs
);
4413 TestJoinableThreads();
4416 TestJoinableThreads();
4417 TestDetachedThreads();
4418 TestThreadSuspend();
4420 TestThreadConditions();
4424 #endif // TEST_THREADS
4428 #endif // TEST_TIMER
4430 #ifdef TEST_DATETIME
4437 TestTimeSpanFormat();
4443 #if TEST_INTERACTIVE
4444 TestDateTimeInteractive();
4446 #endif // TEST_DATETIME
4448 #ifdef TEST_SCOPEGUARD
4452 #ifdef TEST_STACKWALKER
4453 #if wxUSE_STACKWALKER
4454 TestStackWalk(argv
[0]);
4456 #endif // TEST_STACKWALKER
4458 #ifdef TEST_STDPATHS
4459 TestStandardPaths();
4463 wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
4465 #endif // TEST_USLEEP
4470 #endif // TEST_VCARD
4474 #endif // TEST_VOLUME
4478 TestEncodingConverter();
4479 #endif // TEST_WCHAR
4482 TestZipStreamRead();
4483 TestZipFileSystem();
4488 for ( int n
= 0; n
< argc
; n
++ )
4493 #endif // wxUSE_UNICODE