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
87 // #define TEST_VCARD -- don't enable this (VZ)
94 static const bool TEST_ALL
= TRUE
;
98 static const bool TEST_ALL
= FALSE
;
101 // some tests are interactive, define this to run them
102 #ifdef TEST_INTERACTIVE
103 #undef TEST_INTERACTIVE
105 static const bool TEST_INTERACTIVE
= TRUE
;
107 static const bool TEST_INTERACTIVE
= FALSE
;
110 // ----------------------------------------------------------------------------
111 // test class for container objects
112 // ----------------------------------------------------------------------------
114 #if defined(TEST_ARRAYS) || defined(TEST_LIST)
116 class Bar
// Foo is already taken in the hash test
119 Bar(const wxString
& name
) : m_name(name
) { ms_bars
++; }
120 Bar(const Bar
& bar
) : m_name(bar
.m_name
) { ms_bars
++; }
121 ~Bar() { ms_bars
--; }
123 static size_t GetNumber() { return ms_bars
; }
125 const wxChar
*GetName() const { return m_name
; }
130 static size_t ms_bars
;
133 size_t Bar::ms_bars
= 0;
135 #endif // defined(TEST_ARRAYS) || defined(TEST_LIST)
137 // ============================================================================
139 // ============================================================================
141 // ----------------------------------------------------------------------------
143 // ----------------------------------------------------------------------------
145 #if defined(TEST_STRINGS) || defined(TEST_SOCKETS)
147 // replace TABs with \t and CRs with \n
148 static wxString
MakePrintable(const wxChar
*s
)
151 (void)str
.Replace(_T("\t"), _T("\\t"));
152 (void)str
.Replace(_T("\n"), _T("\\n"));
153 (void)str
.Replace(_T("\r"), _T("\\r"));
158 #endif // MakePrintable() is used
160 // ----------------------------------------------------------------------------
161 // wxFontMapper::CharsetToEncoding
162 // ----------------------------------------------------------------------------
166 #include "wx/fontmap.h"
168 static void TestCharset()
170 static const wxChar
*charsets
[] =
172 // some vali charsets
181 // and now some bogus ones
188 for ( size_t n
= 0; n
< WXSIZEOF(charsets
); n
++ )
190 wxFontEncoding enc
= wxFontMapper::Get()->CharsetToEncoding(charsets
[n
]);
191 wxPrintf(_T("Charset: %s\tEncoding: %s (%s)\n"),
193 wxFontMapper::Get()->GetEncodingName(enc
).c_str(),
194 wxFontMapper::Get()->GetEncodingDescription(enc
).c_str());
198 #endif // TEST_CHARSET
200 // ----------------------------------------------------------------------------
202 // ----------------------------------------------------------------------------
206 #include "wx/cmdline.h"
207 #include "wx/datetime.h"
210 #if wxUSE_CMDLINE_PARSER
212 static void ShowCmdLine(const wxCmdLineParser
& parser
)
214 wxString s
= _T("Input files: ");
216 size_t count
= parser
.GetParamCount();
217 for ( size_t param
= 0; param
< count
; param
++ )
219 s
<< parser
.GetParam(param
) << ' ';
223 << _T("Verbose:\t") << (parser
.Found(_T("v")) ? _T("yes") : _T("no")) << '\n'
224 << _T("Quiet:\t") << (parser
.Found(_T("q")) ? _T("yes") : _T("no")) << '\n';
229 if ( parser
.Found(_T("o"), &strVal
) )
230 s
<< _T("Output file:\t") << strVal
<< '\n';
231 if ( parser
.Found(_T("i"), &strVal
) )
232 s
<< _T("Input dir:\t") << strVal
<< '\n';
233 if ( parser
.Found(_T("s"), &lVal
) )
234 s
<< _T("Size:\t") << lVal
<< '\n';
235 if ( parser
.Found(_T("d"), &dt
) )
236 s
<< _T("Date:\t") << dt
.FormatISODate() << '\n';
237 if ( parser
.Found(_T("project_name"), &strVal
) )
238 s
<< _T("Project:\t") << strVal
<< '\n';
243 #endif // wxUSE_CMDLINE_PARSER
245 static void TestCmdLineConvert()
247 static const wxChar
*cmdlines
[] =
250 _T("-a \"-bstring 1\" -c\"string 2\" \"string 3\""),
251 _T("literal \\\" and \"\""),
254 for ( size_t n
= 0; n
< WXSIZEOF(cmdlines
); n
++ )
256 const wxChar
*cmdline
= cmdlines
[n
];
257 wxPrintf(_T("Parsing: %s\n"), cmdline
);
258 wxArrayString args
= wxCmdLineParser::ConvertStringToArgs(cmdline
);
260 size_t count
= args
.GetCount();
261 wxPrintf(_T("\targc = %u\n"), count
);
262 for ( size_t arg
= 0; arg
< count
; arg
++ )
264 wxPrintf(_T("\targv[%u] = %s\n"), arg
, args
[arg
].c_str());
269 #endif // TEST_CMDLINE
271 // ----------------------------------------------------------------------------
273 // ----------------------------------------------------------------------------
280 static const wxChar
*ROOTDIR
= _T("/");
281 static const wxChar
*TESTDIR
= _T("/usr");
282 #elif defined(__WXMSW__)
283 static const wxChar
*ROOTDIR
= _T("c:\\");
284 static const wxChar
*TESTDIR
= _T("d:\\");
286 #error "don't know where the root directory is"
289 static void TestDirEnumHelper(wxDir
& dir
,
290 int flags
= wxDIR_DEFAULT
,
291 const wxString
& filespec
= wxEmptyString
)
295 if ( !dir
.IsOpened() )
298 bool cont
= dir
.GetFirst(&filename
, filespec
, flags
);
301 wxPrintf(_T("\t%s\n"), filename
.c_str());
303 cont
= dir
.GetNext(&filename
);
309 static void TestDirEnum()
311 wxPuts(_T("*** Testing wxDir::GetFirst/GetNext ***"));
313 wxString cwd
= wxGetCwd();
314 if ( !wxDir::Exists(cwd
) )
316 wxPrintf(_T("ERROR: current directory '%s' doesn't exist?\n"), cwd
.c_str());
321 if ( !dir
.IsOpened() )
323 wxPrintf(_T("ERROR: failed to open current directory '%s'.\n"), cwd
.c_str());
327 wxPuts(_T("Enumerating everything in current directory:"));
328 TestDirEnumHelper(dir
);
330 wxPuts(_T("Enumerating really everything in current directory:"));
331 TestDirEnumHelper(dir
, wxDIR_DEFAULT
| wxDIR_DOTDOT
);
333 wxPuts(_T("Enumerating object files in current directory:"));
334 TestDirEnumHelper(dir
, wxDIR_DEFAULT
, "*.o*");
336 wxPuts(_T("Enumerating directories in current directory:"));
337 TestDirEnumHelper(dir
, wxDIR_DIRS
);
339 wxPuts(_T("Enumerating files in current directory:"));
340 TestDirEnumHelper(dir
, wxDIR_FILES
);
342 wxPuts(_T("Enumerating files including hidden in current directory:"));
343 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
347 wxPuts(_T("Enumerating everything in root directory:"));
348 TestDirEnumHelper(dir
, wxDIR_DEFAULT
);
350 wxPuts(_T("Enumerating directories in root directory:"));
351 TestDirEnumHelper(dir
, wxDIR_DIRS
);
353 wxPuts(_T("Enumerating files in root directory:"));
354 TestDirEnumHelper(dir
, wxDIR_FILES
);
356 wxPuts(_T("Enumerating files including hidden in root directory:"));
357 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
359 wxPuts(_T("Enumerating files in non existing directory:"));
360 wxDir
dirNo("nosuchdir");
361 TestDirEnumHelper(dirNo
);
364 class DirPrintTraverser
: public wxDirTraverser
367 virtual wxDirTraverseResult
OnFile(const wxString
& filename
)
369 return wxDIR_CONTINUE
;
372 virtual wxDirTraverseResult
OnDir(const wxString
& dirname
)
374 wxString path
, name
, ext
;
375 wxSplitPath(dirname
, &path
, &name
, &ext
);
378 name
<< _T('.') << ext
;
381 for ( const wxChar
*p
= path
.c_str(); *p
; p
++ )
383 if ( wxIsPathSeparator(*p
) )
387 wxPrintf(_T("%s%s\n"), indent
.c_str(), name
.c_str());
389 return wxDIR_CONTINUE
;
393 static void TestDirTraverse()
395 wxPuts(_T("*** Testing wxDir::Traverse() ***"));
399 size_t n
= wxDir::GetAllFiles(TESTDIR
, &files
);
400 wxPrintf(_T("There are %u files under '%s'\n"), n
, TESTDIR
);
403 wxPrintf(_T("First one is '%s'\n"), files
[0u].c_str());
404 wxPrintf(_T(" last one is '%s'\n"), files
[n
- 1].c_str());
407 // enum again with custom traverser
409 DirPrintTraverser traverser
;
410 dir
.Traverse(traverser
, _T(""), wxDIR_DIRS
| wxDIR_HIDDEN
);
413 static void TestDirExists()
415 wxPuts(_T("*** Testing wxDir::Exists() ***"));
417 static const wxChar
*dirnames
[] =
420 #if defined(__WXMSW__)
423 _T("\\\\share\\file"),
427 _T("c:\\autoexec.bat"),
428 #elif defined(__UNIX__)
437 for ( size_t n
= 0; n
< WXSIZEOF(dirnames
); n
++ )
439 wxPrintf(_T("%-40s: %s\n"),
441 wxDir::Exists(dirnames
[n
]) ? _T("exists")
442 : _T("doesn't exist"));
448 // ----------------------------------------------------------------------------
450 // ----------------------------------------------------------------------------
452 #ifdef TEST_DLLLOADER
454 #include "wx/dynlib.h"
456 static void TestDllLoad()
458 #if defined(__WXMSW__)
459 static const wxChar
*LIB_NAME
= _T("kernel32.dll");
460 static const wxChar
*FUNC_NAME
= _T("lstrlenA");
461 #elif defined(__UNIX__)
462 // weird: using just libc.so does *not* work!
463 static const wxChar
*LIB_NAME
= _T("/lib/libc-2.0.7.so");
464 static const wxChar
*FUNC_NAME
= _T("strlen");
466 #error "don't know how to test wxDllLoader on this platform"
469 wxPuts(_T("*** testing wxDllLoader ***\n"));
471 wxDynamicLibrary
lib(LIB_NAME
);
472 if ( !lib
.IsLoaded() )
474 wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME
);
478 typedef int (*wxStrlenType
)(const char *);
479 wxStrlenType pfnStrlen
= (wxStrlenType
)lib
.GetSymbol(FUNC_NAME
);
482 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
483 FUNC_NAME
, LIB_NAME
);
487 if ( pfnStrlen("foo") != 3 )
489 wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
493 wxPuts(_T("... ok"));
499 #endif // TEST_DLLLOADER
501 // ----------------------------------------------------------------------------
503 // ----------------------------------------------------------------------------
507 #include "wx/utils.h"
509 static wxString
MyGetEnv(const wxString
& var
)
512 if ( !wxGetEnv(var
, &val
) )
515 val
= wxString(_T('\'')) + val
+ _T('\'');
520 static void TestEnvironment()
522 const wxChar
*var
= _T("wxTestVar");
524 wxPuts(_T("*** testing environment access functions ***"));
526 wxPrintf(_T("Initially getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
527 wxSetEnv(var
, _T("value for wxTestVar"));
528 wxPrintf(_T("After wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
529 wxSetEnv(var
, _T("another value"));
530 wxPrintf(_T("After 2nd wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
532 wxPrintf(_T("After wxUnsetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
533 wxPrintf(_T("PATH = %s\n"), MyGetEnv(_T("PATH")).c_str());
536 #endif // TEST_ENVIRON
538 // ----------------------------------------------------------------------------
540 // ----------------------------------------------------------------------------
544 #include "wx/utils.h"
546 static void TestExecute()
548 wxPuts(_T("*** testing wxExecute ***"));
551 #define COMMAND "cat -n ../../Makefile" // "echo hi"
552 #define SHELL_COMMAND "echo hi from shell"
553 #define REDIRECT_COMMAND COMMAND // "date"
554 #elif defined(__WXMSW__)
555 #define COMMAND "command.com /c echo hi"
556 #define SHELL_COMMAND "echo hi"
557 #define REDIRECT_COMMAND COMMAND
559 #error "no command to exec"
562 wxPrintf(_T("Testing wxShell: "));
564 if ( wxShell(SHELL_COMMAND
) )
567 wxPuts(_T("ERROR."));
569 wxPrintf(_T("Testing wxExecute: "));
571 if ( wxExecute(COMMAND
, TRUE
/* sync */) == 0 )
574 wxPuts(_T("ERROR."));
576 #if 0 // no, it doesn't work (yet?)
577 wxPrintf(_T("Testing async wxExecute: "));
579 if ( wxExecute(COMMAND
) != 0 )
580 wxPuts(_T("Ok (command launched)."));
582 wxPuts(_T("ERROR."));
585 wxPrintf(_T("Testing wxExecute with redirection:\n"));
586 wxArrayString output
;
587 if ( wxExecute(REDIRECT_COMMAND
, output
) != 0 )
589 wxPuts(_T("ERROR."));
593 size_t count
= output
.GetCount();
594 for ( size_t n
= 0; n
< count
; n
++ )
596 wxPrintf(_T("\t%s\n"), output
[n
].c_str());
603 #endif // TEST_EXECUTE
605 // ----------------------------------------------------------------------------
607 // ----------------------------------------------------------------------------
612 #include "wx/ffile.h"
613 #include "wx/textfile.h"
615 static void TestFileRead()
617 wxPuts(_T("*** wxFile read test ***"));
619 wxFile
file(_T("testdata.fc"));
620 if ( file
.IsOpened() )
622 wxPrintf(_T("File length: %lu\n"), file
.Length());
624 wxPuts(_T("File dump:\n----------"));
626 static const off_t len
= 1024;
630 off_t nRead
= file
.Read(buf
, len
);
631 if ( nRead
== wxInvalidOffset
)
633 wxPrintf(_T("Failed to read the file."));
637 fwrite(buf
, nRead
, 1, stdout
);
643 wxPuts(_T("----------"));
647 wxPrintf(_T("ERROR: can't open test file.\n"));
653 static void TestTextFileRead()
655 wxPuts(_T("*** wxTextFile read test ***"));
657 wxTextFile
file(_T("testdata.fc"));
660 wxPrintf(_T("Number of lines: %u\n"), file
.GetLineCount());
661 wxPrintf(_T("Last line: '%s'\n"), file
.GetLastLine().c_str());
665 wxPuts(_T("\nDumping the entire file:"));
666 for ( s
= file
.GetFirstLine(); !file
.Eof(); s
= file
.GetNextLine() )
668 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
670 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
672 wxPuts(_T("\nAnd now backwards:"));
673 for ( s
= file
.GetLastLine();
674 file
.GetCurrentLine() != 0;
675 s
= file
.GetPrevLine() )
677 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
679 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
683 wxPrintf(_T("ERROR: can't open '%s'\n"), file
.GetName());
689 static void TestFileCopy()
691 wxPuts(_T("*** Testing wxCopyFile ***"));
693 static const wxChar
*filename1
= _T("testdata.fc");
694 static const wxChar
*filename2
= _T("test2");
695 if ( !wxCopyFile(filename1
, filename2
) )
697 wxPuts(_T("ERROR: failed to copy file"));
701 wxFFile
f1(filename1
, "rb"),
704 if ( !f1
.IsOpened() || !f2
.IsOpened() )
706 wxPuts(_T("ERROR: failed to open file(s)"));
711 if ( !f1
.ReadAll(&s1
) || !f2
.ReadAll(&s2
) )
713 wxPuts(_T("ERROR: failed to read file(s)"));
717 if ( (s1
.length() != s2
.length()) ||
718 (memcmp(s1
.c_str(), s2
.c_str(), s1
.length()) != 0) )
720 wxPuts(_T("ERROR: copy error!"));
724 wxPuts(_T("File was copied ok."));
730 if ( !wxRemoveFile(filename2
) )
732 wxPuts(_T("ERROR: failed to remove the file"));
740 // ----------------------------------------------------------------------------
742 // ----------------------------------------------------------------------------
746 #include "wx/confbase.h"
747 #include "wx/fileconf.h"
749 static const struct FileConfTestData
751 const wxChar
*name
; // value name
752 const wxChar
*value
; // the value from the file
755 { _T("value1"), _T("one") },
756 { _T("value2"), _T("two") },
757 { _T("novalue"), _T("default") },
760 static void TestFileConfRead()
762 wxPuts(_T("*** testing wxFileConfig loading/reading ***"));
764 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
765 _T("testdata.fc"), wxEmptyString
,
766 wxCONFIG_USE_RELATIVE_PATH
);
768 // test simple reading
769 wxPuts(_T("\nReading config file:"));
770 wxString
defValue(_T("default")), value
;
771 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
773 const FileConfTestData
& data
= fcTestData
[n
];
774 value
= fileconf
.Read(data
.name
, defValue
);
775 wxPrintf(_T("\t%s = %s "), data
.name
, value
.c_str());
776 if ( value
== data
.value
)
782 wxPrintf(_T("(ERROR: should be %s)\n"), data
.value
);
786 // test enumerating the entries
787 wxPuts(_T("\nEnumerating all root entries:"));
790 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
793 wxPrintf(_T("\t%s = %s\n"),
795 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
797 cont
= fileconf
.GetNextEntry(name
, dummy
);
801 #endif // TEST_FILECONF
803 // ----------------------------------------------------------------------------
805 // ----------------------------------------------------------------------------
809 #include "wx/filename.h"
811 static void DumpFileName(const wxFileName
& fn
)
813 wxString full
= fn
.GetFullPath();
815 wxString vol
, path
, name
, ext
;
816 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
818 wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
819 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
821 wxFileName::SplitPath(full
, &path
, &name
, &ext
);
822 wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
823 path
.c_str(), name
.c_str(), ext
.c_str());
825 wxPrintf(_T("path is also:\t'%s'\n"), fn
.GetPath().c_str());
826 wxPrintf(_T("with volume: \t'%s'\n"),
827 fn
.GetPath(wxPATH_GET_VOLUME
).c_str());
828 wxPrintf(_T("with separator:\t'%s'\n"),
829 fn
.GetPath(wxPATH_GET_SEPARATOR
).c_str());
830 wxPrintf(_T("with both: \t'%s'\n"),
831 fn
.GetPath(wxPATH_GET_SEPARATOR
| wxPATH_GET_VOLUME
).c_str());
833 wxPuts(_T("The directories in the path are:"));
834 wxArrayString dirs
= fn
.GetDirs();
835 size_t count
= dirs
.GetCount();
836 for ( size_t n
= 0; n
< count
; n
++ )
838 wxPrintf(_T("\t%u: %s\n"), n
, dirs
[n
].c_str());
842 static struct FileNameInfo
844 const wxChar
*fullname
;
845 const wxChar
*volume
;
854 { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), TRUE
, wxPATH_UNIX
},
855 { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), TRUE
, wxPATH_UNIX
},
856 { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), TRUE
, wxPATH_UNIX
},
857 { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), FALSE
, wxPATH_UNIX
},
858 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_UNIX
},
859 { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), TRUE
, wxPATH_UNIX
},
860 { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), TRUE
, wxPATH_UNIX
},
861 { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), FALSE
, wxPATH_UNIX
},
862 { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), TRUE
, wxPATH_UNIX
},
864 // Windows file names
865 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
866 { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
867 { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
868 { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
869 { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), TRUE
, wxPATH_DOS
},
870 { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
871 { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
873 // wxFileName support for Mac file names is broken currently
876 { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE
, wxPATH_MAC
},
877 { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), TRUE
, wxPATH_MAC
},
878 { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), TRUE
, wxPATH_MAC
},
879 { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), FALSE
, wxPATH_MAC
},
880 { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE
, wxPATH_MAC
},
881 { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE
, wxPATH_MAC
},
885 { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), TRUE
, wxPATH_VMS
},
886 { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), FALSE
, wxPATH_VMS
},
889 static void TestFileNameConstruction()
891 wxPuts(_T("*** testing wxFileName construction ***"));
893 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
895 const FileNameInfo
& fni
= filenames
[n
];
897 wxFileName
fn(fni
.fullname
, fni
.format
);
899 wxString fullname
= fn
.GetFullPath(fni
.format
);
900 if ( fullname
!= fni
.fullname
)
902 wxPrintf(_T("ERROR: fullname should be '%s'\n"), fni
.fullname
);
905 bool isAbsolute
= fn
.IsAbsolute(fni
.format
);
906 wxPrintf(_T("'%s' is %s (%s)\n\t"),
908 isAbsolute
? "absolute" : "relative",
909 isAbsolute
== fni
.isAbsolute
? "ok" : "ERROR");
911 if ( !fn
.Normalize(wxPATH_NORM_ALL
, _T(""), fni
.format
) )
913 wxPuts(_T("ERROR (couldn't be normalized)"));
917 wxPrintf(_T("normalized: '%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
924 static void TestFileNameSplit()
926 wxPuts(_T("*** testing wxFileName splitting ***"));
928 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
930 const FileNameInfo
& fni
= filenames
[n
];
931 wxString volume
, path
, name
, ext
;
932 wxFileName::SplitPath(fni
.fullname
,
933 &volume
, &path
, &name
, &ext
, fni
.format
);
935 wxPrintf(_T("%s -> volume = '%s', path = '%s', name = '%s', ext = '%s'"),
937 volume
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
939 if ( volume
!= fni
.volume
)
940 wxPrintf(_T(" (ERROR: volume = '%s')"), fni
.volume
);
941 if ( path
!= fni
.path
)
942 wxPrintf(_T(" (ERROR: path = '%s')"), fni
.path
);
943 if ( name
!= fni
.name
)
944 wxPrintf(_T(" (ERROR: name = '%s')"), fni
.name
);
945 if ( ext
!= fni
.ext
)
946 wxPrintf(_T(" (ERROR: ext = '%s')"), fni
.ext
);
952 static void TestFileNameTemp()
954 wxPuts(_T("*** testing wxFileName temp file creation ***"));
956 static const wxChar
*tmpprefixes
[] =
964 _T("/tmp/foo/bar"), // this one must be an error
968 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
970 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
973 // "error" is not in upper case because it may be ok
974 wxPrintf(_T("Prefix '%s'\t-> error\n"), tmpprefixes
[n
]);
978 wxPrintf(_T("Prefix '%s'\t-> temp file '%s'\n"),
979 tmpprefixes
[n
], path
.c_str());
981 if ( !wxRemoveFile(path
) )
983 wxLogWarning(_T("Failed to remove temp file '%s'"),
990 static void TestFileNameMakeRelative()
992 wxPuts(_T("*** testing wxFileName::MakeRelativeTo() ***"));
994 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
996 const FileNameInfo
& fni
= filenames
[n
];
998 wxFileName
fn(fni
.fullname
, fni
.format
);
1000 // choose the base dir of the same format
1002 switch ( fni
.format
)
1014 // TODO: I don't know how this is supposed to work there
1017 case wxPATH_NATIVE
: // make gcc happy
1019 wxFAIL_MSG( "unexpected path format" );
1022 wxPrintf(_T("'%s' relative to '%s': "),
1023 fn
.GetFullPath(fni
.format
).c_str(), base
.c_str());
1025 if ( !fn
.MakeRelativeTo(base
, fni
.format
) )
1027 wxPuts(_T("unchanged"));
1031 wxPrintf(_T("'%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
1036 static void TestFileNameComparison()
1041 static void TestFileNameOperations()
1046 static void TestFileNameCwd()
1051 #endif // TEST_FILENAME
1053 // ----------------------------------------------------------------------------
1054 // wxFileName time functions
1055 // ----------------------------------------------------------------------------
1057 #ifdef TEST_FILETIME
1059 #include <wx/filename.h>
1060 #include <wx/datetime.h>
1062 static void TestFileGetTimes()
1064 wxFileName
fn(_T("testdata.fc"));
1066 wxDateTime dtAccess
, dtMod
, dtCreate
;
1067 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtCreate
) )
1069 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
1073 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
1075 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
1076 wxPrintf(_T("Creation: \t%s\n"), dtCreate
.Format(fmt
).c_str());
1077 wxPrintf(_T("Last read: \t%s\n"), dtAccess
.Format(fmt
).c_str());
1078 wxPrintf(_T("Last write: \t%s\n"), dtMod
.Format(fmt
).c_str());
1082 static void TestFileSetTimes()
1084 wxFileName
fn(_T("testdata.fc"));
1088 wxPrintf(_T("ERROR: Touch() failed.\n"));
1092 #endif // TEST_FILETIME
1094 // ----------------------------------------------------------------------------
1096 // ----------------------------------------------------------------------------
1100 #include "wx/hash.h"
1104 Foo(int n_
) { n
= n_
; count
++; }
1109 static size_t count
;
1112 size_t Foo::count
= 0;
1114 WX_DECLARE_LIST(Foo
, wxListFoos
);
1115 WX_DECLARE_HASH(Foo
, wxListFoos
, wxHashFoos
);
1117 #include "wx/listimpl.cpp"
1119 WX_DEFINE_LIST(wxListFoos
);
1121 static void TestHash()
1123 wxPuts(_T("*** Testing wxHashTable ***\n"));
1127 hash
.DeleteContents(TRUE
);
1129 wxPrintf(_T("Hash created: %u foos in hash, %u foos totally\n"),
1130 hash
.GetCount(), Foo::count
);
1132 static const int hashTestData
[] =
1134 0, 1, 17, -2, 2, 4, -4, 345, 3, 3, 2, 1,
1138 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1140 hash
.Put(hashTestData
[n
], n
, new Foo(n
));
1143 wxPrintf(_T("Hash filled: %u foos in hash, %u foos totally\n"),
1144 hash
.GetCount(), Foo::count
);
1146 wxPuts(_T("Hash access test:"));
1147 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1149 wxPrintf(_T("\tGetting element with key %d, value %d: "),
1150 hashTestData
[n
], n
);
1151 Foo
*foo
= hash
.Get(hashTestData
[n
], n
);
1154 wxPrintf(_T("ERROR, not found.\n"));
1158 wxPrintf(_T("%d (%s)\n"), foo
->n
,
1159 (size_t)foo
->n
== n
? "ok" : "ERROR");
1163 wxPrintf(_T("\nTrying to get an element not in hash: "));
1165 if ( hash
.Get(1234) || hash
.Get(1, 0) )
1167 wxPuts(_T("ERROR: found!"));
1171 wxPuts(_T("ok (not found)"));
1175 wxPrintf(_T("Hash destroyed: %u foos left\n"), Foo::count
);
1180 // ----------------------------------------------------------------------------
1182 // ----------------------------------------------------------------------------
1186 #include "wx/hashmap.h"
1188 // test compilation of basic map types
1189 WX_DECLARE_HASH_MAP( int*, int*, wxPointerHash
, wxPointerEqual
, myPtrHashMap
);
1190 WX_DECLARE_HASH_MAP( long, long, wxIntegerHash
, wxIntegerEqual
, myLongHashMap
);
1191 WX_DECLARE_HASH_MAP( unsigned long, unsigned, wxIntegerHash
, wxIntegerEqual
,
1192 myUnsignedHashMap
);
1193 WX_DECLARE_HASH_MAP( unsigned int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1195 WX_DECLARE_HASH_MAP( int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1197 WX_DECLARE_HASH_MAP( short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1199 WX_DECLARE_HASH_MAP( unsigned short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1203 // WX_DECLARE_HASH_MAP( wxString, wxString, wxStringHash, wxStringEqual,
1204 // myStringHashMap );
1205 WX_DECLARE_STRING_HASH_MAP(wxString
, myStringHashMap
);
1207 typedef myStringHashMap::iterator Itor
;
1209 static void TestHashMap()
1211 wxPuts(_T("*** Testing wxHashMap ***\n"));
1212 myStringHashMap
sh(0); // as small as possible
1215 const size_t count
= 10000;
1217 // init with some data
1218 for( i
= 0; i
< count
; ++i
)
1220 buf
.Printf(wxT("%d"), i
);
1221 sh
[buf
] = wxT("A") + buf
+ wxT("C");
1224 // test that insertion worked
1225 if( sh
.size() != count
)
1227 wxPrintf(_T("*** ERROR: %u ELEMENTS, SHOULD BE %u ***\n"), sh
.size(), count
);
1230 for( i
= 0; i
< count
; ++i
)
1232 buf
.Printf(wxT("%d"), i
);
1233 if( sh
[buf
] != wxT("A") + buf
+ wxT("C") )
1235 wxPrintf(_T("*** ERROR INSERTION BROKEN! STOPPING NOW! ***\n"));
1240 // check that iterators work
1242 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1246 wxPrintf(_T("*** ERROR ITERATORS DO NOT TERMINATE! STOPPING NOW! ***\n"));
1250 if( it
->second
!= sh
[it
->first
] )
1252 wxPrintf(_T("*** ERROR ITERATORS BROKEN! STOPPING NOW! ***\n"));
1257 if( sh
.size() != i
)
1259 wxPrintf(_T("*** ERROR: %u ELEMENTS ITERATED, SHOULD BE %u ***\n"), i
, count
);
1262 // test copy ctor, assignment operator
1263 myStringHashMap
h1( sh
), h2( 0 );
1266 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1268 if( h1
[it
->first
] != it
->second
)
1270 wxPrintf(_T("*** ERROR: COPY CTOR BROKEN %s ***\n"), it
->first
.c_str());
1273 if( h2
[it
->first
] != it
->second
)
1275 wxPrintf(_T("*** ERROR: OPERATOR= BROKEN %s ***\n"), it
->first
.c_str());
1280 for( i
= 0; i
< count
; ++i
)
1282 buf
.Printf(wxT("%d"), i
);
1283 size_t sz
= sh
.size();
1285 // test find() and erase(it)
1288 it
= sh
.find( buf
);
1289 if( it
!= sh
.end() )
1293 if( sh
.find( buf
) != sh
.end() )
1295 wxPrintf(_T("*** ERROR: FOUND DELETED ELEMENT %u ***\n"), i
);
1299 wxPrintf(_T("*** ERROR: CANT FIND ELEMENT %u ***\n"), i
);
1304 size_t c
= sh
.erase( buf
);
1306 wxPrintf(_T("*** ERROR: SHOULD RETURN 1 ***\n"));
1308 if( sh
.find( buf
) != sh
.end() )
1310 wxPrintf(_T("*** ERROR: FOUND DELETED ELEMENT %u ***\n"), i
);
1314 // count should decrease
1315 if( sh
.size() != sz
- 1 )
1317 wxPrintf(_T("*** ERROR: COUNT DID NOT DECREASE ***\n"));
1321 wxPrintf(_T("*** Finished testing wxHashMap ***\n"));
1324 #endif // TEST_HASHMAP
1326 // ----------------------------------------------------------------------------
1328 // ----------------------------------------------------------------------------
1332 #include "wx/list.h"
1334 WX_DECLARE_LIST(Bar
, wxListBars
);
1335 #include "wx/listimpl.cpp"
1336 WX_DEFINE_LIST(wxListBars
);
1338 static void TestListCtor()
1340 wxPuts(_T("*** Testing wxList construction ***\n"));
1344 list1
.Append(new Bar(_T("first")));
1345 list1
.Append(new Bar(_T("second")));
1347 wxPrintf(_T("After 1st list creation: %u objects in the list, %u objects total.\n"),
1348 list1
.GetCount(), Bar::GetNumber());
1353 wxPrintf(_T("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n"),
1354 list1
.GetCount(), list2
.GetCount(), Bar::GetNumber());
1356 list1
.DeleteContents(TRUE
);
1359 wxPrintf(_T("After list destruction: %u objects left.\n"), Bar::GetNumber());
1364 // ----------------------------------------------------------------------------
1366 // ----------------------------------------------------------------------------
1370 #include "wx/intl.h"
1371 #include "wx/utils.h" // for wxSetEnv
1373 static wxLocale
gs_localeDefault(wxLANGUAGE_ENGLISH
);
1375 // find the name of the language from its value
1376 static const wxChar
*GetLangName(int lang
)
1378 static const wxChar
*languageNames
[] =
1388 _T("ARABIC_ALGERIA"),
1389 _T("ARABIC_BAHRAIN"),
1392 _T("ARABIC_JORDAN"),
1393 _T("ARABIC_KUWAIT"),
1394 _T("ARABIC_LEBANON"),
1396 _T("ARABIC_MOROCCO"),
1399 _T("ARABIC_SAUDI_ARABIA"),
1402 _T("ARABIC_TUNISIA"),
1409 _T("AZERI_CYRILLIC"),
1424 _T("CHINESE_SIMPLIFIED"),
1425 _T("CHINESE_TRADITIONAL"),
1426 _T("CHINESE_HONGKONG"),
1427 _T("CHINESE_MACAU"),
1428 _T("CHINESE_SINGAPORE"),
1429 _T("CHINESE_TAIWAN"),
1435 _T("DUTCH_BELGIAN"),
1439 _T("ENGLISH_AUSTRALIA"),
1440 _T("ENGLISH_BELIZE"),
1441 _T("ENGLISH_BOTSWANA"),
1442 _T("ENGLISH_CANADA"),
1443 _T("ENGLISH_CARIBBEAN"),
1444 _T("ENGLISH_DENMARK"),
1446 _T("ENGLISH_JAMAICA"),
1447 _T("ENGLISH_NEW_ZEALAND"),
1448 _T("ENGLISH_PHILIPPINES"),
1449 _T("ENGLISH_SOUTH_AFRICA"),
1450 _T("ENGLISH_TRINIDAD"),
1451 _T("ENGLISH_ZIMBABWE"),
1459 _T("FRENCH_BELGIAN"),
1460 _T("FRENCH_CANADIAN"),
1461 _T("FRENCH_LUXEMBOURG"),
1462 _T("FRENCH_MONACO"),
1468 _T("GERMAN_AUSTRIAN"),
1469 _T("GERMAN_BELGIUM"),
1470 _T("GERMAN_LIECHTENSTEIN"),
1471 _T("GERMAN_LUXEMBOURG"),
1489 _T("ITALIAN_SWISS"),
1494 _T("KASHMIRI_INDIA"),
1512 _T("MALAY_BRUNEI_DARUSSALAM"),
1513 _T("MALAY_MALAYSIA"),
1523 _T("NORWEGIAN_BOKMAL"),
1524 _T("NORWEGIAN_NYNORSK"),
1531 _T("PORTUGUESE_BRAZILIAN"),
1534 _T("RHAETO_ROMANCE"),
1537 _T("RUSSIAN_UKRAINE"),
1543 _T("SERBIAN_CYRILLIC"),
1544 _T("SERBIAN_LATIN"),
1545 _T("SERBO_CROATIAN"),
1556 _T("SPANISH_ARGENTINA"),
1557 _T("SPANISH_BOLIVIA"),
1558 _T("SPANISH_CHILE"),
1559 _T("SPANISH_COLOMBIA"),
1560 _T("SPANISH_COSTA_RICA"),
1561 _T("SPANISH_DOMINICAN_REPUBLIC"),
1562 _T("SPANISH_ECUADOR"),
1563 _T("SPANISH_EL_SALVADOR"),
1564 _T("SPANISH_GUATEMALA"),
1565 _T("SPANISH_HONDURAS"),
1566 _T("SPANISH_MEXICAN"),
1567 _T("SPANISH_MODERN"),
1568 _T("SPANISH_NICARAGUA"),
1569 _T("SPANISH_PANAMA"),
1570 _T("SPANISH_PARAGUAY"),
1572 _T("SPANISH_PUERTO_RICO"),
1573 _T("SPANISH_URUGUAY"),
1575 _T("SPANISH_VENEZUELA"),
1579 _T("SWEDISH_FINLAND"),
1597 _T("URDU_PAKISTAN"),
1599 _T("UZBEK_CYRILLIC"),
1612 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1613 return languageNames
[lang
];
1615 return _T("INVALID");
1618 static void TestDefaultLang()
1620 wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
1622 static const wxChar
*langStrings
[] =
1624 NULL
, // system default
1631 _T("de_DE.iso88591"),
1633 _T("?"), // invalid lang spec
1634 _T("klingonese"), // I bet on some systems it does exist...
1637 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1638 wxLocale::GetSystemEncodingName().c_str(),
1639 wxLocale::GetSystemEncoding());
1641 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1643 const wxChar
*langStr
= langStrings
[n
];
1646 // FIXME: this doesn't do anything at all under Windows, we need
1647 // to create a new wxLocale!
1648 wxSetEnv(_T("LC_ALL"), langStr
);
1651 int lang
= gs_localeDefault
.GetSystemLanguage();
1652 wxPrintf(_T("Locale for '%s' is %s.\n"),
1653 langStr
? langStr
: _T("system default"), GetLangName(lang
));
1657 #endif // TEST_LOCALE
1659 // ----------------------------------------------------------------------------
1661 // ----------------------------------------------------------------------------
1665 #include "wx/mimetype.h"
1667 static void TestMimeEnum()
1669 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1671 wxArrayString mimetypes
;
1673 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1675 wxPrintf(_T("*** All %u known filetypes: ***\n"), count
);
1680 for ( size_t n
= 0; n
< count
; n
++ )
1682 wxFileType
*filetype
=
1683 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1686 wxPrintf(_T("nothing known about the filetype '%s'!\n"),
1687 mimetypes
[n
].c_str());
1691 filetype
->GetDescription(&desc
);
1692 filetype
->GetExtensions(exts
);
1694 filetype
->GetIcon(NULL
);
1697 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1700 extsAll
<< _T(", ");
1704 wxPrintf(_T("\t%s: %s (%s)\n"),
1705 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
1711 static void TestMimeOverride()
1713 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
1715 static const wxChar
*mailcap
= _T("/tmp/mailcap");
1716 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
1718 if ( wxFile::Exists(mailcap
) )
1719 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
1721 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
1723 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
1726 if ( wxFile::Exists(mimetypes
) )
1727 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
1729 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
1731 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
1737 static void TestMimeFilename()
1739 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
1741 static const wxChar
*filenames
[] =
1749 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1751 const wxString fname
= filenames
[n
];
1752 wxString ext
= fname
.AfterLast(_T('.'));
1753 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
1756 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
1761 if ( !ft
->GetDescription(&desc
) )
1762 desc
= _T("<no description>");
1765 if ( !ft
->GetOpenCommand(&cmd
,
1766 wxFileType::MessageParameters(fname
, _T(""))) )
1767 cmd
= _T("<no command available>");
1769 cmd
= wxString('"') + cmd
+ '"';
1771 wxPrintf(_T("To open %s (%s) do %s.\n"),
1772 fname
.c_str(), desc
.c_str(), cmd
.c_str());
1781 static void TestMimeAssociate()
1783 wxPuts(_T("*** Testing creation of filetype association ***\n"));
1785 wxFileTypeInfo
ftInfo(
1786 _T("application/x-xyz"),
1787 _T("xyzview '%s'"), // open cmd
1788 _T(""), // print cmd
1789 _T("XYZ File"), // description
1790 _T(".xyz"), // extensions
1791 NULL
// end of extensions
1793 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
1795 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
1798 wxPuts(_T("ERROR: failed to create association!"));
1802 // TODO: read it back
1811 // ----------------------------------------------------------------------------
1812 // misc information functions
1813 // ----------------------------------------------------------------------------
1815 #ifdef TEST_INFO_FUNCTIONS
1817 #include "wx/utils.h"
1819 static void TestDiskInfo()
1821 wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
1825 wxChar pathname
[128];
1826 wxPrintf(_T("\nEnter a directory name: "));
1827 if ( !wxFgets(pathname
, WXSIZEOF(pathname
), stdin
) )
1830 // kill the last '\n'
1831 pathname
[wxStrlen(pathname
) - 1] = 0;
1833 wxLongLong total
, free
;
1834 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
1836 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
1840 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
1841 (total
/ 1024).ToString().c_str(),
1842 (free
/ 1024).ToString().c_str(),
1848 static void TestOsInfo()
1850 wxPuts(_T("*** Testing OS info functions ***\n"));
1853 wxGetOsVersion(&major
, &minor
);
1854 wxPrintf(_T("Running under: %s, version %d.%d\n"),
1855 wxGetOsDescription().c_str(), major
, minor
);
1857 wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory());
1859 wxPrintf(_T("Host name is %s (%s).\n"),
1860 wxGetHostName().c_str(), wxGetFullHostName().c_str());
1865 static void TestUserInfo()
1867 wxPuts(_T("*** Testing user info functions ***\n"));
1869 wxPrintf(_T("User id is:\t%s\n"), wxGetUserId().c_str());
1870 wxPrintf(_T("User name is:\t%s\n"), wxGetUserName().c_str());
1871 wxPrintf(_T("Home dir is:\t%s\n"), wxGetHomeDir().c_str());
1872 wxPrintf(_T("Email address:\t%s\n"), wxGetEmailAddress().c_str());
1877 #endif // TEST_INFO_FUNCTIONS
1879 // ----------------------------------------------------------------------------
1881 // ----------------------------------------------------------------------------
1883 #ifdef TEST_LONGLONG
1885 #include "wx/longlong.h"
1886 #include "wx/timer.h"
1888 // make a 64 bit number from 4 16 bit ones
1889 #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3)
1891 // get a random 64 bit number
1892 #define RAND_LL() MAKE_LL(rand(), rand(), rand(), rand())
1894 static const long testLongs
[] =
1905 #if wxUSE_LONGLONG_WX
1906 inline bool operator==(const wxLongLongWx
& a
, const wxLongLongNative
& b
)
1907 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1908 inline bool operator==(const wxLongLongNative
& a
, const wxLongLongWx
& b
)
1909 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1910 #endif // wxUSE_LONGLONG_WX
1912 static void TestSpeed()
1914 static const long max
= 100000000;
1921 for ( n
= 0; n
< max
; n
++ )
1926 wxPrintf(_T("Summing longs took %ld milliseconds.\n"), sw
.Time());
1929 #if wxUSE_LONGLONG_NATIVE
1934 for ( n
= 0; n
< max
; n
++ )
1939 wxPrintf(_T("Summing wxLongLong_t took %ld milliseconds.\n"), sw
.Time());
1941 #endif // wxUSE_LONGLONG_NATIVE
1947 for ( n
= 0; n
< max
; n
++ )
1952 wxPrintf(_T("Summing wxLongLongs took %ld milliseconds.\n"), sw
.Time());
1956 static void TestLongLongConversion()
1958 wxPuts(_T("*** Testing wxLongLong conversions ***\n"));
1962 for ( size_t n
= 0; n
< 100000; n
++ )
1966 #if wxUSE_LONGLONG_NATIVE
1967 wxLongLongNative
b(a
.GetHi(), a
.GetLo());
1969 wxASSERT_MSG( a
== b
, "conversions failure" );
1971 wxPuts(_T("Can't do it without native long long type, test skipped."));
1974 #endif // wxUSE_LONGLONG_NATIVE
1976 if ( !(nTested
% 1000) )
1985 wxPuts(_T(" done!"));
1988 static void TestMultiplication()
1990 wxPuts(_T("*** Testing wxLongLong multiplication ***\n"));
1994 for ( size_t n
= 0; n
< 100000; n
++ )
1999 #if wxUSE_LONGLONG_NATIVE
2000 wxLongLongNative
aa(a
.GetHi(), a
.GetLo());
2001 wxLongLongNative
bb(b
.GetHi(), b
.GetLo());
2003 wxASSERT_MSG( a
*b
== aa
*bb
, "multiplication failure" );
2004 #else // !wxUSE_LONGLONG_NATIVE
2005 wxPuts(_T("Can't do it without native long long type, test skipped."));
2008 #endif // wxUSE_LONGLONG_NATIVE
2010 if ( !(nTested
% 1000) )
2019 wxPuts(_T(" done!"));
2022 static void TestDivision()
2024 wxPuts(_T("*** Testing wxLongLong division ***\n"));
2028 for ( size_t n
= 0; n
< 100000; n
++ )
2030 // get a random wxLongLong (shifting by 12 the MSB ensures that the
2031 // multiplication will not overflow)
2032 wxLongLong ll
= MAKE_LL((rand() >> 12), rand(), rand(), rand());
2034 // get a random (but non null) long (not wxLongLong for now) to divide
2046 #if wxUSE_LONGLONG_NATIVE
2047 wxLongLongNative
m(ll
.GetHi(), ll
.GetLo());
2049 wxLongLongNative p
= m
/ l
, s
= m
% l
;
2050 wxASSERT_MSG( q
== p
&& r
== s
, "division failure" );
2051 #else // !wxUSE_LONGLONG_NATIVE
2052 // verify the result
2053 wxASSERT_MSG( ll
== q
*l
+ r
, "division failure" );
2054 #endif // wxUSE_LONGLONG_NATIVE
2056 if ( !(nTested
% 1000) )
2065 wxPuts(_T(" done!"));
2068 static void TestAddition()
2070 wxPuts(_T("*** Testing wxLongLong addition ***\n"));
2074 for ( size_t n
= 0; n
< 100000; n
++ )
2080 #if wxUSE_LONGLONG_NATIVE
2081 wxASSERT_MSG( c
== wxLongLongNative(a
.GetHi(), a
.GetLo()) +
2082 wxLongLongNative(b
.GetHi(), b
.GetLo()),
2083 "addition failure" );
2084 #else // !wxUSE_LONGLONG_NATIVE
2085 wxASSERT_MSG( c
- b
== a
, "addition failure" );
2086 #endif // wxUSE_LONGLONG_NATIVE
2088 if ( !(nTested
% 1000) )
2097 wxPuts(_T(" done!"));
2100 static void TestBitOperations()
2102 wxPuts(_T("*** Testing wxLongLong bit operation ***\n"));
2106 for ( size_t n
= 0; n
< 100000; n
++ )
2110 #if wxUSE_LONGLONG_NATIVE
2111 for ( size_t n
= 0; n
< 33; n
++ )
2114 #else // !wxUSE_LONGLONG_NATIVE
2115 wxPuts(_T("Can't do it without native long long type, test skipped."));
2118 #endif // wxUSE_LONGLONG_NATIVE
2120 if ( !(nTested
% 1000) )
2129 wxPuts(_T(" done!"));
2132 static void TestLongLongComparison()
2134 #if wxUSE_LONGLONG_WX
2135 wxPuts(_T("*** Testing wxLongLong comparison ***\n"));
2137 static const long ls
[2] =
2143 wxLongLongWx lls
[2];
2147 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2151 for ( size_t m
= 0; m
< WXSIZEOF(lls
); m
++ )
2153 res
= lls
[m
] > testLongs
[n
];
2154 wxPrintf(_T("0x%lx > 0x%lx is %s (%s)\n"),
2155 ls
[m
], testLongs
[n
], res
? "true" : "false",
2156 res
== (ls
[m
] > testLongs
[n
]) ? "ok" : "ERROR");
2158 res
= lls
[m
] < testLongs
[n
];
2159 wxPrintf(_T("0x%lx < 0x%lx is %s (%s)\n"),
2160 ls
[m
], testLongs
[n
], res
? "true" : "false",
2161 res
== (ls
[m
] < testLongs
[n
]) ? "ok" : "ERROR");
2163 res
= lls
[m
] == testLongs
[n
];
2164 wxPrintf(_T("0x%lx == 0x%lx is %s (%s)\n"),
2165 ls
[m
], testLongs
[n
], res
? "true" : "false",
2166 res
== (ls
[m
] == testLongs
[n
]) ? "ok" : "ERROR");
2169 #endif // wxUSE_LONGLONG_WX
2172 static void TestLongLongPrint()
2174 wxPuts(_T("*** Testing wxLongLong printing ***\n"));
2176 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2178 wxLongLong ll
= testLongs
[n
];
2179 wxPrintf(_T("%ld == %s\n"), testLongs
[n
], ll
.ToString().c_str());
2182 wxLongLong
ll(0x12345678, 0x87654321);
2183 wxPrintf(_T("0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2186 wxPrintf(_T("-0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2189 static void TestLongLongPrintf()
2191 wxPuts(_T("*** Testing wxLongLong printing ***\n"));
2193 #ifdef wxLongLongFmtSpec
2194 wxLongLong ll
= wxLL(0x1234567890abcdef);
2195 wxString s
= wxString::Format(_T("%") wxLongLongFmtSpec
_T("x"),
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("%07Lo"), (wxLongLong_t
)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 textInUtf8_
[] =
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 #define textInUtf8 ((const char *)textInUtf8_)
3889 static void TestUtf8()
3891 wxPuts(_T("*** Testing UTF8 support ***\n"));
3895 if ( wxConvUTF8
.MB2WC(wbuf
, textInUtf8
, WXSIZEOF(textInUtf8
)) <= 0 )
3897 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3901 wxCSConv
conv(_T("koi8-r"));
3902 if ( conv
.WC2MB(buf
, wbuf
, 0 /* not needed wcslen(wbuf) */) <= 0 )
3904 wxPuts(_T("ERROR: conversion to KOI8-R failed."));
3908 wxPrintf(_T("The resulting string (in KOI8-R): %s\n"), buf
);
3912 if ( wxConvUTF8
.WC2MB(buf
, L
"Ã la", WXSIZEOF(buf
)) <= 0 )
3914 wxPuts(_T("ERROR: conversion to UTF-8 failed."));
3918 wxPrintf(_T("The string in UTF-8: %s\n"), buf
);
3924 static void TestEncodingConverter()
3926 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
3928 // using wxEncodingConverter should give the same result as above
3931 if ( wxConvUTF8
.MB2WC(wbuf
, textInUtf8
, WXSIZEOF(textInUtf8
)) <= 0 )
3933 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3937 wxEncodingConverter ec
;
3938 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
3939 ec
.Convert(wbuf
, buf
);
3940 wxPrintf(_T("The same string obtained using wxEC: %s\n"), buf
);
3946 #endif // TEST_WCHAR
3948 // ----------------------------------------------------------------------------
3950 // ----------------------------------------------------------------------------
3954 #include "wx/filesys.h"
3955 #include "wx/fs_zip.h"
3956 #include "wx/zipstrm.h"
3958 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
3960 static void TestZipStreamRead()
3962 wxPuts(_T("*** Testing ZIP reading ***\n"));
3964 static const wxChar
*filename
= _T("foo");
3965 wxZipInputStream
istr(TESTFILE_ZIP
, filename
);
3966 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
3968 wxPrintf(_T("Dumping the file '%s':\n"), filename
);
3969 while ( !istr
.Eof() )
3971 putchar(istr
.GetC());
3975 wxPuts(_T("\n----- done ------"));
3978 static void DumpZipDirectory(wxFileSystem
& fs
,
3979 const wxString
& dir
,
3980 const wxString
& indent
)
3982 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
3983 TESTFILE_ZIP
, dir
.c_str());
3984 wxString wildcard
= prefix
+ _T("/*");
3986 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
3987 while ( !dirname
.empty() )
3989 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
3991 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3996 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
3998 DumpZipDirectory(fs
, dirname
,
3999 indent
+ wxString(_T(' '), 4));
4001 dirname
= fs
.FindNext();
4004 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
4005 while ( !filename
.empty() )
4007 if ( !filename
.StartsWith(prefix
, &filename
) )
4009 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
4014 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
4016 filename
= fs
.FindNext();
4020 static void TestZipFileSystem()
4022 wxPuts(_T("*** Testing ZIP file system ***\n"));
4024 wxFileSystem::AddHandler(new wxZipFSHandler
);
4026 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
4028 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
4033 // ----------------------------------------------------------------------------
4035 // ----------------------------------------------------------------------------
4039 #include "wx/zstream.h"
4040 #include "wx/wfstream.h"
4042 static const wxChar
*FILENAME_GZ
= _T("test.gz");
4043 static const wxChar
*TEST_DATA
= _T("hello and hello and hello and hello and hello");
4045 static void TestZlibStreamWrite()
4047 wxPuts(_T("*** Testing Zlib stream reading ***\n"));
4049 wxFileOutputStream
fileOutStream(FILENAME_GZ
);
4050 wxZlibOutputStream
ostr(fileOutStream
);
4051 wxPrintf(_T("Compressing the test string... "));
4052 ostr
.Write(TEST_DATA
, wxStrlen(TEST_DATA
) + 1);
4055 wxPuts(_T("(ERROR: failed)"));
4062 wxPuts(_T("\n----- done ------"));
4065 static void TestZlibStreamRead()
4067 wxPuts(_T("*** Testing Zlib stream reading ***\n"));
4069 wxFileInputStream
fileInStream(FILENAME_GZ
);
4070 wxZlibInputStream
istr(fileInStream
);
4071 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
4073 wxPuts(_T("Dumping the file:"));
4074 while ( !istr
.Eof() )
4076 putchar(istr
.GetC());
4080 wxPuts(_T("\n----- done ------"));
4085 // ----------------------------------------------------------------------------
4087 // ----------------------------------------------------------------------------
4089 #ifdef TEST_DATETIME
4093 #include "wx/date.h"
4094 #include "wx/datetime.h"
4099 wxDateTime::wxDateTime_t day
;
4100 wxDateTime::Month month
;
4102 wxDateTime::wxDateTime_t hour
, min
, sec
;
4104 wxDateTime::WeekDay wday
;
4105 time_t gmticks
, ticks
;
4107 void Init(const wxDateTime::Tm
& tm
)
4116 gmticks
= ticks
= -1;
4119 wxDateTime
DT() const
4120 { return wxDateTime(day
, month
, year
, hour
, min
, sec
); }
4122 bool SameDay(const wxDateTime::Tm
& tm
) const
4124 return day
== tm
.mday
&& month
== tm
.mon
&& year
== tm
.year
;
4127 wxString
Format() const
4130 s
.Printf(_T("%02d:%02d:%02d %10s %02d, %4d%s"),
4132 wxDateTime::GetMonthName(month
).c_str(),
4134 abs(wxDateTime::ConvertYearToBC(year
)),
4135 year
> 0 ? _T("AD") : _T("BC"));
4139 wxString
FormatDate() const
4142 s
.Printf(_T("%02d-%s-%4d%s"),
4144 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
4145 abs(wxDateTime::ConvertYearToBC(year
)),
4146 year
> 0 ? _T("AD") : _T("BC"));
4151 static const Date testDates
[] =
4153 { 1, wxDateTime::Jan
, 1970, 00, 00, 00, 2440587.5, wxDateTime::Thu
, 0, -3600 },
4154 { 7, wxDateTime::Feb
, 2036, 00, 00, 00, 2464730.5, wxDateTime::Thu
, -1, -1 },
4155 { 8, wxDateTime::Feb
, 2036, 00, 00, 00, 2464731.5, wxDateTime::Fri
, -1, -1 },
4156 { 1, wxDateTime::Jan
, 2037, 00, 00, 00, 2465059.5, wxDateTime::Thu
, -1, -1 },
4157 { 1, wxDateTime::Jan
, 2038, 00, 00, 00, 2465424.5, wxDateTime::Fri
, -1, -1 },
4158 { 21, wxDateTime::Jan
, 2222, 00, 00, 00, 2532648.5, wxDateTime::Mon
, -1, -1 },
4159 { 29, wxDateTime::May
, 1976, 12, 00, 00, 2442928.0, wxDateTime::Sat
, 202219200, 202212000 },
4160 { 29, wxDateTime::Feb
, 1976, 00, 00, 00, 2442837.5, wxDateTime::Sun
, 194400000, 194396400 },
4161 { 1, wxDateTime::Jan
, 1900, 12, 00, 00, 2415021.0, wxDateTime::Mon
, -1, -1 },
4162 { 1, wxDateTime::Jan
, 1900, 00, 00, 00, 2415020.5, wxDateTime::Mon
, -1, -1 },
4163 { 15, wxDateTime::Oct
, 1582, 00, 00, 00, 2299160.5, wxDateTime::Fri
, -1, -1 },
4164 { 4, wxDateTime::Oct
, 1582, 00, 00, 00, 2299149.5, wxDateTime::Mon
, -1, -1 },
4165 { 1, wxDateTime::Mar
, 1, 00, 00, 00, 1721484.5, wxDateTime::Thu
, -1, -1 },
4166 { 1, wxDateTime::Jan
, 1, 00, 00, 00, 1721425.5, wxDateTime::Mon
, -1, -1 },
4167 { 31, wxDateTime::Dec
, 0, 00, 00, 00, 1721424.5, wxDateTime::Sun
, -1, -1 },
4168 { 1, wxDateTime::Jan
, 0, 00, 00, 00, 1721059.5, wxDateTime::Sat
, -1, -1 },
4169 { 12, wxDateTime::Aug
, -1234, 00, 00, 00, 1270573.5, wxDateTime::Fri
, -1, -1 },
4170 { 12, wxDateTime::Aug
, -4000, 00, 00, 00, 260313.5, wxDateTime::Sat
, -1, -1 },
4171 { 24, wxDateTime::Nov
, -4713, 00, 00, 00, -0.5, wxDateTime::Mon
, -1, -1 },
4174 // this test miscellaneous static wxDateTime functions
4175 static void TestTimeStatic()
4177 wxPuts(_T("\n*** wxDateTime static methods test ***"));
4179 // some info about the current date
4180 int year
= wxDateTime::GetCurrentYear();
4181 wxPrintf(_T("Current year %d is %sa leap one and has %d days.\n"),
4183 wxDateTime::IsLeapYear(year
) ? "" : "not ",
4184 wxDateTime::GetNumberOfDays(year
));
4186 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
4187 wxPrintf(_T("Current month is '%s' ('%s') and it has %d days\n"),
4188 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
4189 wxDateTime::GetMonthName(month
).c_str(),
4190 wxDateTime::GetNumberOfDays(month
));
4193 static const size_t nYears
= 5;
4194 static const size_t years
[2][nYears
] =
4196 // first line: the years to test
4197 { 1990, 1976, 2000, 2030, 1984, },
4199 // second line: TRUE if leap, FALSE otherwise
4200 { FALSE
, TRUE
, TRUE
, FALSE
, TRUE
}
4203 for ( size_t n
= 0; n
< nYears
; n
++ )
4205 int year
= years
[0][n
];
4206 bool should
= years
[1][n
] != 0,
4207 is
= wxDateTime::IsLeapYear(year
);
4209 wxPrintf(_T("Year %d is %sa leap year (%s)\n"),
4212 should
== is
? "ok" : "ERROR");
4214 wxASSERT( should
== wxDateTime::IsLeapYear(year
) );
4218 // test constructing wxDateTime objects
4219 static void TestTimeSet()
4221 wxPuts(_T("\n*** wxDateTime construction test ***"));
4223 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4225 const Date
& d1
= testDates
[n
];
4226 wxDateTime dt
= d1
.DT();
4229 d2
.Init(dt
.GetTm());
4231 wxString s1
= d1
.Format(),
4234 wxPrintf(_T("Date: %s == %s (%s)\n"),
4235 s1
.c_str(), s2
.c_str(),
4236 s1
== s2
? _T("ok") : _T("ERROR"));
4240 // test time zones stuff
4241 static void TestTimeZones()
4243 wxPuts(_T("\n*** wxDateTime timezone test ***"));
4245 wxDateTime now
= wxDateTime::Now();
4247 wxPrintf(_T("Current GMT time:\t%s\n"), now
.Format(_T("%c"), wxDateTime::GMT0
).c_str());
4248 wxPrintf(_T("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::GMT0
).c_str());
4249 wxPrintf(_T("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::EST
).c_str());
4250 wxPrintf(_T("Current time in Paris:\t%s\n"), now
.Format(_T("%c"), wxDateTime::CET
).c_str());
4251 wxPrintf(_T(" Moscow:\t%s\n"), now
.Format(_T("%c"), wxDateTime::MSK
).c_str());
4252 wxPrintf(_T(" New York:\t%s\n"), now
.Format(_T("%c"), wxDateTime::EST
).c_str());
4254 wxDateTime::Tm tm
= now
.GetTm();
4255 if ( wxDateTime(tm
) != now
)
4257 wxPrintf(_T("ERROR: got %s instead of %s\n"),
4258 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
4262 // test some minimal support for the dates outside the standard range
4263 static void TestTimeRange()
4265 wxPuts(_T("\n*** wxDateTime out-of-standard-range dates test ***"));
4267 static const wxChar
*fmt
= _T("%d-%b-%Y %H:%M:%S");
4269 wxPrintf(_T("Unix epoch:\t%s\n"),
4270 wxDateTime(2440587.5).Format(fmt
).c_str());
4271 wxPrintf(_T("Feb 29, 0: \t%s\n"),
4272 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
4273 wxPrintf(_T("JDN 0: \t%s\n"),
4274 wxDateTime(0.0).Format(fmt
).c_str());
4275 wxPrintf(_T("Jan 1, 1AD:\t%s\n"),
4276 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
4277 wxPrintf(_T("May 29, 2099:\t%s\n"),
4278 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
4281 static void TestTimeTicks()
4283 wxPuts(_T("\n*** wxDateTime ticks test ***"));
4285 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4287 const Date
& d
= testDates
[n
];
4288 if ( d
.ticks
== -1 )
4291 wxDateTime dt
= d
.DT();
4292 long ticks
= (dt
.GetValue() / 1000).ToLong();
4293 wxPrintf(_T("Ticks of %s:\t% 10ld"), d
.Format().c_str(), ticks
);
4294 if ( ticks
== d
.ticks
)
4296 wxPuts(_T(" (ok)"));
4300 wxPrintf(_T(" (ERROR: should be %ld, delta = %ld)\n"),
4301 (long)d
.ticks
, (long)(ticks
- d
.ticks
));
4304 dt
= d
.DT().ToTimezone(wxDateTime::GMT0
);
4305 ticks
= (dt
.GetValue() / 1000).ToLong();
4306 wxPrintf(_T("GMtks of %s:\t% 10ld"), d
.Format().c_str(), ticks
);
4307 if ( ticks
== d
.gmticks
)
4309 wxPuts(_T(" (ok)"));
4313 wxPrintf(_T(" (ERROR: should be %ld, delta = %ld)\n"),
4314 (long)d
.gmticks
, (long)(ticks
- d
.gmticks
));
4321 // test conversions to JDN &c
4322 static void TestTimeJDN()
4324 wxPuts(_T("\n*** wxDateTime to JDN test ***"));
4326 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4328 const Date
& d
= testDates
[n
];
4329 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
4330 double jdn
= dt
.GetJulianDayNumber();
4332 wxPrintf(_T("JDN of %s is:\t% 15.6f"), d
.Format().c_str(), jdn
);
4335 wxPuts(_T(" (ok)"));
4339 wxPrintf(_T(" (ERROR: should be %f, delta = %f)\n"),
4340 d
.jdn
, jdn
- d
.jdn
);
4345 // test week days computation
4346 static void TestTimeWDays()
4348 wxPuts(_T("\n*** wxDateTime weekday test ***"));
4350 // test GetWeekDay()
4352 for ( n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4354 const Date
& d
= testDates
[n
];
4355 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
4357 wxDateTime::WeekDay wday
= dt
.GetWeekDay();
4358 wxPrintf(_T("%s is: %s"),
4360 wxDateTime::GetWeekDayName(wday
).c_str());
4361 if ( wday
== d
.wday
)
4363 wxPuts(_T(" (ok)"));
4367 wxPrintf(_T(" (ERROR: should be %s)\n"),
4368 wxDateTime::GetWeekDayName(d
.wday
).c_str());
4374 // test SetToWeekDay()
4375 struct WeekDateTestData
4377 Date date
; // the real date (precomputed)
4378 int nWeek
; // its week index in the month
4379 wxDateTime::WeekDay wday
; // the weekday
4380 wxDateTime::Month month
; // the month
4381 int year
; // and the year
4383 wxString
Format() const
4386 switch ( nWeek
< -1 ? -nWeek
: nWeek
)
4388 case 1: which
= _T("first"); break;
4389 case 2: which
= _T("second"); break;
4390 case 3: which
= _T("third"); break;
4391 case 4: which
= _T("fourth"); break;
4392 case 5: which
= _T("fifth"); break;
4394 case -1: which
= _T("last"); break;
4399 which
+= _T(" from end");
4402 s
.Printf(_T("The %s %s of %s in %d"),
4404 wxDateTime::GetWeekDayName(wday
).c_str(),
4405 wxDateTime::GetMonthName(month
).c_str(),
4412 // the array data was generated by the following python program
4414 from DateTime import *
4415 from whrandom import *
4416 from string import *
4418 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4419 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4421 week = DateTimeDelta(7)
4424 year = randint(1900, 2100)
4425 month = randint(1, 12)
4426 day = randint(1, 28)
4427 dt = DateTime(year, month, day)
4428 wday = dt.day_of_week
4430 countFromEnd = choice([-1, 1])
4433 while dt.month is month:
4434 dt = dt - countFromEnd * week
4435 weekNum = weekNum + countFromEnd
4437 data = { 'day': rjust(`day`, 2), 'month': monthNames[month - 1], 'year': year, 'weekNum': rjust(`weekNum`, 2), 'wday': wdayNames[wday] }
4439 print "{ { %(day)s, wxDateTime::%(month)s, %(year)d }, %(weekNum)d, "\
4440 "wxDateTime::%(wday)s, wxDateTime::%(month)s, %(year)d }," % data
4443 static const WeekDateTestData weekDatesTestData
[] =
4445 { { 20, wxDateTime::Mar
, 2045 }, 3, wxDateTime::Mon
, wxDateTime::Mar
, 2045 },
4446 { { 5, wxDateTime::Jun
, 1985 }, -4, wxDateTime::Wed
, wxDateTime::Jun
, 1985 },
4447 { { 12, wxDateTime::Nov
, 1961 }, -3, wxDateTime::Sun
, wxDateTime::Nov
, 1961 },
4448 { { 27, wxDateTime::Feb
, 2093 }, -1, wxDateTime::Fri
, wxDateTime::Feb
, 2093 },
4449 { { 4, wxDateTime::Jul
, 2070 }, -4, wxDateTime::Fri
, wxDateTime::Jul
, 2070 },
4450 { { 2, wxDateTime::Apr
, 1906 }, -5, wxDateTime::Mon
, wxDateTime::Apr
, 1906 },
4451 { { 19, wxDateTime::Jul
, 2023 }, -2, wxDateTime::Wed
, wxDateTime::Jul
, 2023 },
4452 { { 5, wxDateTime::May
, 1958 }, -4, wxDateTime::Mon
, wxDateTime::May
, 1958 },
4453 { { 11, wxDateTime::Aug
, 1900 }, 2, wxDateTime::Sat
, wxDateTime::Aug
, 1900 },
4454 { { 14, wxDateTime::Feb
, 1945 }, 2, wxDateTime::Wed
, wxDateTime::Feb
, 1945 },
4455 { { 25, wxDateTime::Jul
, 1967 }, -1, wxDateTime::Tue
, wxDateTime::Jul
, 1967 },
4456 { { 9, wxDateTime::May
, 1916 }, -4, wxDateTime::Tue
, wxDateTime::May
, 1916 },
4457 { { 20, wxDateTime::Jun
, 1927 }, 3, wxDateTime::Mon
, wxDateTime::Jun
, 1927 },
4458 { { 2, wxDateTime::Aug
, 2000 }, 1, wxDateTime::Wed
, wxDateTime::Aug
, 2000 },
4459 { { 20, wxDateTime::Apr
, 2044 }, 3, wxDateTime::Wed
, wxDateTime::Apr
, 2044 },
4460 { { 20, wxDateTime::Feb
, 1932 }, -2, wxDateTime::Sat
, wxDateTime::Feb
, 1932 },
4461 { { 25, wxDateTime::Jul
, 2069 }, 4, wxDateTime::Thu
, wxDateTime::Jul
, 2069 },
4462 { { 3, wxDateTime::Apr
, 1925 }, 1, wxDateTime::Fri
, wxDateTime::Apr
, 1925 },
4463 { { 21, wxDateTime::Mar
, 2093 }, 3, wxDateTime::Sat
, wxDateTime::Mar
, 2093 },
4464 { { 3, wxDateTime::Dec
, 2074 }, -5, wxDateTime::Mon
, wxDateTime::Dec
, 2074 },
4467 static const wxChar
*fmt
= _T("%d-%b-%Y");
4470 for ( n
= 0; n
< WXSIZEOF(weekDatesTestData
); n
++ )
4472 const WeekDateTestData
& wd
= weekDatesTestData
[n
];
4474 dt
.SetToWeekDay(wd
.wday
, wd
.nWeek
, wd
.month
, wd
.year
);
4476 wxPrintf(_T("%s is %s"), wd
.Format().c_str(), dt
.Format(fmt
).c_str());
4478 const Date
& d
= wd
.date
;
4479 if ( d
.SameDay(dt
.GetTm()) )
4481 wxPuts(_T(" (ok)"));
4485 dt
.Set(d
.day
, d
.month
, d
.year
);
4487 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.Format(fmt
).c_str());
4492 // test the computation of (ISO) week numbers
4493 static void TestTimeWNumber()
4495 wxPuts(_T("\n*** wxDateTime week number test ***"));
4497 struct WeekNumberTestData
4499 Date date
; // the date
4500 wxDateTime::wxDateTime_t week
; // the week number in the year
4501 wxDateTime::wxDateTime_t wmon
; // the week number in the month
4502 wxDateTime::wxDateTime_t wmon2
; // same but week starts with Sun
4503 wxDateTime::wxDateTime_t dnum
; // day number in the year
4506 // data generated with the following python script:
4508 from DateTime import *
4509 from whrandom import *
4510 from string import *
4512 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4513 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4515 def GetMonthWeek(dt):
4516 weekNumMonth = dt.iso_week[1] - DateTime(dt.year, dt.month, 1).iso_week[1] + 1
4517 if weekNumMonth < 0:
4518 weekNumMonth = weekNumMonth + 53
4521 def GetLastSundayBefore(dt):
4522 if dt.iso_week[2] == 7:
4525 return dt - DateTimeDelta(dt.iso_week[2])
4528 year = randint(1900, 2100)
4529 month = randint(1, 12)
4530 day = randint(1, 28)
4531 dt = DateTime(year, month, day)
4532 dayNum = dt.day_of_year
4533 weekNum = dt.iso_week[1]
4534 weekNumMonth = GetMonthWeek(dt)
4537 dtSunday = GetLastSundayBefore(dt)
4539 while dtSunday >= GetLastSundayBefore(DateTime(dt.year, dt.month, 1)):
4540 weekNumMonth2 = weekNumMonth2 + 1
4541 dtSunday = dtSunday - DateTimeDelta(7)
4543 data = { 'day': rjust(`day`, 2), \
4544 'month': monthNames[month - 1], \
4546 'weekNum': rjust(`weekNum`, 2), \
4547 'weekNumMonth': weekNumMonth, \
4548 'weekNumMonth2': weekNumMonth2, \
4549 'dayNum': rjust(`dayNum`, 3) }
4551 print " { { %(day)s, "\
4552 "wxDateTime::%(month)s, "\
4555 "%(weekNumMonth)s, "\
4556 "%(weekNumMonth2)s, "\
4557 "%(dayNum)s }," % data
4560 static const WeekNumberTestData weekNumberTestDates
[] =
4562 { { 27, wxDateTime::Dec
, 1966 }, 52, 5, 5, 361 },
4563 { { 22, wxDateTime::Jul
, 1926 }, 29, 4, 4, 203 },
4564 { { 22, wxDateTime::Oct
, 2076 }, 43, 4, 4, 296 },
4565 { { 1, wxDateTime::Jul
, 1967 }, 26, 1, 1, 182 },
4566 { { 8, wxDateTime::Nov
, 2004 }, 46, 2, 2, 313 },
4567 { { 21, wxDateTime::Mar
, 1920 }, 12, 3, 4, 81 },
4568 { { 7, wxDateTime::Jan
, 1965 }, 1, 2, 2, 7 },
4569 { { 19, wxDateTime::Oct
, 1999 }, 42, 4, 4, 292 },
4570 { { 13, wxDateTime::Aug
, 1955 }, 32, 2, 2, 225 },
4571 { { 18, wxDateTime::Jul
, 2087 }, 29, 3, 3, 199 },
4572 { { 2, wxDateTime::Sep
, 2028 }, 35, 1, 1, 246 },
4573 { { 28, wxDateTime::Jul
, 1945 }, 30, 5, 4, 209 },
4574 { { 15, wxDateTime::Jun
, 1901 }, 24, 3, 3, 166 },
4575 { { 10, wxDateTime::Oct
, 1939 }, 41, 3, 2, 283 },
4576 { { 3, wxDateTime::Dec
, 1965 }, 48, 1, 1, 337 },
4577 { { 23, wxDateTime::Feb
, 1940 }, 8, 4, 4, 54 },
4578 { { 2, wxDateTime::Jan
, 1987 }, 1, 1, 1, 2 },
4579 { { 11, wxDateTime::Aug
, 2079 }, 32, 2, 2, 223 },
4580 { { 2, wxDateTime::Feb
, 2063 }, 5, 1, 1, 33 },
4581 { { 16, wxDateTime::Oct
, 1942 }, 42, 3, 3, 289 },
4584 for ( size_t n
= 0; n
< WXSIZEOF(weekNumberTestDates
); n
++ )
4586 const WeekNumberTestData
& wn
= weekNumberTestDates
[n
];
4587 const Date
& d
= wn
.date
;
4589 wxDateTime dt
= d
.DT();
4591 wxDateTime::wxDateTime_t
4592 week
= dt
.GetWeekOfYear(wxDateTime::Monday_First
),
4593 wmon
= dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4594 wmon2
= dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4595 dnum
= dt
.GetDayOfYear();
4597 wxPrintf(_T("%s: the day number is %d"), d
.FormatDate().c_str(), dnum
);
4598 if ( dnum
== wn
.dnum
)
4600 wxPrintf(_T(" (ok)"));
4604 wxPrintf(_T(" (ERROR: should be %d)"), wn
.dnum
);
4607 wxPrintf(_T(", week in month is %d"), wmon
);
4608 if ( wmon
== wn
.wmon
)
4610 wxPrintf(_T(" (ok)"));
4614 wxPrintf(_T(" (ERROR: should be %d)"), wn
.wmon
);
4617 wxPrintf(_T(" or %d"), wmon2
);
4618 if ( wmon2
== wn
.wmon2
)
4620 wxPrintf(_T(" (ok)"));
4624 wxPrintf(_T(" (ERROR: should be %d)"), wn
.wmon2
);
4627 wxPrintf(_T(", week in year is %d"), week
);
4628 if ( week
== wn
.week
)
4630 wxPuts(_T(" (ok)"));
4634 wxPrintf(_T(" (ERROR: should be %d)\n"), wn
.week
);
4639 // test DST calculations
4640 static void TestTimeDST()
4642 wxPuts(_T("\n*** wxDateTime DST test ***"));
4644 wxPrintf(_T("DST is%s in effect now.\n\n"),
4645 wxDateTime::Now().IsDST() ? _T("") : _T(" not"));
4647 // taken from http://www.energy.ca.gov/daylightsaving.html
4648 static const Date datesDST
[2][2004 - 1900 + 1] =
4651 { 1, wxDateTime::Apr
, 1990 },
4652 { 7, wxDateTime::Apr
, 1991 },
4653 { 5, wxDateTime::Apr
, 1992 },
4654 { 4, wxDateTime::Apr
, 1993 },
4655 { 3, wxDateTime::Apr
, 1994 },
4656 { 2, wxDateTime::Apr
, 1995 },
4657 { 7, wxDateTime::Apr
, 1996 },
4658 { 6, wxDateTime::Apr
, 1997 },
4659 { 5, wxDateTime::Apr
, 1998 },
4660 { 4, wxDateTime::Apr
, 1999 },
4661 { 2, wxDateTime::Apr
, 2000 },
4662 { 1, wxDateTime::Apr
, 2001 },
4663 { 7, wxDateTime::Apr
, 2002 },
4664 { 6, wxDateTime::Apr
, 2003 },
4665 { 4, wxDateTime::Apr
, 2004 },
4668 { 28, wxDateTime::Oct
, 1990 },
4669 { 27, wxDateTime::Oct
, 1991 },
4670 { 25, wxDateTime::Oct
, 1992 },
4671 { 31, wxDateTime::Oct
, 1993 },
4672 { 30, wxDateTime::Oct
, 1994 },
4673 { 29, wxDateTime::Oct
, 1995 },
4674 { 27, wxDateTime::Oct
, 1996 },
4675 { 26, wxDateTime::Oct
, 1997 },
4676 { 25, wxDateTime::Oct
, 1998 },
4677 { 31, wxDateTime::Oct
, 1999 },
4678 { 29, wxDateTime::Oct
, 2000 },
4679 { 28, wxDateTime::Oct
, 2001 },
4680 { 27, wxDateTime::Oct
, 2002 },
4681 { 26, wxDateTime::Oct
, 2003 },
4682 { 31, wxDateTime::Oct
, 2004 },
4687 for ( year
= 1990; year
< 2005; year
++ )
4689 wxDateTime dtBegin
= wxDateTime::GetBeginDST(year
, wxDateTime::USA
),
4690 dtEnd
= wxDateTime::GetEndDST(year
, wxDateTime::USA
);
4692 wxPrintf(_T("DST period in the US for year %d: from %s to %s"),
4693 year
, dtBegin
.Format().c_str(), dtEnd
.Format().c_str());
4695 size_t n
= year
- 1990;
4696 const Date
& dBegin
= datesDST
[0][n
];
4697 const Date
& dEnd
= datesDST
[1][n
];
4699 if ( dBegin
.SameDay(dtBegin
.GetTm()) && dEnd
.SameDay(dtEnd
.GetTm()) )
4701 wxPuts(_T(" (ok)"));
4705 wxPrintf(_T(" (ERROR: should be %s %d to %s %d)\n"),
4706 wxDateTime::GetMonthName(dBegin
.month
).c_str(), dBegin
.day
,
4707 wxDateTime::GetMonthName(dEnd
.month
).c_str(), dEnd
.day
);
4713 for ( year
= 1990; year
< 2005; year
++ )
4715 wxPrintf(_T("DST period in Europe for year %d: from %s to %s\n"),
4717 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
4718 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
4722 // test wxDateTime -> text conversion
4723 static void TestTimeFormat()
4725 wxPuts(_T("\n*** wxDateTime formatting test ***"));
4727 // some information may be lost during conversion, so store what kind
4728 // of info should we recover after a round trip
4731 CompareNone
, // don't try comparing
4732 CompareBoth
, // dates and times should be identical
4733 CompareDate
, // dates only
4734 CompareTime
// time only
4739 CompareKind compareKind
;
4740 const wxChar
*format
;
4741 } formatTestFormats
[] =
4743 { CompareBoth
, _T("---> %c") },
4744 { CompareDate
, _T("Date is %A, %d of %B, in year %Y") },
4745 { CompareBoth
, _T("Date is %x, time is %X") },
4746 { CompareTime
, _T("Time is %H:%M:%S or %I:%M:%S %p") },
4747 { CompareNone
, _T("The day of year: %j, the week of year: %W") },
4748 { CompareDate
, _T("ISO date without separators: %Y%m%d") },
4751 static const Date formatTestDates
[] =
4753 { 29, wxDateTime::May
, 1976, 18, 30, 00 },
4754 { 31, wxDateTime::Dec
, 1999, 23, 30, 00 },
4756 // this test can't work for other centuries because it uses two digit
4757 // years in formats, so don't even try it
4758 { 29, wxDateTime::May
, 2076, 18, 30, 00 },
4759 { 29, wxDateTime::Feb
, 2400, 02, 15, 25 },
4760 { 01, wxDateTime::Jan
, -52, 03, 16, 47 },
4764 // an extra test (as it doesn't depend on date, don't do it in the loop)
4765 wxPrintf(_T("%s\n"), wxDateTime::Now().Format(_T("Our timezone is %Z")).c_str());
4767 for ( size_t d
= 0; d
< WXSIZEOF(formatTestDates
) + 1; d
++ )
4771 wxDateTime dt
= d
== 0 ? wxDateTime::Now() : formatTestDates
[d
- 1].DT();
4772 for ( size_t n
= 0; n
< WXSIZEOF(formatTestFormats
); n
++ )
4774 wxString s
= dt
.Format(formatTestFormats
[n
].format
);
4775 wxPrintf(_T("%s"), s
.c_str());
4777 // what can we recover?
4778 int kind
= formatTestFormats
[n
].compareKind
;
4782 const wxChar
*result
= dt2
.ParseFormat(s
, formatTestFormats
[n
].format
);
4785 // converion failed - should it have?
4786 if ( kind
== CompareNone
)
4787 wxPuts(_T(" (ok)"));
4789 wxPuts(_T(" (ERROR: conversion back failed)"));
4793 // should have parsed the entire string
4794 wxPuts(_T(" (ERROR: conversion back stopped too soon)"));
4798 bool equal
= FALSE
; // suppress compilaer warning
4806 equal
= dt
.IsSameDate(dt2
);
4810 equal
= dt
.IsSameTime(dt2
);
4816 wxPrintf(_T(" (ERROR: got back '%s' instead of '%s')\n"),
4817 dt2
.Format().c_str(), dt
.Format().c_str());
4821 wxPuts(_T(" (ok)"));
4828 // test text -> wxDateTime conversion
4829 static void TestTimeParse()
4831 wxPuts(_T("\n*** wxDateTime parse test ***"));
4833 struct ParseTestData
4835 const wxChar
*format
;
4840 static const ParseTestData parseTestDates
[] =
4842 { _T("Sat, 18 Dec 1999 00:46:40 +0100"), { 18, wxDateTime::Dec
, 1999, 00, 46, 40 }, TRUE
},
4843 { _T("Wed, 1 Dec 1999 05:17:20 +0300"), { 1, wxDateTime::Dec
, 1999, 03, 17, 20 }, TRUE
},
4846 for ( size_t n
= 0; n
< WXSIZEOF(parseTestDates
); n
++ )
4848 const wxChar
*format
= parseTestDates
[n
].format
;
4850 wxPrintf(_T("%s => "), format
);
4853 if ( dt
.ParseRfc822Date(format
) )
4855 wxPrintf(_T("%s "), dt
.Format().c_str());
4857 if ( parseTestDates
[n
].good
)
4859 wxDateTime dtReal
= parseTestDates
[n
].date
.DT();
4866 wxPrintf(_T("(ERROR: should be %s)\n"), dtReal
.Format().c_str());
4871 wxPuts(_T("(ERROR: bad format)"));
4876 wxPrintf(_T("bad format (%s)\n"),
4877 parseTestDates
[n
].good
? "ERROR" : "ok");
4882 static void TestDateTimeInteractive()
4884 wxPuts(_T("\n*** interactive wxDateTime tests ***"));
4890 wxPrintf(_T("Enter a date: "));
4891 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
4894 // kill the last '\n'
4895 buf
[wxStrlen(buf
) - 1] = 0;
4898 const wxChar
*p
= dt
.ParseDate(buf
);
4901 wxPrintf(_T("ERROR: failed to parse the date '%s'.\n"), buf
);
4907 wxPrintf(_T("WARNING: parsed only first %u characters.\n"), p
- buf
);
4910 wxPrintf(_T("%s: day %u, week of month %u/%u, week of year %u\n"),
4911 dt
.Format(_T("%b %d, %Y")).c_str(),
4913 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4914 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4915 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
4918 wxPuts(_T("\n*** done ***"));
4921 static void TestTimeMS()
4923 wxPuts(_T("*** testing millisecond-resolution support in wxDateTime ***"));
4925 wxDateTime dt1
= wxDateTime::Now(),
4926 dt2
= wxDateTime::UNow();
4928 wxPrintf(_T("Now = %s\n"), dt1
.Format(_T("%H:%M:%S:%l")).c_str());
4929 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
4930 wxPrintf(_T("Dummy loop: "));
4931 for ( int i
= 0; i
< 6000; i
++ )
4933 //for ( int j = 0; j < 10; j++ )
4936 s
.Printf(_T("%g"), sqrt(i
));
4942 wxPuts(_T(", done"));
4945 dt2
= wxDateTime::UNow();
4946 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
4948 wxPrintf(_T("Loop executed in %s ms\n"), (dt2
- dt1
).Format(_T("%l")).c_str());
4950 wxPuts(_T("\n*** done ***"));
4953 static void TestTimeArithmetics()
4955 wxPuts(_T("\n*** testing arithmetic operations on wxDateTime ***"));
4957 static const struct ArithmData
4959 ArithmData(const wxDateSpan
& sp
, const wxChar
*nam
)
4960 : span(sp
), name(nam
) { }
4964 } testArithmData
[] =
4966 ArithmData(wxDateSpan::Day(), _T("day")),
4967 ArithmData(wxDateSpan::Week(), _T("week")),
4968 ArithmData(wxDateSpan::Month(), _T("month")),
4969 ArithmData(wxDateSpan::Year(), _T("year")),
4970 ArithmData(wxDateSpan(1, 2, 3, 4), _T("year, 2 months, 3 weeks, 4 days")),
4973 wxDateTime
dt(29, wxDateTime::Dec
, 1999), dt1
, dt2
;
4975 for ( size_t n
= 0; n
< WXSIZEOF(testArithmData
); n
++ )
4977 wxDateSpan span
= testArithmData
[n
].span
;
4981 const wxChar
*name
= testArithmData
[n
].name
;
4982 wxPrintf(_T("%s + %s = %s, %s - %s = %s\n"),
4983 dt
.FormatISODate().c_str(), name
, dt1
.FormatISODate().c_str(),
4984 dt
.FormatISODate().c_str(), name
, dt2
.FormatISODate().c_str());
4986 wxPrintf(_T("Going back: %s"), (dt1
- span
).FormatISODate().c_str());
4987 if ( dt1
- span
== dt
)
4989 wxPuts(_T(" (ok)"));
4993 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.FormatISODate().c_str());
4996 wxPrintf(_T("Going forward: %s"), (dt2
+ span
).FormatISODate().c_str());
4997 if ( dt2
+ span
== dt
)
4999 wxPuts(_T(" (ok)"));
5003 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.FormatISODate().c_str());
5006 wxPrintf(_T("Double increment: %s"), (dt2
+ 2*span
).FormatISODate().c_str());
5007 if ( dt2
+ 2*span
== dt1
)
5009 wxPuts(_T(" (ok)"));
5013 wxPrintf(_T(" (ERROR: should be %s)\n"), dt2
.FormatISODate().c_str());
5020 static void TestTimeHolidays()
5022 wxPuts(_T("\n*** testing wxDateTimeHolidayAuthority ***\n"));
5024 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
5025 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
5026 dtEnd
= dtStart
.GetLastMonthDay();
5028 wxDateTimeArray hol
;
5029 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
5031 const wxChar
*format
= _T("%d-%b-%Y (%a)");
5033 wxPrintf(_T("All holidays between %s and %s:\n"),
5034 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
5036 size_t count
= hol
.GetCount();
5037 for ( size_t n
= 0; n
< count
; n
++ )
5039 wxPrintf(_T("\t%s\n"), hol
[n
].Format(format
).c_str());
5045 static void TestTimeZoneBug()
5047 wxPuts(_T("\n*** testing for DST/timezone bug ***\n"));
5049 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
5050 for ( int i
= 0; i
< 31; i
++ )
5052 wxPrintf(_T("Date %s: week day %s.\n"),
5053 date
.Format(_T("%d-%m-%Y")).c_str(),
5054 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
5056 date
+= wxDateSpan::Day();
5062 static void TestTimeSpanFormat()
5064 wxPuts(_T("\n*** wxTimeSpan tests ***"));
5066 static const wxChar
*formats
[] =
5068 _T("(default) %H:%M:%S"),
5069 _T("%E weeks and %D days"),
5070 _T("%l milliseconds"),
5071 _T("(with ms) %H:%M:%S:%l"),
5072 _T("100%% of minutes is %M"), // test "%%"
5073 _T("%D days and %H hours"),
5074 _T("or also %S seconds"),
5077 wxTimeSpan
ts1(1, 2, 3, 4),
5079 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
5081 wxPrintf(_T("ts1 = %s\tts2 = %s\n"),
5082 ts1
.Format(formats
[n
]).c_str(),
5083 ts2
.Format(formats
[n
]).c_str());
5091 // test compatibility with the old wxDate/wxTime classes
5092 static void TestTimeCompatibility()
5094 wxPuts(_T("\n*** wxDateTime compatibility test ***"));
5096 wxPrintf(_T("wxDate for JDN 0: %s\n"), wxDate(0l).FormatDate().c_str());
5097 wxPrintf(_T("wxDate for MJD 0: %s\n"), wxDate(2400000).FormatDate().c_str());
5099 double jdnNow
= wxDateTime::Now().GetJDN();
5100 long jdnMidnight
= (long)(jdnNow
- 0.5);
5101 wxPrintf(_T("wxDate for today: %s\n"), wxDate(jdnMidnight
).FormatDate().c_str());
5103 jdnMidnight
= wxDate().Set().GetJulianDate();
5104 wxPrintf(_T("wxDateTime for today: %s\n"),
5105 wxDateTime((double)(jdnMidnight
+ 0.5)).Format("%c", wxDateTime::GMT0
).c_str());
5107 int flags
= wxEUROPEAN
;//wxFULL;
5110 wxPrintf(_T("Today is %s\n"), date
.FormatDate(flags
).c_str());
5111 for ( int n
= 0; n
< 7; n
++ )
5113 wxPrintf(_T("Previous %s is %s\n"),
5114 wxDateTime::GetWeekDayName((wxDateTime::WeekDay
)n
),
5115 date
.Previous(n
+ 1).FormatDate(flags
).c_str());
5121 #endif // TEST_DATETIME
5123 // ----------------------------------------------------------------------------
5125 // ----------------------------------------------------------------------------
5129 #include "wx/thread.h"
5131 static size_t gs_counter
= (size_t)-1;
5132 static wxCriticalSection gs_critsect
;
5133 static wxSemaphore gs_cond
;
5135 class MyJoinableThread
: public wxThread
5138 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
5139 { m_n
= n
; Create(); }
5141 // thread execution starts here
5142 virtual ExitCode
Entry();
5148 wxThread::ExitCode
MyJoinableThread::Entry()
5150 unsigned long res
= 1;
5151 for ( size_t n
= 1; n
< m_n
; n
++ )
5155 // it's a loooong calculation :-)
5159 return (ExitCode
)res
;
5162 class MyDetachedThread
: public wxThread
5165 MyDetachedThread(size_t n
, wxChar ch
)
5169 m_cancelled
= FALSE
;
5174 // thread execution starts here
5175 virtual ExitCode
Entry();
5178 virtual void OnExit();
5181 size_t m_n
; // number of characters to write
5182 wxChar m_ch
; // character to write
5184 bool m_cancelled
; // FALSE if we exit normally
5187 wxThread::ExitCode
MyDetachedThread::Entry()
5190 wxCriticalSectionLocker
lock(gs_critsect
);
5191 if ( gs_counter
== (size_t)-1 )
5197 for ( size_t n
= 0; n
< m_n
; n
++ )
5199 if ( TestDestroy() )
5209 wxThread::Sleep(100);
5215 void MyDetachedThread::OnExit()
5217 wxLogTrace(_T("thread"), _T("Thread %ld is in OnExit"), GetId());
5219 wxCriticalSectionLocker
lock(gs_critsect
);
5220 if ( !--gs_counter
&& !m_cancelled
)
5224 static void TestDetachedThreads()
5226 wxPuts(_T("\n*** Testing detached threads ***"));
5228 static const size_t nThreads
= 3;
5229 MyDetachedThread
*threads
[nThreads
];
5231 for ( n
= 0; n
< nThreads
; n
++ )
5233 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
5236 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
5237 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
5239 for ( n
= 0; n
< nThreads
; n
++ )
5244 // wait until all threads terminate
5250 static void TestJoinableThreads()
5252 wxPuts(_T("\n*** Testing a joinable thread (a loooong calculation...) ***"));
5254 // calc 10! in the background
5255 MyJoinableThread
thread(10);
5258 wxPrintf(_T("\nThread terminated with exit code %lu.\n"),
5259 (unsigned long)thread
.Wait());
5262 static void TestThreadSuspend()
5264 wxPuts(_T("\n*** Testing thread suspend/resume functions ***"));
5266 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
5270 // this is for this demo only, in a real life program we'd use another
5271 // condition variable which would be signaled from wxThread::Entry() to
5272 // tell us that the thread really started running - but here just wait a
5273 // bit and hope that it will be enough (the problem is, of course, that
5274 // the thread might still not run when we call Pause() which will result
5276 wxThread::Sleep(300);
5278 for ( size_t n
= 0; n
< 3; n
++ )
5282 wxPuts(_T("\nThread suspended"));
5285 // don't sleep but resume immediately the first time
5286 wxThread::Sleep(300);
5288 wxPuts(_T("Going to resume the thread"));
5293 wxPuts(_T("Waiting until it terminates now"));
5295 // wait until the thread terminates
5301 static void TestThreadDelete()
5303 // As above, using Sleep() is only for testing here - we must use some
5304 // synchronisation object instead to ensure that the thread is still
5305 // running when we delete it - deleting a detached thread which already
5306 // terminated will lead to a crash!
5308 wxPuts(_T("\n*** Testing thread delete function ***"));
5310 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
5314 wxPuts(_T("\nDeleted a thread which didn't start to run yet."));
5316 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
5320 wxThread::Sleep(300);
5324 wxPuts(_T("\nDeleted a running thread."));
5326 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
5330 wxThread::Sleep(300);
5336 wxPuts(_T("\nDeleted a sleeping thread."));
5338 MyJoinableThread
thread3(20);
5343 wxPuts(_T("\nDeleted a joinable thread."));
5345 MyJoinableThread
thread4(2);
5348 wxThread::Sleep(300);
5352 wxPuts(_T("\nDeleted a joinable thread which already terminated."));
5357 class MyWaitingThread
: public wxThread
5360 MyWaitingThread( wxMutex
*mutex
, wxCondition
*condition
)
5363 m_condition
= condition
;
5368 virtual ExitCode
Entry()
5370 wxPrintf(_T("Thread %lu has started running.\n"), GetId());
5375 wxPrintf(_T("Thread %lu starts to wait...\n"), GetId());
5379 m_condition
->Wait();
5382 wxPrintf(_T("Thread %lu finished to wait, exiting.\n"), GetId());
5390 wxCondition
*m_condition
;
5393 static void TestThreadConditions()
5396 wxCondition
condition(mutex
);
5398 // otherwise its difficult to understand which log messages pertain to
5400 //wxLogTrace(_T("thread"), _T("Local condition var is %08x, gs_cond = %08x"),
5401 // condition.GetId(), gs_cond.GetId());
5403 // create and launch threads
5404 MyWaitingThread
*threads
[10];
5407 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5409 threads
[n
] = new MyWaitingThread( &mutex
, &condition
);
5412 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5417 // wait until all threads run
5418 wxPuts(_T("Main thread is waiting for the other threads to start"));
5421 size_t nRunning
= 0;
5422 while ( nRunning
< WXSIZEOF(threads
) )
5428 wxPrintf(_T("Main thread: %u already running\n"), nRunning
);
5432 wxPuts(_T("Main thread: all threads started up."));
5435 wxThread::Sleep(500);
5438 // now wake one of them up
5439 wxPrintf(_T("Main thread: about to signal the condition.\n"));
5444 wxThread::Sleep(200);
5446 // wake all the (remaining) threads up, so that they can exit
5447 wxPrintf(_T("Main thread: about to broadcast the condition.\n"));
5449 condition
.Broadcast();
5451 // give them time to terminate (dirty!)
5452 wxThread::Sleep(500);
5455 #include "wx/utils.h"
5457 class MyExecThread
: public wxThread
5460 MyExecThread(const wxString
& command
) : wxThread(wxTHREAD_JOINABLE
),
5466 virtual ExitCode
Entry()
5468 return (ExitCode
)wxExecute(m_command
, wxEXEC_SYNC
);
5475 static void TestThreadExec()
5477 wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
5479 MyExecThread
thread(_T("true"));
5482 wxPrintf(_T("Main program exit code: %ld.\n"),
5483 wxExecute(_T("false"), wxEXEC_SYNC
));
5485 wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread
.Wait());
5489 #include "wx/datetime.h"
5491 class MySemaphoreThread
: public wxThread
5494 MySemaphoreThread(int i
, wxSemaphore
*sem
)
5495 : wxThread(wxTHREAD_JOINABLE
),
5502 virtual ExitCode
Entry()
5504 wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
5505 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5509 wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
5510 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5514 wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
5515 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5527 WX_DEFINE_ARRAY(wxThread
*, ArrayThreads
);
5529 static void TestSemaphore()
5531 wxPuts(_T("*** Testing wxSemaphore class. ***"));
5533 static const int SEM_LIMIT
= 3;
5535 wxSemaphore
sem(SEM_LIMIT
, SEM_LIMIT
);
5536 ArrayThreads threads
;
5538 for ( int i
= 0; i
< 3*SEM_LIMIT
; i
++ )
5540 threads
.Add(new MySemaphoreThread(i
, &sem
));
5541 threads
.Last()->Run();
5544 for ( size_t n
= 0; n
< threads
.GetCount(); n
++ )
5551 #endif // TEST_THREADS
5553 // ----------------------------------------------------------------------------
5555 // ----------------------------------------------------------------------------
5559 #include "wx/dynarray.h"
5561 typedef unsigned short ushort
;
5563 #define DefineCompare(name, T) \
5565 int wxCMPFUNC_CONV name ## CompareValues(T first, T second) \
5567 return first - second; \
5570 int wxCMPFUNC_CONV name ## Compare(T* first, T* second) \
5572 return *first - *second; \
5575 int wxCMPFUNC_CONV name ## RevCompare(T* first, T* second) \
5577 return *second - *first; \
5580 DefineCompare(UShort, ushort);
5581 DefineCompare(Int
, int);
5583 // test compilation of all macros
5584 WX_DEFINE_ARRAY_SHORT(ushort
, wxArrayUShort
);
5585 WX_DEFINE_SORTED_ARRAY_SHORT(ushort
, wxSortedArrayUShortNoCmp
);
5586 WX_DEFINE_SORTED_ARRAY_CMP_SHORT(ushort
, UShortCompareValues
, wxSortedArrayUShort
);
5587 WX_DEFINE_SORTED_ARRAY_CMP_INT(int, IntCompareValues
, wxSortedArrayInt
);
5589 WX_DECLARE_OBJARRAY(Bar
, ArrayBars
);
5590 #include "wx/arrimpl.cpp"
5591 WX_DEFINE_OBJARRAY(ArrayBars
);
5593 static void PrintArray(const wxChar
* name
, const wxArrayString
& array
)
5595 wxPrintf(_T("Dump of the array '%s'\n"), name
);
5597 size_t nCount
= array
.GetCount();
5598 for ( size_t n
= 0; n
< nCount
; n
++ )
5600 wxPrintf(_T("\t%s[%u] = '%s'\n"), name
, n
, array
[n
].c_str());
5604 int wxCMPFUNC_CONV
StringLenCompare(const wxString
& first
,
5605 const wxString
& second
)
5607 return first
.length() - second
.length();
5610 #define TestArrayOf(name) \
5612 static void PrintArray(const wxChar* name, const wxSortedArray##name & array) \
5614 wxPrintf(_T("Dump of the array '%s'\n"), name); \
5616 size_t nCount = array.GetCount(); \
5617 for ( size_t n = 0; n < nCount; n++ ) \
5619 wxPrintf(_T("\t%s[%u] = %d\n"), name, n, array[n]); \
5623 static void PrintArray(const wxChar* name, const wxArray##name & array) \
5625 wxPrintf(_T("Dump of the array '%s'\n"), name); \
5627 size_t nCount = array.GetCount(); \
5628 for ( size_t n = 0; n < nCount; n++ ) \
5630 wxPrintf(_T("\t%s[%u] = %d\n"), name, n, array[n]); \
5634 static void TestArrayOf ## name ## s() \
5636 wxPrintf(_T("*** Testing wxArray%s ***\n"), #name); \
5644 wxPuts(_T("Initially:")); \
5645 PrintArray(_T("a"), a); \
5647 wxPuts(_T("After sort:")); \
5648 a.Sort(name ## Compare); \
5649 PrintArray(_T("a"), a); \
5651 wxPuts(_T("After reverse sort:")); \
5652 a.Sort(name ## RevCompare); \
5653 PrintArray(_T("a"), a); \
5655 wxSortedArray##name b; \
5661 wxPuts(_T("Sorted array initially:")); \
5662 PrintArray(_T("b"), b); \
5665 TestArrayOf(UShort
);
5668 static void TestArrayOfObjects()
5670 wxPuts(_T("*** Testing wxObjArray ***\n"));
5674 Bar
bar("second bar (two copies!)");
5676 wxPrintf(_T("Initially: %u objects in the array, %u objects total.\n"),
5677 bars
.GetCount(), Bar::GetNumber());
5679 bars
.Add(new Bar("first bar"));
5682 wxPrintf(_T("Now: %u objects in the array, %u objects total.\n"),
5683 bars
.GetCount(), Bar::GetNumber());
5685 bars
.RemoveAt(1, bars
.GetCount() - 1);
5687 wxPrintf(_T("After removing all but first element: %u objects in the ")
5688 _T("array, %u objects total.\n"),
5689 bars
.GetCount(), Bar::GetNumber());
5693 wxPrintf(_T("After Empty(): %u objects in the array, %u objects total.\n"),
5694 bars
.GetCount(), Bar::GetNumber());
5697 wxPrintf(_T("Finally: no more objects in the array, %u objects total.\n"),
5701 #endif // TEST_ARRAYS
5703 // ----------------------------------------------------------------------------
5705 // ----------------------------------------------------------------------------
5709 #include "wx/timer.h"
5710 #include "wx/tokenzr.h"
5712 static void TestStringConstruction()
5714 wxPuts(_T("*** Testing wxString constructores ***"));
5716 #define TEST_CTOR(args, res) \
5719 wxPrintf(_T("wxString%s = %s "), #args, s.c_str()); \
5722 wxPuts(_T("(ok)")); \
5726 wxPrintf(_T("(ERROR: should be %s)\n"), res); \
5730 TEST_CTOR((_T('Z'), 4), _T("ZZZZ"));
5731 TEST_CTOR((_T("Hello"), 4), _T("Hell"));
5732 TEST_CTOR((_T("Hello"), 5), _T("Hello"));
5733 // TEST_CTOR((_T("Hello"), 6), _T("Hello")); -- should give assert failure
5735 static const wxChar
*s
= _T("?really!");
5736 const wxChar
*start
= wxStrchr(s
, _T('r'));
5737 const wxChar
*end
= wxStrchr(s
, _T('!'));
5738 TEST_CTOR((start
, end
), _T("really"));
5743 static void TestString()
5753 for (int i
= 0; i
< 1000000; ++i
)
5757 c
= "! How'ya doin'?";
5760 c
= "Hello world! What's up?";
5765 wxPrintf(_T("TestString elapsed time: %ld\n"), sw
.Time());
5768 static void TestPChar()
5776 for (int i
= 0; i
< 1000000; ++i
)
5778 wxStrcpy (a
, _T("Hello"));
5779 wxStrcpy (b
, _T(" world"));
5780 wxStrcpy (c
, _T("! How'ya doin'?"));
5783 wxStrcpy (c
, _T("Hello world! What's up?"));
5784 if (wxStrcmp (c
, a
) == 0)
5785 wxStrcpy (c
, _T("Doh!"));
5788 wxPrintf(_T("TestPChar elapsed time: %ld\n"), sw
.Time());
5791 static void TestStringSub()
5793 wxString
s("Hello, world!");
5795 wxPuts(_T("*** Testing wxString substring extraction ***"));
5797 wxPrintf(_T("String = '%s'\n"), s
.c_str());
5798 wxPrintf(_T("Left(5) = '%s'\n"), s
.Left(5).c_str());
5799 wxPrintf(_T("Right(6) = '%s'\n"), s
.Right(6).c_str());
5800 wxPrintf(_T("Mid(3, 5) = '%s'\n"), s(3, 5).c_str());
5801 wxPrintf(_T("Mid(3) = '%s'\n"), s
.Mid(3).c_str());
5802 wxPrintf(_T("substr(3, 5) = '%s'\n"), s
.substr(3, 5).c_str());
5803 wxPrintf(_T("substr(3) = '%s'\n"), s
.substr(3).c_str());
5805 static const wxChar
*prefixes
[] =
5809 _T("Hello, world!"),
5810 _T("Hello, world!!!"),
5816 for ( size_t n
= 0; n
< WXSIZEOF(prefixes
); n
++ )
5818 wxString prefix
= prefixes
[n
], rest
;
5819 bool rc
= s
.StartsWith(prefix
, &rest
);
5820 wxPrintf(_T("StartsWith('%s') = %s"), prefix
.c_str(), rc
? _T("TRUE") : _T("FALSE"));
5823 wxPrintf(_T(" (the rest is '%s')\n"), rest
.c_str());
5834 static void TestStringFormat()
5836 wxPuts(_T("*** Testing wxString formatting ***"));
5839 s
.Printf(_T("%03d"), 18);
5841 wxPrintf(_T("Number 18: %s\n"), wxString::Format(_T("%03d"), 18).c_str());
5842 wxPrintf(_T("Number 18: %s\n"), s
.c_str());
5847 // returns "not found" for npos, value for all others
5848 static wxString
PosToString(size_t res
)
5850 wxString s
= res
== wxString::npos
? wxString(_T("not found"))
5851 : wxString::Format(_T("%u"), res
);
5855 static void TestStringFind()
5857 wxPuts(_T("*** Testing wxString find() functions ***"));
5859 static const wxChar
*strToFind
= _T("ell");
5860 static const struct StringFindTest
5864 result
; // of searching "ell" in str
5867 { _T("Well, hello world"), 0, 1 },
5868 { _T("Well, hello world"), 6, 7 },
5869 { _T("Well, hello world"), 9, wxString::npos
},
5872 for ( size_t n
= 0; n
< WXSIZEOF(findTestData
); n
++ )
5874 const StringFindTest
& ft
= findTestData
[n
];
5875 size_t res
= wxString(ft
.str
).find(strToFind
, ft
.start
);
5877 wxPrintf(_T("Index of '%s' in '%s' starting from %u is %s "),
5878 strToFind
, ft
.str
, ft
.start
, PosToString(res
).c_str());
5880 size_t resTrue
= ft
.result
;
5881 if ( res
== resTrue
)
5887 wxPrintf(_T("(ERROR: should be %s)\n"),
5888 PosToString(resTrue
).c_str());
5895 static void TestStringTokenizer()
5897 wxPuts(_T("*** Testing wxStringTokenizer ***"));
5899 static const wxChar
*modeNames
[] =
5903 _T("return all empty"),
5908 static const struct StringTokenizerTest
5910 const wxChar
*str
; // string to tokenize
5911 const wxChar
*delims
; // delimiters to use
5912 size_t count
; // count of token
5913 wxStringTokenizerMode mode
; // how should we tokenize it
5914 } tokenizerTestData
[] =
5916 { _T(""), _T(" "), 0 },
5917 { _T("Hello, world"), _T(" "), 2 },
5918 { _T("Hello, world "), _T(" "), 2 },
5919 { _T("Hello, world"), _T(","), 2 },
5920 { _T("Hello, world!"), _T(",!"), 2 },
5921 { _T("Hello,, world!"), _T(",!"), 3 },
5922 { _T("Hello, world!"), _T(",!"), 3, wxTOKEN_RET_EMPTY_ALL
},
5923 { _T("username:password:uid:gid:gecos:home:shell"), _T(":"), 7 },
5924 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 4 },
5925 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 6, wxTOKEN_RET_EMPTY
},
5926 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 9, wxTOKEN_RET_EMPTY_ALL
},
5927 { _T("01/02/99"), _T("/-"), 3 },
5928 { _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS
},
5931 for ( size_t n
= 0; n
< WXSIZEOF(tokenizerTestData
); n
++ )
5933 const StringTokenizerTest
& tt
= tokenizerTestData
[n
];
5934 wxStringTokenizer
tkz(tt
.str
, tt
.delims
, tt
.mode
);
5936 size_t count
= tkz
.CountTokens();
5937 wxPrintf(_T("String '%s' has %u tokens delimited by '%s' (mode = %s) "),
5938 MakePrintable(tt
.str
).c_str(),
5940 MakePrintable(tt
.delims
).c_str(),
5941 modeNames
[tkz
.GetMode()]);
5942 if ( count
== tt
.count
)
5948 wxPrintf(_T("(ERROR: should be %u)\n"), tt
.count
);
5953 // if we emulate strtok(), check that we do it correctly
5954 wxChar
*buf
, *s
= NULL
, *last
;
5956 if ( tkz
.GetMode() == wxTOKEN_STRTOK
)
5958 buf
= new wxChar
[wxStrlen(tt
.str
) + 1];
5959 wxStrcpy(buf
, tt
.str
);
5961 s
= wxStrtok(buf
, tt
.delims
, &last
);
5968 // now show the tokens themselves
5970 while ( tkz
.HasMoreTokens() )
5972 wxString token
= tkz
.GetNextToken();
5974 wxPrintf(_T("\ttoken %u: '%s'"),
5976 MakePrintable(token
).c_str());
5982 wxPuts(_T(" (ok)"));
5986 wxPrintf(_T(" (ERROR: should be %s)\n"), s
);
5989 s
= wxStrtok(NULL
, tt
.delims
, &last
);
5993 // nothing to compare with
5998 if ( count2
!= count
)
6000 wxPuts(_T("\tERROR: token count mismatch"));
6009 static void TestStringReplace()
6011 wxPuts(_T("*** Testing wxString::replace ***"));
6013 static const struct StringReplaceTestData
6015 const wxChar
*original
; // original test string
6016 size_t start
, len
; // the part to replace
6017 const wxChar
*replacement
; // the replacement string
6018 const wxChar
*result
; // and the expected result
6019 } stringReplaceTestData
[] =
6021 { _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") },
6022 { _T("increase"), 0, 2, _T("de"), _T("decrease") },
6023 { _T("wxWindow"), 8, 0, _T("s"), _T("wxWindows") },
6024 { _T("foobar"), 3, 0, _T("-"), _T("foo-bar") },
6025 { _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") },
6028 for ( size_t n
= 0; n
< WXSIZEOF(stringReplaceTestData
); n
++ )
6030 const StringReplaceTestData data
= stringReplaceTestData
[n
];
6032 wxString original
= data
.original
;
6033 original
.replace(data
.start
, data
.len
, data
.replacement
);
6035 wxPrintf(_T("wxString(\"%s\").replace(%u, %u, %s) = %s "),
6036 data
.original
, data
.start
, data
.len
, data
.replacement
,
6039 if ( original
== data
.result
)
6045 wxPrintf(_T("(ERROR: should be '%s')\n"), data
.result
);
6052 static void TestStringMatch()
6054 wxPuts(_T("*** Testing wxString::Matches() ***"));
6056 static const struct StringMatchTestData
6059 const wxChar
*wildcard
;
6061 } stringMatchTestData
[] =
6063 { _T("foobar"), _T("foo*"), 1 },
6064 { _T("foobar"), _T("*oo*"), 1 },
6065 { _T("foobar"), _T("*bar"), 1 },
6066 { _T("foobar"), _T("??????"), 1 },
6067 { _T("foobar"), _T("f??b*"), 1 },
6068 { _T("foobar"), _T("f?b*"), 0 },
6069 { _T("foobar"), _T("*goo*"), 0 },
6070 { _T("foobar"), _T("*foo"), 0 },
6071 { _T("foobarfoo"), _T("*foo"), 1 },
6072 { _T(""), _T("*"), 1 },
6073 { _T(""), _T("?"), 0 },
6076 for ( size_t n
= 0; n
< WXSIZEOF(stringMatchTestData
); n
++ )
6078 const StringMatchTestData
& data
= stringMatchTestData
[n
];
6079 bool matches
= wxString(data
.text
).Matches(data
.wildcard
);
6080 wxPrintf(_T("'%s' %s '%s' (%s)\n"),
6082 matches
? _T("matches") : _T("doesn't match"),
6084 matches
== data
.matches
? _T("ok") : _T("ERROR"));
6090 #endif // TEST_STRINGS
6092 // ----------------------------------------------------------------------------
6094 // ----------------------------------------------------------------------------
6096 #ifdef TEST_SNGLINST
6097 #include "wx/snglinst.h"
6098 #endif // TEST_SNGLINST
6100 int main(int argc
, char **argv
)
6102 wxApp::CheckBuildOptions(wxBuildOptions());
6104 wxInitializer initializer
;
6107 fprintf(stderr
, "Failed to initialize the wxWindows library, aborting.");
6112 #ifdef TEST_SNGLINST
6113 wxSingleInstanceChecker checker
;
6114 if ( checker
.Create(_T(".wxconsole.lock")) )
6116 if ( checker
.IsAnotherRunning() )
6118 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
6123 // wait some time to give time to launch another instance
6124 wxPrintf(_T("Press \"Enter\" to continue..."));
6127 else // failed to create
6129 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
6131 #endif // TEST_SNGLINST
6135 #endif // TEST_CHARSET
6138 TestCmdLineConvert();
6140 #if wxUSE_CMDLINE_PARSER
6141 static const wxCmdLineEntryDesc cmdLineDesc
[] =
6143 { wxCMD_LINE_SWITCH
, _T("h"), _T("help"), _T("show this help message"),
6144 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
6145 { wxCMD_LINE_SWITCH
, _T("v"), _T("verbose"), _T("be verbose") },
6146 { wxCMD_LINE_SWITCH
, _T("q"), _T("quiet"), _T("be quiet") },
6148 { wxCMD_LINE_OPTION
, _T("o"), _T("output"), _T("output file") },
6149 { wxCMD_LINE_OPTION
, _T("i"), _T("input"), _T("input dir") },
6150 { wxCMD_LINE_OPTION
, _T("s"), _T("size"), _T("output block size"),
6151 wxCMD_LINE_VAL_NUMBER
},
6152 { wxCMD_LINE_OPTION
, _T("d"), _T("date"), _T("output file date"),
6153 wxCMD_LINE_VAL_DATE
},
6155 { wxCMD_LINE_PARAM
, NULL
, NULL
, _T("input file"),
6156 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
6162 wxChar
**wargv
= new wxChar
*[argc
+ 1];
6165 for ( int n
= 0; n
< argc
; n
++ )
6167 wxMB2WXbuf warg
= wxConvertMB2WX(argv
[n
]);
6168 wargv
[n
] = wxStrdup(warg
);
6175 #endif // wxUSE_UNICODE
6177 wxCmdLineParser
parser(cmdLineDesc
, argc
, argv
);
6181 for ( int n
= 0; n
< argc
; n
++ )
6186 #endif // wxUSE_UNICODE
6188 parser
.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
6189 wxCMD_LINE_VAL_STRING
,
6190 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
6192 switch ( parser
.Parse() )
6195 wxLogMessage(_T("Help was given, terminating."));
6199 ShowCmdLine(parser
);
6203 wxLogMessage(_T("Syntax error detected, aborting."));
6206 #endif // wxUSE_CMDLINE_PARSER
6208 #endif // TEST_CMDLINE
6216 TestStringConstruction();
6219 TestStringTokenizer();
6220 TestStringReplace();
6226 #endif // TEST_STRINGS
6232 a1
.Add(_T("tiger"));
6234 a1
.Add(_T("lion"), 3);
6236 a1
.Add(_T("human"));
6239 wxPuts(_T("*** Initially:"));
6241 PrintArray(_T("a1"), a1
);
6243 wxArrayString
a2(a1
);
6244 PrintArray(_T("a2"), a2
);
6246 wxSortedArrayString
a3(a1
);
6247 PrintArray(_T("a3"), a3
);
6249 wxPuts(_T("*** After deleting three strings from a1"));
6252 PrintArray(_T("a1"), a1
);
6253 PrintArray(_T("a2"), a2
);
6254 PrintArray(_T("a3"), a3
);
6256 wxPuts(_T("*** After reassigning a1 to a2 and a3"));
6258 PrintArray(_T("a2"), a2
);
6259 PrintArray(_T("a3"), a3
);
6261 wxPuts(_T("*** After sorting a1"));
6263 PrintArray(_T("a1"), a1
);
6265 wxPuts(_T("*** After sorting a1 in reverse order"));
6267 PrintArray(_T("a1"), a1
);
6269 wxPuts(_T("*** After sorting a1 by the string length"));
6270 a1
.Sort(StringLenCompare
);
6271 PrintArray(_T("a1"), a1
);
6273 TestArrayOfObjects();
6274 TestArrayOfUShorts();
6278 #endif // TEST_ARRAYS
6289 #ifdef TEST_DLLLOADER
6291 #endif // TEST_DLLLOADER
6295 #endif // TEST_ENVIRON
6299 #endif // TEST_EXECUTE
6301 #ifdef TEST_FILECONF
6303 #endif // TEST_FILECONF
6311 #endif // TEST_LOCALE
6315 for ( size_t n
= 0; n
< 8000; n
++ )
6317 s
<< (wxChar
)(_T('A') + (n
% 26));
6321 msg
.Printf(_T("A very very long message: '%s', the end!\n"), s
.c_str());
6323 // this one shouldn't be truncated
6326 // but this one will because log functions use fixed size buffer
6327 // (note that it doesn't need '\n' at the end neither - will be added
6329 wxLogMessage(_T("A very very long message 2: '%s', the end!"), s
.c_str());
6341 #ifdef TEST_FILENAME
6345 fn
.Assign(_T("c:\\foo"), _T("bar.baz"));
6346 fn
.Assign(_T("/u/os9-port/Viewer/tvision/WEI2HZ-3B3-14_05-04-00MSC1.asc"));
6351 TestFileNameConstruction();
6354 TestFileNameConstruction();
6355 TestFileNameMakeRelative();
6356 TestFileNameSplit();
6359 TestFileNameComparison();
6360 TestFileNameOperations();
6362 #endif // TEST_FILENAME
6364 #ifdef TEST_FILETIME
6368 #endif // TEST_FILETIME
6371 wxLog::AddTraceMask(FTP_TRACE_MASK
);
6372 if ( TestFtpConnect() )
6383 if ( TEST_INTERACTIVE
)
6384 TestFtpInteractive();
6386 //else: connecting to the FTP server failed
6392 #ifdef TEST_LONGLONG
6393 // seed pseudo random generator
6394 srand((unsigned)time(NULL
));
6403 TestMultiplication();
6406 TestLongLongConversion();
6407 TestBitOperations();
6408 TestLongLongComparison();
6409 TestLongLongPrint();
6411 #endif // TEST_LONGLONG
6419 #endif // TEST_HASHMAP
6422 wxLog::AddTraceMask(_T("mime"));
6427 TestMimeAssociate();
6432 #ifdef TEST_INFO_FUNCTIONS
6438 if ( TEST_INTERACTIVE
)
6441 #endif // TEST_INFO_FUNCTIONS
6443 #ifdef TEST_PATHLIST
6445 #endif // TEST_PATHLIST
6453 #endif // TEST_PRINTF
6457 #endif // TEST_REGCONF
6460 // TODO: write a real test using src/regex/tests file
6465 TestRegExSubmatch();
6466 TestRegExReplacement();
6468 if ( TEST_INTERACTIVE
)
6469 TestRegExInteractive();
6471 #endif // TEST_REGEX
6473 #ifdef TEST_REGISTRY
6475 TestRegistryAssociation();
6476 #endif // TEST_REGISTRY
6481 #endif // TEST_SOCKETS
6489 #endif // TEST_STREAMS
6492 int nCPUs
= wxThread::GetCPUCount();
6493 wxPrintf(_T("This system has %d CPUs\n"), nCPUs
);
6495 wxThread::SetConcurrency(nCPUs
);
6497 TestDetachedThreads();
6500 TestJoinableThreads();
6501 TestThreadSuspend();
6503 TestThreadConditions();
6507 #endif // TEST_THREADS
6511 #endif // TEST_TIMER
6513 #ifdef TEST_DATETIME
6526 TestTimeArithmetics();
6529 TestTimeSpanFormat();
6536 if ( TEST_INTERACTIVE
)
6537 TestDateTimeInteractive();
6538 #endif // TEST_DATETIME
6541 wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
6543 #endif // TEST_USLEEP
6548 #endif // TEST_VCARD
6552 #endif // TEST_VOLUME
6555 TestUnicodeToFromAscii();
6556 #endif // TEST_UNICODE
6560 TestEncodingConverter();
6561 #endif // TEST_WCHAR
6564 TestZipStreamRead();
6565 TestZipFileSystem();
6569 TestZlibStreamWrite();
6570 TestZlibStreamRead();