1 /////////////////////////////////////////////////////////////////////////////
2 // Name: samples/console/console.cpp
3 // Purpose: a sample console (as opposed to GUI) progam using wxWindows
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
23 #error "This sample can't be compiled in GUI mode."
28 #include "wx/string.h"
32 // without this pragma, the stupid compiler precompiles #defines below so that
33 // changing them doesn't "take place" later!
38 // ----------------------------------------------------------------------------
39 // conditional compilation
40 // ----------------------------------------------------------------------------
43 A note about all these conditional compilation macros: this file is used
44 both as a test suite for various non-GUI wxWindows classes and as a
45 scratchpad for quick tests. So there are two compilation modes: if you
46 define TEST_ALL all tests are run, otherwise you may enable the individual
47 tests individually in the "#else" branch below.
50 // what to test (in alphabetic order)? uncomment the line below to do all tests
58 #define TEST_DLLLOADER
68 #define TEST_INFO_FUNCTIONS
84 #define TEST_TEXTSTREAM
88 // #define TEST_VCARD -- don't enable this (VZ)
95 static const bool TEST_ALL
= TRUE
;
97 #define TEST_TEXTSTREAM
99 static const bool TEST_ALL
= FALSE
;
102 // some tests are interactive, define this to run them
103 #ifdef TEST_INTERACTIVE
104 #undef TEST_INTERACTIVE
106 static const bool TEST_INTERACTIVE
= TRUE
;
108 static const bool TEST_INTERACTIVE
= FALSE
;
111 // ----------------------------------------------------------------------------
112 // test class for container objects
113 // ----------------------------------------------------------------------------
115 #if defined(TEST_ARRAYS) || defined(TEST_LIST)
117 class Bar
// Foo is already taken in the hash test
120 Bar(const wxString
& name
) : m_name(name
) { ms_bars
++; }
121 Bar(const Bar
& bar
) : m_name(bar
.m_name
) { ms_bars
++; }
122 ~Bar() { ms_bars
--; }
124 static size_t GetNumber() { return ms_bars
; }
126 const wxChar
*GetName() const { return m_name
; }
131 static size_t ms_bars
;
134 size_t Bar::ms_bars
= 0;
136 #endif // defined(TEST_ARRAYS) || defined(TEST_LIST)
138 // ============================================================================
140 // ============================================================================
142 // ----------------------------------------------------------------------------
144 // ----------------------------------------------------------------------------
146 #if defined(TEST_STRINGS) || defined(TEST_SOCKETS)
148 // replace TABs with \t and CRs with \n
149 static wxString
MakePrintable(const wxChar
*s
)
152 (void)str
.Replace(_T("\t"), _T("\\t"));
153 (void)str
.Replace(_T("\n"), _T("\\n"));
154 (void)str
.Replace(_T("\r"), _T("\\r"));
159 #endif // MakePrintable() is used
161 // ----------------------------------------------------------------------------
162 // wxFontMapper::CharsetToEncoding
163 // ----------------------------------------------------------------------------
167 #include "wx/fontmap.h"
169 static void TestCharset()
171 static const wxChar
*charsets
[] =
173 // some vali charsets
182 // and now some bogus ones
189 for ( size_t n
= 0; n
< WXSIZEOF(charsets
); n
++ )
191 wxFontEncoding enc
= wxFontMapper::Get()->CharsetToEncoding(charsets
[n
]);
192 wxPrintf(_T("Charset: %s\tEncoding: %s (%s)\n"),
194 wxFontMapper::Get()->GetEncodingName(enc
).c_str(),
195 wxFontMapper::Get()->GetEncodingDescription(enc
).c_str());
199 #endif // TEST_CHARSET
201 // ----------------------------------------------------------------------------
203 // ----------------------------------------------------------------------------
207 #include "wx/cmdline.h"
208 #include "wx/datetime.h"
211 #if wxUSE_CMDLINE_PARSER
213 static void ShowCmdLine(const wxCmdLineParser
& parser
)
215 wxString s
= _T("Input files: ");
217 size_t count
= parser
.GetParamCount();
218 for ( size_t param
= 0; param
< count
; param
++ )
220 s
<< parser
.GetParam(param
) << ' ';
224 << _T("Verbose:\t") << (parser
.Found(_T("v")) ? _T("yes") : _T("no")) << '\n'
225 << _T("Quiet:\t") << (parser
.Found(_T("q")) ? _T("yes") : _T("no")) << '\n';
230 if ( parser
.Found(_T("o"), &strVal
) )
231 s
<< _T("Output file:\t") << strVal
<< '\n';
232 if ( parser
.Found(_T("i"), &strVal
) )
233 s
<< _T("Input dir:\t") << strVal
<< '\n';
234 if ( parser
.Found(_T("s"), &lVal
) )
235 s
<< _T("Size:\t") << lVal
<< '\n';
236 if ( parser
.Found(_T("d"), &dt
) )
237 s
<< _T("Date:\t") << dt
.FormatISODate() << '\n';
238 if ( parser
.Found(_T("project_name"), &strVal
) )
239 s
<< _T("Project:\t") << strVal
<< '\n';
244 #endif // wxUSE_CMDLINE_PARSER
246 static void TestCmdLineConvert()
248 static const wxChar
*cmdlines
[] =
251 _T("-a \"-bstring 1\" -c\"string 2\" \"string 3\""),
252 _T("literal \\\" and \"\""),
255 for ( size_t n
= 0; n
< WXSIZEOF(cmdlines
); n
++ )
257 const wxChar
*cmdline
= cmdlines
[n
];
258 wxPrintf(_T("Parsing: %s\n"), cmdline
);
259 wxArrayString args
= wxCmdLineParser::ConvertStringToArgs(cmdline
);
261 size_t count
= args
.GetCount();
262 wxPrintf(_T("\targc = %u\n"), count
);
263 for ( size_t arg
= 0; arg
< count
; arg
++ )
265 wxPrintf(_T("\targv[%u] = %s\n"), arg
, args
[arg
].c_str());
270 #endif // TEST_CMDLINE
272 // ----------------------------------------------------------------------------
274 // ----------------------------------------------------------------------------
281 static const wxChar
*ROOTDIR
= _T("/");
282 static const wxChar
*TESTDIR
= _T("/usr");
283 #elif defined(__WXMSW__)
284 static const wxChar
*ROOTDIR
= _T("c:\\");
285 static const wxChar
*TESTDIR
= _T("d:\\");
287 #error "don't know where the root directory is"
290 static void TestDirEnumHelper(wxDir
& dir
,
291 int flags
= wxDIR_DEFAULT
,
292 const wxString
& filespec
= wxEmptyString
)
296 if ( !dir
.IsOpened() )
299 bool cont
= dir
.GetFirst(&filename
, filespec
, flags
);
302 wxPrintf(_T("\t%s\n"), filename
.c_str());
304 cont
= dir
.GetNext(&filename
);
310 static void TestDirEnum()
312 wxPuts(_T("*** Testing wxDir::GetFirst/GetNext ***"));
314 wxString cwd
= wxGetCwd();
315 if ( !wxDir::Exists(cwd
) )
317 wxPrintf(_T("ERROR: current directory '%s' doesn't exist?\n"), cwd
.c_str());
322 if ( !dir
.IsOpened() )
324 wxPrintf(_T("ERROR: failed to open current directory '%s'.\n"), cwd
.c_str());
328 wxPuts(_T("Enumerating everything in current directory:"));
329 TestDirEnumHelper(dir
);
331 wxPuts(_T("Enumerating really everything in current directory:"));
332 TestDirEnumHelper(dir
, wxDIR_DEFAULT
| wxDIR_DOTDOT
);
334 wxPuts(_T("Enumerating object files in current directory:"));
335 TestDirEnumHelper(dir
, wxDIR_DEFAULT
, "*.o*");
337 wxPuts(_T("Enumerating directories in current directory:"));
338 TestDirEnumHelper(dir
, wxDIR_DIRS
);
340 wxPuts(_T("Enumerating files in current directory:"));
341 TestDirEnumHelper(dir
, wxDIR_FILES
);
343 wxPuts(_T("Enumerating files including hidden in current directory:"));
344 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
348 wxPuts(_T("Enumerating everything in root directory:"));
349 TestDirEnumHelper(dir
, wxDIR_DEFAULT
);
351 wxPuts(_T("Enumerating directories in root directory:"));
352 TestDirEnumHelper(dir
, wxDIR_DIRS
);
354 wxPuts(_T("Enumerating files in root directory:"));
355 TestDirEnumHelper(dir
, wxDIR_FILES
);
357 wxPuts(_T("Enumerating files including hidden in root directory:"));
358 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
360 wxPuts(_T("Enumerating files in non existing directory:"));
361 wxDir
dirNo("nosuchdir");
362 TestDirEnumHelper(dirNo
);
365 class DirPrintTraverser
: public wxDirTraverser
368 virtual wxDirTraverseResult
OnFile(const wxString
& filename
)
370 return wxDIR_CONTINUE
;
373 virtual wxDirTraverseResult
OnDir(const wxString
& dirname
)
375 wxString path
, name
, ext
;
376 wxSplitPath(dirname
, &path
, &name
, &ext
);
379 name
<< _T('.') << ext
;
382 for ( const wxChar
*p
= path
.c_str(); *p
; p
++ )
384 if ( wxIsPathSeparator(*p
) )
388 wxPrintf(_T("%s%s\n"), indent
.c_str(), name
.c_str());
390 return wxDIR_CONTINUE
;
394 static void TestDirTraverse()
396 wxPuts(_T("*** Testing wxDir::Traverse() ***"));
400 size_t n
= wxDir::GetAllFiles(TESTDIR
, &files
);
401 wxPrintf(_T("There are %u files under '%s'\n"), n
, TESTDIR
);
404 wxPrintf(_T("First one is '%s'\n"), files
[0u].c_str());
405 wxPrintf(_T(" last one is '%s'\n"), files
[n
- 1].c_str());
408 // enum again with custom traverser
410 DirPrintTraverser traverser
;
411 dir
.Traverse(traverser
, _T(""), wxDIR_DIRS
| wxDIR_HIDDEN
);
414 static void TestDirExists()
416 wxPuts(_T("*** Testing wxDir::Exists() ***"));
418 static const wxChar
*dirnames
[] =
421 #if defined(__WXMSW__)
424 _T("\\\\share\\file"),
428 _T("c:\\autoexec.bat"),
429 #elif defined(__UNIX__)
438 for ( size_t n
= 0; n
< WXSIZEOF(dirnames
); n
++ )
440 wxPrintf(_T("%-40s: %s\n"),
442 wxDir::Exists(dirnames
[n
]) ? _T("exists")
443 : _T("doesn't exist"));
449 // ----------------------------------------------------------------------------
451 // ----------------------------------------------------------------------------
453 #ifdef TEST_DLLLOADER
455 #include "wx/dynlib.h"
457 static void TestDllLoad()
459 #if defined(__WXMSW__)
460 static const wxChar
*LIB_NAME
= _T("kernel32.dll");
461 static const wxChar
*FUNC_NAME
= _T("lstrlenA");
462 #elif defined(__UNIX__)
463 // weird: using just libc.so does *not* work!
464 static const wxChar
*LIB_NAME
= _T("/lib/libc-2.0.7.so");
465 static const wxChar
*FUNC_NAME
= _T("strlen");
467 #error "don't know how to test wxDllLoader on this platform"
470 wxPuts(_T("*** testing wxDllLoader ***\n"));
472 wxDynamicLibrary
lib(LIB_NAME
);
473 if ( !lib
.IsLoaded() )
475 wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME
);
479 typedef int (*wxStrlenType
)(const char *);
480 wxStrlenType pfnStrlen
= (wxStrlenType
)lib
.GetSymbol(FUNC_NAME
);
483 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
484 FUNC_NAME
, LIB_NAME
);
488 if ( pfnStrlen("foo") != 3 )
490 wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
494 wxPuts(_T("... ok"));
500 #endif // TEST_DLLLOADER
502 // ----------------------------------------------------------------------------
504 // ----------------------------------------------------------------------------
508 #include "wx/utils.h"
510 static wxString
MyGetEnv(const wxString
& var
)
513 if ( !wxGetEnv(var
, &val
) )
516 val
= wxString(_T('\'')) + val
+ _T('\'');
521 static void TestEnvironment()
523 const wxChar
*var
= _T("wxTestVar");
525 wxPuts(_T("*** testing environment access functions ***"));
527 wxPrintf(_T("Initially getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
528 wxSetEnv(var
, _T("value for wxTestVar"));
529 wxPrintf(_T("After wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
530 wxSetEnv(var
, _T("another value"));
531 wxPrintf(_T("After 2nd wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
533 wxPrintf(_T("After wxUnsetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
534 wxPrintf(_T("PATH = %s\n"), MyGetEnv(_T("PATH")).c_str());
537 #endif // TEST_ENVIRON
539 // ----------------------------------------------------------------------------
541 // ----------------------------------------------------------------------------
545 #include "wx/utils.h"
547 static void TestExecute()
549 wxPuts(_T("*** testing wxExecute ***"));
552 #define COMMAND "cat -n ../../Makefile" // "echo hi"
553 #define SHELL_COMMAND "echo hi from shell"
554 #define REDIRECT_COMMAND COMMAND // "date"
555 #elif defined(__WXMSW__)
556 #define COMMAND "command.com /c echo hi"
557 #define SHELL_COMMAND "echo hi"
558 #define REDIRECT_COMMAND COMMAND
560 #error "no command to exec"
563 wxPrintf(_T("Testing wxShell: "));
565 if ( wxShell(SHELL_COMMAND
) )
568 wxPuts(_T("ERROR."));
570 wxPrintf(_T("Testing wxExecute: "));
572 if ( wxExecute(COMMAND
, TRUE
/* sync */) == 0 )
575 wxPuts(_T("ERROR."));
577 #if 0 // no, it doesn't work (yet?)
578 wxPrintf(_T("Testing async wxExecute: "));
580 if ( wxExecute(COMMAND
) != 0 )
581 wxPuts(_T("Ok (command launched)."));
583 wxPuts(_T("ERROR."));
586 wxPrintf(_T("Testing wxExecute with redirection:\n"));
587 wxArrayString output
;
588 if ( wxExecute(REDIRECT_COMMAND
, output
) != 0 )
590 wxPuts(_T("ERROR."));
594 size_t count
= output
.GetCount();
595 for ( size_t n
= 0; n
< count
; n
++ )
597 wxPrintf(_T("\t%s\n"), output
[n
].c_str());
604 #endif // TEST_EXECUTE
606 // ----------------------------------------------------------------------------
608 // ----------------------------------------------------------------------------
613 #include "wx/ffile.h"
614 #include "wx/textfile.h"
616 static void TestFileRead()
618 wxPuts(_T("*** wxFile read test ***"));
620 wxFile
file(_T("testdata.fc"));
621 if ( file
.IsOpened() )
623 wxPrintf(_T("File length: %lu\n"), file
.Length());
625 wxPuts(_T("File dump:\n----------"));
627 static const off_t len
= 1024;
631 off_t nRead
= file
.Read(buf
, len
);
632 if ( nRead
== wxInvalidOffset
)
634 wxPrintf(_T("Failed to read the file."));
638 fwrite(buf
, nRead
, 1, stdout
);
644 wxPuts(_T("----------"));
648 wxPrintf(_T("ERROR: can't open test file.\n"));
654 static void TestTextFileRead()
656 wxPuts(_T("*** wxTextFile read test ***"));
658 wxTextFile
file(_T("testdata.fc"));
661 wxPrintf(_T("Number of lines: %u\n"), file
.GetLineCount());
662 wxPrintf(_T("Last line: '%s'\n"), file
.GetLastLine().c_str());
666 wxPuts(_T("\nDumping the entire file:"));
667 for ( s
= file
.GetFirstLine(); !file
.Eof(); s
= file
.GetNextLine() )
669 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
671 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
673 wxPuts(_T("\nAnd now backwards:"));
674 for ( s
= file
.GetLastLine();
675 file
.GetCurrentLine() != 0;
676 s
= file
.GetPrevLine() )
678 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
680 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
684 wxPrintf(_T("ERROR: can't open '%s'\n"), file
.GetName());
690 static void TestFileCopy()
692 wxPuts(_T("*** Testing wxCopyFile ***"));
694 static const wxChar
*filename1
= _T("testdata.fc");
695 static const wxChar
*filename2
= _T("test2");
696 if ( !wxCopyFile(filename1
, filename2
) )
698 wxPuts(_T("ERROR: failed to copy file"));
702 wxFFile
f1(filename1
, "rb"),
705 if ( !f1
.IsOpened() || !f2
.IsOpened() )
707 wxPuts(_T("ERROR: failed to open file(s)"));
712 if ( !f1
.ReadAll(&s1
) || !f2
.ReadAll(&s2
) )
714 wxPuts(_T("ERROR: failed to read file(s)"));
718 if ( (s1
.length() != s2
.length()) ||
719 (memcmp(s1
.c_str(), s2
.c_str(), s1
.length()) != 0) )
721 wxPuts(_T("ERROR: copy error!"));
725 wxPuts(_T("File was copied ok."));
731 if ( !wxRemoveFile(filename2
) )
733 wxPuts(_T("ERROR: failed to remove the file"));
741 // ----------------------------------------------------------------------------
743 // ----------------------------------------------------------------------------
747 #include "wx/confbase.h"
748 #include "wx/fileconf.h"
750 static const struct FileConfTestData
752 const wxChar
*name
; // value name
753 const wxChar
*value
; // the value from the file
756 { _T("value1"), _T("one") },
757 { _T("value2"), _T("two") },
758 { _T("novalue"), _T("default") },
761 static void TestFileConfRead()
763 wxPuts(_T("*** testing wxFileConfig loading/reading ***"));
765 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
766 _T("testdata.fc"), wxEmptyString
,
767 wxCONFIG_USE_RELATIVE_PATH
);
769 // test simple reading
770 wxPuts(_T("\nReading config file:"));
771 wxString
defValue(_T("default")), value
;
772 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
774 const FileConfTestData
& data
= fcTestData
[n
];
775 value
= fileconf
.Read(data
.name
, defValue
);
776 wxPrintf(_T("\t%s = %s "), data
.name
, value
.c_str());
777 if ( value
== data
.value
)
783 wxPrintf(_T("(ERROR: should be %s)\n"), data
.value
);
787 // test enumerating the entries
788 wxPuts(_T("\nEnumerating all root entries:"));
791 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
794 wxPrintf(_T("\t%s = %s\n"),
796 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
798 cont
= fileconf
.GetNextEntry(name
, dummy
);
802 #endif // TEST_FILECONF
804 // ----------------------------------------------------------------------------
806 // ----------------------------------------------------------------------------
810 #include "wx/filename.h"
812 static void DumpFileName(const wxFileName
& fn
)
814 wxString full
= fn
.GetFullPath();
816 wxString vol
, path
, name
, ext
;
817 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
819 wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
820 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
822 wxFileName::SplitPath(full
, &path
, &name
, &ext
);
823 wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
824 path
.c_str(), name
.c_str(), ext
.c_str());
826 wxPrintf(_T("path is also:\t'%s'\n"), fn
.GetPath().c_str());
827 wxPrintf(_T("with volume: \t'%s'\n"),
828 fn
.GetPath(wxPATH_GET_VOLUME
).c_str());
829 wxPrintf(_T("with separator:\t'%s'\n"),
830 fn
.GetPath(wxPATH_GET_SEPARATOR
).c_str());
831 wxPrintf(_T("with both: \t'%s'\n"),
832 fn
.GetPath(wxPATH_GET_SEPARATOR
| wxPATH_GET_VOLUME
).c_str());
834 wxPuts(_T("The directories in the path are:"));
835 wxArrayString dirs
= fn
.GetDirs();
836 size_t count
= dirs
.GetCount();
837 for ( size_t n
= 0; n
< count
; n
++ )
839 wxPrintf(_T("\t%u: %s\n"), n
, dirs
[n
].c_str());
843 static struct FileNameInfo
845 const wxChar
*fullname
;
846 const wxChar
*volume
;
855 { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), TRUE
, wxPATH_UNIX
},
856 { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), TRUE
, wxPATH_UNIX
},
857 { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), TRUE
, wxPATH_UNIX
},
858 { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), FALSE
, wxPATH_UNIX
},
859 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_UNIX
},
860 { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), TRUE
, wxPATH_UNIX
},
861 { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), TRUE
, wxPATH_UNIX
},
862 { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), FALSE
, wxPATH_UNIX
},
863 { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), TRUE
, wxPATH_UNIX
},
865 // Windows file names
866 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
867 { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
868 { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
869 { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
870 { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), TRUE
, wxPATH_DOS
},
871 { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
872 { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
874 // wxFileName support for Mac file names is broken currently
877 { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE
, wxPATH_MAC
},
878 { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), TRUE
, wxPATH_MAC
},
879 { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), TRUE
, wxPATH_MAC
},
880 { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), FALSE
, wxPATH_MAC
},
881 { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE
, wxPATH_MAC
},
882 { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE
, wxPATH_MAC
},
886 { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), TRUE
, wxPATH_VMS
},
887 { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), FALSE
, wxPATH_VMS
},
890 static void TestFileNameConstruction()
892 wxPuts(_T("*** testing wxFileName construction ***"));
894 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
896 const FileNameInfo
& fni
= filenames
[n
];
898 wxFileName
fn(fni
.fullname
, fni
.format
);
900 wxString fullname
= fn
.GetFullPath(fni
.format
);
901 if ( fullname
!= fni
.fullname
)
903 wxPrintf(_T("ERROR: fullname should be '%s'\n"), fni
.fullname
);
906 bool isAbsolute
= fn
.IsAbsolute(fni
.format
);
907 wxPrintf(_T("'%s' is %s (%s)\n\t"),
909 isAbsolute
? "absolute" : "relative",
910 isAbsolute
== fni
.isAbsolute
? "ok" : "ERROR");
912 if ( !fn
.Normalize(wxPATH_NORM_ALL
, _T(""), fni
.format
) )
914 wxPuts(_T("ERROR (couldn't be normalized)"));
918 wxPrintf(_T("normalized: '%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
925 static void TestFileNameSplit()
927 wxPuts(_T("*** testing wxFileName splitting ***"));
929 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
931 const FileNameInfo
& fni
= filenames
[n
];
932 wxString volume
, path
, name
, ext
;
933 wxFileName::SplitPath(fni
.fullname
,
934 &volume
, &path
, &name
, &ext
, fni
.format
);
936 wxPrintf(_T("%s -> volume = '%s', path = '%s', name = '%s', ext = '%s'"),
938 volume
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
940 if ( volume
!= fni
.volume
)
941 wxPrintf(_T(" (ERROR: volume = '%s')"), fni
.volume
);
942 if ( path
!= fni
.path
)
943 wxPrintf(_T(" (ERROR: path = '%s')"), fni
.path
);
944 if ( name
!= fni
.name
)
945 wxPrintf(_T(" (ERROR: name = '%s')"), fni
.name
);
946 if ( ext
!= fni
.ext
)
947 wxPrintf(_T(" (ERROR: ext = '%s')"), fni
.ext
);
953 static void TestFileNameTemp()
955 wxPuts(_T("*** testing wxFileName temp file creation ***"));
957 static const wxChar
*tmpprefixes
[] =
965 _T("/tmp/foo/bar"), // this one must be an error
969 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
971 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
974 // "error" is not in upper case because it may be ok
975 wxPrintf(_T("Prefix '%s'\t-> error\n"), tmpprefixes
[n
]);
979 wxPrintf(_T("Prefix '%s'\t-> temp file '%s'\n"),
980 tmpprefixes
[n
], path
.c_str());
982 if ( !wxRemoveFile(path
) )
984 wxLogWarning(_T("Failed to remove temp file '%s'"),
991 static void TestFileNameMakeRelative()
993 wxPuts(_T("*** testing wxFileName::MakeRelativeTo() ***"));
995 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
997 const FileNameInfo
& fni
= filenames
[n
];
999 wxFileName
fn(fni
.fullname
, fni
.format
);
1001 // choose the base dir of the same format
1003 switch ( fni
.format
)
1015 // TODO: I don't know how this is supposed to work there
1018 case wxPATH_NATIVE
: // make gcc happy
1020 wxFAIL_MSG( "unexpected path format" );
1023 wxPrintf(_T("'%s' relative to '%s': "),
1024 fn
.GetFullPath(fni
.format
).c_str(), base
.c_str());
1026 if ( !fn
.MakeRelativeTo(base
, fni
.format
) )
1028 wxPuts(_T("unchanged"));
1032 wxPrintf(_T("'%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
1037 static void TestFileNameComparison()
1042 static void TestFileNameOperations()
1047 static void TestFileNameCwd()
1052 #endif // TEST_FILENAME
1054 // ----------------------------------------------------------------------------
1055 // wxFileName time functions
1056 // ----------------------------------------------------------------------------
1058 #ifdef TEST_FILETIME
1060 #include <wx/filename.h>
1061 #include <wx/datetime.h>
1063 static void TestFileGetTimes()
1065 wxFileName
fn(_T("testdata.fc"));
1067 wxDateTime dtAccess
, dtMod
, dtCreate
;
1068 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtCreate
) )
1070 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
1074 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
1076 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
1077 wxPrintf(_T("Creation: \t%s\n"), dtCreate
.Format(fmt
).c_str());
1078 wxPrintf(_T("Last read: \t%s\n"), dtAccess
.Format(fmt
).c_str());
1079 wxPrintf(_T("Last write: \t%s\n"), dtMod
.Format(fmt
).c_str());
1083 static void TestFileSetTimes()
1085 wxFileName
fn(_T("testdata.fc"));
1089 wxPrintf(_T("ERROR: Touch() failed.\n"));
1093 #endif // TEST_FILETIME
1095 // ----------------------------------------------------------------------------
1097 // ----------------------------------------------------------------------------
1101 #include "wx/hash.h"
1105 Foo(int n_
) { n
= n_
; count
++; }
1110 static size_t count
;
1113 size_t Foo::count
= 0;
1115 WX_DECLARE_LIST(Foo
, wxListFoos
);
1116 WX_DECLARE_HASH(Foo
, wxListFoos
, wxHashFoos
);
1118 #include "wx/listimpl.cpp"
1120 WX_DEFINE_LIST(wxListFoos
);
1122 static void TestHash()
1124 wxPuts(_T("*** Testing wxHashTable ***\n"));
1128 hash
.DeleteContents(TRUE
);
1130 wxPrintf(_T("Hash created: %u foos in hash, %u foos totally\n"),
1131 hash
.GetCount(), Foo::count
);
1133 static const int hashTestData
[] =
1135 0, 1, 17, -2, 2, 4, -4, 345, 3, 3, 2, 1,
1139 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1141 hash
.Put(hashTestData
[n
], n
, new Foo(n
));
1144 wxPrintf(_T("Hash filled: %u foos in hash, %u foos totally\n"),
1145 hash
.GetCount(), Foo::count
);
1147 wxPuts(_T("Hash access test:"));
1148 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1150 wxPrintf(_T("\tGetting element with key %d, value %d: "),
1151 hashTestData
[n
], n
);
1152 Foo
*foo
= hash
.Get(hashTestData
[n
], n
);
1155 wxPrintf(_T("ERROR, not found.\n"));
1159 wxPrintf(_T("%d (%s)\n"), foo
->n
,
1160 (size_t)foo
->n
== n
? "ok" : "ERROR");
1164 wxPrintf(_T("\nTrying to get an element not in hash: "));
1166 if ( hash
.Get(1234) || hash
.Get(1, 0) )
1168 wxPuts(_T("ERROR: found!"));
1172 wxPuts(_T("ok (not found)"));
1176 wxPrintf(_T("Hash destroyed: %u foos left\n"), Foo::count
);
1181 // ----------------------------------------------------------------------------
1183 // ----------------------------------------------------------------------------
1187 #include "wx/hashmap.h"
1189 // test compilation of basic map types
1190 WX_DECLARE_HASH_MAP( int*, int*, wxPointerHash
, wxPointerEqual
, myPtrHashMap
);
1191 WX_DECLARE_HASH_MAP( long, long, wxIntegerHash
, wxIntegerEqual
, myLongHashMap
);
1192 WX_DECLARE_HASH_MAP( unsigned long, unsigned, wxIntegerHash
, wxIntegerEqual
,
1193 myUnsignedHashMap
);
1194 WX_DECLARE_HASH_MAP( unsigned int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1196 WX_DECLARE_HASH_MAP( int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1198 WX_DECLARE_HASH_MAP( short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1200 WX_DECLARE_HASH_MAP( unsigned short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1204 // WX_DECLARE_HASH_MAP( wxString, wxString, wxStringHash, wxStringEqual,
1205 // myStringHashMap );
1206 WX_DECLARE_STRING_HASH_MAP(wxString
, myStringHashMap
);
1208 typedef myStringHashMap::iterator Itor
;
1210 static void TestHashMap()
1212 wxPuts(_T("*** Testing wxHashMap ***\n"));
1213 myStringHashMap
sh(0); // as small as possible
1216 const size_t count
= 10000;
1218 // init with some data
1219 for( i
= 0; i
< count
; ++i
)
1221 buf
.Printf(wxT("%d"), i
);
1222 sh
[buf
] = wxT("A") + buf
+ wxT("C");
1225 // test that insertion worked
1226 if( sh
.size() != count
)
1228 wxPrintf(_T("*** ERROR: %u ELEMENTS, SHOULD BE %u ***\n"), sh
.size(), count
);
1231 for( i
= 0; i
< count
; ++i
)
1233 buf
.Printf(wxT("%d"), i
);
1234 if( sh
[buf
] != wxT("A") + buf
+ wxT("C") )
1236 wxPrintf(_T("*** ERROR INSERTION BROKEN! STOPPING NOW! ***\n"));
1241 // check that iterators work
1243 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1247 wxPrintf(_T("*** ERROR ITERATORS DO NOT TERMINATE! STOPPING NOW! ***\n"));
1251 if( it
->second
!= sh
[it
->first
] )
1253 wxPrintf(_T("*** ERROR ITERATORS BROKEN! STOPPING NOW! ***\n"));
1258 if( sh
.size() != i
)
1260 wxPrintf(_T("*** ERROR: %u ELEMENTS ITERATED, SHOULD BE %u ***\n"), i
, count
);
1263 // test copy ctor, assignment operator
1264 myStringHashMap
h1( sh
), h2( 0 );
1267 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1269 if( h1
[it
->first
] != it
->second
)
1271 wxPrintf(_T("*** ERROR: COPY CTOR BROKEN %s ***\n"), it
->first
.c_str());
1274 if( h2
[it
->first
] != it
->second
)
1276 wxPrintf(_T("*** ERROR: OPERATOR= BROKEN %s ***\n"), it
->first
.c_str());
1281 for( i
= 0; i
< count
; ++i
)
1283 buf
.Printf(wxT("%d"), i
);
1284 size_t sz
= sh
.size();
1286 // test find() and erase(it)
1289 it
= sh
.find( buf
);
1290 if( it
!= sh
.end() )
1294 if( sh
.find( buf
) != sh
.end() )
1296 wxPrintf(_T("*** ERROR: FOUND DELETED ELEMENT %u ***\n"), i
);
1300 wxPrintf(_T("*** ERROR: CANT FIND ELEMENT %u ***\n"), i
);
1305 size_t c
= sh
.erase( buf
);
1307 wxPrintf(_T("*** ERROR: SHOULD RETURN 1 ***\n"));
1309 if( sh
.find( buf
) != sh
.end() )
1311 wxPrintf(_T("*** ERROR: FOUND DELETED ELEMENT %u ***\n"), i
);
1315 // count should decrease
1316 if( sh
.size() != sz
- 1 )
1318 wxPrintf(_T("*** ERROR: COUNT DID NOT DECREASE ***\n"));
1322 wxPrintf(_T("*** Finished testing wxHashMap ***\n"));
1325 #endif // TEST_HASHMAP
1327 // ----------------------------------------------------------------------------
1329 // ----------------------------------------------------------------------------
1333 #include "wx/list.h"
1335 WX_DECLARE_LIST(Bar
, wxListBars
);
1336 #include "wx/listimpl.cpp"
1337 WX_DEFINE_LIST(wxListBars
);
1339 static void TestListCtor()
1341 wxPuts(_T("*** Testing wxList construction ***\n"));
1345 list1
.Append(new Bar(_T("first")));
1346 list1
.Append(new Bar(_T("second")));
1348 wxPrintf(_T("After 1st list creation: %u objects in the list, %u objects total.\n"),
1349 list1
.GetCount(), Bar::GetNumber());
1354 wxPrintf(_T("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n"),
1355 list1
.GetCount(), list2
.GetCount(), Bar::GetNumber());
1357 list1
.DeleteContents(TRUE
);
1360 wxPrintf(_T("After list destruction: %u objects left.\n"), Bar::GetNumber());
1365 // ----------------------------------------------------------------------------
1367 // ----------------------------------------------------------------------------
1371 #include "wx/intl.h"
1372 #include "wx/utils.h" // for wxSetEnv
1374 static wxLocale
gs_localeDefault(wxLANGUAGE_ENGLISH
);
1376 // find the name of the language from its value
1377 static const wxChar
*GetLangName(int lang
)
1379 static const wxChar
*languageNames
[] =
1389 _T("ARABIC_ALGERIA"),
1390 _T("ARABIC_BAHRAIN"),
1393 _T("ARABIC_JORDAN"),
1394 _T("ARABIC_KUWAIT"),
1395 _T("ARABIC_LEBANON"),
1397 _T("ARABIC_MOROCCO"),
1400 _T("ARABIC_SAUDI_ARABIA"),
1403 _T("ARABIC_TUNISIA"),
1410 _T("AZERI_CYRILLIC"),
1425 _T("CHINESE_SIMPLIFIED"),
1426 _T("CHINESE_TRADITIONAL"),
1427 _T("CHINESE_HONGKONG"),
1428 _T("CHINESE_MACAU"),
1429 _T("CHINESE_SINGAPORE"),
1430 _T("CHINESE_TAIWAN"),
1436 _T("DUTCH_BELGIAN"),
1440 _T("ENGLISH_AUSTRALIA"),
1441 _T("ENGLISH_BELIZE"),
1442 _T("ENGLISH_BOTSWANA"),
1443 _T("ENGLISH_CANADA"),
1444 _T("ENGLISH_CARIBBEAN"),
1445 _T("ENGLISH_DENMARK"),
1447 _T("ENGLISH_JAMAICA"),
1448 _T("ENGLISH_NEW_ZEALAND"),
1449 _T("ENGLISH_PHILIPPINES"),
1450 _T("ENGLISH_SOUTH_AFRICA"),
1451 _T("ENGLISH_TRINIDAD"),
1452 _T("ENGLISH_ZIMBABWE"),
1460 _T("FRENCH_BELGIAN"),
1461 _T("FRENCH_CANADIAN"),
1462 _T("FRENCH_LUXEMBOURG"),
1463 _T("FRENCH_MONACO"),
1469 _T("GERMAN_AUSTRIAN"),
1470 _T("GERMAN_BELGIUM"),
1471 _T("GERMAN_LIECHTENSTEIN"),
1472 _T("GERMAN_LUXEMBOURG"),
1490 _T("ITALIAN_SWISS"),
1495 _T("KASHMIRI_INDIA"),
1513 _T("MALAY_BRUNEI_DARUSSALAM"),
1514 _T("MALAY_MALAYSIA"),
1524 _T("NORWEGIAN_BOKMAL"),
1525 _T("NORWEGIAN_NYNORSK"),
1532 _T("PORTUGUESE_BRAZILIAN"),
1535 _T("RHAETO_ROMANCE"),
1538 _T("RUSSIAN_UKRAINE"),
1544 _T("SERBIAN_CYRILLIC"),
1545 _T("SERBIAN_LATIN"),
1546 _T("SERBO_CROATIAN"),
1557 _T("SPANISH_ARGENTINA"),
1558 _T("SPANISH_BOLIVIA"),
1559 _T("SPANISH_CHILE"),
1560 _T("SPANISH_COLOMBIA"),
1561 _T("SPANISH_COSTA_RICA"),
1562 _T("SPANISH_DOMINICAN_REPUBLIC"),
1563 _T("SPANISH_ECUADOR"),
1564 _T("SPANISH_EL_SALVADOR"),
1565 _T("SPANISH_GUATEMALA"),
1566 _T("SPANISH_HONDURAS"),
1567 _T("SPANISH_MEXICAN"),
1568 _T("SPANISH_MODERN"),
1569 _T("SPANISH_NICARAGUA"),
1570 _T("SPANISH_PANAMA"),
1571 _T("SPANISH_PARAGUAY"),
1573 _T("SPANISH_PUERTO_RICO"),
1574 _T("SPANISH_URUGUAY"),
1576 _T("SPANISH_VENEZUELA"),
1580 _T("SWEDISH_FINLAND"),
1598 _T("URDU_PAKISTAN"),
1600 _T("UZBEK_CYRILLIC"),
1613 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1614 return languageNames
[lang
];
1616 return _T("INVALID");
1619 static void TestDefaultLang()
1621 wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
1623 static const wxChar
*langStrings
[] =
1625 NULL
, // system default
1632 _T("de_DE.iso88591"),
1634 _T("?"), // invalid lang spec
1635 _T("klingonese"), // I bet on some systems it does exist...
1638 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1639 wxLocale::GetSystemEncodingName().c_str(),
1640 wxLocale::GetSystemEncoding());
1642 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1644 const wxChar
*langStr
= langStrings
[n
];
1647 // FIXME: this doesn't do anything at all under Windows, we need
1648 // to create a new wxLocale!
1649 wxSetEnv(_T("LC_ALL"), langStr
);
1652 int lang
= gs_localeDefault
.GetSystemLanguage();
1653 wxPrintf(_T("Locale for '%s' is %s.\n"),
1654 langStr
? langStr
: _T("system default"), GetLangName(lang
));
1658 #endif // TEST_LOCALE
1660 // ----------------------------------------------------------------------------
1662 // ----------------------------------------------------------------------------
1666 #include "wx/mimetype.h"
1668 static void TestMimeEnum()
1670 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1672 wxArrayString mimetypes
;
1674 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1676 wxPrintf(_T("*** All %u known filetypes: ***\n"), count
);
1681 for ( size_t n
= 0; n
< count
; n
++ )
1683 wxFileType
*filetype
=
1684 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1687 wxPrintf(_T("nothing known about the filetype '%s'!\n"),
1688 mimetypes
[n
].c_str());
1692 filetype
->GetDescription(&desc
);
1693 filetype
->GetExtensions(exts
);
1695 filetype
->GetIcon(NULL
);
1698 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1701 extsAll
<< _T(", ");
1705 wxPrintf(_T("\t%s: %s (%s)\n"),
1706 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
1712 static void TestMimeOverride()
1714 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
1716 static const wxChar
*mailcap
= _T("/tmp/mailcap");
1717 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
1719 if ( wxFile::Exists(mailcap
) )
1720 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
1722 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
1724 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
1727 if ( wxFile::Exists(mimetypes
) )
1728 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
1730 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
1732 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
1738 static void TestMimeFilename()
1740 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
1742 static const wxChar
*filenames
[] =
1750 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1752 const wxString fname
= filenames
[n
];
1753 wxString ext
= fname
.AfterLast(_T('.'));
1754 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
1757 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
1762 if ( !ft
->GetDescription(&desc
) )
1763 desc
= _T("<no description>");
1766 if ( !ft
->GetOpenCommand(&cmd
,
1767 wxFileType::MessageParameters(fname
, _T(""))) )
1768 cmd
= _T("<no command available>");
1770 cmd
= wxString(_T('"')) + cmd
+ _T('"');
1772 wxPrintf(_T("To open %s (%s) do %s.\n"),
1773 fname
.c_str(), desc
.c_str(), cmd
.c_str());
1782 static void TestMimeAssociate()
1784 wxPuts(_T("*** Testing creation of filetype association ***\n"));
1786 wxFileTypeInfo
ftInfo(
1787 _T("application/x-xyz"),
1788 _T("xyzview '%s'"), // open cmd
1789 _T(""), // print cmd
1790 _T("XYZ File"), // description
1791 _T(".xyz"), // extensions
1792 NULL
// end of extensions
1794 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
1796 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
1799 wxPuts(_T("ERROR: failed to create association!"));
1803 // TODO: read it back
1812 // ----------------------------------------------------------------------------
1813 // misc information functions
1814 // ----------------------------------------------------------------------------
1816 #ifdef TEST_INFO_FUNCTIONS
1818 #include "wx/utils.h"
1820 static void TestDiskInfo()
1822 wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
1826 wxChar pathname
[128];
1827 wxPrintf(_T("\nEnter a directory name: "));
1828 if ( !wxFgets(pathname
, WXSIZEOF(pathname
), stdin
) )
1831 // kill the last '\n'
1832 pathname
[wxStrlen(pathname
) - 1] = 0;
1834 wxLongLong total
, free
;
1835 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
1837 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
1841 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
1842 (total
/ 1024).ToString().c_str(),
1843 (free
/ 1024).ToString().c_str(),
1849 static void TestOsInfo()
1851 wxPuts(_T("*** Testing OS info functions ***\n"));
1854 wxGetOsVersion(&major
, &minor
);
1855 wxPrintf(_T("Running under: %s, version %d.%d\n"),
1856 wxGetOsDescription().c_str(), major
, minor
);
1858 wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory());
1860 wxPrintf(_T("Host name is %s (%s).\n"),
1861 wxGetHostName().c_str(), wxGetFullHostName().c_str());
1866 static void TestUserInfo()
1868 wxPuts(_T("*** Testing user info functions ***\n"));
1870 wxPrintf(_T("User id is:\t%s\n"), wxGetUserId().c_str());
1871 wxPrintf(_T("User name is:\t%s\n"), wxGetUserName().c_str());
1872 wxPrintf(_T("Home dir is:\t%s\n"), wxGetHomeDir().c_str());
1873 wxPrintf(_T("Email address:\t%s\n"), wxGetEmailAddress().c_str());
1878 #endif // TEST_INFO_FUNCTIONS
1880 // ----------------------------------------------------------------------------
1882 // ----------------------------------------------------------------------------
1884 #ifdef TEST_LONGLONG
1886 #include "wx/longlong.h"
1887 #include "wx/timer.h"
1889 // make a 64 bit number from 4 16 bit ones
1890 #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3)
1892 // get a random 64 bit number
1893 #define RAND_LL() MAKE_LL(rand(), rand(), rand(), rand())
1895 static const long testLongs
[] =
1906 #if wxUSE_LONGLONG_WX
1907 inline bool operator==(const wxLongLongWx
& a
, const wxLongLongNative
& b
)
1908 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1909 inline bool operator==(const wxLongLongNative
& a
, const wxLongLongWx
& b
)
1910 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1911 #endif // wxUSE_LONGLONG_WX
1913 static void TestSpeed()
1915 static const long max
= 100000000;
1922 for ( n
= 0; n
< max
; n
++ )
1927 wxPrintf(_T("Summing longs took %ld milliseconds.\n"), sw
.Time());
1930 #if wxUSE_LONGLONG_NATIVE
1935 for ( n
= 0; n
< max
; n
++ )
1940 wxPrintf(_T("Summing wxLongLong_t took %ld milliseconds.\n"), sw
.Time());
1942 #endif // wxUSE_LONGLONG_NATIVE
1948 for ( n
= 0; n
< max
; n
++ )
1953 wxPrintf(_T("Summing wxLongLongs took %ld milliseconds.\n"), sw
.Time());
1957 static void TestLongLongConversion()
1959 wxPuts(_T("*** Testing wxLongLong conversions ***\n"));
1963 for ( size_t n
= 0; n
< 100000; n
++ )
1967 #if wxUSE_LONGLONG_NATIVE
1968 wxLongLongNative
b(a
.GetHi(), a
.GetLo());
1970 wxASSERT_MSG( a
== b
, "conversions failure" );
1972 wxPuts(_T("Can't do it without native long long type, test skipped."));
1975 #endif // wxUSE_LONGLONG_NATIVE
1977 if ( !(nTested
% 1000) )
1986 wxPuts(_T(" done!"));
1989 static void TestMultiplication()
1991 wxPuts(_T("*** Testing wxLongLong multiplication ***\n"));
1995 for ( size_t n
= 0; n
< 100000; n
++ )
2000 #if wxUSE_LONGLONG_NATIVE
2001 wxLongLongNative
aa(a
.GetHi(), a
.GetLo());
2002 wxLongLongNative
bb(b
.GetHi(), b
.GetLo());
2004 wxASSERT_MSG( a
*b
== aa
*bb
, "multiplication failure" );
2005 #else // !wxUSE_LONGLONG_NATIVE
2006 wxPuts(_T("Can't do it without native long long type, test skipped."));
2009 #endif // wxUSE_LONGLONG_NATIVE
2011 if ( !(nTested
% 1000) )
2020 wxPuts(_T(" done!"));
2023 static void TestDivision()
2025 wxPuts(_T("*** Testing wxLongLong division ***\n"));
2029 for ( size_t n
= 0; n
< 100000; n
++ )
2031 // get a random wxLongLong (shifting by 12 the MSB ensures that the
2032 // multiplication will not overflow)
2033 wxLongLong ll
= MAKE_LL((rand() >> 12), rand(), rand(), rand());
2035 // get a random (but non null) long (not wxLongLong for now) to divide
2047 #if wxUSE_LONGLONG_NATIVE
2048 wxLongLongNative
m(ll
.GetHi(), ll
.GetLo());
2050 wxLongLongNative p
= m
/ l
, s
= m
% l
;
2051 wxASSERT_MSG( q
== p
&& r
== s
, "division failure" );
2052 #else // !wxUSE_LONGLONG_NATIVE
2053 // verify the result
2054 wxASSERT_MSG( ll
== q
*l
+ r
, "division failure" );
2055 #endif // wxUSE_LONGLONG_NATIVE
2057 if ( !(nTested
% 1000) )
2066 wxPuts(_T(" done!"));
2069 static void TestAddition()
2071 wxPuts(_T("*** Testing wxLongLong addition ***\n"));
2075 for ( size_t n
= 0; n
< 100000; n
++ )
2081 #if wxUSE_LONGLONG_NATIVE
2082 wxASSERT_MSG( c
== wxLongLongNative(a
.GetHi(), a
.GetLo()) +
2083 wxLongLongNative(b
.GetHi(), b
.GetLo()),
2084 "addition failure" );
2085 #else // !wxUSE_LONGLONG_NATIVE
2086 wxASSERT_MSG( c
- b
== a
, "addition failure" );
2087 #endif // wxUSE_LONGLONG_NATIVE
2089 if ( !(nTested
% 1000) )
2098 wxPuts(_T(" done!"));
2101 static void TestBitOperations()
2103 wxPuts(_T("*** Testing wxLongLong bit operation ***\n"));
2107 for ( size_t n
= 0; n
< 100000; n
++ )
2111 #if wxUSE_LONGLONG_NATIVE
2112 for ( size_t n
= 0; n
< 33; n
++ )
2115 #else // !wxUSE_LONGLONG_NATIVE
2116 wxPuts(_T("Can't do it without native long long type, test skipped."));
2119 #endif // wxUSE_LONGLONG_NATIVE
2121 if ( !(nTested
% 1000) )
2130 wxPuts(_T(" done!"));
2133 static void TestLongLongComparison()
2135 #if wxUSE_LONGLONG_WX
2136 wxPuts(_T("*** Testing wxLongLong comparison ***\n"));
2138 static const long ls
[2] =
2144 wxLongLongWx lls
[2];
2148 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2152 for ( size_t m
= 0; m
< WXSIZEOF(lls
); m
++ )
2154 res
= lls
[m
] > testLongs
[n
];
2155 wxPrintf(_T("0x%lx > 0x%lx is %s (%s)\n"),
2156 ls
[m
], testLongs
[n
], res
? "true" : "false",
2157 res
== (ls
[m
] > testLongs
[n
]) ? "ok" : "ERROR");
2159 res
= lls
[m
] < testLongs
[n
];
2160 wxPrintf(_T("0x%lx < 0x%lx is %s (%s)\n"),
2161 ls
[m
], testLongs
[n
], res
? "true" : "false",
2162 res
== (ls
[m
] < testLongs
[n
]) ? "ok" : "ERROR");
2164 res
= lls
[m
] == testLongs
[n
];
2165 wxPrintf(_T("0x%lx == 0x%lx is %s (%s)\n"),
2166 ls
[m
], testLongs
[n
], res
? "true" : "false",
2167 res
== (ls
[m
] == testLongs
[n
]) ? "ok" : "ERROR");
2170 #endif // wxUSE_LONGLONG_WX
2173 static void TestLongLongToString()
2175 wxPuts(_T("*** Testing wxLongLong::ToString() ***\n"));
2177 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2179 wxLongLong ll
= testLongs
[n
];
2180 wxPrintf(_T("%ld == %s\n"), testLongs
[n
], ll
.ToString().c_str());
2183 wxLongLong
ll(0x12345678, 0x87654321);
2184 wxPrintf(_T("0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2187 wxPrintf(_T("-0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2190 static void TestLongLongPrintf()
2192 wxPuts(_T("*** Testing wxLongLong printing ***\n"));
2194 #ifdef wxLongLongFmtSpec
2195 wxLongLong ll
= wxLL(0x1234567890abcdef);
2196 wxString s
= wxString::Format(_T("%") wxLongLongFmtSpec
_T("x"), ll
);
2197 wxPrintf(_T("0x1234567890abcdef -> %s (%s)\n"),
2198 s
.c_str(), s
== _T("1234567890abcdef") ? _T("ok") : _T("ERROR"));
2199 #else // !wxLongLongFmtSpec
2200 #error "wxLongLongFmtSpec not defined for this compiler/platform"
2207 #endif // TEST_LONGLONG
2209 // ----------------------------------------------------------------------------
2211 // ----------------------------------------------------------------------------
2213 #ifdef TEST_PATHLIST
2216 #define CMD_IN_PATH _T("ls")
2218 #define CMD_IN_PATH _T("command.com")
2221 static void TestPathList()
2223 wxPuts(_T("*** Testing wxPathList ***\n"));
2225 wxPathList pathlist
;
2226 pathlist
.AddEnvList(_T("PATH"));
2227 wxString path
= pathlist
.FindValidPath(CMD_IN_PATH
);
2230 wxPrintf(_T("ERROR: command not found in the path.\n"));
2234 wxPrintf(_T("Command found in the path as '%s'.\n"), path
.c_str());
2238 #endif // TEST_PATHLIST
2240 // ----------------------------------------------------------------------------
2241 // regular expressions
2242 // ----------------------------------------------------------------------------
2246 #include "wx/regex.h"
2248 static void TestRegExCompile()
2250 wxPuts(_T("*** Testing RE compilation ***\n"));
2252 static struct RegExCompTestData
2254 const wxChar
*pattern
;
2256 } regExCompTestData
[] =
2258 { _T("foo"), TRUE
},
2259 { _T("foo("), FALSE
},
2260 { _T("foo(bar"), FALSE
},
2261 { _T("foo(bar)"), TRUE
},
2262 { _T("foo["), FALSE
},
2263 { _T("foo[bar"), FALSE
},
2264 { _T("foo[bar]"), TRUE
},
2265 { _T("foo{"), TRUE
},
2266 { _T("foo{1"), FALSE
},
2267 { _T("foo{bar"), TRUE
},
2268 { _T("foo{1}"), TRUE
},
2269 { _T("foo{1,2}"), TRUE
},
2270 { _T("foo{bar}"), TRUE
},
2271 { _T("foo*"), TRUE
},
2272 { _T("foo**"), FALSE
},
2273 { _T("foo+"), TRUE
},
2274 { _T("foo++"), FALSE
},
2275 { _T("foo?"), TRUE
},
2276 { _T("foo??"), FALSE
},
2277 { _T("foo?+"), FALSE
},
2281 for ( size_t n
= 0; n
< WXSIZEOF(regExCompTestData
); n
++ )
2283 const RegExCompTestData
& data
= regExCompTestData
[n
];
2284 bool ok
= re
.Compile(data
.pattern
);
2286 wxPrintf(_T("'%s' is %sa valid RE (%s)\n"),
2288 ok
? _T("") : _T("not "),
2289 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2293 static void TestRegExMatch()
2295 wxPuts(_T("*** Testing RE matching ***\n"));
2297 static struct RegExMatchTestData
2299 const wxChar
*pattern
;
2302 } regExMatchTestData
[] =
2304 { _T("foo"), _T("bar"), FALSE
},
2305 { _T("foo"), _T("foobar"), TRUE
},
2306 { _T("^foo"), _T("foobar"), TRUE
},
2307 { _T("^foo"), _T("barfoo"), FALSE
},
2308 { _T("bar$"), _T("barbar"), TRUE
},
2309 { _T("bar$"), _T("barbar "), FALSE
},
2312 for ( size_t n
= 0; n
< WXSIZEOF(regExMatchTestData
); n
++ )
2314 const RegExMatchTestData
& data
= regExMatchTestData
[n
];
2316 wxRegEx
re(data
.pattern
);
2317 bool ok
= re
.Matches(data
.text
);
2319 wxPrintf(_T("'%s' %s %s (%s)\n"),
2321 ok
? _T("matches") : _T("doesn't match"),
2323 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2327 static void TestRegExSubmatch()
2329 wxPuts(_T("*** Testing RE subexpressions ***\n"));
2331 wxRegEx
re(_T("([[:alpha:]]+) ([[:alpha:]]+) ([[:digit:]]+).*([[:digit:]]+)$"));
2332 if ( !re
.IsValid() )
2334 wxPuts(_T("ERROR: compilation failed."));
2338 wxString text
= _T("Fri Jul 13 18:37:52 CEST 2001");
2340 if ( !re
.Matches(text
) )
2342 wxPuts(_T("ERROR: match expected."));
2346 wxPrintf(_T("Entire match: %s\n"), re
.GetMatch(text
).c_str());
2348 wxPrintf(_T("Date: %s/%s/%s, wday: %s\n"),
2349 re
.GetMatch(text
, 3).c_str(),
2350 re
.GetMatch(text
, 2).c_str(),
2351 re
.GetMatch(text
, 4).c_str(),
2352 re
.GetMatch(text
, 1).c_str());
2356 static void TestRegExReplacement()
2358 wxPuts(_T("*** Testing RE replacement ***"));
2360 static struct RegExReplTestData
2364 const wxChar
*result
;
2366 } regExReplTestData
[] =
2368 { _T("foo123"), _T("bar"), _T("bar"), 1 },
2369 { _T("foo123"), _T("\\2\\1"), _T("123foo"), 1 },
2370 { _T("foo_123"), _T("\\2\\1"), _T("123foo"), 1 },
2371 { _T("123foo"), _T("bar"), _T("123foo"), 0 },
2372 { _T("123foo456foo"), _T("&&"), _T("123foo456foo456foo"), 1 },
2373 { _T("foo123foo123"), _T("bar"), _T("barbar"), 2 },
2374 { _T("foo123_foo456_foo789"), _T("bar"), _T("bar_bar_bar"), 3 },
2377 const wxChar
*pattern
= _T("([a-z]+)[^0-9]*([0-9]+)");
2378 wxRegEx
re(pattern
);
2380 wxPrintf(_T("Using pattern '%s' for replacement.\n"), pattern
);
2382 for ( size_t n
= 0; n
< WXSIZEOF(regExReplTestData
); n
++ )
2384 const RegExReplTestData
& data
= regExReplTestData
[n
];
2386 wxString text
= data
.text
;
2387 size_t nRepl
= re
.Replace(&text
, data
.repl
);
2389 wxPrintf(_T("%s =~ s/RE/%s/g: %u match%s, result = '%s' ("),
2390 data
.text
, data
.repl
,
2391 nRepl
, nRepl
== 1 ? _T("") : _T("es"),
2393 if ( text
== data
.result
&& nRepl
== data
.count
)
2399 wxPrintf(_T("ERROR: should be %u and '%s')\n"),
2400 data
.count
, data
.result
);
2405 static void TestRegExInteractive()
2407 wxPuts(_T("*** Testing RE interactively ***"));
2411 wxChar pattern
[128];
2412 wxPrintf(_T("\nEnter a pattern: "));
2413 if ( !wxFgets(pattern
, WXSIZEOF(pattern
), stdin
) )
2416 // kill the last '\n'
2417 pattern
[wxStrlen(pattern
) - 1] = 0;
2420 if ( !re
.Compile(pattern
) )
2428 wxPrintf(_T("Enter text to match: "));
2429 if ( !wxFgets(text
, WXSIZEOF(text
), stdin
) )
2432 // kill the last '\n'
2433 text
[wxStrlen(text
) - 1] = 0;
2435 if ( !re
.Matches(text
) )
2437 wxPrintf(_T("No match.\n"));
2441 wxPrintf(_T("Pattern matches at '%s'\n"), re
.GetMatch(text
).c_str());
2444 for ( size_t n
= 1; ; n
++ )
2446 if ( !re
.GetMatch(&start
, &len
, n
) )
2451 wxPrintf(_T("Subexpr %u matched '%s'\n"),
2452 n
, wxString(text
+ start
, len
).c_str());
2459 #endif // TEST_REGEX
2461 // ----------------------------------------------------------------------------
2463 // ----------------------------------------------------------------------------
2473 static void TestDbOpen()
2481 // ----------------------------------------------------------------------------
2483 // ----------------------------------------------------------------------------
2486 NB: this stuff was taken from the glibc test suite and modified to build
2487 in wxWindows: if I read the copyright below properly, this shouldn't
2493 #ifdef wxTEST_PRINTF
2494 // use our functions from wxchar.cpp
2498 // NB: do _not_ use ATTRIBUTE_PRINTF here, we have some invalid formats
2499 // in the tests below
2500 int wxPrintf( const wxChar
*format
, ... );
2501 int wxSprintf( wxChar
*str
, const wxChar
*format
, ... );
2504 #include "wx/longlong.h"
2508 static void rfg1 (void);
2509 static void rfg2 (void);
2513 fmtchk (const wxChar
*fmt
)
2515 (void) wxPrintf(_T("%s:\t`"), fmt
);
2516 (void) wxPrintf(fmt
, 0x12);
2517 (void) wxPrintf(_T("'\n"));
2521 fmtst1chk (const wxChar
*fmt
)
2523 (void) wxPrintf(_T("%s:\t`"), fmt
);
2524 (void) wxPrintf(fmt
, 4, 0x12);
2525 (void) wxPrintf(_T("'\n"));
2529 fmtst2chk (const wxChar
*fmt
)
2531 (void) wxPrintf(_T("%s:\t`"), fmt
);
2532 (void) wxPrintf(fmt
, 4, 4, 0x12);
2533 (void) wxPrintf(_T("'\n"));
2536 /* This page is covered by the following copyright: */
2538 /* (C) Copyright C E Chew
2540 * Feel free to copy, use and distribute this software provided:
2542 * 1. you do not pretend that you wrote it
2543 * 2. you leave this copyright notice intact.
2547 * Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans.
2554 /* Formatted Output Test
2556 * This exercises the output formatting code.
2564 wxChar
*prefix
= buf
;
2567 wxPuts(_T("\nFormatted output test"));
2568 wxPrintf(_T("prefix 6d 6o 6x 6X 6u\n"));
2569 wxStrcpy(prefix
, _T("%"));
2570 for (i
= 0; i
< 2; i
++) {
2571 for (j
= 0; j
< 2; j
++) {
2572 for (k
= 0; k
< 2; k
++) {
2573 for (l
= 0; l
< 2; l
++) {
2574 wxStrcpy(prefix
, _T("%"));
2575 if (i
== 0) wxStrcat(prefix
, _T("-"));
2576 if (j
== 0) wxStrcat(prefix
, _T("+"));
2577 if (k
== 0) wxStrcat(prefix
, _T("#"));
2578 if (l
== 0) wxStrcat(prefix
, _T("0"));
2579 wxPrintf(_T("%5s |"), prefix
);
2580 wxStrcpy(tp
, prefix
);
2581 wxStrcat(tp
, _T("6d |"));
2583 wxStrcpy(tp
, prefix
);
2584 wxStrcat(tp
, _T("6o |"));
2586 wxStrcpy(tp
, prefix
);
2587 wxStrcat(tp
, _T("6x |"));
2589 wxStrcpy(tp
, prefix
);
2590 wxStrcat(tp
, _T("6X |"));
2592 wxStrcpy(tp
, prefix
);
2593 wxStrcat(tp
, _T("6u |"));
2600 wxPrintf(_T("%10s\n"), (wxChar
*) NULL
);
2601 wxPrintf(_T("%-10s\n"), (wxChar
*) NULL
);
2604 static void TestPrintf()
2606 static wxChar shortstr
[] = _T("Hi, Z.");
2607 static wxChar longstr
[] = _T("Good morning, Doctor Chandra. This is Hal. \
2608 I am ready for my first lesson today.");
2613 fmtchk(_T("%4.4x"));
2614 fmtchk(_T("%04.4x"));
2615 fmtchk(_T("%4.3x"));
2616 fmtchk(_T("%04.3x"));
2618 fmtst1chk(_T("%.*x"));
2619 fmtst1chk(_T("%0*x"));
2620 fmtst2chk(_T("%*.*x"));
2621 fmtst2chk(_T("%0*.*x"));
2623 wxPrintf(_T("bad format:\t\"%b\"\n"));
2624 wxPrintf(_T("nil pointer (padded):\t\"%10p\"\n"), (void *) NULL
);
2626 wxPrintf(_T("decimal negative:\t\"%d\"\n"), -2345);
2627 wxPrintf(_T("octal negative:\t\"%o\"\n"), -2345);
2628 wxPrintf(_T("hex negative:\t\"%x\"\n"), -2345);
2629 wxPrintf(_T("long decimal number:\t\"%ld\"\n"), -123456L);
2630 wxPrintf(_T("long octal negative:\t\"%lo\"\n"), -2345L);
2631 wxPrintf(_T("long unsigned decimal number:\t\"%lu\"\n"), -123456L);
2632 wxPrintf(_T("zero-padded LDN:\t\"%010ld\"\n"), -123456L);
2633 wxPrintf(_T("left-adjusted ZLDN:\t\"%-010ld\"\n"), -123456);
2634 wxPrintf(_T("space-padded LDN:\t\"%10ld\"\n"), -123456L);
2635 wxPrintf(_T("left-adjusted SLDN:\t\"%-10ld\"\n"), -123456L);
2637 wxPrintf(_T("zero-padded string:\t\"%010s\"\n"), shortstr
);
2638 wxPrintf(_T("left-adjusted Z string:\t\"%-010s\"\n"), shortstr
);
2639 wxPrintf(_T("space-padded string:\t\"%10s\"\n"), shortstr
);
2640 wxPrintf(_T("left-adjusted S string:\t\"%-10s\"\n"), shortstr
);
2641 wxPrintf(_T("null string:\t\"%s\"\n"), (wxChar
*)NULL
);
2642 wxPrintf(_T("limited string:\t\"%.22s\"\n"), longstr
);
2644 wxPrintf(_T("e-style >= 1:\t\"%e\"\n"), 12.34);
2645 wxPrintf(_T("e-style >= .1:\t\"%e\"\n"), 0.1234);
2646 wxPrintf(_T("e-style < .1:\t\"%e\"\n"), 0.001234);
2647 wxPrintf(_T("e-style big:\t\"%.60e\"\n"), 1e20
);
2648 wxPrintf(_T("e-style == .1:\t\"%e\"\n"), 0.1);
2649 wxPrintf(_T("f-style >= 1:\t\"%f\"\n"), 12.34);
2650 wxPrintf(_T("f-style >= .1:\t\"%f\"\n"), 0.1234);
2651 wxPrintf(_T("f-style < .1:\t\"%f\"\n"), 0.001234);
2652 wxPrintf(_T("g-style >= 1:\t\"%g\"\n"), 12.34);
2653 wxPrintf(_T("g-style >= .1:\t\"%g\"\n"), 0.1234);
2654 wxPrintf(_T("g-style < .1:\t\"%g\"\n"), 0.001234);
2655 wxPrintf(_T("g-style big:\t\"%.60g\"\n"), 1e20
);
2657 wxPrintf (_T(" %6.5f\n"), .099999999860301614);
2658 wxPrintf (_T(" %6.5f\n"), .1);
2659 wxPrintf (_T("x%5.4fx\n"), .5);
2661 wxPrintf (_T("%#03x\n"), 1);
2663 //wxPrintf (_T("something really insane: %.10000f\n"), 1.0);
2669 while (niter
-- != 0)
2670 wxPrintf (_T("%.17e\n"), d
/ 2);
2674 wxPrintf (_T("%15.5e\n"), 4.9406564584124654e-324);
2676 #define FORMAT _T("|%12.4f|%12.4e|%12.4g|\n")
2677 wxPrintf (FORMAT
, 0.0, 0.0, 0.0);
2678 wxPrintf (FORMAT
, 1.0, 1.0, 1.0);
2679 wxPrintf (FORMAT
, -1.0, -1.0, -1.0);
2680 wxPrintf (FORMAT
, 100.0, 100.0, 100.0);
2681 wxPrintf (FORMAT
, 1000.0, 1000.0, 1000.0);
2682 wxPrintf (FORMAT
, 10000.0, 10000.0, 10000.0);
2683 wxPrintf (FORMAT
, 12345.0, 12345.0, 12345.0);
2684 wxPrintf (FORMAT
, 100000.0, 100000.0, 100000.0);
2685 wxPrintf (FORMAT
, 123456.0, 123456.0, 123456.0);
2690 int rc
= wxSnprintf (buf
, WXSIZEOF(buf
), _T("%30s"), _T("foo"));
2692 wxPrintf(_T("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n"),
2693 rc
, WXSIZEOF(buf
), buf
);
2696 wxPrintf ("snprintf (\"%%.999999u\", 10)\n",
2697 wxSnprintf(buf2
, WXSIZEOFbuf2
), "%.999999u", 10));
2703 wxPrintf (_T("%e should be 1.234568e+06\n"), 1234567.8);
2704 wxPrintf (_T("%f should be 1234567.800000\n"), 1234567.8);
2705 wxPrintf (_T("%g should be 1.23457e+06\n"), 1234567.8);
2706 wxPrintf (_T("%g should be 123.456\n"), 123.456);
2707 wxPrintf (_T("%g should be 1e+06\n"), 1000000.0);
2708 wxPrintf (_T("%g should be 10\n"), 10.0);
2709 wxPrintf (_T("%g should be 0.02\n"), 0.02);
2713 wxPrintf(_T("%.17f\n"),(1.0/x
/10.0+1.0)*x
-x
);
2719 wxSprintf(buf
,_T("%*s%*s%*s"),-1,_T("one"),-20,_T("two"),-30,_T("three"));
2721 result
|= wxStrcmp (buf
,
2722 _T("onetwo three "));
2724 wxPuts (result
!= 0 ? _T("Test failed!") : _T("Test ok."));
2731 wxSprintf(buf
, _T("%07") wxLongLongFmtSpec
_T("o"), wxLL(040000000000));
2732 wxPrintf (_T("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf
);
2734 if (wxStrcmp (buf
, _T("40000000000")) != 0)
2737 wxPuts (_T("\tFAILED"));
2741 #endif // wxLongLong_t
2743 wxPrintf (_T("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX
+ 2, UCHAR_MAX
+ 2);
2744 wxPrintf (_T("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX
+ 2, USHRT_MAX
+ 2);
2746 wxPuts (_T("--- Should be no further output. ---"));
2755 memset (bytes
, '\xff', sizeof bytes
);
2756 wxSprintf (buf
, _T("foo%hhn\n"), &bytes
[3]);
2757 if (bytes
[0] != '\xff' || bytes
[1] != '\xff' || bytes
[2] != '\xff'
2758 || bytes
[4] != '\xff' || bytes
[5] != '\xff' || bytes
[6] != '\xff')
2760 wxPuts (_T("%hhn overwrite more bytes"));
2765 wxPuts (_T("%hhn wrote incorrect value"));
2777 wxSprintf (buf
, _T("%5.s"), _T("xyz"));
2778 if (wxStrcmp (buf
, _T(" ")) != 0)
2779 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" "));
2780 wxSprintf (buf
, _T("%5.f"), 33.3);
2781 if (wxStrcmp (buf
, _T(" 33")) != 0)
2782 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 33"));
2783 wxSprintf (buf
, _T("%8.e"), 33.3e7
);
2784 if (wxStrcmp (buf
, _T(" 3e+08")) != 0)
2785 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3e+08"));
2786 wxSprintf (buf
, _T("%8.E"), 33.3e7
);
2787 if (wxStrcmp (buf
, _T(" 3E+08")) != 0)
2788 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3E+08"));
2789 wxSprintf (buf
, _T("%.g"), 33.3);
2790 if (wxStrcmp (buf
, _T("3e+01")) != 0)
2791 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3e+01"));
2792 wxSprintf (buf
, _T("%.G"), 33.3);
2793 if (wxStrcmp (buf
, _T("3E+01")) != 0)
2794 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3E+01"));
2804 wxSprintf (buf
, _T("%.*g"), prec
, 3.3);
2805 if (wxStrcmp (buf
, _T("3")) != 0)
2806 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2808 wxSprintf (buf
, _T("%.*G"), prec
, 3.3);
2809 if (wxStrcmp (buf
, _T("3")) != 0)
2810 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2812 wxSprintf (buf
, _T("%7.*G"), prec
, 3.33);
2813 if (wxStrcmp (buf
, _T(" 3")) != 0)
2814 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3"));
2816 wxSprintf (buf
, _T("%04.*o"), prec
, 33);
2817 if (wxStrcmp (buf
, _T(" 041")) != 0)
2818 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 041"));
2820 wxSprintf (buf
, _T("%09.*u"), prec
, 33);
2821 if (wxStrcmp (buf
, _T(" 0000033")) != 0)
2822 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 0000033"));
2824 wxSprintf (buf
, _T("%04.*x"), prec
, 33);
2825 if (wxStrcmp (buf
, _T(" 021")) != 0)
2826 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2828 wxSprintf (buf
, _T("%04.*X"), prec
, 33);
2829 if (wxStrcmp (buf
, _T(" 021")) != 0)
2830 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2833 #endif // TEST_PRINTF
2835 // ----------------------------------------------------------------------------
2836 // registry and related stuff
2837 // ----------------------------------------------------------------------------
2839 // this is for MSW only
2842 #undef TEST_REGISTRY
2847 #include "wx/confbase.h"
2848 #include "wx/msw/regconf.h"
2850 static void TestRegConfWrite()
2852 wxRegConfig
regconf(_T("console"), _T("wxwindows"));
2853 regconf
.Write(_T("Hello"), wxString(_T("world")));
2856 #endif // TEST_REGCONF
2858 #ifdef TEST_REGISTRY
2860 #include "wx/msw/registry.h"
2862 // I chose this one because I liked its name, but it probably only exists under
2864 static const wxChar
*TESTKEY
=
2865 _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
2867 static void TestRegistryRead()
2869 wxPuts(_T("*** testing registry reading ***"));
2871 wxRegKey
key(TESTKEY
);
2872 wxPrintf(_T("The test key name is '%s'.\n"), key
.GetName().c_str());
2875 wxPuts(_T("ERROR: test key can't be opened, aborting test."));
2880 size_t nSubKeys
, nValues
;
2881 if ( key
.GetKeyInfo(&nSubKeys
, NULL
, &nValues
, NULL
) )
2883 wxPrintf(_T("It has %u subkeys and %u values.\n"), nSubKeys
, nValues
);
2886 wxPrintf(_T("Enumerating values:\n"));
2890 bool cont
= key
.GetFirstValue(value
, dummy
);
2893 wxPrintf(_T("Value '%s': type "), value
.c_str());
2894 switch ( key
.GetValueType(value
) )
2896 case wxRegKey::Type_None
: wxPrintf(_T("ERROR (none)")); break;
2897 case wxRegKey::Type_String
: wxPrintf(_T("SZ")); break;
2898 case wxRegKey::Type_Expand_String
: wxPrintf(_T("EXPAND_SZ")); break;
2899 case wxRegKey::Type_Binary
: wxPrintf(_T("BINARY")); break;
2900 case wxRegKey::Type_Dword
: wxPrintf(_T("DWORD")); break;
2901 case wxRegKey::Type_Multi_String
: wxPrintf(_T("MULTI_SZ")); break;
2902 default: wxPrintf(_T("other (unknown)")); break;
2905 wxPrintf(_T(", value = "));
2906 if ( key
.IsNumericValue(value
) )
2909 key
.QueryValue(value
, &val
);
2910 wxPrintf(_T("%ld"), val
);
2915 key
.QueryValue(value
, val
);
2916 wxPrintf(_T("'%s'"), val
.c_str());
2918 key
.QueryRawValue(value
, val
);
2919 wxPrintf(_T(" (raw value '%s')"), val
.c_str());
2924 cont
= key
.GetNextValue(value
, dummy
);
2928 static void TestRegistryAssociation()
2931 The second call to deleteself genertaes an error message, with a
2932 messagebox saying .flo is crucial to system operation, while the .ddf
2933 call also fails, but with no error message
2938 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
2940 key
= "ddxf_auto_file" ;
2941 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
2943 key
= "ddxf_auto_file" ;
2944 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
2947 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
2949 key
= "program \"%1\"" ;
2951 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
2953 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
2955 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
2957 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
2961 #endif // TEST_REGISTRY
2963 // ----------------------------------------------------------------------------
2965 // ----------------------------------------------------------------------------
2969 #include "wx/socket.h"
2970 #include "wx/protocol/protocol.h"
2971 #include "wx/protocol/http.h"
2973 static void TestSocketServer()
2975 wxPuts(_T("*** Testing wxSocketServer ***\n"));
2977 static const int PORT
= 3000;
2982 wxSocketServer
*server
= new wxSocketServer(addr
);
2983 if ( !server
->Ok() )
2985 wxPuts(_T("ERROR: failed to bind"));
2992 wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT
);
2994 wxSocketBase
*socket
= server
->Accept();
2997 wxPuts(_T("ERROR: wxSocketServer::Accept() failed."));
3001 wxPuts(_T("Server: got a client."));
3003 server
->SetTimeout(60); // 1 min
3005 while ( socket
->IsConnected() )
3008 wxChar ch
= _T('\0');
3011 if ( socket
->Read(&ch
, sizeof(ch
)).Error() )
3013 // don't log error if the client just close the connection
3014 if ( socket
->IsConnected() )
3016 wxPuts(_T("ERROR: in wxSocket::Read."));
3036 wxPrintf(_T("Server: got '%s'.\n"), s
.c_str());
3037 if ( s
== _T("bye") )
3044 socket
->Write(s
.MakeUpper().c_str(), s
.length());
3045 socket
->Write("\r\n", 2);
3046 wxPrintf(_T("Server: wrote '%s'.\n"), s
.c_str());
3049 wxPuts(_T("Server: lost a client."));
3054 // same as "delete server" but is consistent with GUI programs
3058 static void TestSocketClient()
3060 wxPuts(_T("*** Testing wxSocketClient ***\n"));
3062 static const wxChar
*hostname
= _T("www.wxwindows.org");
3065 addr
.Hostname(hostname
);
3068 wxPrintf(_T("--- Attempting to connect to %s:80...\n"), hostname
);
3070 wxSocketClient client
;
3071 if ( !client
.Connect(addr
) )
3073 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3077 wxPrintf(_T("--- Connected to %s:%u...\n"),
3078 addr
.Hostname().c_str(), addr
.Service());
3082 // could use simply "GET" here I suppose
3084 wxString::Format(_T("GET http://%s/\r\n"), hostname
);
3085 client
.Write(cmdGet
, cmdGet
.length());
3086 wxPrintf(_T("--- Sent command '%s' to the server\n"),
3087 MakePrintable(cmdGet
).c_str());
3088 client
.Read(buf
, WXSIZEOF(buf
));
3089 wxPrintf(_T("--- Server replied:\n%s"), buf
);
3093 #endif // TEST_SOCKETS
3095 // ----------------------------------------------------------------------------
3097 // ----------------------------------------------------------------------------
3101 #include "wx/protocol/ftp.h"
3105 #define FTP_ANONYMOUS
3107 #ifdef FTP_ANONYMOUS
3108 static const wxChar
*directory
= _T("/pub");
3109 static const wxChar
*filename
= _T("welcome.msg");
3111 static const wxChar
*directory
= _T("/etc");
3112 static const wxChar
*filename
= _T("issue");
3115 static bool TestFtpConnect()
3117 wxPuts(_T("*** Testing FTP connect ***"));
3119 #ifdef FTP_ANONYMOUS
3120 static const wxChar
*hostname
= _T("ftp.wxwindows.org");
3122 wxPrintf(_T("--- Attempting to connect to %s:21 anonymously...\n"), hostname
);
3123 #else // !FTP_ANONYMOUS
3124 static const wxChar
*hostname
= "localhost";
3127 wxFgets(user
, WXSIZEOF(user
), stdin
);
3128 user
[wxStrlen(user
) - 1] = '\0'; // chop off '\n'
3131 wxChar password
[256];
3132 wxPrintf(_T("Password for %s: "), password
);
3133 wxFgets(password
, WXSIZEOF(password
), stdin
);
3134 password
[wxStrlen(password
) - 1] = '\0'; // chop off '\n'
3135 ftp
.SetPassword(password
);
3137 wxPrintf(_T("--- Attempting to connect to %s:21 as %s...\n"), hostname
, user
);
3138 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
3140 if ( !ftp
.Connect(hostname
) )
3142 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3148 wxPrintf(_T("--- Connected to %s, current directory is '%s'\n"),
3149 hostname
, ftp
.Pwd().c_str());
3155 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
3156 static void TestFtpWuFtpd()
3159 static const wxChar
*hostname
= _T("ftp.eudora.com");
3160 if ( !ftp
.Connect(hostname
) )
3162 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3166 static const wxChar
*filename
= _T("eudora/pubs/draft-gellens-submit-09.txt");
3167 wxInputStream
*in
= ftp
.GetInputStream(filename
);
3170 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
3174 size_t size
= in
->GetSize();
3175 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
3177 wxChar
*data
= new wxChar
[size
];
3178 if ( !in
->Read(data
, size
) )
3180 wxPuts(_T("ERROR: read error"));
3184 wxPrintf(_T("Successfully retrieved the file.\n"));
3193 static void TestFtpList()
3195 wxPuts(_T("*** Testing wxFTP file listing ***\n"));
3198 if ( !ftp
.ChDir(directory
) )
3200 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
3203 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3205 // test NLIST and LIST
3206 wxArrayString files
;
3207 if ( !ftp
.GetFilesList(files
) )
3209 wxPuts(_T("ERROR: failed to get NLIST of files"));
3213 wxPrintf(_T("Brief list of files under '%s':\n"), ftp
.Pwd().c_str());
3214 size_t count
= files
.GetCount();
3215 for ( size_t n
= 0; n
< count
; n
++ )
3217 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3219 wxPuts(_T("End of the file list"));
3222 if ( !ftp
.GetDirList(files
) )
3224 wxPuts(_T("ERROR: failed to get LIST of files"));
3228 wxPrintf(_T("Detailed list of files under '%s':\n"), ftp
.Pwd().c_str());
3229 size_t count
= files
.GetCount();
3230 for ( size_t n
= 0; n
< count
; n
++ )
3232 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3234 wxPuts(_T("End of the file list"));
3237 if ( !ftp
.ChDir(_T("..")) )
3239 wxPuts(_T("ERROR: failed to cd to .."));
3242 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3245 static void TestFtpDownload()
3247 wxPuts(_T("*** Testing wxFTP download ***\n"));
3250 wxInputStream
*in
= ftp
.GetInputStream(filename
);
3253 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
3257 size_t size
= in
->GetSize();
3258 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
3261 wxChar
*data
= new wxChar
[size
];
3262 if ( !in
->Read(data
, size
) )
3264 wxPuts(_T("ERROR: read error"));
3268 wxPrintf(_T("\nContents of %s:\n%s\n"), filename
, data
);
3276 static void TestFtpFileSize()
3278 wxPuts(_T("*** Testing FTP SIZE command ***"));
3280 if ( !ftp
.ChDir(directory
) )
3282 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
3285 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3287 if ( ftp
.FileExists(filename
) )
3289 int size
= ftp
.GetFileSize(filename
);
3291 wxPrintf(_T("ERROR: couldn't get size of '%s'\n"), filename
);
3293 wxPrintf(_T("Size of '%s' is %d bytes.\n"), filename
, size
);
3297 wxPrintf(_T("ERROR: '%s' doesn't exist\n"), filename
);
3301 static void TestFtpMisc()
3303 wxPuts(_T("*** Testing miscellaneous wxFTP functions ***"));
3305 if ( ftp
.SendCommand("STAT") != '2' )
3307 wxPuts(_T("ERROR: STAT failed"));
3311 wxPrintf(_T("STAT returned:\n\n%s\n"), ftp
.GetLastResult().c_str());
3314 if ( ftp
.SendCommand("HELP SITE") != '2' )
3316 wxPuts(_T("ERROR: HELP SITE failed"));
3320 wxPrintf(_T("The list of site-specific commands:\n\n%s\n"),
3321 ftp
.GetLastResult().c_str());
3325 static void TestFtpInteractive()
3327 wxPuts(_T("\n*** Interactive wxFTP test ***"));
3333 wxPrintf(_T("Enter FTP command: "));
3334 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
3337 // kill the last '\n'
3338 buf
[wxStrlen(buf
) - 1] = 0;
3340 // special handling of LIST and NLST as they require data connection
3341 wxString
start(buf
, 4);
3343 if ( start
== "LIST" || start
== "NLST" )
3346 if ( wxStrlen(buf
) > 4 )
3349 wxArrayString files
;
3350 if ( !ftp
.GetList(files
, wildcard
, start
== "LIST") )
3352 wxPrintf(_T("ERROR: failed to get %s of files\n"), start
.c_str());
3356 wxPrintf(_T("--- %s of '%s' under '%s':\n"),
3357 start
.c_str(), wildcard
.c_str(), ftp
.Pwd().c_str());
3358 size_t count
= files
.GetCount();
3359 for ( size_t n
= 0; n
< count
; n
++ )
3361 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3363 wxPuts(_T("--- End of the file list"));
3368 wxChar ch
= ftp
.SendCommand(buf
);
3369 wxPrintf(_T("Command %s"), ch
? _T("succeeded") : _T("failed"));
3372 wxPrintf(_T(" (return code %c)"), ch
);
3375 wxPrintf(_T(", server reply:\n%s\n\n"), ftp
.GetLastResult().c_str());
3379 wxPuts(_T("\n*** done ***"));
3382 static void TestFtpUpload()
3384 wxPuts(_T("*** Testing wxFTP uploading ***\n"));
3387 static const wxChar
*file1
= _T("test1");
3388 static const wxChar
*file2
= _T("test2");
3389 wxOutputStream
*out
= ftp
.GetOutputStream(file1
);
3392 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
3393 out
->Write("First hello", 11);
3397 // send a command to check the remote file
3398 if ( ftp
.SendCommand(wxString("STAT ") + file1
) != '2' )
3400 wxPrintf(_T("ERROR: STAT %s failed\n"), file1
);
3404 wxPrintf(_T("STAT %s returned:\n\n%s\n"),
3405 file1
, ftp
.GetLastResult().c_str());
3408 out
= ftp
.GetOutputStream(file2
);
3411 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
3412 out
->Write("Second hello", 12);
3419 // ----------------------------------------------------------------------------
3421 // ----------------------------------------------------------------------------
3425 #include "wx/wfstream.h"
3426 #include "wx/mstream.h"
3428 static void TestFileStream()
3430 wxPuts(_T("*** Testing wxFileInputStream ***"));
3432 static const wxChar
*filename
= _T("testdata.fs");
3434 wxFileOutputStream
fsOut(filename
);
3435 fsOut
.Write("foo", 3);
3438 wxFileInputStream
fsIn(filename
);
3439 wxPrintf(_T("File stream size: %u\n"), fsIn
.GetSize());
3440 while ( !fsIn
.Eof() )
3442 putchar(fsIn
.GetC());
3445 if ( !wxRemoveFile(filename
) )
3447 wxPrintf(_T("ERROR: failed to remove the file '%s'.\n"), filename
);
3450 wxPuts(_T("\n*** wxFileInputStream test done ***"));
3453 static void TestMemoryStream()
3455 wxPuts(_T("*** Testing wxMemoryOutputStream ***"));
3457 wxMemoryOutputStream memOutStream
;
3458 wxPrintf(_T("Initially out stream offset: %lu\n"),
3459 (unsigned long)memOutStream
.TellO());
3461 for ( const wxChar
*p
= _T("Hello, stream!"); *p
; p
++ )
3463 memOutStream
.PutC(*p
);
3466 wxPrintf(_T("Final out stream offset: %lu\n"),
3467 (unsigned long)memOutStream
.TellO());
3469 wxPuts(_T("*** Testing wxMemoryInputStream ***"));
3472 size_t len
= memOutStream
.CopyTo(buf
, WXSIZEOF(buf
));
3474 wxMemoryInputStream
memInpStream(buf
, len
);
3475 wxPrintf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
3476 while ( !memInpStream
.Eof() )
3478 putchar(memInpStream
.GetC());
3481 wxPuts(_T("\n*** wxMemoryInputStream test done ***"));
3484 #endif // TEST_STREAMS
3486 // ----------------------------------------------------------------------------
3488 // ----------------------------------------------------------------------------
3492 #include "wx/timer.h"
3493 #include "wx/utils.h"
3495 static void TestStopWatch()
3497 wxPuts(_T("*** Testing wxStopWatch ***\n"));
3501 wxPrintf(_T("Initially paused, after 2 seconds time is..."));
3504 wxPrintf(_T("\t%ldms\n"), sw
.Time());
3506 wxPrintf(_T("Resuming stopwatch and sleeping 3 seconds..."));
3510 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3513 wxPrintf(_T("Pausing agan and sleeping 2 more seconds..."));
3516 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3519 wxPrintf(_T("Finally resuming and sleeping 2 more seconds..."));
3522 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3525 wxPuts(_T("\nChecking for 'backwards clock' bug..."));
3526 for ( size_t n
= 0; n
< 70; n
++ )
3530 for ( size_t m
= 0; m
< 100000; m
++ )
3532 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
3534 wxPuts(_T("\ntime is negative - ERROR!"));
3542 wxPuts(_T(", ok."));
3545 #endif // TEST_TIMER
3547 // ----------------------------------------------------------------------------
3549 // ----------------------------------------------------------------------------
3553 #include "wx/vcard.h"
3555 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
3558 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
3561 wxPrintf(_T("%s%s"),
3562 wxString(_T('\t'), level
).c_str(),
3563 vcObj
->GetName().c_str());
3566 switch ( vcObj
->GetType() )
3568 case wxVCardObject::String
:
3569 case wxVCardObject::UString
:
3572 vcObj
->GetValue(&val
);
3573 value
<< _T('"') << val
<< _T('"');
3577 case wxVCardObject::Int
:
3580 vcObj
->GetValue(&i
);
3581 value
.Printf(_T("%u"), i
);
3585 case wxVCardObject::Long
:
3588 vcObj
->GetValue(&l
);
3589 value
.Printf(_T("%lu"), l
);
3593 case wxVCardObject::None
:
3596 case wxVCardObject::Object
:
3597 value
= _T("<node>");
3601 value
= _T("<unknown value type>");
3605 wxPrintf(_T(" = %s"), value
.c_str());
3608 DumpVObject(level
+ 1, *vcObj
);
3611 vcObj
= vcard
.GetNextProp(&cookie
);
3615 static void DumpVCardAddresses(const wxVCard
& vcard
)
3617 wxPuts(_T("\nShowing all addresses from vCard:\n"));
3621 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3625 int flags
= addr
->GetFlags();
3626 if ( flags
& wxVCardAddress::Domestic
)
3628 flagsStr
<< _T("domestic ");
3630 if ( flags
& wxVCardAddress::Intl
)
3632 flagsStr
<< _T("international ");
3634 if ( flags
& wxVCardAddress::Postal
)
3636 flagsStr
<< _T("postal ");
3638 if ( flags
& wxVCardAddress::Parcel
)
3640 flagsStr
<< _T("parcel ");
3642 if ( flags
& wxVCardAddress::Home
)
3644 flagsStr
<< _T("home ");
3646 if ( flags
& wxVCardAddress::Work
)
3648 flagsStr
<< _T("work ");
3651 wxPrintf(_T("Address %u:\n")
3653 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3656 addr
->GetPostOffice().c_str(),
3657 addr
->GetExtAddress().c_str(),
3658 addr
->GetStreet().c_str(),
3659 addr
->GetLocality().c_str(),
3660 addr
->GetRegion().c_str(),
3661 addr
->GetPostalCode().c_str(),
3662 addr
->GetCountry().c_str()
3666 addr
= vcard
.GetNextAddress(&cookie
);
3670 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
3672 wxPuts(_T("\nShowing all phone numbers from vCard:\n"));
3676 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
3680 int flags
= phone
->GetFlags();
3681 if ( flags
& wxVCardPhoneNumber::Voice
)
3683 flagsStr
<< _T("voice ");
3685 if ( flags
& wxVCardPhoneNumber::Fax
)
3687 flagsStr
<< _T("fax ");
3689 if ( flags
& wxVCardPhoneNumber::Cellular
)
3691 flagsStr
<< _T("cellular ");
3693 if ( flags
& wxVCardPhoneNumber::Modem
)
3695 flagsStr
<< _T("modem ");
3697 if ( flags
& wxVCardPhoneNumber::Home
)
3699 flagsStr
<< _T("home ");
3701 if ( flags
& wxVCardPhoneNumber::Work
)
3703 flagsStr
<< _T("work ");
3706 wxPrintf(_T("Phone number %u:\n")
3711 phone
->GetNumber().c_str()
3715 phone
= vcard
.GetNextPhoneNumber(&cookie
);
3719 static void TestVCardRead()
3721 wxPuts(_T("*** Testing wxVCard reading ***\n"));
3723 wxVCard
vcard(_T("vcard.vcf"));
3724 if ( !vcard
.IsOk() )
3726 wxPuts(_T("ERROR: couldn't load vCard."));
3730 // read individual vCard properties
3731 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
3735 vcObj
->GetValue(&value
);
3740 value
= _T("<none>");
3743 wxPrintf(_T("Full name retrieved directly: %s\n"), value
.c_str());
3746 if ( !vcard
.GetFullName(&value
) )
3748 value
= _T("<none>");
3751 wxPrintf(_T("Full name from wxVCard API: %s\n"), value
.c_str());
3753 // now show how to deal with multiply occuring properties
3754 DumpVCardAddresses(vcard
);
3755 DumpVCardPhoneNumbers(vcard
);
3757 // and finally show all
3758 wxPuts(_T("\nNow dumping the entire vCard:\n")
3759 "-----------------------------\n");
3761 DumpVObject(0, vcard
);
3765 static void TestVCardWrite()
3767 wxPuts(_T("*** Testing wxVCard writing ***\n"));
3770 if ( !vcard
.IsOk() )
3772 wxPuts(_T("ERROR: couldn't create vCard."));
3777 vcard
.SetName("Zeitlin", "Vadim");
3778 vcard
.SetFullName("Vadim Zeitlin");
3779 vcard
.SetOrganization("wxWindows", "R&D");
3781 // just dump the vCard back
3782 wxPuts(_T("Entire vCard follows:\n"));
3783 wxPuts(vcard
.Write());
3787 #endif // TEST_VCARD
3789 // ----------------------------------------------------------------------------
3791 // ----------------------------------------------------------------------------
3793 #if !defined(__WIN32__) || !wxUSE_FSVOLUME
3799 #include "wx/volume.h"
3801 static const wxChar
*volumeKinds
[] =
3807 _T("network volume"),
3811 static void TestFSVolume()
3813 wxPuts(_T("*** Testing wxFSVolume class ***"));
3815 wxArrayString volumes
= wxFSVolume::GetVolumes();
3816 size_t count
= volumes
.GetCount();
3820 wxPuts(_T("ERROR: no mounted volumes?"));
3824 wxPrintf(_T("%u mounted volumes found:\n"), count
);
3826 for ( size_t n
= 0; n
< count
; n
++ )
3828 wxFSVolume
vol(volumes
[n
]);
3831 wxPuts(_T("ERROR: couldn't create volume"));
3835 wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
3837 vol
.GetDisplayName().c_str(),
3838 vol
.GetName().c_str(),
3839 volumeKinds
[vol
.GetKind()],
3840 vol
.IsWritable() ? _T("rw") : _T("ro"),
3841 vol
.GetFlags() & wxFS_VOL_REMOVABLE
? _T("removable")
3846 #endif // TEST_VOLUME
3848 // ----------------------------------------------------------------------------
3849 // wide char and Unicode support
3850 // ----------------------------------------------------------------------------
3854 static void TestUnicodeToFromAscii()
3856 wxPuts(_T("Testing wxString::To/FromAscii()\n"));
3858 static const char *msg
= "Hello, world!";
3859 wxString s
= wxString::FromAscii(msg
);
3861 wxPrintf(_T("Message in Unicode: %s\n"), s
.c_str());
3862 printf("Message in ASCII: %s\n", (const char *)s
.ToAscii());
3864 wxPutchar(_T('\n'));
3867 #endif // TEST_UNICODE
3871 #include "wx/strconv.h"
3872 #include "wx/fontenc.h"
3873 #include "wx/encconv.h"
3874 #include "wx/buffer.h"
3876 static const unsigned char utf8koi8r
[] =
3878 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
3879 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
3880 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
3881 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
3882 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
3883 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
3884 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
3887 static const unsigned char utf8iso8859_1
[] =
3889 0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e,
3890 0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65,
3891 0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65,
3892 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65,
3893 0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0
3896 static const unsigned char utf8Invalid
[] =
3898 0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30,
3899 0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6,
3900 0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88,
3901 0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70,
3905 static const struct Utf8Data
3907 const unsigned char *text
;
3909 const wxChar
*charset
;
3910 wxFontEncoding encoding
;
3913 { utf8Invalid
, WXSIZEOF(utf8Invalid
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3914 { utf8koi8r
, WXSIZEOF(utf8koi8r
), _T("koi8-r"), wxFONTENCODING_KOI8
},
3915 { utf8iso8859_1
, WXSIZEOF(utf8iso8859_1
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3918 static void TestUtf8()
3920 wxPuts(_T("*** Testing UTF8 support ***\n"));
3925 for ( size_t n
= 0; n
< WXSIZEOF(utf8data
); n
++ )
3927 const Utf8Data
& u8d
= utf8data
[n
];
3928 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)u8d
.text
,
3929 WXSIZEOF(wbuf
)) == (size_t)-1 )
3931 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3935 wxCSConv
conv(u8d
.charset
);
3936 if ( conv
.WC2MB(buf
, wbuf
, WXSIZEOF(buf
)) == (size_t)-1 )
3938 wxPrintf(_T("ERROR: conversion to %s failed.\n"), u8d
.charset
);
3942 wxPrintf(_T("String in %s: %s\n"), u8d
.charset
, buf
);
3946 wxString
s(wxConvUTF8
.cMB2WC((const char *)u8d
.text
), *wxConvCurrent
);
3948 s
= _T("<< conversion failed >>");
3949 wxPrintf(_T("String in current cset: %s\n"), s
.c_str());
3956 static void TestEncodingConverter()
3958 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
3960 // using wxEncodingConverter should give the same result as above
3963 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)utf8koi8r
,
3964 WXSIZEOF(utf8koi8r
)) == (size_t)-1 )
3966 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3970 wxEncodingConverter ec
;
3971 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
3972 ec
.Convert(wbuf
, buf
);
3973 wxPrintf(_T("The same KOI8-R string using wxEC: %s\n"), buf
);
3979 #endif // TEST_WCHAR
3981 // ----------------------------------------------------------------------------
3983 // ----------------------------------------------------------------------------
3987 #include "wx/filesys.h"
3988 #include "wx/fs_zip.h"
3989 #include "wx/zipstrm.h"
3991 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
3993 static void TestZipStreamRead()
3995 wxPuts(_T("*** Testing ZIP reading ***\n"));
3997 static const wxChar
*filename
= _T("foo");
3998 wxZipInputStream
istr(TESTFILE_ZIP
, filename
);
3999 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
4001 wxPrintf(_T("Dumping the file '%s':\n"), filename
);
4002 while ( !istr
.Eof() )
4004 putchar(istr
.GetC());
4008 wxPuts(_T("\n----- done ------"));
4011 static void DumpZipDirectory(wxFileSystem
& fs
,
4012 const wxString
& dir
,
4013 const wxString
& indent
)
4015 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
4016 TESTFILE_ZIP
, dir
.c_str());
4017 wxString wildcard
= prefix
+ _T("/*");
4019 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
4020 while ( !dirname
.empty() )
4022 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
4024 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
4029 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
4031 DumpZipDirectory(fs
, dirname
,
4032 indent
+ wxString(_T(' '), 4));
4034 dirname
= fs
.FindNext();
4037 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
4038 while ( !filename
.empty() )
4040 if ( !filename
.StartsWith(prefix
, &filename
) )
4042 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
4047 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
4049 filename
= fs
.FindNext();
4053 static void TestZipFileSystem()
4055 wxPuts(_T("*** Testing ZIP file system ***\n"));
4057 wxFileSystem::AddHandler(new wxZipFSHandler
);
4059 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
4061 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
4066 // ----------------------------------------------------------------------------
4068 // ----------------------------------------------------------------------------
4072 #include "wx/zstream.h"
4073 #include "wx/wfstream.h"
4075 static const wxChar
*FILENAME_GZ
= _T("test.gz");
4076 static const wxChar
*TEST_DATA
= _T("hello and hello and hello and hello and hello");
4078 static void TestZlibStreamWrite()
4080 wxPuts(_T("*** Testing Zlib stream reading ***\n"));
4082 wxFileOutputStream
fileOutStream(FILENAME_GZ
);
4083 wxZlibOutputStream
ostr(fileOutStream
);
4084 wxPrintf(_T("Compressing the test string... "));
4085 ostr
.Write(TEST_DATA
, wxStrlen(TEST_DATA
) + 1);
4088 wxPuts(_T("(ERROR: failed)"));
4095 wxPuts(_T("\n----- done ------"));
4098 static void TestZlibStreamRead()
4100 wxPuts(_T("*** Testing Zlib stream reading ***\n"));
4102 wxFileInputStream
fileInStream(FILENAME_GZ
);
4103 wxZlibInputStream
istr(fileInStream
);
4104 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
4106 wxPuts(_T("Dumping the file:"));
4107 while ( !istr
.Eof() )
4109 putchar(istr
.GetC());
4113 wxPuts(_T("\n----- done ------"));
4118 // ----------------------------------------------------------------------------
4120 // ----------------------------------------------------------------------------
4122 #ifdef TEST_DATETIME
4126 #include "wx/date.h"
4127 #include "wx/datetime.h"
4132 wxDateTime::wxDateTime_t day
;
4133 wxDateTime::Month month
;
4135 wxDateTime::wxDateTime_t hour
, min
, sec
;
4137 wxDateTime::WeekDay wday
;
4138 time_t gmticks
, ticks
;
4140 void Init(const wxDateTime::Tm
& tm
)
4149 gmticks
= ticks
= -1;
4152 wxDateTime
DT() const
4153 { return wxDateTime(day
, month
, year
, hour
, min
, sec
); }
4155 bool SameDay(const wxDateTime::Tm
& tm
) const
4157 return day
== tm
.mday
&& month
== tm
.mon
&& year
== tm
.year
;
4160 wxString
Format() const
4163 s
.Printf(_T("%02d:%02d:%02d %10s %02d, %4d%s"),
4165 wxDateTime::GetMonthName(month
).c_str(),
4167 abs(wxDateTime::ConvertYearToBC(year
)),
4168 year
> 0 ? _T("AD") : _T("BC"));
4172 wxString
FormatDate() const
4175 s
.Printf(_T("%02d-%s-%4d%s"),
4177 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
4178 abs(wxDateTime::ConvertYearToBC(year
)),
4179 year
> 0 ? _T("AD") : _T("BC"));
4184 static const Date testDates
[] =
4186 { 1, wxDateTime::Jan
, 1970, 00, 00, 00, 2440587.5, wxDateTime::Thu
, 0, -3600 },
4187 { 7, wxDateTime::Feb
, 2036, 00, 00, 00, 2464730.5, wxDateTime::Thu
, -1, -1 },
4188 { 8, wxDateTime::Feb
, 2036, 00, 00, 00, 2464731.5, wxDateTime::Fri
, -1, -1 },
4189 { 1, wxDateTime::Jan
, 2037, 00, 00, 00, 2465059.5, wxDateTime::Thu
, -1, -1 },
4190 { 1, wxDateTime::Jan
, 2038, 00, 00, 00, 2465424.5, wxDateTime::Fri
, -1, -1 },
4191 { 21, wxDateTime::Jan
, 2222, 00, 00, 00, 2532648.5, wxDateTime::Mon
, -1, -1 },
4192 { 29, wxDateTime::May
, 1976, 12, 00, 00, 2442928.0, wxDateTime::Sat
, 202219200, 202212000 },
4193 { 29, wxDateTime::Feb
, 1976, 00, 00, 00, 2442837.5, wxDateTime::Sun
, 194400000, 194396400 },
4194 { 1, wxDateTime::Jan
, 1900, 12, 00, 00, 2415021.0, wxDateTime::Mon
, -1, -1 },
4195 { 1, wxDateTime::Jan
, 1900, 00, 00, 00, 2415020.5, wxDateTime::Mon
, -1, -1 },
4196 { 15, wxDateTime::Oct
, 1582, 00, 00, 00, 2299160.5, wxDateTime::Fri
, -1, -1 },
4197 { 4, wxDateTime::Oct
, 1582, 00, 00, 00, 2299149.5, wxDateTime::Mon
, -1, -1 },
4198 { 1, wxDateTime::Mar
, 1, 00, 00, 00, 1721484.5, wxDateTime::Thu
, -1, -1 },
4199 { 1, wxDateTime::Jan
, 1, 00, 00, 00, 1721425.5, wxDateTime::Mon
, -1, -1 },
4200 { 31, wxDateTime::Dec
, 0, 00, 00, 00, 1721424.5, wxDateTime::Sun
, -1, -1 },
4201 { 1, wxDateTime::Jan
, 0, 00, 00, 00, 1721059.5, wxDateTime::Sat
, -1, -1 },
4202 { 12, wxDateTime::Aug
, -1234, 00, 00, 00, 1270573.5, wxDateTime::Fri
, -1, -1 },
4203 { 12, wxDateTime::Aug
, -4000, 00, 00, 00, 260313.5, wxDateTime::Sat
, -1, -1 },
4204 { 24, wxDateTime::Nov
, -4713, 00, 00, 00, -0.5, wxDateTime::Mon
, -1, -1 },
4207 // this test miscellaneous static wxDateTime functions
4208 static void TestTimeStatic()
4210 wxPuts(_T("\n*** wxDateTime static methods test ***"));
4212 // some info about the current date
4213 int year
= wxDateTime::GetCurrentYear();
4214 wxPrintf(_T("Current year %d is %sa leap one and has %d days.\n"),
4216 wxDateTime::IsLeapYear(year
) ? "" : "not ",
4217 wxDateTime::GetNumberOfDays(year
));
4219 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
4220 wxPrintf(_T("Current month is '%s' ('%s') and it has %d days\n"),
4221 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
4222 wxDateTime::GetMonthName(month
).c_str(),
4223 wxDateTime::GetNumberOfDays(month
));
4226 static const size_t nYears
= 5;
4227 static const size_t years
[2][nYears
] =
4229 // first line: the years to test
4230 { 1990, 1976, 2000, 2030, 1984, },
4232 // second line: TRUE if leap, FALSE otherwise
4233 { FALSE
, TRUE
, TRUE
, FALSE
, TRUE
}
4236 for ( size_t n
= 0; n
< nYears
; n
++ )
4238 int year
= years
[0][n
];
4239 bool should
= years
[1][n
] != 0,
4240 is
= wxDateTime::IsLeapYear(year
);
4242 wxPrintf(_T("Year %d is %sa leap year (%s)\n"),
4245 should
== is
? "ok" : "ERROR");
4247 wxASSERT( should
== wxDateTime::IsLeapYear(year
) );
4251 // test constructing wxDateTime objects
4252 static void TestTimeSet()
4254 wxPuts(_T("\n*** wxDateTime construction test ***"));
4256 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4258 const Date
& d1
= testDates
[n
];
4259 wxDateTime dt
= d1
.DT();
4262 d2
.Init(dt
.GetTm());
4264 wxString s1
= d1
.Format(),
4267 wxPrintf(_T("Date: %s == %s (%s)\n"),
4268 s1
.c_str(), s2
.c_str(),
4269 s1
== s2
? _T("ok") : _T("ERROR"));
4273 // test time zones stuff
4274 static void TestTimeZones()
4276 wxPuts(_T("\n*** wxDateTime timezone test ***"));
4278 wxDateTime now
= wxDateTime::Now();
4280 wxPrintf(_T("Current GMT time:\t%s\n"), now
.Format(_T("%c"), wxDateTime::GMT0
).c_str());
4281 wxPrintf(_T("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::GMT0
).c_str());
4282 wxPrintf(_T("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::EST
).c_str());
4283 wxPrintf(_T("Current time in Paris:\t%s\n"), now
.Format(_T("%c"), wxDateTime::CET
).c_str());
4284 wxPrintf(_T(" Moscow:\t%s\n"), now
.Format(_T("%c"), wxDateTime::MSK
).c_str());
4285 wxPrintf(_T(" New York:\t%s\n"), now
.Format(_T("%c"), wxDateTime::EST
).c_str());
4287 wxDateTime::Tm tm
= now
.GetTm();
4288 if ( wxDateTime(tm
) != now
)
4290 wxPrintf(_T("ERROR: got %s instead of %s\n"),
4291 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
4295 // test some minimal support for the dates outside the standard range
4296 static void TestTimeRange()
4298 wxPuts(_T("\n*** wxDateTime out-of-standard-range dates test ***"));
4300 static const wxChar
*fmt
= _T("%d-%b-%Y %H:%M:%S");
4302 wxPrintf(_T("Unix epoch:\t%s\n"),
4303 wxDateTime(2440587.5).Format(fmt
).c_str());
4304 wxPrintf(_T("Feb 29, 0: \t%s\n"),
4305 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
4306 wxPrintf(_T("JDN 0: \t%s\n"),
4307 wxDateTime(0.0).Format(fmt
).c_str());
4308 wxPrintf(_T("Jan 1, 1AD:\t%s\n"),
4309 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
4310 wxPrintf(_T("May 29, 2099:\t%s\n"),
4311 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
4314 static void TestTimeTicks()
4316 wxPuts(_T("\n*** wxDateTime ticks test ***"));
4318 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4320 const Date
& d
= testDates
[n
];
4321 if ( d
.ticks
== -1 )
4324 wxDateTime dt
= d
.DT();
4325 long ticks
= (dt
.GetValue() / 1000).ToLong();
4326 wxPrintf(_T("Ticks of %s:\t% 10ld"), d
.Format().c_str(), ticks
);
4327 if ( ticks
== d
.ticks
)
4329 wxPuts(_T(" (ok)"));
4333 wxPrintf(_T(" (ERROR: should be %ld, delta = %ld)\n"),
4334 (long)d
.ticks
, (long)(ticks
- d
.ticks
));
4337 dt
= d
.DT().ToTimezone(wxDateTime::GMT0
);
4338 ticks
= (dt
.GetValue() / 1000).ToLong();
4339 wxPrintf(_T("GMtks of %s:\t% 10ld"), d
.Format().c_str(), ticks
);
4340 if ( ticks
== d
.gmticks
)
4342 wxPuts(_T(" (ok)"));
4346 wxPrintf(_T(" (ERROR: should be %ld, delta = %ld)\n"),
4347 (long)d
.gmticks
, (long)(ticks
- d
.gmticks
));
4354 // test conversions to JDN &c
4355 static void TestTimeJDN()
4357 wxPuts(_T("\n*** wxDateTime to JDN test ***"));
4359 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4361 const Date
& d
= testDates
[n
];
4362 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
4363 double jdn
= dt
.GetJulianDayNumber();
4365 wxPrintf(_T("JDN of %s is:\t% 15.6f"), d
.Format().c_str(), jdn
);
4368 wxPuts(_T(" (ok)"));
4372 wxPrintf(_T(" (ERROR: should be %f, delta = %f)\n"),
4373 d
.jdn
, jdn
- d
.jdn
);
4378 // test week days computation
4379 static void TestTimeWDays()
4381 wxPuts(_T("\n*** wxDateTime weekday test ***"));
4383 // test GetWeekDay()
4385 for ( n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4387 const Date
& d
= testDates
[n
];
4388 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
4390 wxDateTime::WeekDay wday
= dt
.GetWeekDay();
4391 wxPrintf(_T("%s is: %s"),
4393 wxDateTime::GetWeekDayName(wday
).c_str());
4394 if ( wday
== d
.wday
)
4396 wxPuts(_T(" (ok)"));
4400 wxPrintf(_T(" (ERROR: should be %s)\n"),
4401 wxDateTime::GetWeekDayName(d
.wday
).c_str());
4407 // test SetToWeekDay()
4408 struct WeekDateTestData
4410 Date date
; // the real date (precomputed)
4411 int nWeek
; // its week index in the month
4412 wxDateTime::WeekDay wday
; // the weekday
4413 wxDateTime::Month month
; // the month
4414 int year
; // and the year
4416 wxString
Format() const
4419 switch ( nWeek
< -1 ? -nWeek
: nWeek
)
4421 case 1: which
= _T("first"); break;
4422 case 2: which
= _T("second"); break;
4423 case 3: which
= _T("third"); break;
4424 case 4: which
= _T("fourth"); break;
4425 case 5: which
= _T("fifth"); break;
4427 case -1: which
= _T("last"); break;
4432 which
+= _T(" from end");
4435 s
.Printf(_T("The %s %s of %s in %d"),
4437 wxDateTime::GetWeekDayName(wday
).c_str(),
4438 wxDateTime::GetMonthName(month
).c_str(),
4445 // the array data was generated by the following python program
4447 from DateTime import *
4448 from whrandom import *
4449 from string import *
4451 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4452 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4454 week = DateTimeDelta(7)
4457 year = randint(1900, 2100)
4458 month = randint(1, 12)
4459 day = randint(1, 28)
4460 dt = DateTime(year, month, day)
4461 wday = dt.day_of_week
4463 countFromEnd = choice([-1, 1])
4466 while dt.month is month:
4467 dt = dt - countFromEnd * week
4468 weekNum = weekNum + countFromEnd
4470 data = { 'day': rjust(`day`, 2), 'month': monthNames[month - 1], 'year': year, 'weekNum': rjust(`weekNum`, 2), 'wday': wdayNames[wday] }
4472 print "{ { %(day)s, wxDateTime::%(month)s, %(year)d }, %(weekNum)d, "\
4473 "wxDateTime::%(wday)s, wxDateTime::%(month)s, %(year)d }," % data
4476 static const WeekDateTestData weekDatesTestData
[] =
4478 { { 20, wxDateTime::Mar
, 2045 }, 3, wxDateTime::Mon
, wxDateTime::Mar
, 2045 },
4479 { { 5, wxDateTime::Jun
, 1985 }, -4, wxDateTime::Wed
, wxDateTime::Jun
, 1985 },
4480 { { 12, wxDateTime::Nov
, 1961 }, -3, wxDateTime::Sun
, wxDateTime::Nov
, 1961 },
4481 { { 27, wxDateTime::Feb
, 2093 }, -1, wxDateTime::Fri
, wxDateTime::Feb
, 2093 },
4482 { { 4, wxDateTime::Jul
, 2070 }, -4, wxDateTime::Fri
, wxDateTime::Jul
, 2070 },
4483 { { 2, wxDateTime::Apr
, 1906 }, -5, wxDateTime::Mon
, wxDateTime::Apr
, 1906 },
4484 { { 19, wxDateTime::Jul
, 2023 }, -2, wxDateTime::Wed
, wxDateTime::Jul
, 2023 },
4485 { { 5, wxDateTime::May
, 1958 }, -4, wxDateTime::Mon
, wxDateTime::May
, 1958 },
4486 { { 11, wxDateTime::Aug
, 1900 }, 2, wxDateTime::Sat
, wxDateTime::Aug
, 1900 },
4487 { { 14, wxDateTime::Feb
, 1945 }, 2, wxDateTime::Wed
, wxDateTime::Feb
, 1945 },
4488 { { 25, wxDateTime::Jul
, 1967 }, -1, wxDateTime::Tue
, wxDateTime::Jul
, 1967 },
4489 { { 9, wxDateTime::May
, 1916 }, -4, wxDateTime::Tue
, wxDateTime::May
, 1916 },
4490 { { 20, wxDateTime::Jun
, 1927 }, 3, wxDateTime::Mon
, wxDateTime::Jun
, 1927 },
4491 { { 2, wxDateTime::Aug
, 2000 }, 1, wxDateTime::Wed
, wxDateTime::Aug
, 2000 },
4492 { { 20, wxDateTime::Apr
, 2044 }, 3, wxDateTime::Wed
, wxDateTime::Apr
, 2044 },
4493 { { 20, wxDateTime::Feb
, 1932 }, -2, wxDateTime::Sat
, wxDateTime::Feb
, 1932 },
4494 { { 25, wxDateTime::Jul
, 2069 }, 4, wxDateTime::Thu
, wxDateTime::Jul
, 2069 },
4495 { { 3, wxDateTime::Apr
, 1925 }, 1, wxDateTime::Fri
, wxDateTime::Apr
, 1925 },
4496 { { 21, wxDateTime::Mar
, 2093 }, 3, wxDateTime::Sat
, wxDateTime::Mar
, 2093 },
4497 { { 3, wxDateTime::Dec
, 2074 }, -5, wxDateTime::Mon
, wxDateTime::Dec
, 2074 },
4500 static const wxChar
*fmt
= _T("%d-%b-%Y");
4503 for ( n
= 0; n
< WXSIZEOF(weekDatesTestData
); n
++ )
4505 const WeekDateTestData
& wd
= weekDatesTestData
[n
];
4507 dt
.SetToWeekDay(wd
.wday
, wd
.nWeek
, wd
.month
, wd
.year
);
4509 wxPrintf(_T("%s is %s"), wd
.Format().c_str(), dt
.Format(fmt
).c_str());
4511 const Date
& d
= wd
.date
;
4512 if ( d
.SameDay(dt
.GetTm()) )
4514 wxPuts(_T(" (ok)"));
4518 dt
.Set(d
.day
, d
.month
, d
.year
);
4520 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.Format(fmt
).c_str());
4525 // test the computation of (ISO) week numbers
4526 static void TestTimeWNumber()
4528 wxPuts(_T("\n*** wxDateTime week number test ***"));
4530 struct WeekNumberTestData
4532 Date date
; // the date
4533 wxDateTime::wxDateTime_t week
; // the week number in the year
4534 wxDateTime::wxDateTime_t wmon
; // the week number in the month
4535 wxDateTime::wxDateTime_t wmon2
; // same but week starts with Sun
4536 wxDateTime::wxDateTime_t dnum
; // day number in the year
4539 // data generated with the following python script:
4541 from DateTime import *
4542 from whrandom import *
4543 from string import *
4545 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4546 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4548 def GetMonthWeek(dt):
4549 weekNumMonth = dt.iso_week[1] - DateTime(dt.year, dt.month, 1).iso_week[1] + 1
4550 if weekNumMonth < 0:
4551 weekNumMonth = weekNumMonth + 53
4554 def GetLastSundayBefore(dt):
4555 if dt.iso_week[2] == 7:
4558 return dt - DateTimeDelta(dt.iso_week[2])
4561 year = randint(1900, 2100)
4562 month = randint(1, 12)
4563 day = randint(1, 28)
4564 dt = DateTime(year, month, day)
4565 dayNum = dt.day_of_year
4566 weekNum = dt.iso_week[1]
4567 weekNumMonth = GetMonthWeek(dt)
4570 dtSunday = GetLastSundayBefore(dt)
4572 while dtSunday >= GetLastSundayBefore(DateTime(dt.year, dt.month, 1)):
4573 weekNumMonth2 = weekNumMonth2 + 1
4574 dtSunday = dtSunday - DateTimeDelta(7)
4576 data = { 'day': rjust(`day`, 2), \
4577 'month': monthNames[month - 1], \
4579 'weekNum': rjust(`weekNum`, 2), \
4580 'weekNumMonth': weekNumMonth, \
4581 'weekNumMonth2': weekNumMonth2, \
4582 'dayNum': rjust(`dayNum`, 3) }
4584 print " { { %(day)s, "\
4585 "wxDateTime::%(month)s, "\
4588 "%(weekNumMonth)s, "\
4589 "%(weekNumMonth2)s, "\
4590 "%(dayNum)s }," % data
4593 static const WeekNumberTestData weekNumberTestDates
[] =
4595 { { 27, wxDateTime::Dec
, 1966 }, 52, 5, 5, 361 },
4596 { { 22, wxDateTime::Jul
, 1926 }, 29, 4, 4, 203 },
4597 { { 22, wxDateTime::Oct
, 2076 }, 43, 4, 4, 296 },
4598 { { 1, wxDateTime::Jul
, 1967 }, 26, 1, 1, 182 },
4599 { { 8, wxDateTime::Nov
, 2004 }, 46, 2, 2, 313 },
4600 { { 21, wxDateTime::Mar
, 1920 }, 12, 3, 4, 81 },
4601 { { 7, wxDateTime::Jan
, 1965 }, 1, 2, 2, 7 },
4602 { { 19, wxDateTime::Oct
, 1999 }, 42, 4, 4, 292 },
4603 { { 13, wxDateTime::Aug
, 1955 }, 32, 2, 2, 225 },
4604 { { 18, wxDateTime::Jul
, 2087 }, 29, 3, 3, 199 },
4605 { { 2, wxDateTime::Sep
, 2028 }, 35, 1, 1, 246 },
4606 { { 28, wxDateTime::Jul
, 1945 }, 30, 5, 4, 209 },
4607 { { 15, wxDateTime::Jun
, 1901 }, 24, 3, 3, 166 },
4608 { { 10, wxDateTime::Oct
, 1939 }, 41, 3, 2, 283 },
4609 { { 3, wxDateTime::Dec
, 1965 }, 48, 1, 1, 337 },
4610 { { 23, wxDateTime::Feb
, 1940 }, 8, 4, 4, 54 },
4611 { { 2, wxDateTime::Jan
, 1987 }, 1, 1, 1, 2 },
4612 { { 11, wxDateTime::Aug
, 2079 }, 32, 2, 2, 223 },
4613 { { 2, wxDateTime::Feb
, 2063 }, 5, 1, 1, 33 },
4614 { { 16, wxDateTime::Oct
, 1942 }, 42, 3, 3, 289 },
4617 for ( size_t n
= 0; n
< WXSIZEOF(weekNumberTestDates
); n
++ )
4619 const WeekNumberTestData
& wn
= weekNumberTestDates
[n
];
4620 const Date
& d
= wn
.date
;
4622 wxDateTime dt
= d
.DT();
4624 wxDateTime::wxDateTime_t
4625 week
= dt
.GetWeekOfYear(wxDateTime::Monday_First
),
4626 wmon
= dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4627 wmon2
= dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4628 dnum
= dt
.GetDayOfYear();
4630 wxPrintf(_T("%s: the day number is %d"), d
.FormatDate().c_str(), dnum
);
4631 if ( dnum
== wn
.dnum
)
4633 wxPrintf(_T(" (ok)"));
4637 wxPrintf(_T(" (ERROR: should be %d)"), wn
.dnum
);
4640 wxPrintf(_T(", week in month = %d"), wmon
);
4641 if ( wmon
!= wn
.wmon
)
4643 wxPrintf(_T(" (ERROR: should be %d)"), wn
.wmon
);
4646 wxPrintf(_T(" or %d"), wmon2
);
4647 if ( wmon2
== wn
.wmon2
)
4649 wxPrintf(_T(" (ok)"));
4653 wxPrintf(_T(" (ERROR: should be %d)"), wn
.wmon2
);
4656 wxPrintf(_T(", week in year = %d"), week
);
4657 if ( week
!= wn
.week
)
4659 wxPrintf(_T(" (ERROR: should be %d)"), wn
.week
);
4662 wxPutchar(_T('\n'));
4664 wxDateTime
dt2(1, wxDateTime::Jan
, d
.year
);
4665 dt2
.SetToTheWeek(wn
.week
, dt
.GetWeekDay());
4669 d2
.Init(dt2
.GetTm());
4670 wxPrintf(_T("ERROR: SetToTheWeek() returned %s\n"),
4671 d2
.FormatDate().c_str());
4676 // test DST calculations
4677 static void TestTimeDST()
4679 wxPuts(_T("\n*** wxDateTime DST test ***"));
4681 wxPrintf(_T("DST is%s in effect now.\n\n"),
4682 wxDateTime::Now().IsDST() ? _T("") : _T(" not"));
4684 // taken from http://www.energy.ca.gov/daylightsaving.html
4685 static const Date datesDST
[2][2004 - 1900 + 1] =
4688 { 1, wxDateTime::Apr
, 1990 },
4689 { 7, wxDateTime::Apr
, 1991 },
4690 { 5, wxDateTime::Apr
, 1992 },
4691 { 4, wxDateTime::Apr
, 1993 },
4692 { 3, wxDateTime::Apr
, 1994 },
4693 { 2, wxDateTime::Apr
, 1995 },
4694 { 7, wxDateTime::Apr
, 1996 },
4695 { 6, wxDateTime::Apr
, 1997 },
4696 { 5, wxDateTime::Apr
, 1998 },
4697 { 4, wxDateTime::Apr
, 1999 },
4698 { 2, wxDateTime::Apr
, 2000 },
4699 { 1, wxDateTime::Apr
, 2001 },
4700 { 7, wxDateTime::Apr
, 2002 },
4701 { 6, wxDateTime::Apr
, 2003 },
4702 { 4, wxDateTime::Apr
, 2004 },
4705 { 28, wxDateTime::Oct
, 1990 },
4706 { 27, wxDateTime::Oct
, 1991 },
4707 { 25, wxDateTime::Oct
, 1992 },
4708 { 31, wxDateTime::Oct
, 1993 },
4709 { 30, wxDateTime::Oct
, 1994 },
4710 { 29, wxDateTime::Oct
, 1995 },
4711 { 27, wxDateTime::Oct
, 1996 },
4712 { 26, wxDateTime::Oct
, 1997 },
4713 { 25, wxDateTime::Oct
, 1998 },
4714 { 31, wxDateTime::Oct
, 1999 },
4715 { 29, wxDateTime::Oct
, 2000 },
4716 { 28, wxDateTime::Oct
, 2001 },
4717 { 27, wxDateTime::Oct
, 2002 },
4718 { 26, wxDateTime::Oct
, 2003 },
4719 { 31, wxDateTime::Oct
, 2004 },
4724 for ( year
= 1990; year
< 2005; year
++ )
4726 wxDateTime dtBegin
= wxDateTime::GetBeginDST(year
, wxDateTime::USA
),
4727 dtEnd
= wxDateTime::GetEndDST(year
, wxDateTime::USA
);
4729 wxPrintf(_T("DST period in the US for year %d: from %s to %s"),
4730 year
, dtBegin
.Format().c_str(), dtEnd
.Format().c_str());
4732 size_t n
= year
- 1990;
4733 const Date
& dBegin
= datesDST
[0][n
];
4734 const Date
& dEnd
= datesDST
[1][n
];
4736 if ( dBegin
.SameDay(dtBegin
.GetTm()) && dEnd
.SameDay(dtEnd
.GetTm()) )
4738 wxPuts(_T(" (ok)"));
4742 wxPrintf(_T(" (ERROR: should be %s %d to %s %d)\n"),
4743 wxDateTime::GetMonthName(dBegin
.month
).c_str(), dBegin
.day
,
4744 wxDateTime::GetMonthName(dEnd
.month
).c_str(), dEnd
.day
);
4750 for ( year
= 1990; year
< 2005; year
++ )
4752 wxPrintf(_T("DST period in Europe for year %d: from %s to %s\n"),
4754 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
4755 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
4759 // test wxDateTime -> text conversion
4760 static void TestTimeFormat()
4762 wxPuts(_T("\n*** wxDateTime formatting test ***"));
4764 // some information may be lost during conversion, so store what kind
4765 // of info should we recover after a round trip
4768 CompareNone
, // don't try comparing
4769 CompareBoth
, // dates and times should be identical
4770 CompareDate
, // dates only
4771 CompareTime
// time only
4776 CompareKind compareKind
;
4777 const wxChar
*format
;
4778 } formatTestFormats
[] =
4780 { CompareBoth
, _T("---> %c") },
4781 { CompareDate
, _T("Date is %A, %d of %B, in year %Y") },
4782 { CompareBoth
, _T("Date is %x, time is %X") },
4783 { CompareTime
, _T("Time is %H:%M:%S or %I:%M:%S %p") },
4784 { CompareNone
, _T("The day of year: %j, the week of year: %W") },
4785 { CompareDate
, _T("ISO date without separators: %Y%m%d") },
4788 static const Date formatTestDates
[] =
4790 { 29, wxDateTime::May
, 1976, 18, 30, 00 },
4791 { 31, wxDateTime::Dec
, 1999, 23, 30, 00 },
4793 // this test can't work for other centuries because it uses two digit
4794 // years in formats, so don't even try it
4795 { 29, wxDateTime::May
, 2076, 18, 30, 00 },
4796 { 29, wxDateTime::Feb
, 2400, 02, 15, 25 },
4797 { 01, wxDateTime::Jan
, -52, 03, 16, 47 },
4801 // an extra test (as it doesn't depend on date, don't do it in the loop)
4802 wxPrintf(_T("%s\n"), wxDateTime::Now().Format(_T("Our timezone is %Z")).c_str());
4804 for ( size_t d
= 0; d
< WXSIZEOF(formatTestDates
) + 1; d
++ )
4808 wxDateTime dt
= d
== 0 ? wxDateTime::Now() : formatTestDates
[d
- 1].DT();
4809 for ( size_t n
= 0; n
< WXSIZEOF(formatTestFormats
); n
++ )
4811 wxString s
= dt
.Format(formatTestFormats
[n
].format
);
4812 wxPrintf(_T("%s"), s
.c_str());
4814 // what can we recover?
4815 int kind
= formatTestFormats
[n
].compareKind
;
4819 const wxChar
*result
= dt2
.ParseFormat(s
, formatTestFormats
[n
].format
);
4822 // converion failed - should it have?
4823 if ( kind
== CompareNone
)
4824 wxPuts(_T(" (ok)"));
4826 wxPuts(_T(" (ERROR: conversion back failed)"));
4830 // should have parsed the entire string
4831 wxPuts(_T(" (ERROR: conversion back stopped too soon)"));
4835 bool equal
= FALSE
; // suppress compilaer warning
4843 equal
= dt
.IsSameDate(dt2
);
4847 equal
= dt
.IsSameTime(dt2
);
4853 wxPrintf(_T(" (ERROR: got back '%s' instead of '%s')\n"),
4854 dt2
.Format().c_str(), dt
.Format().c_str());
4858 wxPuts(_T(" (ok)"));
4865 // test text -> wxDateTime conversion
4866 static void TestTimeParse()
4868 wxPuts(_T("\n*** wxDateTime parse test ***"));
4870 struct ParseTestData
4872 const wxChar
*format
;
4877 static const ParseTestData parseTestDates
[] =
4879 { _T("Sat, 18 Dec 1999 00:46:40 +0100"), { 18, wxDateTime::Dec
, 1999, 00, 46, 40 }, TRUE
},
4880 { _T("Wed, 1 Dec 1999 05:17:20 +0300"), { 1, wxDateTime::Dec
, 1999, 03, 17, 20 }, TRUE
},
4883 for ( size_t n
= 0; n
< WXSIZEOF(parseTestDates
); n
++ )
4885 const wxChar
*format
= parseTestDates
[n
].format
;
4887 wxPrintf(_T("%s => "), format
);
4890 if ( dt
.ParseRfc822Date(format
) )
4892 wxPrintf(_T("%s "), dt
.Format().c_str());
4894 if ( parseTestDates
[n
].good
)
4896 wxDateTime dtReal
= parseTestDates
[n
].date
.DT();
4903 wxPrintf(_T("(ERROR: should be %s)\n"), dtReal
.Format().c_str());
4908 wxPuts(_T("(ERROR: bad format)"));
4913 wxPrintf(_T("bad format (%s)\n"),
4914 parseTestDates
[n
].good
? "ERROR" : "ok");
4919 static void TestDateTimeInteractive()
4921 wxPuts(_T("\n*** interactive wxDateTime tests ***"));
4927 wxPrintf(_T("Enter a date: "));
4928 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
4931 // kill the last '\n'
4932 buf
[wxStrlen(buf
) - 1] = 0;
4935 const wxChar
*p
= dt
.ParseDate(buf
);
4938 wxPrintf(_T("ERROR: failed to parse the date '%s'.\n"), buf
);
4944 wxPrintf(_T("WARNING: parsed only first %u characters.\n"), p
- buf
);
4947 wxPrintf(_T("%s: day %u, week of month %u/%u, week of year %u\n"),
4948 dt
.Format(_T("%b %d, %Y")).c_str(),
4950 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4951 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4952 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
4955 wxPuts(_T("\n*** done ***"));
4958 static void TestTimeMS()
4960 wxPuts(_T("*** testing millisecond-resolution support in wxDateTime ***"));
4962 wxDateTime dt1
= wxDateTime::Now(),
4963 dt2
= wxDateTime::UNow();
4965 wxPrintf(_T("Now = %s\n"), dt1
.Format(_T("%H:%M:%S:%l")).c_str());
4966 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
4967 wxPrintf(_T("Dummy loop: "));
4968 for ( int i
= 0; i
< 6000; i
++ )
4970 //for ( int j = 0; j < 10; j++ )
4973 s
.Printf(_T("%g"), sqrt(i
));
4979 wxPuts(_T(", done"));
4982 dt2
= wxDateTime::UNow();
4983 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
4985 wxPrintf(_T("Loop executed in %s ms\n"), (dt2
- dt1
).Format(_T("%l")).c_str());
4987 wxPuts(_T("\n*** done ***"));
4990 static void TestTimeArithmetics()
4992 wxPuts(_T("\n*** testing arithmetic operations on wxDateTime ***"));
4994 static const struct ArithmData
4996 ArithmData(const wxDateSpan
& sp
, const wxChar
*nam
)
4997 : span(sp
), name(nam
) { }
5001 } testArithmData
[] =
5003 ArithmData(wxDateSpan::Day(), _T("day")),
5004 ArithmData(wxDateSpan::Week(), _T("week")),
5005 ArithmData(wxDateSpan::Month(), _T("month")),
5006 ArithmData(wxDateSpan::Year(), _T("year")),
5007 ArithmData(wxDateSpan(1, 2, 3, 4), _T("year, 2 months, 3 weeks, 4 days")),
5010 wxDateTime
dt(29, wxDateTime::Dec
, 1999), dt1
, dt2
;
5012 for ( size_t n
= 0; n
< WXSIZEOF(testArithmData
); n
++ )
5014 wxDateSpan span
= testArithmData
[n
].span
;
5018 const wxChar
*name
= testArithmData
[n
].name
;
5019 wxPrintf(_T("%s + %s = %s, %s - %s = %s\n"),
5020 dt
.FormatISODate().c_str(), name
, dt1
.FormatISODate().c_str(),
5021 dt
.FormatISODate().c_str(), name
, dt2
.FormatISODate().c_str());
5023 wxPrintf(_T("Going back: %s"), (dt1
- span
).FormatISODate().c_str());
5024 if ( dt1
- span
== dt
)
5026 wxPuts(_T(" (ok)"));
5030 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.FormatISODate().c_str());
5033 wxPrintf(_T("Going forward: %s"), (dt2
+ span
).FormatISODate().c_str());
5034 if ( dt2
+ span
== dt
)
5036 wxPuts(_T(" (ok)"));
5040 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.FormatISODate().c_str());
5043 wxPrintf(_T("Double increment: %s"), (dt2
+ 2*span
).FormatISODate().c_str());
5044 if ( dt2
+ 2*span
== dt1
)
5046 wxPuts(_T(" (ok)"));
5050 wxPrintf(_T(" (ERROR: should be %s)\n"), dt2
.FormatISODate().c_str());
5057 static void TestTimeHolidays()
5059 wxPuts(_T("\n*** testing wxDateTimeHolidayAuthority ***\n"));
5061 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
5062 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
5063 dtEnd
= dtStart
.GetLastMonthDay();
5065 wxDateTimeArray hol
;
5066 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
5068 const wxChar
*format
= _T("%d-%b-%Y (%a)");
5070 wxPrintf(_T("All holidays between %s and %s:\n"),
5071 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
5073 size_t count
= hol
.GetCount();
5074 for ( size_t n
= 0; n
< count
; n
++ )
5076 wxPrintf(_T("\t%s\n"), hol
[n
].Format(format
).c_str());
5082 static void TestTimeZoneBug()
5084 wxPuts(_T("\n*** testing for DST/timezone bug ***\n"));
5086 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
5087 for ( int i
= 0; i
< 31; i
++ )
5089 wxPrintf(_T("Date %s: week day %s.\n"),
5090 date
.Format(_T("%d-%m-%Y")).c_str(),
5091 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
5093 date
+= wxDateSpan::Day();
5099 static void TestTimeSpanFormat()
5101 wxPuts(_T("\n*** wxTimeSpan tests ***"));
5103 static const wxChar
*formats
[] =
5105 _T("(default) %H:%M:%S"),
5106 _T("%E weeks and %D days"),
5107 _T("%l milliseconds"),
5108 _T("(with ms) %H:%M:%S:%l"),
5109 _T("100%% of minutes is %M"), // test "%%"
5110 _T("%D days and %H hours"),
5111 _T("or also %S seconds"),
5114 wxTimeSpan
ts1(1, 2, 3, 4),
5116 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
5118 wxPrintf(_T("ts1 = %s\tts2 = %s\n"),
5119 ts1
.Format(formats
[n
]).c_str(),
5120 ts2
.Format(formats
[n
]).c_str());
5128 // test compatibility with the old wxDate/wxTime classes
5129 static void TestTimeCompatibility()
5131 wxPuts(_T("\n*** wxDateTime compatibility test ***"));
5133 wxPrintf(_T("wxDate for JDN 0: %s\n"), wxDate(0l).FormatDate().c_str());
5134 wxPrintf(_T("wxDate for MJD 0: %s\n"), wxDate(2400000).FormatDate().c_str());
5136 double jdnNow
= wxDateTime::Now().GetJDN();
5137 long jdnMidnight
= (long)(jdnNow
- 0.5);
5138 wxPrintf(_T("wxDate for today: %s\n"), wxDate(jdnMidnight
).FormatDate().c_str());
5140 jdnMidnight
= wxDate().Set().GetJulianDate();
5141 wxPrintf(_T("wxDateTime for today: %s\n"),
5142 wxDateTime((double)(jdnMidnight
+ 0.5)).Format("%c", wxDateTime::GMT0
).c_str());
5144 int flags
= wxEUROPEAN
;//wxFULL;
5147 wxPrintf(_T("Today is %s\n"), date
.FormatDate(flags
).c_str());
5148 for ( int n
= 0; n
< 7; n
++ )
5150 wxPrintf(_T("Previous %s is %s\n"),
5151 wxDateTime::GetWeekDayName((wxDateTime::WeekDay
)n
),
5152 date
.Previous(n
+ 1).FormatDate(flags
).c_str());
5158 #endif // TEST_DATETIME
5160 // ----------------------------------------------------------------------------
5161 // wxTextInput/OutputStream
5162 // ----------------------------------------------------------------------------
5164 #ifdef TEST_TEXTSTREAM
5166 #include "wx/txtstrm.h"
5167 #include "wx/wfstream.h"
5169 static void TestTextInputStream()
5171 wxPuts(_T("\n*** wxTextInputStream test ***"));
5173 wxFileInputStream
fsIn(_T("testdata.fc"));
5176 wxPuts(_T("ERROR: couldn't open file."));
5180 wxTextInputStream
tis(fsIn
);
5185 const wxString s
= tis
.ReadLine();
5187 // line could be non empty if the last line of the file isn't
5188 // terminated with EOL
5189 if ( fsIn
.Eof() && s
.empty() )
5192 wxPrintf(_T("Line %d: %s\n"), line
++, s
.c_str());
5197 #endif // TEST_TEXTSTREAM
5199 // ----------------------------------------------------------------------------
5201 // ----------------------------------------------------------------------------
5205 #include "wx/thread.h"
5207 static size_t gs_counter
= (size_t)-1;
5208 static wxCriticalSection gs_critsect
;
5209 static wxSemaphore gs_cond
;
5211 class MyJoinableThread
: public wxThread
5214 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
5215 { m_n
= n
; Create(); }
5217 // thread execution starts here
5218 virtual ExitCode
Entry();
5224 wxThread::ExitCode
MyJoinableThread::Entry()
5226 unsigned long res
= 1;
5227 for ( size_t n
= 1; n
< m_n
; n
++ )
5231 // it's a loooong calculation :-)
5235 return (ExitCode
)res
;
5238 class MyDetachedThread
: public wxThread
5241 MyDetachedThread(size_t n
, wxChar ch
)
5245 m_cancelled
= FALSE
;
5250 // thread execution starts here
5251 virtual ExitCode
Entry();
5254 virtual void OnExit();
5257 size_t m_n
; // number of characters to write
5258 wxChar m_ch
; // character to write
5260 bool m_cancelled
; // FALSE if we exit normally
5263 wxThread::ExitCode
MyDetachedThread::Entry()
5266 wxCriticalSectionLocker
lock(gs_critsect
);
5267 if ( gs_counter
== (size_t)-1 )
5273 for ( size_t n
= 0; n
< m_n
; n
++ )
5275 if ( TestDestroy() )
5285 wxThread::Sleep(100);
5291 void MyDetachedThread::OnExit()
5293 wxLogTrace(_T("thread"), _T("Thread %ld is in OnExit"), GetId());
5295 wxCriticalSectionLocker
lock(gs_critsect
);
5296 if ( !--gs_counter
&& !m_cancelled
)
5300 static void TestDetachedThreads()
5302 wxPuts(_T("\n*** Testing detached threads ***"));
5304 static const size_t nThreads
= 3;
5305 MyDetachedThread
*threads
[nThreads
];
5307 for ( n
= 0; n
< nThreads
; n
++ )
5309 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
5312 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
5313 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
5315 for ( n
= 0; n
< nThreads
; n
++ )
5320 // wait until all threads terminate
5326 static void TestJoinableThreads()
5328 wxPuts(_T("\n*** Testing a joinable thread (a loooong calculation...) ***"));
5330 // calc 10! in the background
5331 MyJoinableThread
thread(10);
5334 wxPrintf(_T("\nThread terminated with exit code %lu.\n"),
5335 (unsigned long)thread
.Wait());
5338 static void TestThreadSuspend()
5340 wxPuts(_T("\n*** Testing thread suspend/resume functions ***"));
5342 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
5346 // this is for this demo only, in a real life program we'd use another
5347 // condition variable which would be signaled from wxThread::Entry() to
5348 // tell us that the thread really started running - but here just wait a
5349 // bit and hope that it will be enough (the problem is, of course, that
5350 // the thread might still not run when we call Pause() which will result
5352 wxThread::Sleep(300);
5354 for ( size_t n
= 0; n
< 3; n
++ )
5358 wxPuts(_T("\nThread suspended"));
5361 // don't sleep but resume immediately the first time
5362 wxThread::Sleep(300);
5364 wxPuts(_T("Going to resume the thread"));
5369 wxPuts(_T("Waiting until it terminates now"));
5371 // wait until the thread terminates
5377 static void TestThreadDelete()
5379 // As above, using Sleep() is only for testing here - we must use some
5380 // synchronisation object instead to ensure that the thread is still
5381 // running when we delete it - deleting a detached thread which already
5382 // terminated will lead to a crash!
5384 wxPuts(_T("\n*** Testing thread delete function ***"));
5386 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
5390 wxPuts(_T("\nDeleted a thread which didn't start to run yet."));
5392 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
5396 wxThread::Sleep(300);
5400 wxPuts(_T("\nDeleted a running thread."));
5402 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
5406 wxThread::Sleep(300);
5412 wxPuts(_T("\nDeleted a sleeping thread."));
5414 MyJoinableThread
thread3(20);
5419 wxPuts(_T("\nDeleted a joinable thread."));
5421 MyJoinableThread
thread4(2);
5424 wxThread::Sleep(300);
5428 wxPuts(_T("\nDeleted a joinable thread which already terminated."));
5433 class MyWaitingThread
: public wxThread
5436 MyWaitingThread( wxMutex
*mutex
, wxCondition
*condition
)
5439 m_condition
= condition
;
5444 virtual ExitCode
Entry()
5446 wxPrintf(_T("Thread %lu has started running.\n"), GetId());
5451 wxPrintf(_T("Thread %lu starts to wait...\n"), GetId());
5455 m_condition
->Wait();
5458 wxPrintf(_T("Thread %lu finished to wait, exiting.\n"), GetId());
5466 wxCondition
*m_condition
;
5469 static void TestThreadConditions()
5472 wxCondition
condition(mutex
);
5474 // otherwise its difficult to understand which log messages pertain to
5476 //wxLogTrace(_T("thread"), _T("Local condition var is %08x, gs_cond = %08x"),
5477 // condition.GetId(), gs_cond.GetId());
5479 // create and launch threads
5480 MyWaitingThread
*threads
[10];
5483 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5485 threads
[n
] = new MyWaitingThread( &mutex
, &condition
);
5488 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5493 // wait until all threads run
5494 wxPuts(_T("Main thread is waiting for the other threads to start"));
5497 size_t nRunning
= 0;
5498 while ( nRunning
< WXSIZEOF(threads
) )
5504 wxPrintf(_T("Main thread: %u already running\n"), nRunning
);
5508 wxPuts(_T("Main thread: all threads started up."));
5511 wxThread::Sleep(500);
5514 // now wake one of them up
5515 wxPrintf(_T("Main thread: about to signal the condition.\n"));
5520 wxThread::Sleep(200);
5522 // wake all the (remaining) threads up, so that they can exit
5523 wxPrintf(_T("Main thread: about to broadcast the condition.\n"));
5525 condition
.Broadcast();
5527 // give them time to terminate (dirty!)
5528 wxThread::Sleep(500);
5531 #include "wx/utils.h"
5533 class MyExecThread
: public wxThread
5536 MyExecThread(const wxString
& command
) : wxThread(wxTHREAD_JOINABLE
),
5542 virtual ExitCode
Entry()
5544 return (ExitCode
)wxExecute(m_command
, wxEXEC_SYNC
);
5551 static void TestThreadExec()
5553 wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
5555 MyExecThread
thread(_T("true"));
5558 wxPrintf(_T("Main program exit code: %ld.\n"),
5559 wxExecute(_T("false"), wxEXEC_SYNC
));
5561 wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread
.Wait());
5565 #include "wx/datetime.h"
5567 class MySemaphoreThread
: public wxThread
5570 MySemaphoreThread(int i
, wxSemaphore
*sem
)
5571 : wxThread(wxTHREAD_JOINABLE
),
5578 virtual ExitCode
Entry()
5580 wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
5581 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5585 wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
5586 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5590 wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
5591 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5603 WX_DEFINE_ARRAY(wxThread
*, ArrayThreads
);
5605 static void TestSemaphore()
5607 wxPuts(_T("*** Testing wxSemaphore class. ***"));
5609 static const int SEM_LIMIT
= 3;
5611 wxSemaphore
sem(SEM_LIMIT
, SEM_LIMIT
);
5612 ArrayThreads threads
;
5614 for ( int i
= 0; i
< 3*SEM_LIMIT
; i
++ )
5616 threads
.Add(new MySemaphoreThread(i
, &sem
));
5617 threads
.Last()->Run();
5620 for ( size_t n
= 0; n
< threads
.GetCount(); n
++ )
5627 #endif // TEST_THREADS
5629 // ----------------------------------------------------------------------------
5631 // ----------------------------------------------------------------------------
5635 #include "wx/dynarray.h"
5637 typedef unsigned short ushort
;
5639 #define DefineCompare(name, T) \
5641 int wxCMPFUNC_CONV name ## CompareValues(T first, T second) \
5643 return first - second; \
5646 int wxCMPFUNC_CONV name ## Compare(T* first, T* second) \
5648 return *first - *second; \
5651 int wxCMPFUNC_CONV name ## RevCompare(T* first, T* second) \
5653 return *second - *first; \
5656 DefineCompare(UShort, ushort);
5657 DefineCompare(Int
, int);
5659 // test compilation of all macros
5660 WX_DEFINE_ARRAY_SHORT(ushort
, wxArrayUShort
);
5661 WX_DEFINE_SORTED_ARRAY_SHORT(ushort
, wxSortedArrayUShortNoCmp
);
5662 WX_DEFINE_SORTED_ARRAY_CMP_SHORT(ushort
, UShortCompareValues
, wxSortedArrayUShort
);
5663 WX_DEFINE_SORTED_ARRAY_CMP_INT(int, IntCompareValues
, wxSortedArrayInt
);
5665 WX_DECLARE_OBJARRAY(Bar
, ArrayBars
);
5666 #include "wx/arrimpl.cpp"
5667 WX_DEFINE_OBJARRAY(ArrayBars
);
5669 static void PrintArray(const wxChar
* name
, const wxArrayString
& array
)
5671 wxPrintf(_T("Dump of the array '%s'\n"), name
);
5673 size_t nCount
= array
.GetCount();
5674 for ( size_t n
= 0; n
< nCount
; n
++ )
5676 wxPrintf(_T("\t%s[%u] = '%s'\n"), name
, n
, array
[n
].c_str());
5680 int wxCMPFUNC_CONV
StringLenCompare(const wxString
& first
,
5681 const wxString
& second
)
5683 return first
.length() - second
.length();
5686 #define TestArrayOf(name) \
5688 static void PrintArray(const wxChar* name, const wxSortedArray##name & array) \
5690 wxPrintf(_T("Dump of the array '%s'\n"), name); \
5692 size_t nCount = array.GetCount(); \
5693 for ( size_t n = 0; n < nCount; n++ ) \
5695 wxPrintf(_T("\t%s[%u] = %d\n"), name, n, array[n]); \
5699 static void PrintArray(const wxChar* name, const wxArray##name & array) \
5701 wxPrintf(_T("Dump of the array '%s'\n"), name); \
5703 size_t nCount = array.GetCount(); \
5704 for ( size_t n = 0; n < nCount; n++ ) \
5706 wxPrintf(_T("\t%s[%u] = %d\n"), name, n, array[n]); \
5710 static void TestArrayOf ## name ## s() \
5712 wxPrintf(_T("*** Testing wxArray%s ***\n"), #name); \
5720 wxPuts(_T("Initially:")); \
5721 PrintArray(_T("a"), a); \
5723 wxPuts(_T("After sort:")); \
5724 a.Sort(name ## Compare); \
5725 PrintArray(_T("a"), a); \
5727 wxPuts(_T("After reverse sort:")); \
5728 a.Sort(name ## RevCompare); \
5729 PrintArray(_T("a"), a); \
5731 wxSortedArray##name b; \
5737 wxPuts(_T("Sorted array initially:")); \
5738 PrintArray(_T("b"), b); \
5741 TestArrayOf(UShort
);
5744 static void TestArrayOfObjects()
5746 wxPuts(_T("*** Testing wxObjArray ***\n"));
5750 Bar
bar("second bar (two copies!)");
5752 wxPrintf(_T("Initially: %u objects in the array, %u objects total.\n"),
5753 bars
.GetCount(), Bar::GetNumber());
5755 bars
.Add(new Bar("first bar"));
5758 wxPrintf(_T("Now: %u objects in the array, %u objects total.\n"),
5759 bars
.GetCount(), Bar::GetNumber());
5761 bars
.RemoveAt(1, bars
.GetCount() - 1);
5763 wxPrintf(_T("After removing all but first element: %u objects in the ")
5764 _T("array, %u objects total.\n"),
5765 bars
.GetCount(), Bar::GetNumber());
5769 wxPrintf(_T("After Empty(): %u objects in the array, %u objects total.\n"),
5770 bars
.GetCount(), Bar::GetNumber());
5773 wxPrintf(_T("Finally: no more objects in the array, %u objects total.\n"),
5777 #endif // TEST_ARRAYS
5779 // ----------------------------------------------------------------------------
5781 // ----------------------------------------------------------------------------
5785 #include "wx/timer.h"
5786 #include "wx/tokenzr.h"
5788 static void TestStringConstruction()
5790 wxPuts(_T("*** Testing wxString constructores ***"));
5792 #define TEST_CTOR(args, res) \
5795 wxPrintf(_T("wxString%s = %s "), #args, s.c_str()); \
5798 wxPuts(_T("(ok)")); \
5802 wxPrintf(_T("(ERROR: should be %s)\n"), res); \
5806 TEST_CTOR((_T('Z'), 4), _T("ZZZZ"));
5807 TEST_CTOR((_T("Hello"), 4), _T("Hell"));
5808 TEST_CTOR((_T("Hello"), 5), _T("Hello"));
5809 // TEST_CTOR((_T("Hello"), 6), _T("Hello")); -- should give assert failure
5811 static const wxChar
*s
= _T("?really!");
5812 const wxChar
*start
= wxStrchr(s
, _T('r'));
5813 const wxChar
*end
= wxStrchr(s
, _T('!'));
5814 TEST_CTOR((start
, end
), _T("really"));
5819 static void TestString()
5829 for (int i
= 0; i
< 1000000; ++i
)
5833 c
= "! How'ya doin'?";
5836 c
= "Hello world! What's up?";
5841 wxPrintf(_T("TestString elapsed time: %ld\n"), sw
.Time());
5844 static void TestPChar()
5852 for (int i
= 0; i
< 1000000; ++i
)
5854 wxStrcpy (a
, _T("Hello"));
5855 wxStrcpy (b
, _T(" world"));
5856 wxStrcpy (c
, _T("! How'ya doin'?"));
5859 wxStrcpy (c
, _T("Hello world! What's up?"));
5860 if (wxStrcmp (c
, a
) == 0)
5861 wxStrcpy (c
, _T("Doh!"));
5864 wxPrintf(_T("TestPChar elapsed time: %ld\n"), sw
.Time());
5867 static void TestStringSub()
5869 wxString
s("Hello, world!");
5871 wxPuts(_T("*** Testing wxString substring extraction ***"));
5873 wxPrintf(_T("String = '%s'\n"), s
.c_str());
5874 wxPrintf(_T("Left(5) = '%s'\n"), s
.Left(5).c_str());
5875 wxPrintf(_T("Right(6) = '%s'\n"), s
.Right(6).c_str());
5876 wxPrintf(_T("Mid(3, 5) = '%s'\n"), s(3, 5).c_str());
5877 wxPrintf(_T("Mid(3) = '%s'\n"), s
.Mid(3).c_str());
5878 wxPrintf(_T("substr(3, 5) = '%s'\n"), s
.substr(3, 5).c_str());
5879 wxPrintf(_T("substr(3) = '%s'\n"), s
.substr(3).c_str());
5881 static const wxChar
*prefixes
[] =
5885 _T("Hello, world!"),
5886 _T("Hello, world!!!"),
5892 for ( size_t n
= 0; n
< WXSIZEOF(prefixes
); n
++ )
5894 wxString prefix
= prefixes
[n
], rest
;
5895 bool rc
= s
.StartsWith(prefix
, &rest
);
5896 wxPrintf(_T("StartsWith('%s') = %s"), prefix
.c_str(), rc
? _T("TRUE") : _T("FALSE"));
5899 wxPrintf(_T(" (the rest is '%s')\n"), rest
.c_str());
5910 static void TestStringFormat()
5912 wxPuts(_T("*** Testing wxString formatting ***"));
5915 s
.Printf(_T("%03d"), 18);
5917 wxPrintf(_T("Number 18: %s\n"), wxString::Format(_T("%03d"), 18).c_str());
5918 wxPrintf(_T("Number 18: %s\n"), s
.c_str());
5923 // returns "not found" for npos, value for all others
5924 static wxString
PosToString(size_t res
)
5926 wxString s
= res
== wxString::npos
? wxString(_T("not found"))
5927 : wxString::Format(_T("%u"), res
);
5931 static void TestStringFind()
5933 wxPuts(_T("*** Testing wxString find() functions ***"));
5935 static const wxChar
*strToFind
= _T("ell");
5936 static const struct StringFindTest
5940 result
; // of searching "ell" in str
5943 { _T("Well, hello world"), 0, 1 },
5944 { _T("Well, hello world"), 6, 7 },
5945 { _T("Well, hello world"), 9, wxString::npos
},
5948 for ( size_t n
= 0; n
< WXSIZEOF(findTestData
); n
++ )
5950 const StringFindTest
& ft
= findTestData
[n
];
5951 size_t res
= wxString(ft
.str
).find(strToFind
, ft
.start
);
5953 wxPrintf(_T("Index of '%s' in '%s' starting from %u is %s "),
5954 strToFind
, ft
.str
, ft
.start
, PosToString(res
).c_str());
5956 size_t resTrue
= ft
.result
;
5957 if ( res
== resTrue
)
5963 wxPrintf(_T("(ERROR: should be %s)\n"),
5964 PosToString(resTrue
).c_str());
5971 static void TestStringTokenizer()
5973 wxPuts(_T("*** Testing wxStringTokenizer ***"));
5975 static const wxChar
*modeNames
[] =
5979 _T("return all empty"),
5984 static const struct StringTokenizerTest
5986 const wxChar
*str
; // string to tokenize
5987 const wxChar
*delims
; // delimiters to use
5988 size_t count
; // count of token
5989 wxStringTokenizerMode mode
; // how should we tokenize it
5990 } tokenizerTestData
[] =
5992 { _T(""), _T(" "), 0 },
5993 { _T("Hello, world"), _T(" "), 2 },
5994 { _T("Hello, world "), _T(" "), 2 },
5995 { _T("Hello, world"), _T(","), 2 },
5996 { _T("Hello, world!"), _T(",!"), 2 },
5997 { _T("Hello,, world!"), _T(",!"), 3 },
5998 { _T("Hello, world!"), _T(",!"), 3, wxTOKEN_RET_EMPTY_ALL
},
5999 { _T("username:password:uid:gid:gecos:home:shell"), _T(":"), 7 },
6000 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 4 },
6001 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 6, wxTOKEN_RET_EMPTY
},
6002 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 9, wxTOKEN_RET_EMPTY_ALL
},
6003 { _T("01/02/99"), _T("/-"), 3 },
6004 { _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS
},
6007 for ( size_t n
= 0; n
< WXSIZEOF(tokenizerTestData
); n
++ )
6009 const StringTokenizerTest
& tt
= tokenizerTestData
[n
];
6010 wxStringTokenizer
tkz(tt
.str
, tt
.delims
, tt
.mode
);
6012 size_t count
= tkz
.CountTokens();
6013 wxPrintf(_T("String '%s' has %u tokens delimited by '%s' (mode = %s) "),
6014 MakePrintable(tt
.str
).c_str(),
6016 MakePrintable(tt
.delims
).c_str(),
6017 modeNames
[tkz
.GetMode()]);
6018 if ( count
== tt
.count
)
6024 wxPrintf(_T("(ERROR: should be %u)\n"), tt
.count
);
6029 // if we emulate strtok(), check that we do it correctly
6030 wxChar
*buf
, *s
= NULL
, *last
;
6032 if ( tkz
.GetMode() == wxTOKEN_STRTOK
)
6034 buf
= new wxChar
[wxStrlen(tt
.str
) + 1];
6035 wxStrcpy(buf
, tt
.str
);
6037 s
= wxStrtok(buf
, tt
.delims
, &last
);
6044 // now show the tokens themselves
6046 while ( tkz
.HasMoreTokens() )
6048 wxString token
= tkz
.GetNextToken();
6050 wxPrintf(_T("\ttoken %u: '%s'"),
6052 MakePrintable(token
).c_str());
6058 wxPuts(_T(" (ok)"));
6062 wxPrintf(_T(" (ERROR: should be %s)\n"), s
);
6065 s
= wxStrtok(NULL
, tt
.delims
, &last
);
6069 // nothing to compare with
6074 if ( count2
!= count
)
6076 wxPuts(_T("\tERROR: token count mismatch"));
6085 static void TestStringReplace()
6087 wxPuts(_T("*** Testing wxString::replace ***"));
6089 static const struct StringReplaceTestData
6091 const wxChar
*original
; // original test string
6092 size_t start
, len
; // the part to replace
6093 const wxChar
*replacement
; // the replacement string
6094 const wxChar
*result
; // and the expected result
6095 } stringReplaceTestData
[] =
6097 { _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") },
6098 { _T("increase"), 0, 2, _T("de"), _T("decrease") },
6099 { _T("wxWindow"), 8, 0, _T("s"), _T("wxWindows") },
6100 { _T("foobar"), 3, 0, _T("-"), _T("foo-bar") },
6101 { _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") },
6104 for ( size_t n
= 0; n
< WXSIZEOF(stringReplaceTestData
); n
++ )
6106 const StringReplaceTestData data
= stringReplaceTestData
[n
];
6108 wxString original
= data
.original
;
6109 original
.replace(data
.start
, data
.len
, data
.replacement
);
6111 wxPrintf(_T("wxString(\"%s\").replace(%u, %u, %s) = %s "),
6112 data
.original
, data
.start
, data
.len
, data
.replacement
,
6115 if ( original
== data
.result
)
6121 wxPrintf(_T("(ERROR: should be '%s')\n"), data
.result
);
6128 static void TestStringMatch()
6130 wxPuts(_T("*** Testing wxString::Matches() ***"));
6132 static const struct StringMatchTestData
6135 const wxChar
*wildcard
;
6137 } stringMatchTestData
[] =
6139 { _T("foobar"), _T("foo*"), 1 },
6140 { _T("foobar"), _T("*oo*"), 1 },
6141 { _T("foobar"), _T("*bar"), 1 },
6142 { _T("foobar"), _T("??????"), 1 },
6143 { _T("foobar"), _T("f??b*"), 1 },
6144 { _T("foobar"), _T("f?b*"), 0 },
6145 { _T("foobar"), _T("*goo*"), 0 },
6146 { _T("foobar"), _T("*foo"), 0 },
6147 { _T("foobarfoo"), _T("*foo"), 1 },
6148 { _T(""), _T("*"), 1 },
6149 { _T(""), _T("?"), 0 },
6152 for ( size_t n
= 0; n
< WXSIZEOF(stringMatchTestData
); n
++ )
6154 const StringMatchTestData
& data
= stringMatchTestData
[n
];
6155 bool matches
= wxString(data
.text
).Matches(data
.wildcard
);
6156 wxPrintf(_T("'%s' %s '%s' (%s)\n"),
6158 matches
? _T("matches") : _T("doesn't match"),
6160 matches
== data
.matches
? _T("ok") : _T("ERROR"));
6166 #endif // TEST_STRINGS
6168 // ----------------------------------------------------------------------------
6170 // ----------------------------------------------------------------------------
6172 #ifdef TEST_SNGLINST
6173 #include "wx/snglinst.h"
6174 #endif // TEST_SNGLINST
6176 int main(int argc
, char **argv
)
6178 wxApp::CheckBuildOptions(wxBuildOptions());
6180 wxInitializer initializer
;
6183 fprintf(stderr
, "Failed to initialize the wxWindows library, aborting.");
6188 #ifdef TEST_SNGLINST
6189 wxSingleInstanceChecker checker
;
6190 if ( checker
.Create(_T(".wxconsole.lock")) )
6192 if ( checker
.IsAnotherRunning() )
6194 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
6199 // wait some time to give time to launch another instance
6200 wxPrintf(_T("Press \"Enter\" to continue..."));
6203 else // failed to create
6205 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
6207 #endif // TEST_SNGLINST
6211 #endif // TEST_CHARSET
6214 TestCmdLineConvert();
6216 #if wxUSE_CMDLINE_PARSER
6217 static const wxCmdLineEntryDesc cmdLineDesc
[] =
6219 { wxCMD_LINE_SWITCH
, _T("h"), _T("help"), _T("show this help message"),
6220 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
6221 { wxCMD_LINE_SWITCH
, _T("v"), _T("verbose"), _T("be verbose") },
6222 { wxCMD_LINE_SWITCH
, _T("q"), _T("quiet"), _T("be quiet") },
6224 { wxCMD_LINE_OPTION
, _T("o"), _T("output"), _T("output file") },
6225 { wxCMD_LINE_OPTION
, _T("i"), _T("input"), _T("input dir") },
6226 { wxCMD_LINE_OPTION
, _T("s"), _T("size"), _T("output block size"),
6227 wxCMD_LINE_VAL_NUMBER
},
6228 { wxCMD_LINE_OPTION
, _T("d"), _T("date"), _T("output file date"),
6229 wxCMD_LINE_VAL_DATE
},
6231 { wxCMD_LINE_PARAM
, NULL
, NULL
, _T("input file"),
6232 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
6238 wxChar
**wargv
= new wxChar
*[argc
+ 1];
6241 for ( int n
= 0; n
< argc
; n
++ )
6243 wxMB2WXbuf warg
= wxConvertMB2WX(argv
[n
]);
6244 wargv
[n
] = wxStrdup(warg
);
6251 #endif // wxUSE_UNICODE
6253 wxCmdLineParser
parser(cmdLineDesc
, argc
, argv
);
6257 for ( int n
= 0; n
< argc
; n
++ )
6262 #endif // wxUSE_UNICODE
6264 parser
.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
6265 wxCMD_LINE_VAL_STRING
,
6266 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
6268 switch ( parser
.Parse() )
6271 wxLogMessage(_T("Help was given, terminating."));
6275 ShowCmdLine(parser
);
6279 wxLogMessage(_T("Syntax error detected, aborting."));
6282 #endif // wxUSE_CMDLINE_PARSER
6284 #endif // TEST_CMDLINE
6292 TestStringConstruction();
6295 TestStringTokenizer();
6296 TestStringReplace();
6302 #endif // TEST_STRINGS
6308 a1
.Add(_T("tiger"));
6310 a1
.Add(_T("lion"), 3);
6312 a1
.Add(_T("human"));
6315 wxPuts(_T("*** Initially:"));
6317 PrintArray(_T("a1"), a1
);
6319 wxArrayString
a2(a1
);
6320 PrintArray(_T("a2"), a2
);
6322 wxSortedArrayString
a3(a1
);
6323 PrintArray(_T("a3"), a3
);
6325 wxPuts(_T("*** After deleting three strings from a1"));
6328 PrintArray(_T("a1"), a1
);
6329 PrintArray(_T("a2"), a2
);
6330 PrintArray(_T("a3"), a3
);
6332 wxPuts(_T("*** After reassigning a1 to a2 and a3"));
6334 PrintArray(_T("a2"), a2
);
6335 PrintArray(_T("a3"), a3
);
6337 wxPuts(_T("*** After sorting a1"));
6339 PrintArray(_T("a1"), a1
);
6341 wxPuts(_T("*** After sorting a1 in reverse order"));
6343 PrintArray(_T("a1"), a1
);
6345 wxPuts(_T("*** After sorting a1 by the string length"));
6346 a1
.Sort(StringLenCompare
);
6347 PrintArray(_T("a1"), a1
);
6349 TestArrayOfObjects();
6350 TestArrayOfUShorts();
6354 #endif // TEST_ARRAYS
6365 #ifdef TEST_DLLLOADER
6367 #endif // TEST_DLLLOADER
6371 #endif // TEST_ENVIRON
6375 #endif // TEST_EXECUTE
6377 #ifdef TEST_FILECONF
6379 #endif // TEST_FILECONF
6387 #endif // TEST_LOCALE
6391 for ( size_t n
= 0; n
< 8000; n
++ )
6393 s
<< (wxChar
)(_T('A') + (n
% 26));
6397 msg
.Printf(_T("A very very long message: '%s', the end!\n"), s
.c_str());
6399 // this one shouldn't be truncated
6402 // but this one will because log functions use fixed size buffer
6403 // (note that it doesn't need '\n' at the end neither - will be added
6405 wxLogMessage(_T("A very very long message 2: '%s', the end!"), s
.c_str());
6417 #ifdef TEST_FILENAME
6421 fn
.Assign(_T("c:\\foo"), _T("bar.baz"));
6422 fn
.Assign(_T("/u/os9-port/Viewer/tvision/WEI2HZ-3B3-14_05-04-00MSC1.asc"));
6427 TestFileNameConstruction();
6430 TestFileNameConstruction();
6431 TestFileNameMakeRelative();
6432 TestFileNameSplit();
6435 TestFileNameComparison();
6436 TestFileNameOperations();
6438 #endif // TEST_FILENAME
6440 #ifdef TEST_FILETIME
6444 #endif // TEST_FILETIME
6447 wxLog::AddTraceMask(FTP_TRACE_MASK
);
6448 if ( TestFtpConnect() )
6459 if ( TEST_INTERACTIVE
)
6460 TestFtpInteractive();
6462 //else: connecting to the FTP server failed
6468 #ifdef TEST_LONGLONG
6469 // seed pseudo random generator
6470 srand((unsigned)time(NULL
));
6479 TestMultiplication();
6482 TestLongLongConversion();
6483 TestBitOperations();
6484 TestLongLongComparison();
6485 TestLongLongToString();
6486 TestLongLongPrintf();
6488 #endif // TEST_LONGLONG
6496 #endif // TEST_HASHMAP
6499 wxLog::AddTraceMask(_T("mime"));
6504 TestMimeAssociate();
6509 #ifdef TEST_INFO_FUNCTIONS
6515 if ( TEST_INTERACTIVE
)
6518 #endif // TEST_INFO_FUNCTIONS
6520 #ifdef TEST_PATHLIST
6522 #endif // TEST_PATHLIST
6530 #endif // TEST_PRINTF
6534 #endif // TEST_REGCONF
6537 // TODO: write a real test using src/regex/tests file
6542 TestRegExSubmatch();
6543 TestRegExReplacement();
6545 if ( TEST_INTERACTIVE
)
6546 TestRegExInteractive();
6548 #endif // TEST_REGEX
6550 #ifdef TEST_REGISTRY
6552 TestRegistryAssociation();
6553 #endif // TEST_REGISTRY
6558 #endif // TEST_SOCKETS
6566 #endif // TEST_STREAMS
6568 #ifdef TEST_TEXTSTREAM
6569 TestTextInputStream();
6570 #endif // TEST_TEXTSTREAM
6573 int nCPUs
= wxThread::GetCPUCount();
6574 wxPrintf(_T("This system has %d CPUs\n"), nCPUs
);
6576 wxThread::SetConcurrency(nCPUs
);
6578 TestDetachedThreads();
6581 TestJoinableThreads();
6582 TestThreadSuspend();
6584 TestThreadConditions();
6588 #endif // TEST_THREADS
6592 #endif // TEST_TIMER
6594 #ifdef TEST_DATETIME
6607 TestTimeArithmetics();
6610 TestTimeSpanFormat();
6618 if ( TEST_INTERACTIVE
)
6619 TestDateTimeInteractive();
6620 #endif // TEST_DATETIME
6623 wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
6625 #endif // TEST_USLEEP
6630 #endif // TEST_VCARD
6634 #endif // TEST_VOLUME
6637 TestUnicodeToFromAscii();
6638 #endif // TEST_UNICODE
6642 TestEncodingConverter();
6643 #endif // TEST_WCHAR
6646 TestZipStreamRead();
6647 TestZipFileSystem();
6651 TestZlibStreamWrite();
6652 TestZlibStreamRead();