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
85 // #define TEST_VCARD -- don't enable this (VZ)
91 static const bool TEST_ALL
= TRUE
;
95 static const bool TEST_ALL
= FALSE
;
98 // some tests are interactive, define this to run them
99 #ifdef TEST_INTERACTIVE
100 #undef TEST_INTERACTIVE
102 static const bool TEST_INTERACTIVE
= TRUE
;
104 static const bool TEST_INTERACTIVE
= FALSE
;
107 // ----------------------------------------------------------------------------
108 // test class for container objects
109 // ----------------------------------------------------------------------------
111 #if defined(TEST_ARRAYS) || defined(TEST_LIST)
113 class Bar
// Foo is already taken in the hash test
116 Bar(const wxString
& name
) : m_name(name
) { ms_bars
++; }
117 ~Bar() { ms_bars
--; }
119 static size_t GetNumber() { return ms_bars
; }
121 const char *GetName() const { return m_name
; }
126 static size_t ms_bars
;
129 size_t Bar::ms_bars
= 0;
131 #endif // defined(TEST_ARRAYS) || defined(TEST_LIST)
133 // ============================================================================
135 // ============================================================================
137 // ----------------------------------------------------------------------------
139 // ----------------------------------------------------------------------------
141 #if defined(TEST_STRINGS) || defined(TEST_SOCKETS)
143 // replace TABs with \t and CRs with \n
144 static wxString
MakePrintable(const wxChar
*s
)
147 (void)str
.Replace(_T("\t"), _T("\\t"));
148 (void)str
.Replace(_T("\n"), _T("\\n"));
149 (void)str
.Replace(_T("\r"), _T("\\r"));
154 #endif // MakePrintable() is used
156 // ----------------------------------------------------------------------------
157 // wxFontMapper::CharsetToEncoding
158 // ----------------------------------------------------------------------------
162 #include "wx/fontmap.h"
164 static void TestCharset()
166 static const wxChar
*charsets
[] =
168 // some vali charsets
177 // and now some bogus ones
184 for ( size_t n
= 0; n
< WXSIZEOF(charsets
); n
++ )
186 wxFontEncoding enc
= wxTheFontMapper
->CharsetToEncoding(charsets
[n
]);
187 wxPrintf(_T("Charset: %s\tEncoding: %s (%s)\n"),
189 wxTheFontMapper
->GetEncodingName(enc
).c_str(),
190 wxTheFontMapper
->GetEncodingDescription(enc
).c_str());
194 #endif // TEST_CHARSET
196 // ----------------------------------------------------------------------------
198 // ----------------------------------------------------------------------------
202 #include "wx/cmdline.h"
203 #include "wx/datetime.h"
205 #if wxUSE_CMDLINE_PARSER
207 static void ShowCmdLine(const wxCmdLineParser
& parser
)
209 wxString s
= "Input files: ";
211 size_t count
= parser
.GetParamCount();
212 for ( size_t param
= 0; param
< count
; param
++ )
214 s
<< parser
.GetParam(param
) << ' ';
218 << "Verbose:\t" << (parser
.Found("v") ? "yes" : "no") << '\n'
219 << "Quiet:\t" << (parser
.Found("q") ? "yes" : "no") << '\n';
224 if ( parser
.Found("o", &strVal
) )
225 s
<< "Output file:\t" << strVal
<< '\n';
226 if ( parser
.Found("i", &strVal
) )
227 s
<< "Input dir:\t" << strVal
<< '\n';
228 if ( parser
.Found("s", &lVal
) )
229 s
<< "Size:\t" << lVal
<< '\n';
230 if ( parser
.Found("d", &dt
) )
231 s
<< "Date:\t" << dt
.FormatISODate() << '\n';
232 if ( parser
.Found("project_name", &strVal
) )
233 s
<< "Project:\t" << strVal
<< '\n';
238 #endif // wxUSE_CMDLINE_PARSER
240 static void TestCmdLineConvert()
242 static const char *cmdlines
[] =
245 "-a \"-bstring 1\" -c\"string 2\" \"string 3\"",
246 "literal \\\" and \"\"",
249 for ( size_t n
= 0; n
< WXSIZEOF(cmdlines
); n
++ )
251 const char *cmdline
= cmdlines
[n
];
252 printf("Parsing: %s\n", cmdline
);
253 wxArrayString args
= wxCmdLineParser::ConvertStringToArgs(cmdline
);
255 size_t count
= args
.GetCount();
256 printf("\targc = %u\n", count
);
257 for ( size_t arg
= 0; arg
< count
; arg
++ )
259 printf("\targv[%u] = %s\n", arg
, args
[arg
].c_str());
264 #endif // TEST_CMDLINE
266 // ----------------------------------------------------------------------------
268 // ----------------------------------------------------------------------------
275 static const wxChar
*ROOTDIR
= _T("/");
276 static const wxChar
*TESTDIR
= _T("/usr");
277 #elif defined(__WXMSW__)
278 static const wxChar
*ROOTDIR
= _T("c:\\");
279 static const wxChar
*TESTDIR
= _T("d:\\");
281 #error "don't know where the root directory is"
284 static void TestDirEnumHelper(wxDir
& dir
,
285 int flags
= wxDIR_DEFAULT
,
286 const wxString
& filespec
= wxEmptyString
)
290 if ( !dir
.IsOpened() )
293 bool cont
= dir
.GetFirst(&filename
, filespec
, flags
);
296 printf("\t%s\n", filename
.c_str());
298 cont
= dir
.GetNext(&filename
);
304 static void TestDirEnum()
306 puts("*** Testing wxDir::GetFirst/GetNext ***");
308 wxDir
dir(wxGetCwd());
310 puts("Enumerating everything in current directory:");
311 TestDirEnumHelper(dir
);
313 puts("Enumerating really everything in current directory:");
314 TestDirEnumHelper(dir
, wxDIR_DEFAULT
| wxDIR_DOTDOT
);
316 puts("Enumerating object files in current directory:");
317 TestDirEnumHelper(dir
, wxDIR_DEFAULT
, "*.o");
319 puts("Enumerating directories in current directory:");
320 TestDirEnumHelper(dir
, wxDIR_DIRS
);
322 puts("Enumerating files in current directory:");
323 TestDirEnumHelper(dir
, wxDIR_FILES
);
325 puts("Enumerating files including hidden in current directory:");
326 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
330 puts("Enumerating everything in root directory:");
331 TestDirEnumHelper(dir
, wxDIR_DEFAULT
);
333 puts("Enumerating directories in root directory:");
334 TestDirEnumHelper(dir
, wxDIR_DIRS
);
336 puts("Enumerating files in root directory:");
337 TestDirEnumHelper(dir
, wxDIR_FILES
);
339 puts("Enumerating files including hidden in root directory:");
340 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
342 puts("Enumerating files in non existing directory:");
343 wxDir
dirNo("nosuchdir");
344 TestDirEnumHelper(dirNo
);
347 class DirPrintTraverser
: public wxDirTraverser
350 virtual wxDirTraverseResult
OnFile(const wxString
& filename
)
352 return wxDIR_CONTINUE
;
355 virtual wxDirTraverseResult
OnDir(const wxString
& dirname
)
357 wxString path
, name
, ext
;
358 wxSplitPath(dirname
, &path
, &name
, &ext
);
361 name
<< _T('.') << ext
;
364 for ( const wxChar
*p
= path
.c_str(); *p
; p
++ )
366 if ( wxIsPathSeparator(*p
) )
370 printf("%s%s\n", indent
.c_str(), name
.c_str());
372 return wxDIR_CONTINUE
;
376 static void TestDirTraverse()
378 puts("*** Testing wxDir::Traverse() ***");
382 size_t n
= wxDir::GetAllFiles(TESTDIR
, &files
);
383 printf("There are %u files under '%s'\n", n
, TESTDIR
);
386 printf("First one is '%s'\n", files
[0u].c_str());
387 printf(" last one is '%s'\n", files
[n
- 1].c_str());
390 // enum again with custom traverser
392 DirPrintTraverser traverser
;
393 dir
.Traverse(traverser
, _T(""), wxDIR_DIRS
| wxDIR_HIDDEN
);
398 // ----------------------------------------------------------------------------
400 // ----------------------------------------------------------------------------
402 #ifdef TEST_DLLLOADER
404 #include "wx/dynlib.h"
406 static void TestDllLoad()
408 #if defined(__WXMSW__)
409 static const wxChar
*LIB_NAME
= _T("kernel32.dll");
410 static const wxChar
*FUNC_NAME
= _T("lstrlenA");
411 #elif defined(__UNIX__)
412 // weird: using just libc.so does *not* work!
413 static const wxChar
*LIB_NAME
= _T("/lib/libc-2.0.7.so");
414 static const wxChar
*FUNC_NAME
= _T("strlen");
416 #error "don't know how to test wxDllLoader on this platform"
419 puts("*** testing wxDllLoader ***\n");
421 wxDllType dllHandle
= wxDllLoader::LoadLibrary(LIB_NAME
);
424 wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME
);
428 typedef int (*strlenType
)(const char *);
429 strlenType pfnStrlen
= (strlenType
)wxDllLoader::GetSymbol(dllHandle
, FUNC_NAME
);
432 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
433 FUNC_NAME
, LIB_NAME
);
437 if ( pfnStrlen("foo") != 3 )
439 wxPrintf(_T("ERROR: loaded function is not strlen()!\n"));
447 wxDllLoader::UnloadLibrary(dllHandle
);
451 #endif // TEST_DLLLOADER
453 // ----------------------------------------------------------------------------
455 // ----------------------------------------------------------------------------
459 #include "wx/utils.h"
461 static wxString
MyGetEnv(const wxString
& var
)
464 if ( !wxGetEnv(var
, &val
) )
467 val
= wxString(_T('\'')) + val
+ _T('\'');
472 static void TestEnvironment()
474 const wxChar
*var
= _T("wxTestVar");
476 puts("*** testing environment access functions ***");
478 printf("Initially getenv(%s) = %s\n", var
, MyGetEnv(var
).c_str());
479 wxSetEnv(var
, _T("value for wxTestVar"));
480 printf("After wxSetEnv: getenv(%s) = %s\n", var
, MyGetEnv(var
).c_str());
481 wxSetEnv(var
, _T("another value"));
482 printf("After 2nd wxSetEnv: getenv(%s) = %s\n", var
, MyGetEnv(var
).c_str());
484 printf("After wxUnsetEnv: getenv(%s) = %s\n", var
, MyGetEnv(var
).c_str());
485 printf("PATH = %s\n", MyGetEnv(_T("PATH")).c_str());
488 #endif // TEST_ENVIRON
490 // ----------------------------------------------------------------------------
492 // ----------------------------------------------------------------------------
496 #include "wx/utils.h"
498 static void TestExecute()
500 puts("*** testing wxExecute ***");
503 #define COMMAND "cat -n ../../Makefile" // "echo hi"
504 #define SHELL_COMMAND "echo hi from shell"
505 #define REDIRECT_COMMAND COMMAND // "date"
506 #elif defined(__WXMSW__)
507 #define COMMAND "command.com -c 'echo hi'"
508 #define SHELL_COMMAND "echo hi"
509 #define REDIRECT_COMMAND COMMAND
511 #error "no command to exec"
514 printf("Testing wxShell: ");
516 if ( wxShell(SHELL_COMMAND
) )
521 printf("Testing wxExecute: ");
523 if ( wxExecute(COMMAND
, TRUE
/* sync */) == 0 )
528 #if 0 // no, it doesn't work (yet?)
529 printf("Testing async wxExecute: ");
531 if ( wxExecute(COMMAND
) != 0 )
532 puts("Ok (command launched).");
537 printf("Testing wxExecute with redirection:\n");
538 wxArrayString output
;
539 if ( wxExecute(REDIRECT_COMMAND
, output
) != 0 )
545 size_t count
= output
.GetCount();
546 for ( size_t n
= 0; n
< count
; n
++ )
548 printf("\t%s\n", output
[n
].c_str());
555 #endif // TEST_EXECUTE
557 // ----------------------------------------------------------------------------
559 // ----------------------------------------------------------------------------
564 #include "wx/ffile.h"
565 #include "wx/textfile.h"
567 static void TestFileRead()
569 puts("*** wxFile read test ***");
571 wxFile
file(_T("testdata.fc"));
572 if ( file
.IsOpened() )
574 printf("File length: %lu\n", file
.Length());
576 puts("File dump:\n----------");
578 static const off_t len
= 1024;
582 off_t nRead
= file
.Read(buf
, len
);
583 if ( nRead
== wxInvalidOffset
)
585 printf("Failed to read the file.");
589 fwrite(buf
, nRead
, 1, stdout
);
599 printf("ERROR: can't open test file.\n");
605 static void TestTextFileRead()
607 puts("*** wxTextFile read test ***");
609 wxTextFile
file(_T("testdata.fc"));
612 printf("Number of lines: %u\n", file
.GetLineCount());
613 printf("Last line: '%s'\n", file
.GetLastLine().c_str());
617 puts("\nDumping the entire file:");
618 for ( s
= file
.GetFirstLine(); !file
.Eof(); s
= file
.GetNextLine() )
620 printf("%6u: %s\n", file
.GetCurrentLine() + 1, s
.c_str());
622 printf("%6u: %s\n", file
.GetCurrentLine() + 1, s
.c_str());
624 puts("\nAnd now backwards:");
625 for ( s
= file
.GetLastLine();
626 file
.GetCurrentLine() != 0;
627 s
= file
.GetPrevLine() )
629 printf("%6u: %s\n", file
.GetCurrentLine() + 1, s
.c_str());
631 printf("%6u: %s\n", file
.GetCurrentLine() + 1, s
.c_str());
635 printf("ERROR: can't open '%s'\n", file
.GetName());
641 static void TestFileCopy()
643 puts("*** Testing wxCopyFile ***");
645 static const wxChar
*filename1
= _T("testdata.fc");
646 static const wxChar
*filename2
= _T("test2");
647 if ( !wxCopyFile(filename1
, filename2
) )
649 puts("ERROR: failed to copy file");
653 wxFFile
f1(filename1
, "rb"),
656 if ( !f1
.IsOpened() || !f2
.IsOpened() )
658 puts("ERROR: failed to open file(s)");
663 if ( !f1
.ReadAll(&s1
) || !f2
.ReadAll(&s2
) )
665 puts("ERROR: failed to read file(s)");
669 if ( (s1
.length() != s2
.length()) ||
670 (memcmp(s1
.c_str(), s2
.c_str(), s1
.length()) != 0) )
672 puts("ERROR: copy error!");
676 puts("File was copied ok.");
682 if ( !wxRemoveFile(filename2
) )
684 puts("ERROR: failed to remove the file");
692 // ----------------------------------------------------------------------------
694 // ----------------------------------------------------------------------------
698 #include "wx/confbase.h"
699 #include "wx/fileconf.h"
701 static const struct FileConfTestData
703 const wxChar
*name
; // value name
704 const wxChar
*value
; // the value from the file
707 { _T("value1"), _T("one") },
708 { _T("value2"), _T("two") },
709 { _T("novalue"), _T("default") },
712 static void TestFileConfRead()
714 puts("*** testing wxFileConfig loading/reading ***");
716 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
717 _T("testdata.fc"), wxEmptyString
,
718 wxCONFIG_USE_RELATIVE_PATH
);
720 // test simple reading
721 puts("\nReading config file:");
722 wxString
defValue(_T("default")), value
;
723 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
725 const FileConfTestData
& data
= fcTestData
[n
];
726 value
= fileconf
.Read(data
.name
, defValue
);
727 printf("\t%s = %s ", data
.name
, value
.c_str());
728 if ( value
== data
.value
)
734 printf("(ERROR: should be %s)\n", data
.value
);
738 // test enumerating the entries
739 puts("\nEnumerating all root entries:");
742 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
745 printf("\t%s = %s\n",
747 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
749 cont
= fileconf
.GetNextEntry(name
, dummy
);
753 #endif // TEST_FILECONF
755 // ----------------------------------------------------------------------------
757 // ----------------------------------------------------------------------------
761 #include "wx/filename.h"
763 static void DumpFileName(const wxFileName
& fn
)
765 wxString full
= fn
.GetFullPath();
767 wxString vol
, path
, name
, ext
;
768 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
770 wxPrintf(_T("Filename '%s' -> vol '%s', path '%s', name '%s', ext '%s'\n"),
771 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
774 static struct FileNameInfo
776 const wxChar
*fullname
;
777 const wxChar
*volume
;
786 { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), TRUE
, wxPATH_UNIX
},
787 { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), TRUE
, wxPATH_UNIX
},
788 { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), TRUE
, wxPATH_UNIX
},
789 { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), FALSE
, wxPATH_UNIX
},
790 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_UNIX
},
791 { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), TRUE
, wxPATH_UNIX
},
792 { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), TRUE
, wxPATH_UNIX
},
793 { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), FALSE
, wxPATH_UNIX
},
794 { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), TRUE
, wxPATH_UNIX
},
796 // Windows file names
797 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
798 { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
799 { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
800 { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
801 { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), TRUE
, wxPATH_DOS
},
802 { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
805 { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE
, wxPATH_MAC
},
806 { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), TRUE
, wxPATH_MAC
},
807 { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), TRUE
, wxPATH_MAC
},
808 { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), FALSE
, wxPATH_MAC
},
809 { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE
, wxPATH_MAC
},
810 { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE
, wxPATH_MAC
},
813 { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), TRUE
, wxPATH_VMS
},
814 { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), FALSE
, wxPATH_VMS
},
817 static void TestFileNameConstruction()
819 puts("*** testing wxFileName construction ***");
821 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
823 const FileNameInfo
& fni
= filenames
[n
];
825 wxFileName
fn(fni
.fullname
, fni
.format
);
827 wxString fullname
= fn
.GetFullPath(fni
.format
);
828 if ( fullname
!= fni
.fullname
)
830 printf("ERROR: fullname should be '%s'\n", fni
.fullname
);
833 bool isAbsolute
= fn
.IsAbsolute();
834 printf("'%s' is %s (%s)\n\t",
836 isAbsolute
? "absolute" : "relative",
837 isAbsolute
== fni
.isAbsolute
? "ok" : "ERROR");
839 if ( !fn
.Normalize(wxPATH_NORM_ALL
, _T(""), fni
.format
) )
841 puts("ERROR (couldn't be normalized)");
845 printf("normalized: '%s'\n", fn
.GetFullPath(fni
.format
).c_str());
852 static void TestFileNameSplit()
854 puts("*** testing wxFileName splitting ***");
856 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
858 const FileNameInfo
& fni
= filenames
[n
];
859 wxString volume
, path
, name
, ext
;
860 wxFileName::SplitPath(fni
.fullname
,
861 &volume
, &path
, &name
, &ext
, fni
.format
);
863 printf("%s -> volume = '%s', path = '%s', name = '%s', ext = '%s'",
865 volume
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
867 if ( volume
!= fni
.volume
)
868 printf(" (ERROR: volume = '%s')", fni
.volume
);
869 if ( path
!= fni
.path
)
870 printf(" (ERROR: path = '%s')", fni
.path
);
871 if ( name
!= fni
.name
)
872 printf(" (ERROR: name = '%s')", fni
.name
);
873 if ( ext
!= fni
.ext
)
874 printf(" (ERROR: ext = '%s')", fni
.ext
);
880 static void TestFileNameTemp()
882 puts("*** testing wxFileName temp file creation ***");
884 static const char *tmpprefixes
[] =
890 "/tmp/foo/bar", // this one must be an error
893 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
895 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
898 printf("Prefix '%s'\t-> temp file '%s'\n",
899 tmpprefixes
[n
], path
.c_str());
901 if ( !wxRemoveFile(path
) )
903 wxLogWarning("Failed to remove temp file '%s'", path
.c_str());
909 static void TestFileNameMakeRelative()
911 puts("*** testing wxFileName::MakeRelativeTo() ***");
913 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
915 const FileNameInfo
& fni
= filenames
[n
];
917 wxFileName
fn(fni
.fullname
, fni
.format
);
919 // choose the base dir of the same format
921 switch ( fni
.format
)
933 // TODO: I don't know how this is supposed to work there
936 case wxPATH_NATIVE
: // make gcc happy
938 wxFAIL_MSG( "unexpected path format" );
941 printf("'%s' relative to '%s': ",
942 fn
.GetFullPath(fni
.format
).c_str(), base
.c_str());
944 if ( !fn
.MakeRelativeTo(base
, fni
.format
) )
950 printf("'%s'\n", fn
.GetFullPath(fni
.format
).c_str());
955 static void TestFileNameComparison()
960 static void TestFileNameOperations()
965 static void TestFileNameCwd()
970 #endif // TEST_FILENAME
972 // ----------------------------------------------------------------------------
973 // wxFileName time functions
974 // ----------------------------------------------------------------------------
978 #include <wx/filename.h>
979 #include <wx/datetime.h>
981 static void TestFileGetTimes()
983 wxFileName
fn(_T("testdata.fc"));
985 wxDateTime dtAccess
, dtMod
, dtChange
;
986 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtChange
) )
988 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
992 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
994 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
995 wxPrintf(_T("Access: \t%s\n"), dtAccess
.Format(fmt
).c_str());
996 wxPrintf(_T("Mod/creation:\t%s\n"), dtMod
.Format(fmt
).c_str());
997 wxPrintf(_T("Change: \t%s\n"), dtChange
.Format(fmt
).c_str());
1001 static void TestFileSetTimes()
1003 wxFileName
fn(_T("testdata.fc"));
1007 wxPrintf(_T("ERROR: Touch() failed.\n"));
1011 #endif // TEST_FILETIME
1013 // ----------------------------------------------------------------------------
1015 // ----------------------------------------------------------------------------
1019 #include "wx/hash.h"
1023 Foo(int n_
) { n
= n_
; count
++; }
1028 static size_t count
;
1031 size_t Foo::count
= 0;
1033 WX_DECLARE_LIST(Foo
, wxListFoos
);
1034 WX_DECLARE_HASH(Foo
, wxListFoos
, wxHashFoos
);
1036 #include "wx/listimpl.cpp"
1038 WX_DEFINE_LIST(wxListFoos
);
1040 static void TestHash()
1042 puts("*** Testing wxHashTable ***\n");
1046 hash
.DeleteContents(TRUE
);
1048 printf("Hash created: %u foos in hash, %u foos totally\n",
1049 hash
.GetCount(), Foo::count
);
1051 static const int hashTestData
[] =
1053 0, 1, 17, -2, 2, 4, -4, 345, 3, 3, 2, 1,
1057 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1059 hash
.Put(hashTestData
[n
], n
, new Foo(n
));
1062 printf("Hash filled: %u foos in hash, %u foos totally\n",
1063 hash
.GetCount(), Foo::count
);
1065 puts("Hash access test:");
1066 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1068 printf("\tGetting element with key %d, value %d: ",
1069 hashTestData
[n
], n
);
1070 Foo
*foo
= hash
.Get(hashTestData
[n
], n
);
1073 printf("ERROR, not found.\n");
1077 printf("%d (%s)\n", foo
->n
,
1078 (size_t)foo
->n
== n
? "ok" : "ERROR");
1082 printf("\nTrying to get an element not in hash: ");
1084 if ( hash
.Get(1234) || hash
.Get(1, 0) )
1086 puts("ERROR: found!");
1090 puts("ok (not found)");
1094 printf("Hash destroyed: %u foos left\n", Foo::count
);
1099 // ----------------------------------------------------------------------------
1101 // ----------------------------------------------------------------------------
1105 #include "wx/hashmap.h"
1107 // test compilation of basic map types
1108 WX_DECLARE_HASH_MAP( int*, int*, wxPointerHash
, wxPointerEqual
, myPtrHashMap
);
1109 WX_DECLARE_HASH_MAP( long, long, wxIntegerHash
, wxIntegerEqual
, myLongHashMap
);
1110 WX_DECLARE_HASH_MAP( unsigned long, unsigned, wxIntegerHash
, wxIntegerEqual
,
1111 myUnsignedHashMap
);
1112 WX_DECLARE_HASH_MAP( unsigned int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1114 WX_DECLARE_HASH_MAP( int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1116 WX_DECLARE_HASH_MAP( short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1118 WX_DECLARE_HASH_MAP( unsigned short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1122 // WX_DECLARE_HASH_MAP( wxString, wxString, wxStringHash, wxStringEqual,
1123 // myStringHashMap );
1124 WX_DECLARE_STRING_HASH_MAP(wxString
, myStringHashMap
);
1126 typedef myStringHashMap::iterator Itor
;
1128 static void TestHashMap()
1130 puts("*** Testing wxHashMap ***\n");
1131 myStringHashMap
sh(0); // as small as possible
1134 const size_t count
= 10000;
1136 // init with some data
1137 for( i
= 0; i
< count
; ++i
)
1139 buf
.Printf(wxT("%d"), i
);
1140 sh
[buf
] = wxT("A") + buf
+ wxT("C");
1143 // test that insertion worked
1144 if( sh
.size() != count
)
1146 printf("*** ERROR: %u ELEMENTS, SHOULD BE %u ***\n", sh
.size(), count
);
1149 for( i
= 0; i
< count
; ++i
)
1151 buf
.Printf(wxT("%d"), i
);
1152 if( sh
[buf
] != wxT("A") + buf
+ wxT("C") )
1154 printf("*** ERROR INSERTION BROKEN! STOPPING NOW! ***\n");
1159 // check that iterators work
1161 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1165 printf("*** ERROR ITERATORS DO NOT TERMINATE! STOPPING NOW! ***\n");
1169 if( it
->second
!= sh
[it
->first
] )
1171 printf("*** ERROR ITERATORS BROKEN! STOPPING NOW! ***\n");
1176 if( sh
.size() != i
)
1178 printf("*** ERROR: %u ELEMENTS ITERATED, SHOULD BE %u ***\n", i
, count
);
1181 // test copy ctor, assignment operator
1182 myStringHashMap
h1( sh
), h2( 0 );
1185 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1187 if( h1
[it
->first
] != it
->second
)
1189 printf("*** ERROR: COPY CTOR BROKEN %s ***\n", it
->first
.c_str());
1192 if( h2
[it
->first
] != it
->second
)
1194 printf("*** ERROR: OPERATOR= BROKEN %s ***\n", it
->first
.c_str());
1199 for( i
= 0; i
< count
; ++i
)
1201 buf
.Printf(wxT("%d"), i
);
1202 size_t sz
= sh
.size();
1204 // test find() and erase(it)
1207 it
= sh
.find( buf
);
1208 if( it
!= sh
.end() )
1212 if( sh
.find( buf
) != sh
.end() )
1214 printf("*** ERROR: FOUND DELETED ELEMENT %u ***\n", i
);
1218 printf("*** ERROR: CANT FIND ELEMENT %u ***\n", i
);
1223 size_t c
= sh
.erase( buf
);
1225 printf("*** ERROR: SHOULD RETURN 1 ***\n");
1227 if( sh
.find( buf
) != sh
.end() )
1229 printf("*** ERROR: FOUND DELETED ELEMENT %u ***\n", i
);
1233 // count should decrease
1234 if( sh
.size() != sz
- 1 )
1236 printf("*** ERROR: COUNT DID NOT DECREASE ***\n");
1240 printf("*** Finished testing wxHashMap ***\n");
1243 #endif // TEST_HASHMAP
1245 // ----------------------------------------------------------------------------
1247 // ----------------------------------------------------------------------------
1251 #include "wx/list.h"
1253 WX_DECLARE_LIST(Bar
, wxListBars
);
1254 #include "wx/listimpl.cpp"
1255 WX_DEFINE_LIST(wxListBars
);
1257 static void TestListCtor()
1259 puts("*** Testing wxList construction ***\n");
1263 list1
.Append(new Bar(_T("first")));
1264 list1
.Append(new Bar(_T("second")));
1266 printf("After 1st list creation: %u objects in the list, %u objects total.\n",
1267 list1
.GetCount(), Bar::GetNumber());
1272 printf("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n",
1273 list1
.GetCount(), list2
.GetCount(), Bar::GetNumber());
1275 list1
.DeleteContents(TRUE
);
1278 printf("After list destruction: %u objects left.\n", Bar::GetNumber());
1283 // ----------------------------------------------------------------------------
1285 // ----------------------------------------------------------------------------
1289 #include "wx/intl.h"
1290 #include "wx/utils.h" // for wxSetEnv
1292 static wxLocale
gs_localeDefault(wxLANGUAGE_ENGLISH
);
1294 // find the name of the language from its value
1295 static const char *GetLangName(int lang
)
1297 static const char *languageNames
[] =
1318 "ARABIC_SAUDI_ARABIA",
1343 "CHINESE_SIMPLIFIED",
1344 "CHINESE_TRADITIONAL",
1347 "CHINESE_SINGAPORE",
1358 "ENGLISH_AUSTRALIA",
1362 "ENGLISH_CARIBBEAN",
1366 "ENGLISH_NEW_ZEALAND",
1367 "ENGLISH_PHILIPPINES",
1368 "ENGLISH_SOUTH_AFRICA",
1380 "FRENCH_LUXEMBOURG",
1389 "GERMAN_LIECHTENSTEIN",
1390 "GERMAN_LUXEMBOURG",
1431 "MALAY_BRUNEI_DARUSSALAM",
1443 "NORWEGIAN_NYNORSK",
1450 "PORTUGUESE_BRAZILIAN",
1475 "SPANISH_ARGENTINA",
1479 "SPANISH_COSTA_RICA",
1480 "SPANISH_DOMINICAN_REPUBLIC",
1482 "SPANISH_EL_SALVADOR",
1483 "SPANISH_GUATEMALA",
1487 "SPANISH_NICARAGUA",
1491 "SPANISH_PUERTO_RICO",
1494 "SPANISH_VENEZUELA",
1531 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1532 return languageNames
[lang
];
1537 static void TestDefaultLang()
1539 puts("*** Testing wxLocale::GetSystemLanguage ***");
1541 static const wxChar
*langStrings
[] =
1543 NULL
, // system default
1550 _T("de_DE.iso88591"),
1552 _T("?"), // invalid lang spec
1553 _T("klingonese"), // I bet on some systems it does exist...
1556 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1557 wxLocale::GetSystemEncodingName().c_str(),
1558 wxLocale::GetSystemEncoding());
1560 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1562 const char *langStr
= langStrings
[n
];
1565 // FIXME: this doesn't do anything at all under Windows, we need
1566 // to create a new wxLocale!
1567 wxSetEnv(_T("LC_ALL"), langStr
);
1570 int lang
= gs_localeDefault
.GetSystemLanguage();
1571 printf("Locale for '%s' is %s.\n",
1572 langStr
? langStr
: "system default", GetLangName(lang
));
1576 #endif // TEST_LOCALE
1578 // ----------------------------------------------------------------------------
1580 // ----------------------------------------------------------------------------
1584 #include "wx/mimetype.h"
1586 static void TestMimeEnum()
1588 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1590 wxArrayString mimetypes
;
1592 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1594 printf("*** All %u known filetypes: ***\n", count
);
1599 for ( size_t n
= 0; n
< count
; n
++ )
1601 wxFileType
*filetype
=
1602 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1605 printf("nothing known about the filetype '%s'!\n",
1606 mimetypes
[n
].c_str());
1610 filetype
->GetDescription(&desc
);
1611 filetype
->GetExtensions(exts
);
1613 filetype
->GetIcon(NULL
);
1616 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1619 extsAll
<< _T(", ");
1623 printf("\t%s: %s (%s)\n",
1624 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
1630 static void TestMimeOverride()
1632 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
1634 static const wxChar
*mailcap
= _T("/tmp/mailcap");
1635 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
1637 if ( wxFile::Exists(mailcap
) )
1638 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
1640 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
1642 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
1645 if ( wxFile::Exists(mimetypes
) )
1646 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
1648 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
1650 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
1656 static void TestMimeFilename()
1658 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
1660 static const wxChar
*filenames
[] =
1667 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1669 const wxString fname
= filenames
[n
];
1670 wxString ext
= fname
.AfterLast(_T('.'));
1671 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
1674 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
1679 if ( !ft
->GetDescription(&desc
) )
1680 desc
= _T("<no description>");
1683 if ( !ft
->GetOpenCommand(&cmd
,
1684 wxFileType::MessageParameters(fname
, _T(""))) )
1685 cmd
= _T("<no command available>");
1687 wxPrintf(_T("To open %s (%s) do '%s'.\n"),
1688 fname
.c_str(), desc
.c_str(), cmd
.c_str());
1697 static void TestMimeAssociate()
1699 wxPuts(_T("*** Testing creation of filetype association ***\n"));
1701 wxFileTypeInfo
ftInfo(
1702 _T("application/x-xyz"),
1703 _T("xyzview '%s'"), // open cmd
1704 _T(""), // print cmd
1705 _T("XYZ File"), // description
1706 _T(".xyz"), // extensions
1707 NULL
// end of extensions
1709 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
1711 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
1714 wxPuts(_T("ERROR: failed to create association!"));
1718 // TODO: read it back
1727 // ----------------------------------------------------------------------------
1728 // misc information functions
1729 // ----------------------------------------------------------------------------
1731 #ifdef TEST_INFO_FUNCTIONS
1733 #include "wx/utils.h"
1735 static void TestDiskInfo()
1737 puts("*** Testing wxGetDiskSpace() ***");
1742 printf("\nEnter a directory name: ");
1743 if ( !fgets(pathname
, WXSIZEOF(pathname
), stdin
) )
1746 // kill the last '\n'
1747 pathname
[strlen(pathname
) - 1] = 0;
1749 wxLongLong total
, free
;
1750 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
1752 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
1756 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
1757 (total
/ 1024).ToString().c_str(),
1758 (free
/ 1024).ToString().c_str(),
1764 static void TestOsInfo()
1766 puts("*** Testing OS info functions ***\n");
1769 wxGetOsVersion(&major
, &minor
);
1770 printf("Running under: %s, version %d.%d\n",
1771 wxGetOsDescription().c_str(), major
, minor
);
1773 printf("%ld free bytes of memory left.\n", wxGetFreeMemory());
1775 printf("Host name is %s (%s).\n",
1776 wxGetHostName().c_str(), wxGetFullHostName().c_str());
1781 static void TestUserInfo()
1783 puts("*** Testing user info functions ***\n");
1785 printf("User id is:\t%s\n", wxGetUserId().c_str());
1786 printf("User name is:\t%s\n", wxGetUserName().c_str());
1787 printf("Home dir is:\t%s\n", wxGetHomeDir().c_str());
1788 printf("Email address:\t%s\n", wxGetEmailAddress().c_str());
1793 #endif // TEST_INFO_FUNCTIONS
1795 // ----------------------------------------------------------------------------
1797 // ----------------------------------------------------------------------------
1799 #ifdef TEST_LONGLONG
1801 #include "wx/longlong.h"
1802 #include "wx/timer.h"
1804 // make a 64 bit number from 4 16 bit ones
1805 #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3)
1807 // get a random 64 bit number
1808 #define RAND_LL() MAKE_LL(rand(), rand(), rand(), rand())
1810 static const long testLongs
[] =
1821 #if wxUSE_LONGLONG_WX
1822 inline bool operator==(const wxLongLongWx
& a
, const wxLongLongNative
& b
)
1823 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1824 inline bool operator==(const wxLongLongNative
& a
, const wxLongLongWx
& b
)
1825 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1826 #endif // wxUSE_LONGLONG_WX
1828 static void TestSpeed()
1830 static const long max
= 100000000;
1837 for ( n
= 0; n
< max
; n
++ )
1842 printf("Summing longs took %ld milliseconds.\n", sw
.Time());
1845 #if wxUSE_LONGLONG_NATIVE
1850 for ( n
= 0; n
< max
; n
++ )
1855 printf("Summing wxLongLong_t took %ld milliseconds.\n", sw
.Time());
1857 #endif // wxUSE_LONGLONG_NATIVE
1863 for ( n
= 0; n
< max
; n
++ )
1868 printf("Summing wxLongLongs took %ld milliseconds.\n", sw
.Time());
1872 static void TestLongLongConversion()
1874 puts("*** Testing wxLongLong conversions ***\n");
1878 for ( size_t n
= 0; n
< 100000; n
++ )
1882 #if wxUSE_LONGLONG_NATIVE
1883 wxLongLongNative
b(a
.GetHi(), a
.GetLo());
1885 wxASSERT_MSG( a
== b
, "conversions failure" );
1887 puts("Can't do it without native long long type, test skipped.");
1890 #endif // wxUSE_LONGLONG_NATIVE
1892 if ( !(nTested
% 1000) )
1904 static void TestMultiplication()
1906 puts("*** Testing wxLongLong multiplication ***\n");
1910 for ( size_t n
= 0; n
< 100000; n
++ )
1915 #if wxUSE_LONGLONG_NATIVE
1916 wxLongLongNative
aa(a
.GetHi(), a
.GetLo());
1917 wxLongLongNative
bb(b
.GetHi(), b
.GetLo());
1919 wxASSERT_MSG( a
*b
== aa
*bb
, "multiplication failure" );
1920 #else // !wxUSE_LONGLONG_NATIVE
1921 puts("Can't do it without native long long type, test skipped.");
1924 #endif // wxUSE_LONGLONG_NATIVE
1926 if ( !(nTested
% 1000) )
1938 static void TestDivision()
1940 puts("*** Testing wxLongLong division ***\n");
1944 for ( size_t n
= 0; n
< 100000; n
++ )
1946 // get a random wxLongLong (shifting by 12 the MSB ensures that the
1947 // multiplication will not overflow)
1948 wxLongLong ll
= MAKE_LL((rand() >> 12), rand(), rand(), rand());
1950 // get a random (but non null) long (not wxLongLong for now) to divide
1962 #if wxUSE_LONGLONG_NATIVE
1963 wxLongLongNative
m(ll
.GetHi(), ll
.GetLo());
1965 wxLongLongNative p
= m
/ l
, s
= m
% l
;
1966 wxASSERT_MSG( q
== p
&& r
== s
, "division failure" );
1967 #else // !wxUSE_LONGLONG_NATIVE
1968 // verify the result
1969 wxASSERT_MSG( ll
== q
*l
+ r
, "division failure" );
1970 #endif // wxUSE_LONGLONG_NATIVE
1972 if ( !(nTested
% 1000) )
1984 static void TestAddition()
1986 puts("*** Testing wxLongLong addition ***\n");
1990 for ( size_t n
= 0; n
< 100000; n
++ )
1996 #if wxUSE_LONGLONG_NATIVE
1997 wxASSERT_MSG( c
== wxLongLongNative(a
.GetHi(), a
.GetLo()) +
1998 wxLongLongNative(b
.GetHi(), b
.GetLo()),
1999 "addition failure" );
2000 #else // !wxUSE_LONGLONG_NATIVE
2001 wxASSERT_MSG( c
- b
== a
, "addition failure" );
2002 #endif // wxUSE_LONGLONG_NATIVE
2004 if ( !(nTested
% 1000) )
2016 static void TestBitOperations()
2018 puts("*** Testing wxLongLong bit operation ***\n");
2022 for ( size_t n
= 0; n
< 100000; n
++ )
2026 #if wxUSE_LONGLONG_NATIVE
2027 for ( size_t n
= 0; n
< 33; n
++ )
2030 #else // !wxUSE_LONGLONG_NATIVE
2031 puts("Can't do it without native long long type, test skipped.");
2034 #endif // wxUSE_LONGLONG_NATIVE
2036 if ( !(nTested
% 1000) )
2048 static void TestLongLongComparison()
2050 #if wxUSE_LONGLONG_WX
2051 puts("*** Testing wxLongLong comparison ***\n");
2053 static const long ls
[2] =
2059 wxLongLongWx lls
[2];
2063 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2067 for ( size_t m
= 0; m
< WXSIZEOF(lls
); m
++ )
2069 res
= lls
[m
] > testLongs
[n
];
2070 printf("0x%lx > 0x%lx is %s (%s)\n",
2071 ls
[m
], testLongs
[n
], res
? "true" : "false",
2072 res
== (ls
[m
] > testLongs
[n
]) ? "ok" : "ERROR");
2074 res
= lls
[m
] < testLongs
[n
];
2075 printf("0x%lx < 0x%lx is %s (%s)\n",
2076 ls
[m
], testLongs
[n
], res
? "true" : "false",
2077 res
== (ls
[m
] < testLongs
[n
]) ? "ok" : "ERROR");
2079 res
= lls
[m
] == testLongs
[n
];
2080 printf("0x%lx == 0x%lx is %s (%s)\n",
2081 ls
[m
], testLongs
[n
], res
? "true" : "false",
2082 res
== (ls
[m
] == testLongs
[n
]) ? "ok" : "ERROR");
2085 #endif // wxUSE_LONGLONG_WX
2088 static void TestLongLongPrint()
2090 wxPuts(_T("*** Testing wxLongLong printing ***\n"));
2092 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2094 wxLongLong ll
= testLongs
[n
];
2095 wxPrintf(_T("%ld == %s\n"), testLongs
[n
], ll
.ToString().c_str());
2098 wxLongLong
ll(0x12345678, 0x87654321);
2099 wxPrintf(_T("0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2102 wxPrintf(_T("-0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2108 #endif // TEST_LONGLONG
2110 // ----------------------------------------------------------------------------
2112 // ----------------------------------------------------------------------------
2114 #ifdef TEST_PATHLIST
2116 static void TestPathList()
2118 puts("*** Testing wxPathList ***\n");
2120 wxPathList pathlist
;
2121 pathlist
.AddEnvList("PATH");
2122 wxString path
= pathlist
.FindValidPath("ls");
2125 printf("ERROR: command not found in the path.\n");
2129 printf("Command found in the path as '%s'.\n", path
.c_str());
2133 #endif // TEST_PATHLIST
2135 // ----------------------------------------------------------------------------
2136 // regular expressions
2137 // ----------------------------------------------------------------------------
2141 #include "wx/regex.h"
2143 static void TestRegExCompile()
2145 wxPuts(_T("*** Testing RE compilation ***\n"));
2147 static struct RegExCompTestData
2149 const wxChar
*pattern
;
2151 } regExCompTestData
[] =
2153 { _T("foo"), TRUE
},
2154 { _T("foo("), FALSE
},
2155 { _T("foo(bar"), FALSE
},
2156 { _T("foo(bar)"), TRUE
},
2157 { _T("foo["), FALSE
},
2158 { _T("foo[bar"), FALSE
},
2159 { _T("foo[bar]"), TRUE
},
2160 { _T("foo{"), TRUE
},
2161 { _T("foo{1"), FALSE
},
2162 { _T("foo{bar"), TRUE
},
2163 { _T("foo{1}"), TRUE
},
2164 { _T("foo{1,2}"), TRUE
},
2165 { _T("foo{bar}"), TRUE
},
2166 { _T("foo*"), TRUE
},
2167 { _T("foo**"), FALSE
},
2168 { _T("foo+"), TRUE
},
2169 { _T("foo++"), FALSE
},
2170 { _T("foo?"), TRUE
},
2171 { _T("foo??"), FALSE
},
2172 { _T("foo?+"), FALSE
},
2176 for ( size_t n
= 0; n
< WXSIZEOF(regExCompTestData
); n
++ )
2178 const RegExCompTestData
& data
= regExCompTestData
[n
];
2179 bool ok
= re
.Compile(data
.pattern
);
2181 wxPrintf(_T("'%s' is %sa valid RE (%s)\n"),
2183 ok
? _T("") : _T("not "),
2184 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2188 static void TestRegExMatch()
2190 wxPuts(_T("*** Testing RE matching ***\n"));
2192 static struct RegExMatchTestData
2194 const wxChar
*pattern
;
2197 } regExMatchTestData
[] =
2199 { _T("foo"), _T("bar"), FALSE
},
2200 { _T("foo"), _T("foobar"), TRUE
},
2201 { _T("^foo"), _T("foobar"), TRUE
},
2202 { _T("^foo"), _T("barfoo"), FALSE
},
2203 { _T("bar$"), _T("barbar"), TRUE
},
2204 { _T("bar$"), _T("barbar "), FALSE
},
2207 for ( size_t n
= 0; n
< WXSIZEOF(regExMatchTestData
); n
++ )
2209 const RegExMatchTestData
& data
= regExMatchTestData
[n
];
2211 wxRegEx
re(data
.pattern
);
2212 bool ok
= re
.Matches(data
.text
);
2214 wxPrintf(_T("'%s' %s %s (%s)\n"),
2216 ok
? _T("matches") : _T("doesn't match"),
2218 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2222 static void TestRegExSubmatch()
2224 wxPuts(_T("*** Testing RE subexpressions ***\n"));
2226 wxRegEx
re(_T("([[:alpha:]]+) ([[:alpha:]]+) ([[:digit:]]+).*([[:digit:]]+)$"));
2227 if ( !re
.IsValid() )
2229 wxPuts(_T("ERROR: compilation failed."));
2233 wxString text
= _T("Fri Jul 13 18:37:52 CEST 2001");
2235 if ( !re
.Matches(text
) )
2237 wxPuts(_T("ERROR: match expected."));
2241 wxPrintf(_T("Entire match: %s\n"), re
.GetMatch(text
).c_str());
2243 wxPrintf(_T("Date: %s/%s/%s, wday: %s\n"),
2244 re
.GetMatch(text
, 3).c_str(),
2245 re
.GetMatch(text
, 2).c_str(),
2246 re
.GetMatch(text
, 4).c_str(),
2247 re
.GetMatch(text
, 1).c_str());
2251 static void TestRegExReplacement()
2253 wxPuts(_T("*** Testing RE replacement ***"));
2255 static struct RegExReplTestData
2259 const wxChar
*result
;
2261 } regExReplTestData
[] =
2263 { _T("foo123"), _T("bar"), _T("bar"), 1 },
2264 { _T("foo123"), _T("\\2\\1"), _T("123foo"), 1 },
2265 { _T("foo_123"), _T("\\2\\1"), _T("123foo"), 1 },
2266 { _T("123foo"), _T("bar"), _T("123foo"), 0 },
2267 { _T("123foo456foo"), _T("&&"), _T("123foo456foo456foo"), 1 },
2268 { _T("foo123foo123"), _T("bar"), _T("barbar"), 2 },
2269 { _T("foo123_foo456_foo789"), _T("bar"), _T("bar_bar_bar"), 3 },
2272 const wxChar
*pattern
= _T("([a-z]+)[^0-9]*([0-9]+)");
2273 wxRegEx
re(pattern
);
2275 wxPrintf(_T("Using pattern '%s' for replacement.\n"), pattern
);
2277 for ( size_t n
= 0; n
< WXSIZEOF(regExReplTestData
); n
++ )
2279 const RegExReplTestData
& data
= regExReplTestData
[n
];
2281 wxString text
= data
.text
;
2282 size_t nRepl
= re
.Replace(&text
, data
.repl
);
2284 wxPrintf(_T("%s =~ s/RE/%s/g: %u match%s, result = '%s' ("),
2285 data
.text
, data
.repl
,
2286 nRepl
, nRepl
== 1 ? _T("") : _T("es"),
2288 if ( text
== data
.result
&& nRepl
== data
.count
)
2294 wxPrintf(_T("ERROR: should be %u and '%s')\n"),
2295 data
.count
, data
.result
);
2300 static void TestRegExInteractive()
2302 wxPuts(_T("*** Testing RE interactively ***"));
2307 printf("\nEnter a pattern: ");
2308 if ( !fgets(pattern
, WXSIZEOF(pattern
), stdin
) )
2311 // kill the last '\n'
2312 pattern
[strlen(pattern
) - 1] = 0;
2315 if ( !re
.Compile(pattern
) )
2323 printf("Enter text to match: ");
2324 if ( !fgets(text
, WXSIZEOF(text
), stdin
) )
2327 // kill the last '\n'
2328 text
[strlen(text
) - 1] = 0;
2330 if ( !re
.Matches(text
) )
2332 printf("No match.\n");
2336 printf("Pattern matches at '%s'\n", re
.GetMatch(text
).c_str());
2339 for ( size_t n
= 1; ; n
++ )
2341 if ( !re
.GetMatch(&start
, &len
, n
) )
2346 printf("Subexpr %u matched '%s'\n",
2347 n
, wxString(text
+ start
, len
).c_str());
2354 #endif // TEST_REGEX
2356 // ----------------------------------------------------------------------------
2358 // ----------------------------------------------------------------------------
2364 static void TestDbOpen()
2372 // ----------------------------------------------------------------------------
2373 // registry and related stuff
2374 // ----------------------------------------------------------------------------
2376 // this is for MSW only
2379 #undef TEST_REGISTRY
2384 #include "wx/confbase.h"
2385 #include "wx/msw/regconf.h"
2387 static void TestRegConfWrite()
2389 wxRegConfig
regconf(_T("console"), _T("wxwindows"));
2390 regconf
.Write(_T("Hello"), wxString(_T("world")));
2393 #endif // TEST_REGCONF
2395 #ifdef TEST_REGISTRY
2397 #include "wx/msw/registry.h"
2399 // I chose this one because I liked its name, but it probably only exists under
2401 static const wxChar
*TESTKEY
=
2402 _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
2404 static void TestRegistryRead()
2406 puts("*** testing registry reading ***");
2408 wxRegKey
key(TESTKEY
);
2409 printf("The test key name is '%s'.\n", key
.GetName().c_str());
2412 puts("ERROR: test key can't be opened, aborting test.");
2417 size_t nSubKeys
, nValues
;
2418 if ( key
.GetKeyInfo(&nSubKeys
, NULL
, &nValues
, NULL
) )
2420 printf("It has %u subkeys and %u values.\n", nSubKeys
, nValues
);
2423 printf("Enumerating values:\n");
2427 bool cont
= key
.GetFirstValue(value
, dummy
);
2430 printf("Value '%s': type ", value
.c_str());
2431 switch ( key
.GetValueType(value
) )
2433 case wxRegKey::Type_None
: printf("ERROR (none)"); break;
2434 case wxRegKey::Type_String
: printf("SZ"); break;
2435 case wxRegKey::Type_Expand_String
: printf("EXPAND_SZ"); break;
2436 case wxRegKey::Type_Binary
: printf("BINARY"); break;
2437 case wxRegKey::Type_Dword
: printf("DWORD"); break;
2438 case wxRegKey::Type_Multi_String
: printf("MULTI_SZ"); break;
2439 default: printf("other (unknown)"); break;
2442 printf(", value = ");
2443 if ( key
.IsNumericValue(value
) )
2446 key
.QueryValue(value
, &val
);
2452 key
.QueryValue(value
, val
);
2453 printf("'%s'", val
.c_str());
2455 key
.QueryRawValue(value
, val
);
2456 printf(" (raw value '%s')", val
.c_str());
2461 cont
= key
.GetNextValue(value
, dummy
);
2465 static void TestRegistryAssociation()
2468 The second call to deleteself genertaes an error message, with a
2469 messagebox saying .flo is crucial to system operation, while the .ddf
2470 call also fails, but with no error message
2475 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
2477 key
= "ddxf_auto_file" ;
2478 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
2480 key
= "ddxf_auto_file" ;
2481 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
2484 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
2486 key
= "program \"%1\"" ;
2488 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
2490 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
2492 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
2494 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
2498 #endif // TEST_REGISTRY
2500 // ----------------------------------------------------------------------------
2502 // ----------------------------------------------------------------------------
2506 #include "wx/socket.h"
2507 #include "wx/protocol/protocol.h"
2508 #include "wx/protocol/http.h"
2510 static void TestSocketServer()
2512 puts("*** Testing wxSocketServer ***\n");
2514 static const int PORT
= 3000;
2519 wxSocketServer
*server
= new wxSocketServer(addr
);
2520 if ( !server
->Ok() )
2522 puts("ERROR: failed to bind");
2529 printf("Server: waiting for connection on port %d...\n", PORT
);
2531 wxSocketBase
*socket
= server
->Accept();
2534 puts("ERROR: wxSocketServer::Accept() failed.");
2538 puts("Server: got a client.");
2540 server
->SetTimeout(60); // 1 min
2542 while ( socket
->IsConnected() )
2548 if ( socket
->Read(&ch
, sizeof(ch
)).Error() )
2550 // don't log error if the client just close the connection
2551 if ( socket
->IsConnected() )
2553 puts("ERROR: in wxSocket::Read.");
2573 printf("Server: got '%s'.\n", s
.c_str());
2574 if ( s
== _T("bye") )
2581 socket
->Write(s
.MakeUpper().c_str(), s
.length());
2582 socket
->Write("\r\n", 2);
2583 printf("Server: wrote '%s'.\n", s
.c_str());
2586 puts("Server: lost a client.");
2591 // same as "delete server" but is consistent with GUI programs
2595 static void TestSocketClient()
2597 puts("*** Testing wxSocketClient ***\n");
2599 static const char *hostname
= "www.wxwindows.org";
2602 addr
.Hostname(hostname
);
2605 printf("--- Attempting to connect to %s:80...\n", hostname
);
2607 wxSocketClient client
;
2608 if ( !client
.Connect(addr
) )
2610 printf("ERROR: failed to connect to %s\n", hostname
);
2614 printf("--- Connected to %s:%u...\n",
2615 addr
.Hostname().c_str(), addr
.Service());
2619 // could use simply "GET" here I suppose
2621 wxString::Format("GET http://%s/\r\n", hostname
);
2622 client
.Write(cmdGet
, cmdGet
.length());
2623 printf("--- Sent command '%s' to the server\n",
2624 MakePrintable(cmdGet
).c_str());
2625 client
.Read(buf
, WXSIZEOF(buf
));
2626 printf("--- Server replied:\n%s", buf
);
2630 #endif // TEST_SOCKETS
2632 // ----------------------------------------------------------------------------
2634 // ----------------------------------------------------------------------------
2638 #include "wx/protocol/ftp.h"
2642 #define FTP_ANONYMOUS
2644 #ifdef FTP_ANONYMOUS
2645 static const char *directory
= "/pub";
2646 static const char *filename
= "welcome.msg";
2648 static const char *directory
= "/etc";
2649 static const char *filename
= "issue";
2652 static bool TestFtpConnect()
2654 puts("*** Testing FTP connect ***");
2656 #ifdef FTP_ANONYMOUS
2657 static const char *hostname
= "ftp.wxwindows.org";
2659 printf("--- Attempting to connect to %s:21 anonymously...\n", hostname
);
2660 #else // !FTP_ANONYMOUS
2661 static const char *hostname
= "localhost";
2664 fgets(user
, WXSIZEOF(user
), stdin
);
2665 user
[strlen(user
) - 1] = '\0'; // chop off '\n'
2669 printf("Password for %s: ", password
);
2670 fgets(password
, WXSIZEOF(password
), stdin
);
2671 password
[strlen(password
) - 1] = '\0'; // chop off '\n'
2672 ftp
.SetPassword(password
);
2674 printf("--- Attempting to connect to %s:21 as %s...\n", hostname
, user
);
2675 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
2677 if ( !ftp
.Connect(hostname
) )
2679 printf("ERROR: failed to connect to %s\n", hostname
);
2685 printf("--- Connected to %s, current directory is '%s'\n",
2686 hostname
, ftp
.Pwd().c_str());
2692 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
2693 static void TestFtpWuFtpd()
2696 static const char *hostname
= "ftp.eudora.com";
2697 if ( !ftp
.Connect(hostname
) )
2699 printf("ERROR: failed to connect to %s\n", hostname
);
2703 static const char *filename
= "eudora/pubs/draft-gellens-submit-09.txt";
2704 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2707 printf("ERROR: couldn't get input stream for %s\n", filename
);
2711 size_t size
= in
->StreamSize();
2712 printf("Reading file %s (%u bytes)...", filename
, size
);
2714 char *data
= new char[size
];
2715 if ( !in
->Read(data
, size
) )
2717 puts("ERROR: read error");
2721 printf("Successfully retrieved the file.\n");
2730 static void TestFtpList()
2732 puts("*** Testing wxFTP file listing ***\n");
2735 if ( !ftp
.ChDir(directory
) )
2737 printf("ERROR: failed to cd to %s\n", directory
);
2740 printf("Current directory is '%s'\n", ftp
.Pwd().c_str());
2742 // test NLIST and LIST
2743 wxArrayString files
;
2744 if ( !ftp
.GetFilesList(files
) )
2746 puts("ERROR: failed to get NLIST of files");
2750 printf("Brief list of files under '%s':\n", ftp
.Pwd().c_str());
2751 size_t count
= files
.GetCount();
2752 for ( size_t n
= 0; n
< count
; n
++ )
2754 printf("\t%s\n", files
[n
].c_str());
2756 puts("End of the file list");
2759 if ( !ftp
.GetDirList(files
) )
2761 puts("ERROR: failed to get LIST of files");
2765 printf("Detailed list of files under '%s':\n", ftp
.Pwd().c_str());
2766 size_t count
= files
.GetCount();
2767 for ( size_t n
= 0; n
< count
; n
++ )
2769 printf("\t%s\n", files
[n
].c_str());
2771 puts("End of the file list");
2774 if ( !ftp
.ChDir(_T("..")) )
2776 puts("ERROR: failed to cd to ..");
2779 printf("Current directory is '%s'\n", ftp
.Pwd().c_str());
2782 static void TestFtpDownload()
2784 puts("*** Testing wxFTP download ***\n");
2787 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2790 printf("ERROR: couldn't get input stream for %s\n", filename
);
2794 size_t size
= in
->StreamSize();
2795 printf("Reading file %s (%u bytes)...", filename
, size
);
2798 char *data
= new char[size
];
2799 if ( !in
->Read(data
, size
) )
2801 puts("ERROR: read error");
2805 printf("\nContents of %s:\n%s\n", filename
, data
);
2813 static void TestFtpFileSize()
2815 puts("*** Testing FTP SIZE command ***");
2817 if ( !ftp
.ChDir(directory
) )
2819 printf("ERROR: failed to cd to %s\n", directory
);
2822 printf("Current directory is '%s'\n", ftp
.Pwd().c_str());
2824 if ( ftp
.FileExists(filename
) )
2826 int size
= ftp
.GetFileSize(filename
);
2828 printf("ERROR: couldn't get size of '%s'\n", filename
);
2830 printf("Size of '%s' is %d bytes.\n", filename
, size
);
2834 printf("ERROR: '%s' doesn't exist\n", filename
);
2838 static void TestFtpMisc()
2840 puts("*** Testing miscellaneous wxFTP functions ***");
2842 if ( ftp
.SendCommand("STAT") != '2' )
2844 puts("ERROR: STAT failed");
2848 printf("STAT returned:\n\n%s\n", ftp
.GetLastResult().c_str());
2851 if ( ftp
.SendCommand("HELP SITE") != '2' )
2853 puts("ERROR: HELP SITE failed");
2857 printf("The list of site-specific commands:\n\n%s\n",
2858 ftp
.GetLastResult().c_str());
2862 static void TestFtpInteractive()
2864 puts("\n*** Interactive wxFTP test ***");
2870 printf("Enter FTP command: ");
2871 if ( !fgets(buf
, WXSIZEOF(buf
), stdin
) )
2874 // kill the last '\n'
2875 buf
[strlen(buf
) - 1] = 0;
2877 // special handling of LIST and NLST as they require data connection
2878 wxString
start(buf
, 4);
2880 if ( start
== "LIST" || start
== "NLST" )
2883 if ( strlen(buf
) > 4 )
2886 wxArrayString files
;
2887 if ( !ftp
.GetList(files
, wildcard
, start
== "LIST") )
2889 printf("ERROR: failed to get %s of files\n", start
.c_str());
2893 printf("--- %s of '%s' under '%s':\n",
2894 start
.c_str(), wildcard
.c_str(), ftp
.Pwd().c_str());
2895 size_t count
= files
.GetCount();
2896 for ( size_t n
= 0; n
< count
; n
++ )
2898 printf("\t%s\n", files
[n
].c_str());
2900 puts("--- End of the file list");
2905 char ch
= ftp
.SendCommand(buf
);
2906 printf("Command %s", ch
? "succeeded" : "failed");
2909 printf(" (return code %c)", ch
);
2912 printf(", server reply:\n%s\n\n", ftp
.GetLastResult().c_str());
2916 puts("\n*** done ***");
2919 static void TestFtpUpload()
2921 puts("*** Testing wxFTP uploading ***\n");
2924 static const char *file1
= "test1";
2925 static const char *file2
= "test2";
2926 wxOutputStream
*out
= ftp
.GetOutputStream(file1
);
2929 printf("--- Uploading to %s ---\n", file1
);
2930 out
->Write("First hello", 11);
2934 // send a command to check the remote file
2935 if ( ftp
.SendCommand(wxString("STAT ") + file1
) != '2' )
2937 printf("ERROR: STAT %s failed\n", file1
);
2941 printf("STAT %s returned:\n\n%s\n",
2942 file1
, ftp
.GetLastResult().c_str());
2945 out
= ftp
.GetOutputStream(file2
);
2948 printf("--- Uploading to %s ---\n", file1
);
2949 out
->Write("Second hello", 12);
2956 // ----------------------------------------------------------------------------
2958 // ----------------------------------------------------------------------------
2962 #include "wx/wfstream.h"
2963 #include "wx/mstream.h"
2965 static void TestFileStream()
2967 puts("*** Testing wxFileInputStream ***");
2969 static const wxChar
*filename
= _T("testdata.fs");
2971 wxFileOutputStream
fsOut(filename
);
2972 fsOut
.Write("foo", 3);
2975 wxFileInputStream
fsIn(filename
);
2976 printf("File stream size: %u\n", fsIn
.GetSize());
2977 while ( !fsIn
.Eof() )
2979 putchar(fsIn
.GetC());
2982 if ( !wxRemoveFile(filename
) )
2984 printf("ERROR: failed to remove the file '%s'.\n", filename
);
2987 puts("\n*** wxFileInputStream test done ***");
2990 static void TestMemoryStream()
2992 puts("*** Testing wxMemoryInputStream ***");
2995 wxStrncpy(buf
, _T("Hello, stream!"), WXSIZEOF(buf
));
2997 wxMemoryInputStream
memInpStream(buf
, wxStrlen(buf
));
2998 printf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
2999 while ( !memInpStream
.Eof() )
3001 putchar(memInpStream
.GetC());
3004 puts("\n*** wxMemoryInputStream test done ***");
3007 #endif // TEST_STREAMS
3009 // ----------------------------------------------------------------------------
3011 // ----------------------------------------------------------------------------
3015 #include "wx/timer.h"
3016 #include "wx/utils.h"
3018 static void TestStopWatch()
3020 puts("*** Testing wxStopWatch ***\n");
3023 printf("Sleeping 3 seconds...");
3025 printf("\telapsed time: %ldms\n", sw
.Time());
3028 printf("Sleeping 2 more seconds...");
3030 printf("\telapsed time: %ldms\n", sw
.Time());
3033 printf("And 3 more seconds...");
3035 printf("\telapsed time: %ldms\n", sw
.Time());
3038 puts("\nChecking for 'backwards clock' bug...");
3039 for ( size_t n
= 0; n
< 70; n
++ )
3043 for ( size_t m
= 0; m
< 100000; m
++ )
3045 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
3047 puts("\ntime is negative - ERROR!");
3057 #endif // TEST_TIMER
3059 // ----------------------------------------------------------------------------
3061 // ----------------------------------------------------------------------------
3065 #include "wx/vcard.h"
3067 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
3070 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
3074 wxString(_T('\t'), level
).c_str(),
3075 vcObj
->GetName().c_str());
3078 switch ( vcObj
->GetType() )
3080 case wxVCardObject::String
:
3081 case wxVCardObject::UString
:
3084 vcObj
->GetValue(&val
);
3085 value
<< _T('"') << val
<< _T('"');
3089 case wxVCardObject::Int
:
3092 vcObj
->GetValue(&i
);
3093 value
.Printf(_T("%u"), i
);
3097 case wxVCardObject::Long
:
3100 vcObj
->GetValue(&l
);
3101 value
.Printf(_T("%lu"), l
);
3105 case wxVCardObject::None
:
3108 case wxVCardObject::Object
:
3109 value
= _T("<node>");
3113 value
= _T("<unknown value type>");
3117 printf(" = %s", value
.c_str());
3120 DumpVObject(level
+ 1, *vcObj
);
3123 vcObj
= vcard
.GetNextProp(&cookie
);
3127 static void DumpVCardAddresses(const wxVCard
& vcard
)
3129 puts("\nShowing all addresses from vCard:\n");
3133 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3137 int flags
= addr
->GetFlags();
3138 if ( flags
& wxVCardAddress::Domestic
)
3140 flagsStr
<< _T("domestic ");
3142 if ( flags
& wxVCardAddress::Intl
)
3144 flagsStr
<< _T("international ");
3146 if ( flags
& wxVCardAddress::Postal
)
3148 flagsStr
<< _T("postal ");
3150 if ( flags
& wxVCardAddress::Parcel
)
3152 flagsStr
<< _T("parcel ");
3154 if ( flags
& wxVCardAddress::Home
)
3156 flagsStr
<< _T("home ");
3158 if ( flags
& wxVCardAddress::Work
)
3160 flagsStr
<< _T("work ");
3163 printf("Address %u:\n"
3165 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3168 addr
->GetPostOffice().c_str(),
3169 addr
->GetExtAddress().c_str(),
3170 addr
->GetStreet().c_str(),
3171 addr
->GetLocality().c_str(),
3172 addr
->GetRegion().c_str(),
3173 addr
->GetPostalCode().c_str(),
3174 addr
->GetCountry().c_str()
3178 addr
= vcard
.GetNextAddress(&cookie
);
3182 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
3184 puts("\nShowing all phone numbers from vCard:\n");
3188 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
3192 int flags
= phone
->GetFlags();
3193 if ( flags
& wxVCardPhoneNumber::Voice
)
3195 flagsStr
<< _T("voice ");
3197 if ( flags
& wxVCardPhoneNumber::Fax
)
3199 flagsStr
<< _T("fax ");
3201 if ( flags
& wxVCardPhoneNumber::Cellular
)
3203 flagsStr
<< _T("cellular ");
3205 if ( flags
& wxVCardPhoneNumber::Modem
)
3207 flagsStr
<< _T("modem ");
3209 if ( flags
& wxVCardPhoneNumber::Home
)
3211 flagsStr
<< _T("home ");
3213 if ( flags
& wxVCardPhoneNumber::Work
)
3215 flagsStr
<< _T("work ");
3218 printf("Phone number %u:\n"
3223 phone
->GetNumber().c_str()
3227 phone
= vcard
.GetNextPhoneNumber(&cookie
);
3231 static void TestVCardRead()
3233 puts("*** Testing wxVCard reading ***\n");
3235 wxVCard
vcard(_T("vcard.vcf"));
3236 if ( !vcard
.IsOk() )
3238 puts("ERROR: couldn't load vCard.");
3242 // read individual vCard properties
3243 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
3247 vcObj
->GetValue(&value
);
3252 value
= _T("<none>");
3255 printf("Full name retrieved directly: %s\n", value
.c_str());
3258 if ( !vcard
.GetFullName(&value
) )
3260 value
= _T("<none>");
3263 printf("Full name from wxVCard API: %s\n", value
.c_str());
3265 // now show how to deal with multiply occuring properties
3266 DumpVCardAddresses(vcard
);
3267 DumpVCardPhoneNumbers(vcard
);
3269 // and finally show all
3270 puts("\nNow dumping the entire vCard:\n"
3271 "-----------------------------\n");
3273 DumpVObject(0, vcard
);
3277 static void TestVCardWrite()
3279 puts("*** Testing wxVCard writing ***\n");
3282 if ( !vcard
.IsOk() )
3284 puts("ERROR: couldn't create vCard.");
3289 vcard
.SetName("Zeitlin", "Vadim");
3290 vcard
.SetFullName("Vadim Zeitlin");
3291 vcard
.SetOrganization("wxWindows", "R&D");
3293 // just dump the vCard back
3294 puts("Entire vCard follows:\n");
3295 puts(vcard
.Write());
3299 #endif // TEST_VCARD
3301 // ----------------------------------------------------------------------------
3302 // wide char (Unicode) support
3303 // ----------------------------------------------------------------------------
3307 #include "wx/strconv.h"
3308 #include "wx/fontenc.h"
3309 #include "wx/encconv.h"
3310 #include "wx/buffer.h"
3312 static const char textInUtf8
[] =
3314 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
3315 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
3316 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
3317 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
3318 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
3319 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
3320 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
3323 static void TestUtf8()
3325 puts("*** Testing UTF8 support ***\n");
3329 if ( wxConvUTF8
.MB2WC(wbuf
, textInUtf8
, WXSIZEOF(textInUtf8
)) <= 0 )
3331 puts("ERROR: UTF-8 decoding failed.");
3335 wxCSConv
conv(_T("koi8-r"));
3336 if ( conv
.WC2MB(buf
, wbuf
, 0 /* not needed wcslen(wbuf) */) <= 0 )
3338 puts("ERROR: conversion to KOI8-R failed.");
3342 printf("The resulting string (in KOI8-R): %s\n", buf
);
3346 if ( wxConvUTF8
.WC2MB(buf
, L
"Ã la", WXSIZEOF(buf
)) <= 0 )
3348 puts("ERROR: conversion to UTF-8 failed.");
3352 printf("The string in UTF-8: %s\n", buf
);
3358 static void TestEncodingConverter()
3360 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
3362 // using wxEncodingConverter should give the same result as above
3365 if ( wxConvUTF8
.MB2WC(wbuf
, textInUtf8
, WXSIZEOF(textInUtf8
)) <= 0 )
3367 puts("ERROR: UTF-8 decoding failed.");
3371 wxEncodingConverter ec
;
3372 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
3373 ec
.Convert(wbuf
, buf
);
3374 printf("The same string obtained using wxEC: %s\n", buf
);
3380 #endif // TEST_WCHAR
3382 // ----------------------------------------------------------------------------
3384 // ----------------------------------------------------------------------------
3388 #include "wx/filesys.h"
3389 #include "wx/fs_zip.h"
3390 #include "wx/zipstrm.h"
3392 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
3394 static void TestZipStreamRead()
3396 puts("*** Testing ZIP reading ***\n");
3398 static const wxChar
*filename
= _T("foo");
3399 wxZipInputStream
istr(TESTFILE_ZIP
, filename
);
3400 printf("Archive size: %u\n", istr
.GetSize());
3402 printf("Dumping the file '%s':\n", filename
);
3403 while ( !istr
.Eof() )
3405 putchar(istr
.GetC());
3409 puts("\n----- done ------");
3412 static void DumpZipDirectory(wxFileSystem
& fs
,
3413 const wxString
& dir
,
3414 const wxString
& indent
)
3416 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
3417 TESTFILE_ZIP
, dir
.c_str());
3418 wxString wildcard
= prefix
+ _T("/*");
3420 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
3421 while ( !dirname
.empty() )
3423 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
3425 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3430 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
3432 DumpZipDirectory(fs
, dirname
,
3433 indent
+ wxString(_T(' '), 4));
3435 dirname
= fs
.FindNext();
3438 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
3439 while ( !filename
.empty() )
3441 if ( !filename
.StartsWith(prefix
, &filename
) )
3443 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3448 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
3450 filename
= fs
.FindNext();
3454 static void TestZipFileSystem()
3456 puts("*** Testing ZIP file system ***\n");
3458 wxFileSystem::AddHandler(new wxZipFSHandler
);
3460 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
3462 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
3467 // ----------------------------------------------------------------------------
3469 // ----------------------------------------------------------------------------
3473 #include "wx/zstream.h"
3474 #include "wx/wfstream.h"
3476 static const wxChar
*FILENAME_GZ
= _T("test.gz");
3477 static const char *TEST_DATA
= "hello and hello again";
3479 static void TestZlibStreamWrite()
3481 puts("*** Testing Zlib stream reading ***\n");
3483 wxFileOutputStream
fileOutStream(FILENAME_GZ
);
3484 wxZlibOutputStream
ostr(fileOutStream
, 0);
3485 printf("Compressing the test string... ");
3486 ostr
.Write(TEST_DATA
, sizeof(TEST_DATA
));
3489 puts("(ERROR: failed)");
3496 puts("\n----- done ------");
3499 static void TestZlibStreamRead()
3501 puts("*** Testing Zlib stream reading ***\n");
3503 wxFileInputStream
fileInStream(FILENAME_GZ
);
3504 wxZlibInputStream
istr(fileInStream
);
3505 printf("Archive size: %u\n", istr
.GetSize());
3507 puts("Dumping the file:");
3508 while ( !istr
.Eof() )
3510 putchar(istr
.GetC());
3514 puts("\n----- done ------");
3519 // ----------------------------------------------------------------------------
3521 // ----------------------------------------------------------------------------
3523 #ifdef TEST_DATETIME
3527 #include "wx/date.h"
3528 #include "wx/datetime.h"
3533 wxDateTime::wxDateTime_t day
;
3534 wxDateTime::Month month
;
3536 wxDateTime::wxDateTime_t hour
, min
, sec
;
3538 wxDateTime::WeekDay wday
;
3539 time_t gmticks
, ticks
;
3541 void Init(const wxDateTime::Tm
& tm
)
3550 gmticks
= ticks
= -1;
3553 wxDateTime
DT() const
3554 { return wxDateTime(day
, month
, year
, hour
, min
, sec
); }
3556 bool SameDay(const wxDateTime::Tm
& tm
) const
3558 return day
== tm
.mday
&& month
== tm
.mon
&& year
== tm
.year
;
3561 wxString
Format() const
3564 s
.Printf("%02d:%02d:%02d %10s %02d, %4d%s",
3566 wxDateTime::GetMonthName(month
).c_str(),
3568 abs(wxDateTime::ConvertYearToBC(year
)),
3569 year
> 0 ? "AD" : "BC");
3573 wxString
FormatDate() const
3576 s
.Printf("%02d-%s-%4d%s",
3578 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
3579 abs(wxDateTime::ConvertYearToBC(year
)),
3580 year
> 0 ? "AD" : "BC");
3585 static const Date testDates
[] =
3587 { 1, wxDateTime::Jan
, 1970, 00, 00, 00, 2440587.5, wxDateTime::Thu
, 0, -3600 },
3588 { 21, wxDateTime::Jan
, 2222, 00, 00, 00, 2532648.5, wxDateTime::Mon
, -1, -1 },
3589 { 29, wxDateTime::May
, 1976, 12, 00, 00, 2442928.0, wxDateTime::Sat
, 202219200, 202212000 },
3590 { 29, wxDateTime::Feb
, 1976, 00, 00, 00, 2442837.5, wxDateTime::Sun
, 194400000, 194396400 },
3591 { 1, wxDateTime::Jan
, 1900, 12, 00, 00, 2415021.0, wxDateTime::Mon
, -1, -1 },
3592 { 1, wxDateTime::Jan
, 1900, 00, 00, 00, 2415020.5, wxDateTime::Mon
, -1, -1 },
3593 { 15, wxDateTime::Oct
, 1582, 00, 00, 00, 2299160.5, wxDateTime::Fri
, -1, -1 },
3594 { 4, wxDateTime::Oct
, 1582, 00, 00, 00, 2299149.5, wxDateTime::Mon
, -1, -1 },
3595 { 1, wxDateTime::Mar
, 1, 00, 00, 00, 1721484.5, wxDateTime::Thu
, -1, -1 },
3596 { 1, wxDateTime::Jan
, 1, 00, 00, 00, 1721425.5, wxDateTime::Mon
, -1, -1 },
3597 { 31, wxDateTime::Dec
, 0, 00, 00, 00, 1721424.5, wxDateTime::Sun
, -1, -1 },
3598 { 1, wxDateTime::Jan
, 0, 00, 00, 00, 1721059.5, wxDateTime::Sat
, -1, -1 },
3599 { 12, wxDateTime::Aug
, -1234, 00, 00, 00, 1270573.5, wxDateTime::Fri
, -1, -1 },
3600 { 12, wxDateTime::Aug
, -4000, 00, 00, 00, 260313.5, wxDateTime::Sat
, -1, -1 },
3601 { 24, wxDateTime::Nov
, -4713, 00, 00, 00, -0.5, wxDateTime::Mon
, -1, -1 },
3604 // this test miscellaneous static wxDateTime functions
3605 static void TestTimeStatic()
3607 puts("\n*** wxDateTime static methods test ***");
3609 // some info about the current date
3610 int year
= wxDateTime::GetCurrentYear();
3611 printf("Current year %d is %sa leap one and has %d days.\n",
3613 wxDateTime::IsLeapYear(year
) ? "" : "not ",
3614 wxDateTime::GetNumberOfDays(year
));
3616 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
3617 printf("Current month is '%s' ('%s') and it has %d days\n",
3618 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
3619 wxDateTime::GetMonthName(month
).c_str(),
3620 wxDateTime::GetNumberOfDays(month
));
3623 static const size_t nYears
= 5;
3624 static const size_t years
[2][nYears
] =
3626 // first line: the years to test
3627 { 1990, 1976, 2000, 2030, 1984, },
3629 // second line: TRUE if leap, FALSE otherwise
3630 { FALSE
, TRUE
, TRUE
, FALSE
, TRUE
}
3633 for ( size_t n
= 0; n
< nYears
; n
++ )
3635 int year
= years
[0][n
];
3636 bool should
= years
[1][n
] != 0,
3637 is
= wxDateTime::IsLeapYear(year
);
3639 printf("Year %d is %sa leap year (%s)\n",
3642 should
== is
? "ok" : "ERROR");
3644 wxASSERT( should
== wxDateTime::IsLeapYear(year
) );
3648 // test constructing wxDateTime objects
3649 static void TestTimeSet()
3651 puts("\n*** wxDateTime construction test ***");
3653 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
3655 const Date
& d1
= testDates
[n
];
3656 wxDateTime dt
= d1
.DT();
3659 d2
.Init(dt
.GetTm());
3661 wxString s1
= d1
.Format(),
3664 printf("Date: %s == %s (%s)\n",
3665 s1
.c_str(), s2
.c_str(),
3666 s1
== s2
? "ok" : "ERROR");
3670 // test time zones stuff
3671 static void TestTimeZones()
3673 puts("\n*** wxDateTime timezone test ***");
3675 wxDateTime now
= wxDateTime::Now();
3677 printf("Current GMT time:\t%s\n", now
.Format("%c", wxDateTime::GMT0
).c_str());
3678 printf("Unix epoch (GMT):\t%s\n", wxDateTime((time_t)0).Format("%c", wxDateTime::GMT0
).c_str());
3679 printf("Unix epoch (EST):\t%s\n", wxDateTime((time_t)0).Format("%c", wxDateTime::EST
).c_str());
3680 printf("Current time in Paris:\t%s\n", now
.Format("%c", wxDateTime::CET
).c_str());
3681 printf(" Moscow:\t%s\n", now
.Format("%c", wxDateTime::MSK
).c_str());
3682 printf(" New York:\t%s\n", now
.Format("%c", wxDateTime::EST
).c_str());
3684 wxDateTime::Tm tm
= now
.GetTm();
3685 if ( wxDateTime(tm
) != now
)
3687 printf("ERROR: got %s instead of %s\n",
3688 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
3692 // test some minimal support for the dates outside the standard range
3693 static void TestTimeRange()
3695 puts("\n*** wxDateTime out-of-standard-range dates test ***");
3697 static const char *fmt
= "%d-%b-%Y %H:%M:%S";
3699 printf("Unix epoch:\t%s\n",
3700 wxDateTime(2440587.5).Format(fmt
).c_str());
3701 printf("Feb 29, 0: \t%s\n",
3702 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
3703 printf("JDN 0: \t%s\n",
3704 wxDateTime(0.0).Format(fmt
).c_str());
3705 printf("Jan 1, 1AD:\t%s\n",
3706 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
3707 printf("May 29, 2099:\t%s\n",
3708 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
3711 static void TestTimeTicks()
3713 puts("\n*** wxDateTime ticks test ***");
3715 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
3717 const Date
& d
= testDates
[n
];
3718 if ( d
.ticks
== -1 )
3721 wxDateTime dt
= d
.DT();
3722 long ticks
= (dt
.GetValue() / 1000).ToLong();
3723 printf("Ticks of %s:\t% 10ld", d
.Format().c_str(), ticks
);
3724 if ( ticks
== d
.ticks
)
3730 printf(" (ERROR: should be %ld, delta = %ld)\n",
3731 d
.ticks
, ticks
- d
.ticks
);
3734 dt
= d
.DT().ToTimezone(wxDateTime::GMT0
);
3735 ticks
= (dt
.GetValue() / 1000).ToLong();
3736 printf("GMtks of %s:\t% 10ld", d
.Format().c_str(), ticks
);
3737 if ( ticks
== d
.gmticks
)
3743 printf(" (ERROR: should be %ld, delta = %ld)\n",
3744 d
.gmticks
, ticks
- d
.gmticks
);
3751 // test conversions to JDN &c
3752 static void TestTimeJDN()
3754 puts("\n*** wxDateTime to JDN test ***");
3756 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
3758 const Date
& d
= testDates
[n
];
3759 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
3760 double jdn
= dt
.GetJulianDayNumber();
3762 printf("JDN of %s is:\t% 15.6f", d
.Format().c_str(), jdn
);
3769 printf(" (ERROR: should be %f, delta = %f)\n",
3770 d
.jdn
, jdn
- d
.jdn
);
3775 // test week days computation
3776 static void TestTimeWDays()
3778 puts("\n*** wxDateTime weekday test ***");
3780 // test GetWeekDay()
3782 for ( n
= 0; n
< WXSIZEOF(testDates
); n
++ )
3784 const Date
& d
= testDates
[n
];
3785 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
3787 wxDateTime::WeekDay wday
= dt
.GetWeekDay();
3790 wxDateTime::GetWeekDayName(wday
).c_str());
3791 if ( wday
== d
.wday
)
3797 printf(" (ERROR: should be %s)\n",
3798 wxDateTime::GetWeekDayName(d
.wday
).c_str());
3804 // test SetToWeekDay()
3805 struct WeekDateTestData
3807 Date date
; // the real date (precomputed)
3808 int nWeek
; // its week index in the month
3809 wxDateTime::WeekDay wday
; // the weekday
3810 wxDateTime::Month month
; // the month
3811 int year
; // and the year
3813 wxString
Format() const
3816 switch ( nWeek
< -1 ? -nWeek
: nWeek
)
3818 case 1: which
= "first"; break;
3819 case 2: which
= "second"; break;
3820 case 3: which
= "third"; break;
3821 case 4: which
= "fourth"; break;
3822 case 5: which
= "fifth"; break;
3824 case -1: which
= "last"; break;
3829 which
+= " from end";
3832 s
.Printf("The %s %s of %s in %d",
3834 wxDateTime::GetWeekDayName(wday
).c_str(),
3835 wxDateTime::GetMonthName(month
).c_str(),
3842 // the array data was generated by the following python program
3844 from DateTime import *
3845 from whrandom import *
3846 from string import *
3848 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
3849 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
3851 week = DateTimeDelta(7)
3854 year = randint(1900, 2100)
3855 month = randint(1, 12)
3856 day = randint(1, 28)
3857 dt = DateTime(year, month, day)
3858 wday = dt.day_of_week
3860 countFromEnd = choice([-1, 1])
3863 while dt.month is month:
3864 dt = dt - countFromEnd * week
3865 weekNum = weekNum + countFromEnd
3867 data = { 'day': rjust(`day`, 2), 'month': monthNames[month - 1], 'year': year, 'weekNum': rjust(`weekNum`, 2), 'wday': wdayNames[wday] }
3869 print "{ { %(day)s, wxDateTime::%(month)s, %(year)d }, %(weekNum)d, "\
3870 "wxDateTime::%(wday)s, wxDateTime::%(month)s, %(year)d }," % data
3873 static const WeekDateTestData weekDatesTestData
[] =
3875 { { 20, wxDateTime::Mar
, 2045 }, 3, wxDateTime::Mon
, wxDateTime::Mar
, 2045 },
3876 { { 5, wxDateTime::Jun
, 1985 }, -4, wxDateTime::Wed
, wxDateTime::Jun
, 1985 },
3877 { { 12, wxDateTime::Nov
, 1961 }, -3, wxDateTime::Sun
, wxDateTime::Nov
, 1961 },
3878 { { 27, wxDateTime::Feb
, 2093 }, -1, wxDateTime::Fri
, wxDateTime::Feb
, 2093 },
3879 { { 4, wxDateTime::Jul
, 2070 }, -4, wxDateTime::Fri
, wxDateTime::Jul
, 2070 },
3880 { { 2, wxDateTime::Apr
, 1906 }, -5, wxDateTime::Mon
, wxDateTime::Apr
, 1906 },
3881 { { 19, wxDateTime::Jul
, 2023 }, -2, wxDateTime::Wed
, wxDateTime::Jul
, 2023 },
3882 { { 5, wxDateTime::May
, 1958 }, -4, wxDateTime::Mon
, wxDateTime::May
, 1958 },
3883 { { 11, wxDateTime::Aug
, 1900 }, 2, wxDateTime::Sat
, wxDateTime::Aug
, 1900 },
3884 { { 14, wxDateTime::Feb
, 1945 }, 2, wxDateTime::Wed
, wxDateTime::Feb
, 1945 },
3885 { { 25, wxDateTime::Jul
, 1967 }, -1, wxDateTime::Tue
, wxDateTime::Jul
, 1967 },
3886 { { 9, wxDateTime::May
, 1916 }, -4, wxDateTime::Tue
, wxDateTime::May
, 1916 },
3887 { { 20, wxDateTime::Jun
, 1927 }, 3, wxDateTime::Mon
, wxDateTime::Jun
, 1927 },
3888 { { 2, wxDateTime::Aug
, 2000 }, 1, wxDateTime::Wed
, wxDateTime::Aug
, 2000 },
3889 { { 20, wxDateTime::Apr
, 2044 }, 3, wxDateTime::Wed
, wxDateTime::Apr
, 2044 },
3890 { { 20, wxDateTime::Feb
, 1932 }, -2, wxDateTime::Sat
, wxDateTime::Feb
, 1932 },
3891 { { 25, wxDateTime::Jul
, 2069 }, 4, wxDateTime::Thu
, wxDateTime::Jul
, 2069 },
3892 { { 3, wxDateTime::Apr
, 1925 }, 1, wxDateTime::Fri
, wxDateTime::Apr
, 1925 },
3893 { { 21, wxDateTime::Mar
, 2093 }, 3, wxDateTime::Sat
, wxDateTime::Mar
, 2093 },
3894 { { 3, wxDateTime::Dec
, 2074 }, -5, wxDateTime::Mon
, wxDateTime::Dec
, 2074 },
3897 static const char *fmt
= "%d-%b-%Y";
3900 for ( n
= 0; n
< WXSIZEOF(weekDatesTestData
); n
++ )
3902 const WeekDateTestData
& wd
= weekDatesTestData
[n
];
3904 dt
.SetToWeekDay(wd
.wday
, wd
.nWeek
, wd
.month
, wd
.year
);
3906 printf("%s is %s", wd
.Format().c_str(), dt
.Format(fmt
).c_str());
3908 const Date
& d
= wd
.date
;
3909 if ( d
.SameDay(dt
.GetTm()) )
3915 dt
.Set(d
.day
, d
.month
, d
.year
);
3917 printf(" (ERROR: should be %s)\n", dt
.Format(fmt
).c_str());
3922 // test the computation of (ISO) week numbers
3923 static void TestTimeWNumber()
3925 puts("\n*** wxDateTime week number test ***");
3927 struct WeekNumberTestData
3929 Date date
; // the date
3930 wxDateTime::wxDateTime_t week
; // the week number in the year
3931 wxDateTime::wxDateTime_t wmon
; // the week number in the month
3932 wxDateTime::wxDateTime_t wmon2
; // same but week starts with Sun
3933 wxDateTime::wxDateTime_t dnum
; // day number in the year
3936 // data generated with the following python script:
3938 from DateTime import *
3939 from whrandom import *
3940 from string import *
3942 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
3943 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
3945 def GetMonthWeek(dt):
3946 weekNumMonth = dt.iso_week[1] - DateTime(dt.year, dt.month, 1).iso_week[1] + 1
3947 if weekNumMonth < 0:
3948 weekNumMonth = weekNumMonth + 53
3951 def GetLastSundayBefore(dt):
3952 if dt.iso_week[2] == 7:
3955 return dt - DateTimeDelta(dt.iso_week[2])
3958 year = randint(1900, 2100)
3959 month = randint(1, 12)
3960 day = randint(1, 28)
3961 dt = DateTime(year, month, day)
3962 dayNum = dt.day_of_year
3963 weekNum = dt.iso_week[1]
3964 weekNumMonth = GetMonthWeek(dt)
3967 dtSunday = GetLastSundayBefore(dt)
3969 while dtSunday >= GetLastSundayBefore(DateTime(dt.year, dt.month, 1)):
3970 weekNumMonth2 = weekNumMonth2 + 1
3971 dtSunday = dtSunday - DateTimeDelta(7)
3973 data = { 'day': rjust(`day`, 2), \
3974 'month': monthNames[month - 1], \
3976 'weekNum': rjust(`weekNum`, 2), \
3977 'weekNumMonth': weekNumMonth, \
3978 'weekNumMonth2': weekNumMonth2, \
3979 'dayNum': rjust(`dayNum`, 3) }
3981 print " { { %(day)s, "\
3982 "wxDateTime::%(month)s, "\
3985 "%(weekNumMonth)s, "\
3986 "%(weekNumMonth2)s, "\
3987 "%(dayNum)s }," % data
3990 static const WeekNumberTestData weekNumberTestDates
[] =
3992 { { 27, wxDateTime::Dec
, 1966 }, 52, 5, 5, 361 },
3993 { { 22, wxDateTime::Jul
, 1926 }, 29, 4, 4, 203 },
3994 { { 22, wxDateTime::Oct
, 2076 }, 43, 4, 4, 296 },
3995 { { 1, wxDateTime::Jul
, 1967 }, 26, 1, 1, 182 },
3996 { { 8, wxDateTime::Nov
, 2004 }, 46, 2, 2, 313 },
3997 { { 21, wxDateTime::Mar
, 1920 }, 12, 3, 4, 81 },
3998 { { 7, wxDateTime::Jan
, 1965 }, 1, 2, 2, 7 },
3999 { { 19, wxDateTime::Oct
, 1999 }, 42, 4, 4, 292 },
4000 { { 13, wxDateTime::Aug
, 1955 }, 32, 2, 2, 225 },
4001 { { 18, wxDateTime::Jul
, 2087 }, 29, 3, 3, 199 },
4002 { { 2, wxDateTime::Sep
, 2028 }, 35, 1, 1, 246 },
4003 { { 28, wxDateTime::Jul
, 1945 }, 30, 5, 4, 209 },
4004 { { 15, wxDateTime::Jun
, 1901 }, 24, 3, 3, 166 },
4005 { { 10, wxDateTime::Oct
, 1939 }, 41, 3, 2, 283 },
4006 { { 3, wxDateTime::Dec
, 1965 }, 48, 1, 1, 337 },
4007 { { 23, wxDateTime::Feb
, 1940 }, 8, 4, 4, 54 },
4008 { { 2, wxDateTime::Jan
, 1987 }, 1, 1, 1, 2 },
4009 { { 11, wxDateTime::Aug
, 2079 }, 32, 2, 2, 223 },
4010 { { 2, wxDateTime::Feb
, 2063 }, 5, 1, 1, 33 },
4011 { { 16, wxDateTime::Oct
, 1942 }, 42, 3, 3, 289 },
4014 for ( size_t n
= 0; n
< WXSIZEOF(weekNumberTestDates
); n
++ )
4016 const WeekNumberTestData
& wn
= weekNumberTestDates
[n
];
4017 const Date
& d
= wn
.date
;
4019 wxDateTime dt
= d
.DT();
4021 wxDateTime::wxDateTime_t
4022 week
= dt
.GetWeekOfYear(wxDateTime::Monday_First
),
4023 wmon
= dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4024 wmon2
= dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4025 dnum
= dt
.GetDayOfYear();
4027 printf("%s: the day number is %d",
4028 d
.FormatDate().c_str(), dnum
);
4029 if ( dnum
== wn
.dnum
)
4035 printf(" (ERROR: should be %d)", wn
.dnum
);
4038 printf(", week in month is %d", wmon
);
4039 if ( wmon
== wn
.wmon
)
4045 printf(" (ERROR: should be %d)", wn
.wmon
);
4048 printf(" or %d", wmon2
);
4049 if ( wmon2
== wn
.wmon2
)
4055 printf(" (ERROR: should be %d)", wn
.wmon2
);
4058 printf(", week in year is %d", week
);
4059 if ( week
== wn
.week
)
4065 printf(" (ERROR: should be %d)\n", wn
.week
);
4070 // test DST calculations
4071 static void TestTimeDST()
4073 puts("\n*** wxDateTime DST test ***");
4075 printf("DST is%s in effect now.\n\n",
4076 wxDateTime::Now().IsDST() ? "" : " not");
4078 // taken from http://www.energy.ca.gov/daylightsaving.html
4079 static const Date datesDST
[2][2004 - 1900 + 1] =
4082 { 1, wxDateTime::Apr
, 1990 },
4083 { 7, wxDateTime::Apr
, 1991 },
4084 { 5, wxDateTime::Apr
, 1992 },
4085 { 4, wxDateTime::Apr
, 1993 },
4086 { 3, wxDateTime::Apr
, 1994 },
4087 { 2, wxDateTime::Apr
, 1995 },
4088 { 7, wxDateTime::Apr
, 1996 },
4089 { 6, wxDateTime::Apr
, 1997 },
4090 { 5, wxDateTime::Apr
, 1998 },
4091 { 4, wxDateTime::Apr
, 1999 },
4092 { 2, wxDateTime::Apr
, 2000 },
4093 { 1, wxDateTime::Apr
, 2001 },
4094 { 7, wxDateTime::Apr
, 2002 },
4095 { 6, wxDateTime::Apr
, 2003 },
4096 { 4, wxDateTime::Apr
, 2004 },
4099 { 28, wxDateTime::Oct
, 1990 },
4100 { 27, wxDateTime::Oct
, 1991 },
4101 { 25, wxDateTime::Oct
, 1992 },
4102 { 31, wxDateTime::Oct
, 1993 },
4103 { 30, wxDateTime::Oct
, 1994 },
4104 { 29, wxDateTime::Oct
, 1995 },
4105 { 27, wxDateTime::Oct
, 1996 },
4106 { 26, wxDateTime::Oct
, 1997 },
4107 { 25, wxDateTime::Oct
, 1998 },
4108 { 31, wxDateTime::Oct
, 1999 },
4109 { 29, wxDateTime::Oct
, 2000 },
4110 { 28, wxDateTime::Oct
, 2001 },
4111 { 27, wxDateTime::Oct
, 2002 },
4112 { 26, wxDateTime::Oct
, 2003 },
4113 { 31, wxDateTime::Oct
, 2004 },
4118 for ( year
= 1990; year
< 2005; year
++ )
4120 wxDateTime dtBegin
= wxDateTime::GetBeginDST(year
, wxDateTime::USA
),
4121 dtEnd
= wxDateTime::GetEndDST(year
, wxDateTime::USA
);
4123 printf("DST period in the US for year %d: from %s to %s",
4124 year
, dtBegin
.Format().c_str(), dtEnd
.Format().c_str());
4126 size_t n
= year
- 1990;
4127 const Date
& dBegin
= datesDST
[0][n
];
4128 const Date
& dEnd
= datesDST
[1][n
];
4130 if ( dBegin
.SameDay(dtBegin
.GetTm()) && dEnd
.SameDay(dtEnd
.GetTm()) )
4136 printf(" (ERROR: should be %s %d to %s %d)\n",
4137 wxDateTime::GetMonthName(dBegin
.month
).c_str(), dBegin
.day
,
4138 wxDateTime::GetMonthName(dEnd
.month
).c_str(), dEnd
.day
);
4144 for ( year
= 1990; year
< 2005; year
++ )
4146 printf("DST period in Europe for year %d: from %s to %s\n",
4148 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
4149 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
4153 // test wxDateTime -> text conversion
4154 static void TestTimeFormat()
4156 puts("\n*** wxDateTime formatting test ***");
4158 // some information may be lost during conversion, so store what kind
4159 // of info should we recover after a round trip
4162 CompareNone
, // don't try comparing
4163 CompareBoth
, // dates and times should be identical
4164 CompareDate
, // dates only
4165 CompareTime
// time only
4170 CompareKind compareKind
;
4172 } formatTestFormats
[] =
4174 { CompareBoth
, "---> %c" },
4175 { CompareDate
, "Date is %A, %d of %B, in year %Y" },
4176 { CompareBoth
, "Date is %x, time is %X" },
4177 { CompareTime
, "Time is %H:%M:%S or %I:%M:%S %p" },
4178 { CompareNone
, "The day of year: %j, the week of year: %W" },
4179 { CompareDate
, "ISO date without separators: %4Y%2m%2d" },
4182 static const Date formatTestDates
[] =
4184 { 29, wxDateTime::May
, 1976, 18, 30, 00 },
4185 { 31, wxDateTime::Dec
, 1999, 23, 30, 00 },
4187 // this test can't work for other centuries because it uses two digit
4188 // years in formats, so don't even try it
4189 { 29, wxDateTime::May
, 2076, 18, 30, 00 },
4190 { 29, wxDateTime::Feb
, 2400, 02, 15, 25 },
4191 { 01, wxDateTime::Jan
, -52, 03, 16, 47 },
4195 // an extra test (as it doesn't depend on date, don't do it in the loop)
4196 printf("%s\n", wxDateTime::Now().Format("Our timezone is %Z").c_str());
4198 for ( size_t d
= 0; d
< WXSIZEOF(formatTestDates
) + 1; d
++ )
4202 wxDateTime dt
= d
== 0 ? wxDateTime::Now() : formatTestDates
[d
- 1].DT();
4203 for ( size_t n
= 0; n
< WXSIZEOF(formatTestFormats
); n
++ )
4205 wxString s
= dt
.Format(formatTestFormats
[n
].format
);
4206 printf("%s", s
.c_str());
4208 // what can we recover?
4209 int kind
= formatTestFormats
[n
].compareKind
;
4213 const wxChar
*result
= dt2
.ParseFormat(s
, formatTestFormats
[n
].format
);
4216 // converion failed - should it have?
4217 if ( kind
== CompareNone
)
4220 puts(" (ERROR: conversion back failed)");
4224 // should have parsed the entire string
4225 puts(" (ERROR: conversion back stopped too soon)");
4229 bool equal
= FALSE
; // suppress compilaer warning
4237 equal
= dt
.IsSameDate(dt2
);
4241 equal
= dt
.IsSameTime(dt2
);
4247 printf(" (ERROR: got back '%s' instead of '%s')\n",
4248 dt2
.Format().c_str(), dt
.Format().c_str());
4259 // test text -> wxDateTime conversion
4260 static void TestTimeParse()
4262 puts("\n*** wxDateTime parse test ***");
4264 struct ParseTestData
4271 static const ParseTestData parseTestDates
[] =
4273 { "Sat, 18 Dec 1999 00:46:40 +0100", { 18, wxDateTime::Dec
, 1999, 00, 46, 40 }, TRUE
},
4274 { "Wed, 1 Dec 1999 05:17:20 +0300", { 1, wxDateTime::Dec
, 1999, 03, 17, 20 }, TRUE
},
4277 for ( size_t n
= 0; n
< WXSIZEOF(parseTestDates
); n
++ )
4279 const char *format
= parseTestDates
[n
].format
;
4281 printf("%s => ", format
);
4284 if ( dt
.ParseRfc822Date(format
) )
4286 printf("%s ", dt
.Format().c_str());
4288 if ( parseTestDates
[n
].good
)
4290 wxDateTime dtReal
= parseTestDates
[n
].date
.DT();
4297 printf("(ERROR: should be %s)\n", dtReal
.Format().c_str());
4302 puts("(ERROR: bad format)");
4307 printf("bad format (%s)\n",
4308 parseTestDates
[n
].good
? "ERROR" : "ok");
4313 static void TestDateTimeInteractive()
4315 puts("\n*** interactive wxDateTime tests ***");
4321 printf("Enter a date: ");
4322 if ( !fgets(buf
, WXSIZEOF(buf
), stdin
) )
4325 // kill the last '\n'
4326 buf
[strlen(buf
) - 1] = 0;
4329 const char *p
= dt
.ParseDate(buf
);
4332 printf("ERROR: failed to parse the date '%s'.\n", buf
);
4338 printf("WARNING: parsed only first %u characters.\n", p
- buf
);
4341 printf("%s: day %u, week of month %u/%u, week of year %u\n",
4342 dt
.Format("%b %d, %Y").c_str(),
4344 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4345 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4346 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
4349 puts("\n*** done ***");
4352 static void TestTimeMS()
4354 puts("*** testing millisecond-resolution support in wxDateTime ***");
4356 wxDateTime dt1
= wxDateTime::Now(),
4357 dt2
= wxDateTime::UNow();
4359 printf("Now = %s\n", dt1
.Format("%H:%M:%S:%l").c_str());
4360 printf("UNow = %s\n", dt2
.Format("%H:%M:%S:%l").c_str());
4361 printf("Dummy loop: ");
4362 for ( int i
= 0; i
< 6000; i
++ )
4364 //for ( int j = 0; j < 10; j++ )
4367 s
.Printf("%g", sqrt(i
));
4376 dt2
= wxDateTime::UNow();
4377 printf("UNow = %s\n", dt2
.Format("%H:%M:%S:%l").c_str());
4379 printf("Loop executed in %s ms\n", (dt2
- dt1
).Format("%l").c_str());
4381 puts("\n*** done ***");
4384 static void TestTimeArithmetics()
4386 puts("\n*** testing arithmetic operations on wxDateTime ***");
4388 static const struct ArithmData
4390 ArithmData(const wxDateSpan
& sp
, const char *nam
)
4391 : span(sp
), name(nam
) { }
4395 } testArithmData
[] =
4397 ArithmData(wxDateSpan::Day(), "day"),
4398 ArithmData(wxDateSpan::Week(), "week"),
4399 ArithmData(wxDateSpan::Month(), "month"),
4400 ArithmData(wxDateSpan::Year(), "year"),
4401 ArithmData(wxDateSpan(1, 2, 3, 4), "year, 2 months, 3 weeks, 4 days"),
4404 wxDateTime
dt(29, wxDateTime::Dec
, 1999), dt1
, dt2
;
4406 for ( size_t n
= 0; n
< WXSIZEOF(testArithmData
); n
++ )
4408 wxDateSpan span
= testArithmData
[n
].span
;
4412 const char *name
= testArithmData
[n
].name
;
4413 printf("%s + %s = %s, %s - %s = %s\n",
4414 dt
.FormatISODate().c_str(), name
, dt1
.FormatISODate().c_str(),
4415 dt
.FormatISODate().c_str(), name
, dt2
.FormatISODate().c_str());
4417 printf("Going back: %s", (dt1
- span
).FormatISODate().c_str());
4418 if ( dt1
- span
== dt
)
4424 printf(" (ERROR: should be %s)\n", dt
.FormatISODate().c_str());
4427 printf("Going forward: %s", (dt2
+ span
).FormatISODate().c_str());
4428 if ( dt2
+ span
== dt
)
4434 printf(" (ERROR: should be %s)\n", dt
.FormatISODate().c_str());
4437 printf("Double increment: %s", (dt2
+ 2*span
).FormatISODate().c_str());
4438 if ( dt2
+ 2*span
== dt1
)
4444 printf(" (ERROR: should be %s)\n", dt2
.FormatISODate().c_str());
4451 static void TestTimeHolidays()
4453 puts("\n*** testing wxDateTimeHolidayAuthority ***\n");
4455 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
4456 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
4457 dtEnd
= dtStart
.GetLastMonthDay();
4459 wxDateTimeArray hol
;
4460 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
4462 const wxChar
*format
= "%d-%b-%Y (%a)";
4464 printf("All holidays between %s and %s:\n",
4465 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
4467 size_t count
= hol
.GetCount();
4468 for ( size_t n
= 0; n
< count
; n
++ )
4470 printf("\t%s\n", hol
[n
].Format(format
).c_str());
4476 static void TestTimeZoneBug()
4478 puts("\n*** testing for DST/timezone bug ***\n");
4480 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
4481 for ( int i
= 0; i
< 31; i
++ )
4483 printf("Date %s: week day %s.\n",
4484 date
.Format(_T("%d-%m-%Y")).c_str(),
4485 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
4487 date
+= wxDateSpan::Day();
4493 static void TestTimeSpanFormat()
4495 puts("\n*** wxTimeSpan tests ***");
4497 static const char *formats
[] =
4499 _T("(default) %H:%M:%S"),
4500 _T("%E weeks and %D days"),
4501 _T("%l milliseconds"),
4502 _T("(with ms) %H:%M:%S:%l"),
4503 _T("100%% of minutes is %M"), // test "%%"
4504 _T("%D days and %H hours"),
4505 _T("or also %S seconds"),
4508 wxTimeSpan
ts1(1, 2, 3, 4),
4510 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
4512 printf("ts1 = %s\tts2 = %s\n",
4513 ts1
.Format(formats
[n
]).c_str(),
4514 ts2
.Format(formats
[n
]).c_str());
4522 // test compatibility with the old wxDate/wxTime classes
4523 static void TestTimeCompatibility()
4525 puts("\n*** wxDateTime compatibility test ***");
4527 printf("wxDate for JDN 0: %s\n", wxDate(0l).FormatDate().c_str());
4528 printf("wxDate for MJD 0: %s\n", wxDate(2400000).FormatDate().c_str());
4530 double jdnNow
= wxDateTime::Now().GetJDN();
4531 long jdnMidnight
= (long)(jdnNow
- 0.5);
4532 printf("wxDate for today: %s\n", wxDate(jdnMidnight
).FormatDate().c_str());
4534 jdnMidnight
= wxDate().Set().GetJulianDate();
4535 printf("wxDateTime for today: %s\n",
4536 wxDateTime((double)(jdnMidnight
+ 0.5)).Format("%c", wxDateTime::GMT0
).c_str());
4538 int flags
= wxEUROPEAN
;//wxFULL;
4541 printf("Today is %s\n", date
.FormatDate(flags
).c_str());
4542 for ( int n
= 0; n
< 7; n
++ )
4544 printf("Previous %s is %s\n",
4545 wxDateTime::GetWeekDayName((wxDateTime::WeekDay
)n
),
4546 date
.Previous(n
+ 1).FormatDate(flags
).c_str());
4552 #endif // TEST_DATETIME
4554 // ----------------------------------------------------------------------------
4556 // ----------------------------------------------------------------------------
4560 #include "wx/thread.h"
4562 static size_t gs_counter
= (size_t)-1;
4563 static wxCriticalSection gs_critsect
;
4564 static wxCondition gs_cond
;
4566 class MyJoinableThread
: public wxThread
4569 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
4570 { m_n
= n
; Create(); }
4572 // thread execution starts here
4573 virtual ExitCode
Entry();
4579 wxThread::ExitCode
MyJoinableThread::Entry()
4581 unsigned long res
= 1;
4582 for ( size_t n
= 1; n
< m_n
; n
++ )
4586 // it's a loooong calculation :-)
4590 return (ExitCode
)res
;
4593 class MyDetachedThread
: public wxThread
4596 MyDetachedThread(size_t n
, char ch
)
4600 m_cancelled
= FALSE
;
4605 // thread execution starts here
4606 virtual ExitCode
Entry();
4609 virtual void OnExit();
4612 size_t m_n
; // number of characters to write
4613 char m_ch
; // character to write
4615 bool m_cancelled
; // FALSE if we exit normally
4618 wxThread::ExitCode
MyDetachedThread::Entry()
4621 wxCriticalSectionLocker
lock(gs_critsect
);
4622 if ( gs_counter
== (size_t)-1 )
4628 for ( size_t n
= 0; n
< m_n
; n
++ )
4630 if ( TestDestroy() )
4640 wxThread::Sleep(100);
4646 void MyDetachedThread::OnExit()
4648 wxLogTrace("thread", "Thread %ld is in OnExit", GetId());
4650 wxCriticalSectionLocker
lock(gs_critsect
);
4651 if ( !--gs_counter
&& !m_cancelled
)
4655 static void TestDetachedThreads()
4657 puts("\n*** Testing detached threads ***");
4659 static const size_t nThreads
= 3;
4660 MyDetachedThread
*threads
[nThreads
];
4662 for ( n
= 0; n
< nThreads
; n
++ )
4664 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
4667 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
4668 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
4670 for ( n
= 0; n
< nThreads
; n
++ )
4675 // wait until all threads terminate
4681 static void TestJoinableThreads()
4683 puts("\n*** Testing a joinable thread (a loooong calculation...) ***");
4685 // calc 10! in the background
4686 MyJoinableThread
thread(10);
4689 printf("\nThread terminated with exit code %lu.\n",
4690 (unsigned long)thread
.Wait());
4693 static void TestThreadSuspend()
4695 puts("\n*** Testing thread suspend/resume functions ***");
4697 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
4701 // this is for this demo only, in a real life program we'd use another
4702 // condition variable which would be signaled from wxThread::Entry() to
4703 // tell us that the thread really started running - but here just wait a
4704 // bit and hope that it will be enough (the problem is, of course, that
4705 // the thread might still not run when we call Pause() which will result
4707 wxThread::Sleep(300);
4709 for ( size_t n
= 0; n
< 3; n
++ )
4713 puts("\nThread suspended");
4716 // don't sleep but resume immediately the first time
4717 wxThread::Sleep(300);
4719 puts("Going to resume the thread");
4724 puts("Waiting until it terminates now");
4726 // wait until the thread terminates
4732 static void TestThreadDelete()
4734 // As above, using Sleep() is only for testing here - we must use some
4735 // synchronisation object instead to ensure that the thread is still
4736 // running when we delete it - deleting a detached thread which already
4737 // terminated will lead to a crash!
4739 puts("\n*** Testing thread delete function ***");
4741 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
4745 puts("\nDeleted a thread which didn't start to run yet.");
4747 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
4751 wxThread::Sleep(300);
4755 puts("\nDeleted a running thread.");
4757 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
4761 wxThread::Sleep(300);
4767 puts("\nDeleted a sleeping thread.");
4769 MyJoinableThread
thread3(20);
4774 puts("\nDeleted a joinable thread.");
4776 MyJoinableThread
thread4(2);
4779 wxThread::Sleep(300);
4783 puts("\nDeleted a joinable thread which already terminated.");
4788 class MyWaitingThread
: public wxThread
4791 MyWaitingThread(wxCondition
*condition
)
4793 m_condition
= condition
;
4798 virtual ExitCode
Entry()
4800 printf("Thread %lu has started running.\n", GetId());
4805 printf("Thread %lu starts to wait...\n", GetId());
4808 m_condition
->Wait();
4810 printf("Thread %lu finished to wait, exiting.\n", GetId());
4817 wxCondition
*m_condition
;
4820 static void TestThreadConditions()
4822 wxCondition condition
;
4824 // otherwise its difficult to understand which log messages pertain to
4826 wxLogTrace("thread", "Local condition var is %08x, gs_cond = %08x",
4827 condition
.GetId(), gs_cond
.GetId());
4829 // create and launch threads
4830 MyWaitingThread
*threads
[10];
4833 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
4835 threads
[n
] = new MyWaitingThread(&condition
);
4838 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
4843 // wait until all threads run
4844 puts("Main thread is waiting for the other threads to start");
4847 size_t nRunning
= 0;
4848 while ( nRunning
< WXSIZEOF(threads
) )
4854 printf("Main thread: %u already running\n", nRunning
);
4858 puts("Main thread: all threads started up.");
4861 wxThread::Sleep(500);
4864 // now wake one of them up
4865 printf("Main thread: about to signal the condition.\n");
4870 wxThread::Sleep(200);
4872 // wake all the (remaining) threads up, so that they can exit
4873 printf("Main thread: about to broadcast the condition.\n");
4875 condition
.Broadcast();
4877 // give them time to terminate (dirty!)
4878 wxThread::Sleep(500);
4881 #endif // TEST_THREADS
4883 // ----------------------------------------------------------------------------
4885 // ----------------------------------------------------------------------------
4889 #include "wx/dynarray.h"
4891 #define DefineCompare(name, T) \
4893 int wxCMPFUNC_CONV name ## CompareValues(T first, T second) \
4895 return first - second; \
4898 int wxCMPFUNC_CONV name ## Compare(T* first, T* second) \
4900 return *first - *second; \
4903 int wxCMPFUNC_CONV name ## RevCompare(T* first, T* second) \
4905 return *second - *first; \
4908 DefineCompare(Short, short);
4909 DefineCompare(Int
, int);
4911 // test compilation of all macros
4912 WX_DEFINE_ARRAY(short, wxArrayShort
);
4913 WX_DEFINE_SORTED_ARRAY(short, wxSortedArrayShortNoCmp
);
4914 WX_DEFINE_SORTED_ARRAY_CMP(short, ShortCompareValues
, wxSortedArrayShort
);
4915 WX_DEFINE_SORTED_ARRAY_CMP(int, IntCompareValues
, wxSortedArrayInt
);
4917 WX_DECLARE_OBJARRAY(Bar
, ArrayBars
);
4918 #include "wx/arrimpl.cpp"
4919 WX_DEFINE_OBJARRAY(ArrayBars
);
4921 static void PrintArray(const char* name
, const wxArrayString
& array
)
4923 printf("Dump of the array '%s'\n", name
);
4925 size_t nCount
= array
.GetCount();
4926 for ( size_t n
= 0; n
< nCount
; n
++ )
4928 printf("\t%s[%u] = '%s'\n", name
, n
, array
[n
].c_str());
4932 int wxCMPFUNC_CONV
StringLenCompare(const wxString
& first
,
4933 const wxString
& second
)
4935 return first
.length() - second
.length();
4938 #define TestArrayOf(name) \
4940 static void PrintArray(const char* name, const wxSortedArray##name & array) \
4942 printf("Dump of the array '%s'\n", name); \
4944 size_t nCount = array.GetCount(); \
4945 for ( size_t n = 0; n < nCount; n++ ) \
4947 printf("\t%s[%u] = %d\n", name, n, array[n]); \
4951 static void PrintArray(const char* name, const wxArray##name & array) \
4953 printf("Dump of the array '%s'\n", name); \
4955 size_t nCount = array.GetCount(); \
4956 for ( size_t n = 0; n < nCount; n++ ) \
4958 printf("\t%s[%u] = %d\n", name, n, array[n]); \
4962 static void TestArrayOf ## name ## s() \
4964 printf("*** Testing wxArray%s ***\n", #name); \
4972 puts("Initially:"); \
4973 PrintArray("a", a); \
4975 puts("After sort:"); \
4976 a.Sort(name ## Compare); \
4977 PrintArray("a", a); \
4979 puts("After reverse sort:"); \
4980 a.Sort(name ## RevCompare); \
4981 PrintArray("a", a); \
4983 wxSortedArray##name b; \
4989 puts("Sorted array initially:"); \
4990 PrintArray("b", b); \
4996 static void TestArrayOfObjects()
4998 puts("*** Testing wxObjArray ***\n");
5002 Bar
bar("second bar");
5004 printf("Initially: %u objects in the array, %u objects total.\n",
5005 bars
.GetCount(), Bar::GetNumber());
5007 bars
.Add(new Bar("first bar"));
5010 printf("Now: %u objects in the array, %u objects total.\n",
5011 bars
.GetCount(), Bar::GetNumber());
5015 printf("After Empty(): %u objects in the array, %u objects total.\n",
5016 bars
.GetCount(), Bar::GetNumber());
5019 printf("Finally: no more objects in the array, %u objects total.\n",
5023 #endif // TEST_ARRAYS
5025 // ----------------------------------------------------------------------------
5027 // ----------------------------------------------------------------------------
5031 #include "wx/timer.h"
5032 #include "wx/tokenzr.h"
5034 static void TestStringConstruction()
5036 puts("*** Testing wxString constructores ***");
5038 #define TEST_CTOR(args, res) \
5041 printf("wxString%s = %s ", #args, s.c_str()); \
5048 printf("(ERROR: should be %s)\n", res); \
5052 TEST_CTOR((_T('Z'), 4), _T("ZZZZ"));
5053 TEST_CTOR((_T("Hello"), 4), _T("Hell"));
5054 TEST_CTOR((_T("Hello"), 5), _T("Hello"));
5055 // TEST_CTOR((_T("Hello"), 6), _T("Hello")); -- should give assert failure
5057 static const wxChar
*s
= _T("?really!");
5058 const wxChar
*start
= wxStrchr(s
, _T('r'));
5059 const wxChar
*end
= wxStrchr(s
, _T('!'));
5060 TEST_CTOR((start
, end
), _T("really"));
5065 static void TestString()
5075 for (int i
= 0; i
< 1000000; ++i
)
5079 c
= "! How'ya doin'?";
5082 c
= "Hello world! What's up?";
5087 printf ("TestString elapsed time: %ld\n", sw
.Time());
5090 static void TestPChar()
5098 for (int i
= 0; i
< 1000000; ++i
)
5100 strcpy (a
, "Hello");
5101 strcpy (b
, " world");
5102 strcpy (c
, "! How'ya doin'?");
5105 strcpy (c
, "Hello world! What's up?");
5106 if (strcmp (c
, a
) == 0)
5110 printf ("TestPChar elapsed time: %ld\n", sw
.Time());
5113 static void TestStringSub()
5115 wxString
s("Hello, world!");
5117 puts("*** Testing wxString substring extraction ***");
5119 printf("String = '%s'\n", s
.c_str());
5120 printf("Left(5) = '%s'\n", s
.Left(5).c_str());
5121 printf("Right(6) = '%s'\n", s
.Right(6).c_str());
5122 printf("Mid(3, 5) = '%s'\n", s(3, 5).c_str());
5123 printf("Mid(3) = '%s'\n", s
.Mid(3).c_str());
5124 printf("substr(3, 5) = '%s'\n", s
.substr(3, 5).c_str());
5125 printf("substr(3) = '%s'\n", s
.substr(3).c_str());
5127 static const wxChar
*prefixes
[] =
5131 _T("Hello, world!"),
5132 _T("Hello, world!!!"),
5138 for ( size_t n
= 0; n
< WXSIZEOF(prefixes
); n
++ )
5140 wxString prefix
= prefixes
[n
], rest
;
5141 bool rc
= s
.StartsWith(prefix
, &rest
);
5142 printf("StartsWith('%s') = %s", prefix
.c_str(), rc
? "TRUE" : "FALSE");
5145 printf(" (the rest is '%s')\n", rest
.c_str());
5156 static void TestStringFormat()
5158 puts("*** Testing wxString formatting ***");
5161 s
.Printf("%03d", 18);
5163 printf("Number 18: %s\n", wxString::Format("%03d", 18).c_str());
5164 printf("Number 18: %s\n", s
.c_str());
5169 // returns "not found" for npos, value for all others
5170 static wxString
PosToString(size_t res
)
5172 wxString s
= res
== wxString::npos
? wxString(_T("not found"))
5173 : wxString::Format(_T("%u"), res
);
5177 static void TestStringFind()
5179 puts("*** Testing wxString find() functions ***");
5181 static const wxChar
*strToFind
= _T("ell");
5182 static const struct StringFindTest
5186 result
; // of searching "ell" in str
5189 { _T("Well, hello world"), 0, 1 },
5190 { _T("Well, hello world"), 6, 7 },
5191 { _T("Well, hello world"), 9, wxString::npos
},
5194 for ( size_t n
= 0; n
< WXSIZEOF(findTestData
); n
++ )
5196 const StringFindTest
& ft
= findTestData
[n
];
5197 size_t res
= wxString(ft
.str
).find(strToFind
, ft
.start
);
5199 printf(_T("Index of '%s' in '%s' starting from %u is %s "),
5200 strToFind
, ft
.str
, ft
.start
, PosToString(res
).c_str());
5202 size_t resTrue
= ft
.result
;
5203 if ( res
== resTrue
)
5209 printf(_T("(ERROR: should be %s)\n"),
5210 PosToString(resTrue
).c_str());
5217 static void TestStringTokenizer()
5219 puts("*** Testing wxStringTokenizer ***");
5221 static const wxChar
*modeNames
[] =
5225 _T("return all empty"),
5230 static const struct StringTokenizerTest
5232 const wxChar
*str
; // string to tokenize
5233 const wxChar
*delims
; // delimiters to use
5234 size_t count
; // count of token
5235 wxStringTokenizerMode mode
; // how should we tokenize it
5236 } tokenizerTestData
[] =
5238 { _T(""), _T(" "), 0 },
5239 { _T("Hello, world"), _T(" "), 2 },
5240 { _T("Hello, world "), _T(" "), 2 },
5241 { _T("Hello, world"), _T(","), 2 },
5242 { _T("Hello, world!"), _T(",!"), 2 },
5243 { _T("Hello,, world!"), _T(",!"), 3 },
5244 { _T("Hello, world!"), _T(",!"), 3, wxTOKEN_RET_EMPTY_ALL
},
5245 { _T("username:password:uid:gid:gecos:home:shell"), _T(":"), 7 },
5246 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 4 },
5247 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 6, wxTOKEN_RET_EMPTY
},
5248 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 9, wxTOKEN_RET_EMPTY_ALL
},
5249 { _T("01/02/99"), _T("/-"), 3 },
5250 { _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS
},
5253 for ( size_t n
= 0; n
< WXSIZEOF(tokenizerTestData
); n
++ )
5255 const StringTokenizerTest
& tt
= tokenizerTestData
[n
];
5256 wxStringTokenizer
tkz(tt
.str
, tt
.delims
, tt
.mode
);
5258 size_t count
= tkz
.CountTokens();
5259 printf(_T("String '%s' has %u tokens delimited by '%s' (mode = %s) "),
5260 MakePrintable(tt
.str
).c_str(),
5262 MakePrintable(tt
.delims
).c_str(),
5263 modeNames
[tkz
.GetMode()]);
5264 if ( count
== tt
.count
)
5270 printf(_T("(ERROR: should be %u)\n"), tt
.count
);
5275 // if we emulate strtok(), check that we do it correctly
5276 wxChar
*buf
, *s
= NULL
, *last
;
5278 if ( tkz
.GetMode() == wxTOKEN_STRTOK
)
5280 buf
= new wxChar
[wxStrlen(tt
.str
) + 1];
5281 wxStrcpy(buf
, tt
.str
);
5283 s
= wxStrtok(buf
, tt
.delims
, &last
);
5290 // now show the tokens themselves
5292 while ( tkz
.HasMoreTokens() )
5294 wxString token
= tkz
.GetNextToken();
5296 printf(_T("\ttoken %u: '%s'"),
5298 MakePrintable(token
).c_str());
5308 printf(" (ERROR: should be %s)\n", s
);
5311 s
= wxStrtok(NULL
, tt
.delims
, &last
);
5315 // nothing to compare with
5320 if ( count2
!= count
)
5322 puts(_T("\tERROR: token count mismatch"));
5331 static void TestStringReplace()
5333 puts("*** Testing wxString::replace ***");
5335 static const struct StringReplaceTestData
5337 const wxChar
*original
; // original test string
5338 size_t start
, len
; // the part to replace
5339 const wxChar
*replacement
; // the replacement string
5340 const wxChar
*result
; // and the expected result
5341 } stringReplaceTestData
[] =
5343 { _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") },
5344 { _T("increase"), 0, 2, _T("de"), _T("decrease") },
5345 { _T("wxWindow"), 8, 0, _T("s"), _T("wxWindows") },
5346 { _T("foobar"), 3, 0, _T("-"), _T("foo-bar") },
5347 { _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") },
5350 for ( size_t n
= 0; n
< WXSIZEOF(stringReplaceTestData
); n
++ )
5352 const StringReplaceTestData data
= stringReplaceTestData
[n
];
5354 wxString original
= data
.original
;
5355 original
.replace(data
.start
, data
.len
, data
.replacement
);
5357 wxPrintf(_T("wxString(\"%s\").replace(%u, %u, %s) = %s "),
5358 data
.original
, data
.start
, data
.len
, data
.replacement
,
5361 if ( original
== data
.result
)
5367 wxPrintf(_T("(ERROR: should be '%s')\n"), data
.result
);
5374 static void TestStringMatch()
5376 wxPuts(_T("*** Testing wxString::Matches() ***"));
5378 static const struct StringMatchTestData
5381 const wxChar
*wildcard
;
5383 } stringMatchTestData
[] =
5385 { _T("foobar"), _T("foo*"), 1 },
5386 { _T("foobar"), _T("*oo*"), 1 },
5387 { _T("foobar"), _T("*bar"), 1 },
5388 { _T("foobar"), _T("??????"), 1 },
5389 { _T("foobar"), _T("f??b*"), 1 },
5390 { _T("foobar"), _T("f?b*"), 0 },
5391 { _T("foobar"), _T("*goo*"), 0 },
5392 { _T("foobar"), _T("*foo"), 0 },
5393 { _T("foobarfoo"), _T("*foo"), 1 },
5394 { _T(""), _T("*"), 1 },
5395 { _T(""), _T("?"), 0 },
5398 for ( size_t n
= 0; n
< WXSIZEOF(stringMatchTestData
); n
++ )
5400 const StringMatchTestData
& data
= stringMatchTestData
[n
];
5401 bool matches
= wxString(data
.text
).Matches(data
.wildcard
);
5402 wxPrintf(_T("'%s' %s '%s' (%s)\n"),
5404 matches
? _T("matches") : _T("doesn't match"),
5406 matches
== data
.matches
? _T("ok") : _T("ERROR"));
5412 #endif // TEST_STRINGS
5414 // ----------------------------------------------------------------------------
5416 // ----------------------------------------------------------------------------
5418 #ifdef TEST_SNGLINST
5419 #include "wx/snglinst.h"
5420 #endif // TEST_SNGLINST
5422 int main(int argc
, char **argv
)
5424 wxInitializer initializer
;
5427 fprintf(stderr
, "Failed to initialize the wxWindows library, aborting.");
5432 #ifdef TEST_SNGLINST
5433 wxSingleInstanceChecker checker
;
5434 if ( checker
.Create(_T(".wxconsole.lock")) )
5436 if ( checker
.IsAnotherRunning() )
5438 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
5443 // wait some time to give time to launch another instance
5444 wxPrintf(_T("Press \"Enter\" to continue..."));
5447 else // failed to create
5449 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
5451 #endif // TEST_SNGLINST
5455 #endif // TEST_CHARSET
5458 TestCmdLineConvert();
5460 #if wxUSE_CMDLINE_PARSER
5461 static const wxCmdLineEntryDesc cmdLineDesc
[] =
5463 { wxCMD_LINE_SWITCH
, _T("h"), _T("help"), "show this help message",
5464 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
5465 { wxCMD_LINE_SWITCH
, "v", "verbose", "be verbose" },
5466 { wxCMD_LINE_SWITCH
, "q", "quiet", "be quiet" },
5468 { wxCMD_LINE_OPTION
, "o", "output", "output file" },
5469 { wxCMD_LINE_OPTION
, "i", "input", "input dir" },
5470 { wxCMD_LINE_OPTION
, "s", "size", "output block size",
5471 wxCMD_LINE_VAL_NUMBER
},
5472 { wxCMD_LINE_OPTION
, "d", "date", "output file date",
5473 wxCMD_LINE_VAL_DATE
},
5475 { wxCMD_LINE_PARAM
, NULL
, NULL
, "input file",
5476 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
5481 wxCmdLineParser
parser(cmdLineDesc
, argc
, argv
);
5483 parser
.AddOption("project_name", "", "full path to project file",
5484 wxCMD_LINE_VAL_STRING
,
5485 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
5487 switch ( parser
.Parse() )
5490 wxLogMessage("Help was given, terminating.");
5494 ShowCmdLine(parser
);
5498 wxLogMessage("Syntax error detected, aborting.");
5501 #endif // wxUSE_CMDLINE_PARSER
5503 #endif // TEST_CMDLINE
5511 TestStringConstruction();
5514 TestStringTokenizer();
5515 TestStringReplace();
5521 #endif // TEST_STRINGS
5534 puts("*** Initially:");
5536 PrintArray("a1", a1
);
5538 wxArrayString
a2(a1
);
5539 PrintArray("a2", a2
);
5541 wxSortedArrayString
a3(a1
);
5542 PrintArray("a3", a3
);
5544 puts("*** After deleting a string from a1");
5547 PrintArray("a1", a1
);
5548 PrintArray("a2", a2
);
5549 PrintArray("a3", a3
);
5551 puts("*** After reassigning a1 to a2 and a3");
5553 PrintArray("a2", a2
);
5554 PrintArray("a3", a3
);
5556 puts("*** After sorting a1");
5558 PrintArray("a1", a1
);
5560 puts("*** After sorting a1 in reverse order");
5562 PrintArray("a1", a1
);
5564 puts("*** After sorting a1 by the string length");
5565 a1
.Sort(StringLenCompare
);
5566 PrintArray("a1", a1
);
5568 TestArrayOfObjects();
5569 TestArrayOfShorts();
5573 #endif // TEST_ARRAYS
5583 #ifdef TEST_DLLLOADER
5585 #endif // TEST_DLLLOADER
5589 #endif // TEST_ENVIRON
5593 #endif // TEST_EXECUTE
5595 #ifdef TEST_FILECONF
5597 #endif // TEST_FILECONF
5605 #endif // TEST_LOCALE
5609 for ( size_t n
= 0; n
< 8000; n
++ )
5611 s
<< (char)('A' + (n
% 26));
5615 msg
.Printf("A very very long message: '%s', the end!\n", s
.c_str());
5617 // this one shouldn't be truncated
5620 // but this one will because log functions use fixed size buffer
5621 // (note that it doesn't need '\n' at the end neither - will be added
5623 wxLogMessage("A very very long message 2: '%s', the end!", s
.c_str());
5635 #ifdef TEST_FILENAME
5639 fn
.Assign("c:\\foo", "bar.baz");
5646 TestFileNameConstruction();
5647 TestFileNameMakeRelative();
5648 TestFileNameSplit();
5651 TestFileNameComparison();
5652 TestFileNameOperations();
5654 #endif // TEST_FILENAME
5656 #ifdef TEST_FILETIME
5659 #endif // TEST_FILETIME
5662 wxLog::AddTraceMask(FTP_TRACE_MASK
);
5663 if ( TestFtpConnect() )
5674 if ( TEST_INTERACTIVE
)
5675 TestFtpInteractive();
5677 //else: connecting to the FTP server failed
5683 #ifdef TEST_LONGLONG
5684 // seed pseudo random generator
5685 srand((unsigned)time(NULL
));
5694 TestMultiplication();
5697 TestLongLongConversion();
5698 TestBitOperations();
5699 TestLongLongComparison();
5700 TestLongLongPrint();
5702 #endif // TEST_LONGLONG
5710 #endif // TEST_HASHMAP
5713 wxLog::AddTraceMask(_T("mime"));
5721 TestMimeAssociate();
5724 #ifdef TEST_INFO_FUNCTIONS
5730 if ( TEST_INTERACTIVE
)
5733 #endif // TEST_INFO_FUNCTIONS
5735 #ifdef TEST_PATHLIST
5737 #endif // TEST_PATHLIST
5745 #endif // TEST_REGCONF
5748 // TODO: write a real test using src/regex/tests file
5753 TestRegExSubmatch();
5754 TestRegExReplacement();
5756 if ( TEST_INTERACTIVE
)
5757 TestRegExInteractive();
5759 #endif // TEST_REGEX
5761 #ifdef TEST_REGISTRY
5763 TestRegistryAssociation();
5764 #endif // TEST_REGISTRY
5769 #endif // TEST_SOCKETS
5774 #endif // TEST_STREAMS
5777 int nCPUs
= wxThread::GetCPUCount();
5778 printf("This system has %d CPUs\n", nCPUs
);
5780 wxThread::SetConcurrency(nCPUs
);
5784 TestDetachedThreads();
5785 TestJoinableThreads();
5786 TestThreadSuspend();
5790 TestThreadConditions();
5791 #endif // TEST_THREADS
5795 #endif // TEST_TIMER
5797 #ifdef TEST_DATETIME
5810 TestTimeArithmetics();
5813 TestTimeSpanFormat();
5819 if ( TEST_INTERACTIVE
)
5820 TestDateTimeInteractive();
5821 #endif // TEST_DATETIME
5824 puts("Sleeping for 3 seconds... z-z-z-z-z...");
5826 #endif // TEST_USLEEP
5831 #endif // TEST_VCARD
5835 TestEncodingConverter();
5836 #endif // TEST_WCHAR
5839 TestZipStreamRead();
5840 TestZipFileSystem();
5844 TestZlibStreamWrite();
5845 TestZlibStreamRead();