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)
92 static const bool TEST_ALL
= TRUE
;
96 static const bool TEST_ALL
= FALSE
;
99 // some tests are interactive, define this to run them
100 #ifdef TEST_INTERACTIVE
101 #undef TEST_INTERACTIVE
103 static const bool TEST_INTERACTIVE
= TRUE
;
105 static const bool TEST_INTERACTIVE
= FALSE
;
108 // ----------------------------------------------------------------------------
109 // test class for container objects
110 // ----------------------------------------------------------------------------
112 #if defined(TEST_ARRAYS) || defined(TEST_LIST)
114 class Bar
// Foo is already taken in the hash test
117 Bar(const wxString
& name
) : m_name(name
) { ms_bars
++; }
118 Bar(const Bar
& bar
) : m_name(bar
.m_name
) { ms_bars
++; }
119 ~Bar() { ms_bars
--; }
121 static size_t GetNumber() { return ms_bars
; }
123 const char *GetName() const { return m_name
; }
128 static size_t ms_bars
;
131 size_t Bar::ms_bars
= 0;
133 #endif // defined(TEST_ARRAYS) || defined(TEST_LIST)
135 // ============================================================================
137 // ============================================================================
139 // ----------------------------------------------------------------------------
141 // ----------------------------------------------------------------------------
143 #if defined(TEST_STRINGS) || defined(TEST_SOCKETS)
145 // replace TABs with \t and CRs with \n
146 static wxString
MakePrintable(const wxChar
*s
)
149 (void)str
.Replace(_T("\t"), _T("\\t"));
150 (void)str
.Replace(_T("\n"), _T("\\n"));
151 (void)str
.Replace(_T("\r"), _T("\\r"));
156 #endif // MakePrintable() is used
158 // ----------------------------------------------------------------------------
159 // wxFontMapper::CharsetToEncoding
160 // ----------------------------------------------------------------------------
164 #include "wx/fontmap.h"
166 static void TestCharset()
168 static const wxChar
*charsets
[] =
170 // some vali charsets
179 // and now some bogus ones
186 for ( size_t n
= 0; n
< WXSIZEOF(charsets
); n
++ )
188 wxFontEncoding enc
= wxFontMapper::Get()->CharsetToEncoding(charsets
[n
]);
189 wxPrintf(_T("Charset: %s\tEncoding: %s (%s)\n"),
191 wxFontMapper::Get()->GetEncodingName(enc
).c_str(),
192 wxFontMapper::Get()->GetEncodingDescription(enc
).c_str());
196 #endif // TEST_CHARSET
198 // ----------------------------------------------------------------------------
200 // ----------------------------------------------------------------------------
204 #include "wx/cmdline.h"
205 #include "wx/datetime.h"
207 #if wxUSE_CMDLINE_PARSER
209 static void ShowCmdLine(const wxCmdLineParser
& parser
)
211 wxString s
= "Input files: ";
213 size_t count
= parser
.GetParamCount();
214 for ( size_t param
= 0; param
< count
; param
++ )
216 s
<< parser
.GetParam(param
) << ' ';
220 << "Verbose:\t" << (parser
.Found("v") ? "yes" : "no") << '\n'
221 << "Quiet:\t" << (parser
.Found("q") ? "yes" : "no") << '\n';
226 if ( parser
.Found("o", &strVal
) )
227 s
<< "Output file:\t" << strVal
<< '\n';
228 if ( parser
.Found("i", &strVal
) )
229 s
<< "Input dir:\t" << strVal
<< '\n';
230 if ( parser
.Found("s", &lVal
) )
231 s
<< "Size:\t" << lVal
<< '\n';
232 if ( parser
.Found("d", &dt
) )
233 s
<< "Date:\t" << dt
.FormatISODate() << '\n';
234 if ( parser
.Found("project_name", &strVal
) )
235 s
<< "Project:\t" << strVal
<< '\n';
240 #endif // wxUSE_CMDLINE_PARSER
242 static void TestCmdLineConvert()
244 static const char *cmdlines
[] =
247 "-a \"-bstring 1\" -c\"string 2\" \"string 3\"",
248 "literal \\\" and \"\"",
251 for ( size_t n
= 0; n
< WXSIZEOF(cmdlines
); n
++ )
253 const char *cmdline
= cmdlines
[n
];
254 printf("Parsing: %s\n", cmdline
);
255 wxArrayString args
= wxCmdLineParser::ConvertStringToArgs(cmdline
);
257 size_t count
= args
.GetCount();
258 printf("\targc = %u\n", count
);
259 for ( size_t arg
= 0; arg
< count
; arg
++ )
261 printf("\targv[%u] = %s\n", arg
, args
[arg
].c_str());
266 #endif // TEST_CMDLINE
268 // ----------------------------------------------------------------------------
270 // ----------------------------------------------------------------------------
277 static const wxChar
*ROOTDIR
= _T("/");
278 static const wxChar
*TESTDIR
= _T("/usr");
279 #elif defined(__WXMSW__)
280 static const wxChar
*ROOTDIR
= _T("c:\\");
281 static const wxChar
*TESTDIR
= _T("d:\\");
283 #error "don't know where the root directory is"
286 static void TestDirEnumHelper(wxDir
& dir
,
287 int flags
= wxDIR_DEFAULT
,
288 const wxString
& filespec
= wxEmptyString
)
292 if ( !dir
.IsOpened() )
295 bool cont
= dir
.GetFirst(&filename
, filespec
, flags
);
298 printf("\t%s\n", filename
.c_str());
300 cont
= dir
.GetNext(&filename
);
306 static void TestDirEnum()
308 puts("*** Testing wxDir::GetFirst/GetNext ***");
310 wxString cwd
= wxGetCwd();
311 if ( wxDir::Exists(cwd
) )
313 printf("ERROR: current directory '%s' doesn't exist?\n", cwd
.c_str());
318 if ( !dir
.IsOpened() )
320 printf("ERROR: failed to open current directory '%s'.\n", cwd
.c_str());
324 puts("Enumerating everything in current directory:");
325 TestDirEnumHelper(dir
);
327 puts("Enumerating really everything in current directory:");
328 TestDirEnumHelper(dir
, wxDIR_DEFAULT
| wxDIR_DOTDOT
);
330 puts("Enumerating object files in current directory:");
331 TestDirEnumHelper(dir
, wxDIR_DEFAULT
, "*.o");
333 puts("Enumerating directories in current directory:");
334 TestDirEnumHelper(dir
, wxDIR_DIRS
);
336 puts("Enumerating files in current directory:");
337 TestDirEnumHelper(dir
, wxDIR_FILES
);
339 puts("Enumerating files including hidden in current directory:");
340 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
344 puts("Enumerating everything in root directory:");
345 TestDirEnumHelper(dir
, wxDIR_DEFAULT
);
347 puts("Enumerating directories in root directory:");
348 TestDirEnumHelper(dir
, wxDIR_DIRS
);
350 puts("Enumerating files in root directory:");
351 TestDirEnumHelper(dir
, wxDIR_FILES
);
353 puts("Enumerating files including hidden in root directory:");
354 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
356 puts("Enumerating files in non existing directory:");
357 wxDir
dirNo("nosuchdir");
358 TestDirEnumHelper(dirNo
);
361 class DirPrintTraverser
: public wxDirTraverser
364 virtual wxDirTraverseResult
OnFile(const wxString
& filename
)
366 return wxDIR_CONTINUE
;
369 virtual wxDirTraverseResult
OnDir(const wxString
& dirname
)
371 wxString path
, name
, ext
;
372 wxSplitPath(dirname
, &path
, &name
, &ext
);
375 name
<< _T('.') << ext
;
378 for ( const wxChar
*p
= path
.c_str(); *p
; p
++ )
380 if ( wxIsPathSeparator(*p
) )
384 printf("%s%s\n", indent
.c_str(), name
.c_str());
386 return wxDIR_CONTINUE
;
390 static void TestDirTraverse()
392 puts("*** Testing wxDir::Traverse() ***");
396 size_t n
= wxDir::GetAllFiles(TESTDIR
, &files
);
397 printf("There are %u files under '%s'\n", n
, TESTDIR
);
400 printf("First one is '%s'\n", files
[0u].c_str());
401 printf(" last one is '%s'\n", files
[n
- 1].c_str());
404 // enum again with custom traverser
406 DirPrintTraverser traverser
;
407 dir
.Traverse(traverser
, _T(""), wxDIR_DIRS
| wxDIR_HIDDEN
);
410 static void TestDirExists()
412 wxPuts(_T("*** Testing wxDir::Exists() ***"));
414 static const char *dirnames
[] =
417 #if defined(__WXMSW__)
420 _T("\\\\share\\file"),
424 _T("c:\\autoexec.bat"),
425 #elif defined(__UNIX__)
434 for ( size_t n
= 0; n
< WXSIZEOF(dirnames
); n
++ )
436 printf(_T("%-40s: %s\n"),
438 wxDir::Exists(dirnames
[n
]) ? _T("exists") : _T("doesn't exist"));
444 // ----------------------------------------------------------------------------
446 // ----------------------------------------------------------------------------
448 #ifdef TEST_DLLLOADER
450 #include "wx/dynlib.h"
452 static void TestDllLoad()
454 #if defined(__WXMSW__)
455 static const wxChar
*LIB_NAME
= _T("kernel32.dll");
456 static const wxChar
*FUNC_NAME
= _T("lstrlenA");
457 #elif defined(__UNIX__)
458 // weird: using just libc.so does *not* work!
459 static const wxChar
*LIB_NAME
= _T("/lib/libc-2.0.7.so");
460 static const wxChar
*FUNC_NAME
= _T("strlen");
462 #error "don't know how to test wxDllLoader on this platform"
465 puts("*** testing wxDllLoader ***\n");
467 wxDllType dllHandle
= wxDllLoader::LoadLibrary(LIB_NAME
);
470 wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME
);
474 typedef int (*strlenType
)(const char *);
475 strlenType pfnStrlen
= (strlenType
)wxDllLoader::GetSymbol(dllHandle
, FUNC_NAME
);
478 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
479 FUNC_NAME
, LIB_NAME
);
483 if ( pfnStrlen("foo") != 3 )
485 wxPrintf(_T("ERROR: loaded function is not strlen()!\n"));
493 wxDllLoader::UnloadLibrary(dllHandle
);
497 #endif // TEST_DLLLOADER
499 // ----------------------------------------------------------------------------
501 // ----------------------------------------------------------------------------
505 #include "wx/utils.h"
507 static wxString
MyGetEnv(const wxString
& var
)
510 if ( !wxGetEnv(var
, &val
) )
513 val
= wxString(_T('\'')) + val
+ _T('\'');
518 static void TestEnvironment()
520 const wxChar
*var
= _T("wxTestVar");
522 puts("*** testing environment access functions ***");
524 printf("Initially getenv(%s) = %s\n", var
, MyGetEnv(var
).c_str());
525 wxSetEnv(var
, _T("value for wxTestVar"));
526 printf("After wxSetEnv: getenv(%s) = %s\n", var
, MyGetEnv(var
).c_str());
527 wxSetEnv(var
, _T("another value"));
528 printf("After 2nd wxSetEnv: getenv(%s) = %s\n", var
, MyGetEnv(var
).c_str());
530 printf("After wxUnsetEnv: getenv(%s) = %s\n", var
, MyGetEnv(var
).c_str());
531 printf("PATH = %s\n", MyGetEnv(_T("PATH")).c_str());
534 #endif // TEST_ENVIRON
536 // ----------------------------------------------------------------------------
538 // ----------------------------------------------------------------------------
542 #include "wx/utils.h"
544 static void TestExecute()
546 puts("*** testing wxExecute ***");
549 #define COMMAND "cat -n ../../Makefile" // "echo hi"
550 #define SHELL_COMMAND "echo hi from shell"
551 #define REDIRECT_COMMAND COMMAND // "date"
552 #elif defined(__WXMSW__)
553 #define COMMAND "command.com -c 'echo hi'"
554 #define SHELL_COMMAND "echo hi"
555 #define REDIRECT_COMMAND COMMAND
557 #error "no command to exec"
560 printf("Testing wxShell: ");
562 if ( wxShell(SHELL_COMMAND
) )
567 printf("Testing wxExecute: ");
569 if ( wxExecute(COMMAND
, TRUE
/* sync */) == 0 )
574 #if 0 // no, it doesn't work (yet?)
575 printf("Testing async wxExecute: ");
577 if ( wxExecute(COMMAND
) != 0 )
578 puts("Ok (command launched).");
583 printf("Testing wxExecute with redirection:\n");
584 wxArrayString output
;
585 if ( wxExecute(REDIRECT_COMMAND
, output
) != 0 )
591 size_t count
= output
.GetCount();
592 for ( size_t n
= 0; n
< count
; n
++ )
594 printf("\t%s\n", output
[n
].c_str());
601 #endif // TEST_EXECUTE
603 // ----------------------------------------------------------------------------
605 // ----------------------------------------------------------------------------
610 #include "wx/ffile.h"
611 #include "wx/textfile.h"
613 static void TestFileRead()
615 puts("*** wxFile read test ***");
617 wxFile
file(_T("testdata.fc"));
618 if ( file
.IsOpened() )
620 printf("File length: %lu\n", file
.Length());
622 puts("File dump:\n----------");
624 static const off_t len
= 1024;
628 off_t nRead
= file
.Read(buf
, len
);
629 if ( nRead
== wxInvalidOffset
)
631 printf("Failed to read the file.");
635 fwrite(buf
, nRead
, 1, stdout
);
645 printf("ERROR: can't open test file.\n");
651 static void TestTextFileRead()
653 puts("*** wxTextFile read test ***");
655 wxTextFile
file(_T("testdata.fc"));
658 printf("Number of lines: %u\n", file
.GetLineCount());
659 printf("Last line: '%s'\n", file
.GetLastLine().c_str());
663 puts("\nDumping the entire file:");
664 for ( s
= file
.GetFirstLine(); !file
.Eof(); s
= file
.GetNextLine() )
666 printf("%6u: %s\n", file
.GetCurrentLine() + 1, s
.c_str());
668 printf("%6u: %s\n", file
.GetCurrentLine() + 1, s
.c_str());
670 puts("\nAnd now backwards:");
671 for ( s
= file
.GetLastLine();
672 file
.GetCurrentLine() != 0;
673 s
= file
.GetPrevLine() )
675 printf("%6u: %s\n", file
.GetCurrentLine() + 1, s
.c_str());
677 printf("%6u: %s\n", file
.GetCurrentLine() + 1, s
.c_str());
681 printf("ERROR: can't open '%s'\n", file
.GetName());
687 static void TestFileCopy()
689 puts("*** Testing wxCopyFile ***");
691 static const wxChar
*filename1
= _T("testdata.fc");
692 static const wxChar
*filename2
= _T("test2");
693 if ( !wxCopyFile(filename1
, filename2
) )
695 puts("ERROR: failed to copy file");
699 wxFFile
f1(filename1
, "rb"),
702 if ( !f1
.IsOpened() || !f2
.IsOpened() )
704 puts("ERROR: failed to open file(s)");
709 if ( !f1
.ReadAll(&s1
) || !f2
.ReadAll(&s2
) )
711 puts("ERROR: failed to read file(s)");
715 if ( (s1
.length() != s2
.length()) ||
716 (memcmp(s1
.c_str(), s2
.c_str(), s1
.length()) != 0) )
718 puts("ERROR: copy error!");
722 puts("File was copied ok.");
728 if ( !wxRemoveFile(filename2
) )
730 puts("ERROR: failed to remove the file");
738 // ----------------------------------------------------------------------------
740 // ----------------------------------------------------------------------------
744 #include "wx/confbase.h"
745 #include "wx/fileconf.h"
747 static const struct FileConfTestData
749 const wxChar
*name
; // value name
750 const wxChar
*value
; // the value from the file
753 { _T("value1"), _T("one") },
754 { _T("value2"), _T("two") },
755 { _T("novalue"), _T("default") },
758 static void TestFileConfRead()
760 puts("*** testing wxFileConfig loading/reading ***");
762 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
763 _T("testdata.fc"), wxEmptyString
,
764 wxCONFIG_USE_RELATIVE_PATH
);
766 // test simple reading
767 puts("\nReading config file:");
768 wxString
defValue(_T("default")), value
;
769 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
771 const FileConfTestData
& data
= fcTestData
[n
];
772 value
= fileconf
.Read(data
.name
, defValue
);
773 printf("\t%s = %s ", data
.name
, value
.c_str());
774 if ( value
== data
.value
)
780 printf("(ERROR: should be %s)\n", data
.value
);
784 // test enumerating the entries
785 puts("\nEnumerating all root entries:");
788 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
791 printf("\t%s = %s\n",
793 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
795 cont
= fileconf
.GetNextEntry(name
, dummy
);
799 #endif // TEST_FILECONF
801 // ----------------------------------------------------------------------------
803 // ----------------------------------------------------------------------------
807 #include "wx/filename.h"
809 static void DumpFileName(const wxFileName
& fn
)
811 wxString full
= fn
.GetFullPath();
813 wxString vol
, path
, name
, ext
;
814 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
816 wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
817 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
819 wxFileName::SplitPath(full
, &path
, &name
, &ext
);
820 wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
821 path
.c_str(), name
.c_str(), ext
.c_str());
823 wxPrintf(_T("path is also:\t'%s'\n"), fn
.GetPath().c_str());
824 wxPrintf(_T("with volume: \t'%s'\n"),
825 fn
.GetPath(wxPATH_GET_VOLUME
).c_str());
826 wxPrintf(_T("with separator:\t'%s'\n"),
827 fn
.GetPath(wxPATH_GET_SEPARATOR
).c_str());
828 wxPrintf(_T("with both: \t'%s'\n"),
829 fn
.GetPath(wxPATH_GET_SEPARATOR
| wxPATH_GET_VOLUME
).c_str());
831 wxPuts(_T("The directories in the path are:"));
832 wxArrayString dirs
= fn
.GetDirs();
833 size_t count
= dirs
.GetCount();
834 for ( size_t n
= 0; n
< count
; n
++ )
836 wxPrintf(_T("\t%u: %s\n"), n
, dirs
[n
].c_str());
840 static struct FileNameInfo
842 const wxChar
*fullname
;
843 const wxChar
*volume
;
852 { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), TRUE
, wxPATH_UNIX
},
853 { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), TRUE
, wxPATH_UNIX
},
854 { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), TRUE
, wxPATH_UNIX
},
855 { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), FALSE
, wxPATH_UNIX
},
856 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_UNIX
},
857 { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), TRUE
, wxPATH_UNIX
},
858 { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), TRUE
, wxPATH_UNIX
},
859 { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), FALSE
, wxPATH_UNIX
},
860 { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), TRUE
, wxPATH_UNIX
},
862 // Windows file names
863 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
864 { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
865 { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
866 { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
867 { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), TRUE
, wxPATH_DOS
},
868 { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
869 { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
871 // wxFileName support for Mac file names is broken currently
874 { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE
, wxPATH_MAC
},
875 { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), TRUE
, wxPATH_MAC
},
876 { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), TRUE
, wxPATH_MAC
},
877 { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), FALSE
, wxPATH_MAC
},
878 { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE
, wxPATH_MAC
},
879 { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE
, wxPATH_MAC
},
883 { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), TRUE
, wxPATH_VMS
},
884 { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), FALSE
, wxPATH_VMS
},
887 static void TestFileNameConstruction()
889 puts("*** testing wxFileName construction ***");
891 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
893 const FileNameInfo
& fni
= filenames
[n
];
895 wxFileName
fn(fni
.fullname
, fni
.format
);
897 wxString fullname
= fn
.GetFullPath(fni
.format
);
898 if ( fullname
!= fni
.fullname
)
900 printf("ERROR: fullname should be '%s'\n", fni
.fullname
);
903 bool isAbsolute
= fn
.IsAbsolute(fni
.format
);
904 printf("'%s' is %s (%s)\n\t",
906 isAbsolute
? "absolute" : "relative",
907 isAbsolute
== fni
.isAbsolute
? "ok" : "ERROR");
909 if ( !fn
.Normalize(wxPATH_NORM_ALL
, _T(""), fni
.format
) )
911 puts("ERROR (couldn't be normalized)");
915 printf("normalized: '%s'\n", fn
.GetFullPath(fni
.format
).c_str());
922 static void TestFileNameSplit()
924 puts("*** testing wxFileName splitting ***");
926 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
928 const FileNameInfo
& fni
= filenames
[n
];
929 wxString volume
, path
, name
, ext
;
930 wxFileName::SplitPath(fni
.fullname
,
931 &volume
, &path
, &name
, &ext
, fni
.format
);
933 printf("%s -> volume = '%s', path = '%s', name = '%s', ext = '%s'",
935 volume
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
937 if ( volume
!= fni
.volume
)
938 printf(" (ERROR: volume = '%s')", fni
.volume
);
939 if ( path
!= fni
.path
)
940 printf(" (ERROR: path = '%s')", fni
.path
);
941 if ( name
!= fni
.name
)
942 printf(" (ERROR: name = '%s')", fni
.name
);
943 if ( ext
!= fni
.ext
)
944 printf(" (ERROR: ext = '%s')", fni
.ext
);
950 static void TestFileNameTemp()
952 puts("*** testing wxFileName temp file creation ***");
954 static const char *tmpprefixes
[] =
962 "/tmp/foo/bar", // this one must be an error
966 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
968 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
971 // "error" is not in upper case because it may be ok
972 printf("Prefix '%s'\t-> error\n", tmpprefixes
[n
]);
976 printf("Prefix '%s'\t-> temp file '%s'\n",
977 tmpprefixes
[n
], path
.c_str());
979 if ( !wxRemoveFile(path
) )
981 wxLogWarning("Failed to remove temp file '%s'", path
.c_str());
987 static void TestFileNameMakeRelative()
989 puts("*** testing wxFileName::MakeRelativeTo() ***");
991 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
993 const FileNameInfo
& fni
= filenames
[n
];
995 wxFileName
fn(fni
.fullname
, fni
.format
);
997 // choose the base dir of the same format
999 switch ( fni
.format
)
1011 // TODO: I don't know how this is supposed to work there
1014 case wxPATH_NATIVE
: // make gcc happy
1016 wxFAIL_MSG( "unexpected path format" );
1019 printf("'%s' relative to '%s': ",
1020 fn
.GetFullPath(fni
.format
).c_str(), base
.c_str());
1022 if ( !fn
.MakeRelativeTo(base
, fni
.format
) )
1028 printf("'%s'\n", fn
.GetFullPath(fni
.format
).c_str());
1033 static void TestFileNameComparison()
1038 static void TestFileNameOperations()
1043 static void TestFileNameCwd()
1048 #endif // TEST_FILENAME
1050 // ----------------------------------------------------------------------------
1051 // wxFileName time functions
1052 // ----------------------------------------------------------------------------
1054 #ifdef TEST_FILETIME
1056 #include <wx/filename.h>
1057 #include <wx/datetime.h>
1059 static void TestFileGetTimes()
1061 wxFileName
fn(_T("testdata.fc"));
1063 wxDateTime dtAccess
, dtMod
, dtCreate
;
1064 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtCreate
) )
1066 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
1070 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
1072 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
1073 wxPrintf(_T("Creation: \t%s\n"), dtCreate
.Format(fmt
).c_str());
1074 wxPrintf(_T("Last read: \t%s\n"), dtAccess
.Format(fmt
).c_str());
1075 wxPrintf(_T("Last write: \t%s\n"), dtMod
.Format(fmt
).c_str());
1079 static void TestFileSetTimes()
1081 wxFileName
fn(_T("testdata.fc"));
1085 wxPrintf(_T("ERROR: Touch() failed.\n"));
1089 #endif // TEST_FILETIME
1091 // ----------------------------------------------------------------------------
1093 // ----------------------------------------------------------------------------
1097 #include "wx/hash.h"
1101 Foo(int n_
) { n
= n_
; count
++; }
1106 static size_t count
;
1109 size_t Foo::count
= 0;
1111 WX_DECLARE_LIST(Foo
, wxListFoos
);
1112 WX_DECLARE_HASH(Foo
, wxListFoos
, wxHashFoos
);
1114 #include "wx/listimpl.cpp"
1116 WX_DEFINE_LIST(wxListFoos
);
1118 static void TestHash()
1120 puts("*** Testing wxHashTable ***\n");
1124 hash
.DeleteContents(TRUE
);
1126 printf("Hash created: %u foos in hash, %u foos totally\n",
1127 hash
.GetCount(), Foo::count
);
1129 static const int hashTestData
[] =
1131 0, 1, 17, -2, 2, 4, -4, 345, 3, 3, 2, 1,
1135 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1137 hash
.Put(hashTestData
[n
], n
, new Foo(n
));
1140 printf("Hash filled: %u foos in hash, %u foos totally\n",
1141 hash
.GetCount(), Foo::count
);
1143 puts("Hash access test:");
1144 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1146 printf("\tGetting element with key %d, value %d: ",
1147 hashTestData
[n
], n
);
1148 Foo
*foo
= hash
.Get(hashTestData
[n
], n
);
1151 printf("ERROR, not found.\n");
1155 printf("%d (%s)\n", foo
->n
,
1156 (size_t)foo
->n
== n
? "ok" : "ERROR");
1160 printf("\nTrying to get an element not in hash: ");
1162 if ( hash
.Get(1234) || hash
.Get(1, 0) )
1164 puts("ERROR: found!");
1168 puts("ok (not found)");
1172 printf("Hash destroyed: %u foos left\n", Foo::count
);
1177 // ----------------------------------------------------------------------------
1179 // ----------------------------------------------------------------------------
1183 #include "wx/hashmap.h"
1185 // test compilation of basic map types
1186 WX_DECLARE_HASH_MAP( int*, int*, wxPointerHash
, wxPointerEqual
, myPtrHashMap
);
1187 WX_DECLARE_HASH_MAP( long, long, wxIntegerHash
, wxIntegerEqual
, myLongHashMap
);
1188 WX_DECLARE_HASH_MAP( unsigned long, unsigned, wxIntegerHash
, wxIntegerEqual
,
1189 myUnsignedHashMap
);
1190 WX_DECLARE_HASH_MAP( unsigned int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1192 WX_DECLARE_HASH_MAP( int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1194 WX_DECLARE_HASH_MAP( short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1196 WX_DECLARE_HASH_MAP( unsigned short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1200 // WX_DECLARE_HASH_MAP( wxString, wxString, wxStringHash, wxStringEqual,
1201 // myStringHashMap );
1202 WX_DECLARE_STRING_HASH_MAP(wxString
, myStringHashMap
);
1204 typedef myStringHashMap::iterator Itor
;
1206 static void TestHashMap()
1208 puts("*** Testing wxHashMap ***\n");
1209 myStringHashMap
sh(0); // as small as possible
1212 const size_t count
= 10000;
1214 // init with some data
1215 for( i
= 0; i
< count
; ++i
)
1217 buf
.Printf(wxT("%d"), i
);
1218 sh
[buf
] = wxT("A") + buf
+ wxT("C");
1221 // test that insertion worked
1222 if( sh
.size() != count
)
1224 printf("*** ERROR: %u ELEMENTS, SHOULD BE %u ***\n", sh
.size(), count
);
1227 for( i
= 0; i
< count
; ++i
)
1229 buf
.Printf(wxT("%d"), i
);
1230 if( sh
[buf
] != wxT("A") + buf
+ wxT("C") )
1232 printf("*** ERROR INSERTION BROKEN! STOPPING NOW! ***\n");
1237 // check that iterators work
1239 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1243 printf("*** ERROR ITERATORS DO NOT TERMINATE! STOPPING NOW! ***\n");
1247 if( it
->second
!= sh
[it
->first
] )
1249 printf("*** ERROR ITERATORS BROKEN! STOPPING NOW! ***\n");
1254 if( sh
.size() != i
)
1256 printf("*** ERROR: %u ELEMENTS ITERATED, SHOULD BE %u ***\n", i
, count
);
1259 // test copy ctor, assignment operator
1260 myStringHashMap
h1( sh
), h2( 0 );
1263 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1265 if( h1
[it
->first
] != it
->second
)
1267 printf("*** ERROR: COPY CTOR BROKEN %s ***\n", it
->first
.c_str());
1270 if( h2
[it
->first
] != it
->second
)
1272 printf("*** ERROR: OPERATOR= BROKEN %s ***\n", it
->first
.c_str());
1277 for( i
= 0; i
< count
; ++i
)
1279 buf
.Printf(wxT("%d"), i
);
1280 size_t sz
= sh
.size();
1282 // test find() and erase(it)
1285 it
= sh
.find( buf
);
1286 if( it
!= sh
.end() )
1290 if( sh
.find( buf
) != sh
.end() )
1292 printf("*** ERROR: FOUND DELETED ELEMENT %u ***\n", i
);
1296 printf("*** ERROR: CANT FIND ELEMENT %u ***\n", i
);
1301 size_t c
= sh
.erase( buf
);
1303 printf("*** ERROR: SHOULD RETURN 1 ***\n");
1305 if( sh
.find( buf
) != sh
.end() )
1307 printf("*** ERROR: FOUND DELETED ELEMENT %u ***\n", i
);
1311 // count should decrease
1312 if( sh
.size() != sz
- 1 )
1314 printf("*** ERROR: COUNT DID NOT DECREASE ***\n");
1318 printf("*** Finished testing wxHashMap ***\n");
1321 #endif // TEST_HASHMAP
1323 // ----------------------------------------------------------------------------
1325 // ----------------------------------------------------------------------------
1329 #include "wx/list.h"
1331 WX_DECLARE_LIST(Bar
, wxListBars
);
1332 #include "wx/listimpl.cpp"
1333 WX_DEFINE_LIST(wxListBars
);
1335 static void TestListCtor()
1337 puts("*** Testing wxList construction ***\n");
1341 list1
.Append(new Bar(_T("first")));
1342 list1
.Append(new Bar(_T("second")));
1344 printf("After 1st list creation: %u objects in the list, %u objects total.\n",
1345 list1
.GetCount(), Bar::GetNumber());
1350 printf("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n",
1351 list1
.GetCount(), list2
.GetCount(), Bar::GetNumber());
1353 list1
.DeleteContents(TRUE
);
1356 printf("After list destruction: %u objects left.\n", Bar::GetNumber());
1361 // ----------------------------------------------------------------------------
1363 // ----------------------------------------------------------------------------
1367 #include "wx/intl.h"
1368 #include "wx/utils.h" // for wxSetEnv
1370 static wxLocale
gs_localeDefault(wxLANGUAGE_ENGLISH
);
1372 // find the name of the language from its value
1373 static const char *GetLangName(int lang
)
1375 static const char *languageNames
[] =
1396 "ARABIC_SAUDI_ARABIA",
1421 "CHINESE_SIMPLIFIED",
1422 "CHINESE_TRADITIONAL",
1425 "CHINESE_SINGAPORE",
1436 "ENGLISH_AUSTRALIA",
1440 "ENGLISH_CARIBBEAN",
1444 "ENGLISH_NEW_ZEALAND",
1445 "ENGLISH_PHILIPPINES",
1446 "ENGLISH_SOUTH_AFRICA",
1458 "FRENCH_LUXEMBOURG",
1467 "GERMAN_LIECHTENSTEIN",
1468 "GERMAN_LUXEMBOURG",
1509 "MALAY_BRUNEI_DARUSSALAM",
1521 "NORWEGIAN_NYNORSK",
1528 "PORTUGUESE_BRAZILIAN",
1553 "SPANISH_ARGENTINA",
1557 "SPANISH_COSTA_RICA",
1558 "SPANISH_DOMINICAN_REPUBLIC",
1560 "SPANISH_EL_SALVADOR",
1561 "SPANISH_GUATEMALA",
1565 "SPANISH_NICARAGUA",
1569 "SPANISH_PUERTO_RICO",
1572 "SPANISH_VENEZUELA",
1609 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1610 return languageNames
[lang
];
1615 static void TestDefaultLang()
1617 puts("*** Testing wxLocale::GetSystemLanguage ***");
1619 static const wxChar
*langStrings
[] =
1621 NULL
, // system default
1628 _T("de_DE.iso88591"),
1630 _T("?"), // invalid lang spec
1631 _T("klingonese"), // I bet on some systems it does exist...
1634 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1635 wxLocale::GetSystemEncodingName().c_str(),
1636 wxLocale::GetSystemEncoding());
1638 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1640 const char *langStr
= langStrings
[n
];
1643 // FIXME: this doesn't do anything at all under Windows, we need
1644 // to create a new wxLocale!
1645 wxSetEnv(_T("LC_ALL"), langStr
);
1648 int lang
= gs_localeDefault
.GetSystemLanguage();
1649 printf("Locale for '%s' is %s.\n",
1650 langStr
? langStr
: "system default", GetLangName(lang
));
1654 #endif // TEST_LOCALE
1656 // ----------------------------------------------------------------------------
1658 // ----------------------------------------------------------------------------
1662 #include "wx/mimetype.h"
1664 static void TestMimeEnum()
1666 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1668 wxArrayString mimetypes
;
1670 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1672 printf("*** All %u known filetypes: ***\n", count
);
1677 for ( size_t n
= 0; n
< count
; n
++ )
1679 wxFileType
*filetype
=
1680 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1683 printf("nothing known about the filetype '%s'!\n",
1684 mimetypes
[n
].c_str());
1688 filetype
->GetDescription(&desc
);
1689 filetype
->GetExtensions(exts
);
1691 filetype
->GetIcon(NULL
);
1694 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1697 extsAll
<< _T(", ");
1701 printf("\t%s: %s (%s)\n",
1702 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
1708 static void TestMimeOverride()
1710 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
1712 static const wxChar
*mailcap
= _T("/tmp/mailcap");
1713 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
1715 if ( wxFile::Exists(mailcap
) )
1716 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
1718 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
1720 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
1723 if ( wxFile::Exists(mimetypes
) )
1724 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
1726 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
1728 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
1734 static void TestMimeFilename()
1736 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
1738 static const wxChar
*filenames
[] =
1745 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1747 const wxString fname
= filenames
[n
];
1748 wxString ext
= fname
.AfterLast(_T('.'));
1749 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
1752 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
1757 if ( !ft
->GetDescription(&desc
) )
1758 desc
= _T("<no description>");
1761 if ( !ft
->GetOpenCommand(&cmd
,
1762 wxFileType::MessageParameters(fname
, _T(""))) )
1763 cmd
= _T("<no command available>");
1765 wxPrintf(_T("To open %s (%s) do '%s'.\n"),
1766 fname
.c_str(), desc
.c_str(), cmd
.c_str());
1775 static void TestMimeAssociate()
1777 wxPuts(_T("*** Testing creation of filetype association ***\n"));
1779 wxFileTypeInfo
ftInfo(
1780 _T("application/x-xyz"),
1781 _T("xyzview '%s'"), // open cmd
1782 _T(""), // print cmd
1783 _T("XYZ File"), // description
1784 _T(".xyz"), // extensions
1785 NULL
// end of extensions
1787 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
1789 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
1792 wxPuts(_T("ERROR: failed to create association!"));
1796 // TODO: read it back
1805 // ----------------------------------------------------------------------------
1806 // misc information functions
1807 // ----------------------------------------------------------------------------
1809 #ifdef TEST_INFO_FUNCTIONS
1811 #include "wx/utils.h"
1813 static void TestDiskInfo()
1815 puts("*** Testing wxGetDiskSpace() ***");
1820 printf("\nEnter a directory name: ");
1821 if ( !fgets(pathname
, WXSIZEOF(pathname
), stdin
) )
1824 // kill the last '\n'
1825 pathname
[strlen(pathname
) - 1] = 0;
1827 wxLongLong total
, free
;
1828 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
1830 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
1834 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
1835 (total
/ 1024).ToString().c_str(),
1836 (free
/ 1024).ToString().c_str(),
1842 static void TestOsInfo()
1844 puts("*** Testing OS info functions ***\n");
1847 wxGetOsVersion(&major
, &minor
);
1848 printf("Running under: %s, version %d.%d\n",
1849 wxGetOsDescription().c_str(), major
, minor
);
1851 printf("%ld free bytes of memory left.\n", wxGetFreeMemory());
1853 printf("Host name is %s (%s).\n",
1854 wxGetHostName().c_str(), wxGetFullHostName().c_str());
1859 static void TestUserInfo()
1861 puts("*** Testing user info functions ***\n");
1863 printf("User id is:\t%s\n", wxGetUserId().c_str());
1864 printf("User name is:\t%s\n", wxGetUserName().c_str());
1865 printf("Home dir is:\t%s\n", wxGetHomeDir().c_str());
1866 printf("Email address:\t%s\n", wxGetEmailAddress().c_str());
1871 #endif // TEST_INFO_FUNCTIONS
1873 // ----------------------------------------------------------------------------
1875 // ----------------------------------------------------------------------------
1877 #ifdef TEST_LONGLONG
1879 #include "wx/longlong.h"
1880 #include "wx/timer.h"
1882 // make a 64 bit number from 4 16 bit ones
1883 #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3)
1885 // get a random 64 bit number
1886 #define RAND_LL() MAKE_LL(rand(), rand(), rand(), rand())
1888 static const long testLongs
[] =
1899 #if wxUSE_LONGLONG_WX
1900 inline bool operator==(const wxLongLongWx
& a
, const wxLongLongNative
& b
)
1901 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1902 inline bool operator==(const wxLongLongNative
& a
, const wxLongLongWx
& b
)
1903 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1904 #endif // wxUSE_LONGLONG_WX
1906 static void TestSpeed()
1908 static const long max
= 100000000;
1915 for ( n
= 0; n
< max
; n
++ )
1920 printf("Summing longs took %ld milliseconds.\n", sw
.Time());
1923 #if wxUSE_LONGLONG_NATIVE
1928 for ( n
= 0; n
< max
; n
++ )
1933 printf("Summing wxLongLong_t took %ld milliseconds.\n", sw
.Time());
1935 #endif // wxUSE_LONGLONG_NATIVE
1941 for ( n
= 0; n
< max
; n
++ )
1946 printf("Summing wxLongLongs took %ld milliseconds.\n", sw
.Time());
1950 static void TestLongLongConversion()
1952 puts("*** Testing wxLongLong conversions ***\n");
1956 for ( size_t n
= 0; n
< 100000; n
++ )
1960 #if wxUSE_LONGLONG_NATIVE
1961 wxLongLongNative
b(a
.GetHi(), a
.GetLo());
1963 wxASSERT_MSG( a
== b
, "conversions failure" );
1965 puts("Can't do it without native long long type, test skipped.");
1968 #endif // wxUSE_LONGLONG_NATIVE
1970 if ( !(nTested
% 1000) )
1982 static void TestMultiplication()
1984 puts("*** Testing wxLongLong multiplication ***\n");
1988 for ( size_t n
= 0; n
< 100000; n
++ )
1993 #if wxUSE_LONGLONG_NATIVE
1994 wxLongLongNative
aa(a
.GetHi(), a
.GetLo());
1995 wxLongLongNative
bb(b
.GetHi(), b
.GetLo());
1997 wxASSERT_MSG( a
*b
== aa
*bb
, "multiplication failure" );
1998 #else // !wxUSE_LONGLONG_NATIVE
1999 puts("Can't do it without native long long type, test skipped.");
2002 #endif // wxUSE_LONGLONG_NATIVE
2004 if ( !(nTested
% 1000) )
2016 static void TestDivision()
2018 puts("*** Testing wxLongLong division ***\n");
2022 for ( size_t n
= 0; n
< 100000; n
++ )
2024 // get a random wxLongLong (shifting by 12 the MSB ensures that the
2025 // multiplication will not overflow)
2026 wxLongLong ll
= MAKE_LL((rand() >> 12), rand(), rand(), rand());
2028 // get a random (but non null) long (not wxLongLong for now) to divide
2040 #if wxUSE_LONGLONG_NATIVE
2041 wxLongLongNative
m(ll
.GetHi(), ll
.GetLo());
2043 wxLongLongNative p
= m
/ l
, s
= m
% l
;
2044 wxASSERT_MSG( q
== p
&& r
== s
, "division failure" );
2045 #else // !wxUSE_LONGLONG_NATIVE
2046 // verify the result
2047 wxASSERT_MSG( ll
== q
*l
+ r
, "division failure" );
2048 #endif // wxUSE_LONGLONG_NATIVE
2050 if ( !(nTested
% 1000) )
2062 static void TestAddition()
2064 puts("*** Testing wxLongLong addition ***\n");
2068 for ( size_t n
= 0; n
< 100000; n
++ )
2074 #if wxUSE_LONGLONG_NATIVE
2075 wxASSERT_MSG( c
== wxLongLongNative(a
.GetHi(), a
.GetLo()) +
2076 wxLongLongNative(b
.GetHi(), b
.GetLo()),
2077 "addition failure" );
2078 #else // !wxUSE_LONGLONG_NATIVE
2079 wxASSERT_MSG( c
- b
== a
, "addition failure" );
2080 #endif // wxUSE_LONGLONG_NATIVE
2082 if ( !(nTested
% 1000) )
2094 static void TestBitOperations()
2096 puts("*** Testing wxLongLong bit operation ***\n");
2100 for ( size_t n
= 0; n
< 100000; n
++ )
2104 #if wxUSE_LONGLONG_NATIVE
2105 for ( size_t n
= 0; n
< 33; n
++ )
2108 #else // !wxUSE_LONGLONG_NATIVE
2109 puts("Can't do it without native long long type, test skipped.");
2112 #endif // wxUSE_LONGLONG_NATIVE
2114 if ( !(nTested
% 1000) )
2126 static void TestLongLongComparison()
2128 #if wxUSE_LONGLONG_WX
2129 puts("*** Testing wxLongLong comparison ***\n");
2131 static const long ls
[2] =
2137 wxLongLongWx lls
[2];
2141 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2145 for ( size_t m
= 0; m
< WXSIZEOF(lls
); m
++ )
2147 res
= lls
[m
] > testLongs
[n
];
2148 printf("0x%lx > 0x%lx is %s (%s)\n",
2149 ls
[m
], testLongs
[n
], res
? "true" : "false",
2150 res
== (ls
[m
] > testLongs
[n
]) ? "ok" : "ERROR");
2152 res
= lls
[m
] < testLongs
[n
];
2153 printf("0x%lx < 0x%lx is %s (%s)\n",
2154 ls
[m
], testLongs
[n
], res
? "true" : "false",
2155 res
== (ls
[m
] < testLongs
[n
]) ? "ok" : "ERROR");
2157 res
= lls
[m
] == testLongs
[n
];
2158 printf("0x%lx == 0x%lx is %s (%s)\n",
2159 ls
[m
], testLongs
[n
], res
? "true" : "false",
2160 res
== (ls
[m
] == testLongs
[n
]) ? "ok" : "ERROR");
2163 #endif // wxUSE_LONGLONG_WX
2166 static void TestLongLongPrint()
2168 wxPuts(_T("*** Testing wxLongLong printing ***\n"));
2170 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2172 wxLongLong ll
= testLongs
[n
];
2173 wxPrintf(_T("%ld == %s\n"), testLongs
[n
], ll
.ToString().c_str());
2176 wxLongLong
ll(0x12345678, 0x87654321);
2177 wxPrintf(_T("0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2180 wxPrintf(_T("-0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2186 #endif // TEST_LONGLONG
2188 // ----------------------------------------------------------------------------
2190 // ----------------------------------------------------------------------------
2192 #ifdef TEST_PATHLIST
2194 static void TestPathList()
2196 puts("*** Testing wxPathList ***\n");
2198 wxPathList pathlist
;
2199 pathlist
.AddEnvList("PATH");
2200 wxString path
= pathlist
.FindValidPath("ls");
2203 printf("ERROR: command not found in the path.\n");
2207 printf("Command found in the path as '%s'.\n", path
.c_str());
2211 #endif // TEST_PATHLIST
2213 // ----------------------------------------------------------------------------
2214 // regular expressions
2215 // ----------------------------------------------------------------------------
2219 #include "wx/regex.h"
2221 static void TestRegExCompile()
2223 wxPuts(_T("*** Testing RE compilation ***\n"));
2225 static struct RegExCompTestData
2227 const wxChar
*pattern
;
2229 } regExCompTestData
[] =
2231 { _T("foo"), TRUE
},
2232 { _T("foo("), FALSE
},
2233 { _T("foo(bar"), FALSE
},
2234 { _T("foo(bar)"), TRUE
},
2235 { _T("foo["), FALSE
},
2236 { _T("foo[bar"), FALSE
},
2237 { _T("foo[bar]"), TRUE
},
2238 { _T("foo{"), TRUE
},
2239 { _T("foo{1"), FALSE
},
2240 { _T("foo{bar"), TRUE
},
2241 { _T("foo{1}"), TRUE
},
2242 { _T("foo{1,2}"), TRUE
},
2243 { _T("foo{bar}"), TRUE
},
2244 { _T("foo*"), TRUE
},
2245 { _T("foo**"), FALSE
},
2246 { _T("foo+"), TRUE
},
2247 { _T("foo++"), FALSE
},
2248 { _T("foo?"), TRUE
},
2249 { _T("foo??"), FALSE
},
2250 { _T("foo?+"), FALSE
},
2254 for ( size_t n
= 0; n
< WXSIZEOF(regExCompTestData
); n
++ )
2256 const RegExCompTestData
& data
= regExCompTestData
[n
];
2257 bool ok
= re
.Compile(data
.pattern
);
2259 wxPrintf(_T("'%s' is %sa valid RE (%s)\n"),
2261 ok
? _T("") : _T("not "),
2262 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2266 static void TestRegExMatch()
2268 wxPuts(_T("*** Testing RE matching ***\n"));
2270 static struct RegExMatchTestData
2272 const wxChar
*pattern
;
2275 } regExMatchTestData
[] =
2277 { _T("foo"), _T("bar"), FALSE
},
2278 { _T("foo"), _T("foobar"), TRUE
},
2279 { _T("^foo"), _T("foobar"), TRUE
},
2280 { _T("^foo"), _T("barfoo"), FALSE
},
2281 { _T("bar$"), _T("barbar"), TRUE
},
2282 { _T("bar$"), _T("barbar "), FALSE
},
2285 for ( size_t n
= 0; n
< WXSIZEOF(regExMatchTestData
); n
++ )
2287 const RegExMatchTestData
& data
= regExMatchTestData
[n
];
2289 wxRegEx
re(data
.pattern
);
2290 bool ok
= re
.Matches(data
.text
);
2292 wxPrintf(_T("'%s' %s %s (%s)\n"),
2294 ok
? _T("matches") : _T("doesn't match"),
2296 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2300 static void TestRegExSubmatch()
2302 wxPuts(_T("*** Testing RE subexpressions ***\n"));
2304 wxRegEx
re(_T("([[:alpha:]]+) ([[:alpha:]]+) ([[:digit:]]+).*([[:digit:]]+)$"));
2305 if ( !re
.IsValid() )
2307 wxPuts(_T("ERROR: compilation failed."));
2311 wxString text
= _T("Fri Jul 13 18:37:52 CEST 2001");
2313 if ( !re
.Matches(text
) )
2315 wxPuts(_T("ERROR: match expected."));
2319 wxPrintf(_T("Entire match: %s\n"), re
.GetMatch(text
).c_str());
2321 wxPrintf(_T("Date: %s/%s/%s, wday: %s\n"),
2322 re
.GetMatch(text
, 3).c_str(),
2323 re
.GetMatch(text
, 2).c_str(),
2324 re
.GetMatch(text
, 4).c_str(),
2325 re
.GetMatch(text
, 1).c_str());
2329 static void TestRegExReplacement()
2331 wxPuts(_T("*** Testing RE replacement ***"));
2333 static struct RegExReplTestData
2337 const wxChar
*result
;
2339 } regExReplTestData
[] =
2341 { _T("foo123"), _T("bar"), _T("bar"), 1 },
2342 { _T("foo123"), _T("\\2\\1"), _T("123foo"), 1 },
2343 { _T("foo_123"), _T("\\2\\1"), _T("123foo"), 1 },
2344 { _T("123foo"), _T("bar"), _T("123foo"), 0 },
2345 { _T("123foo456foo"), _T("&&"), _T("123foo456foo456foo"), 1 },
2346 { _T("foo123foo123"), _T("bar"), _T("barbar"), 2 },
2347 { _T("foo123_foo456_foo789"), _T("bar"), _T("bar_bar_bar"), 3 },
2350 const wxChar
*pattern
= _T("([a-z]+)[^0-9]*([0-9]+)");
2351 wxRegEx
re(pattern
);
2353 wxPrintf(_T("Using pattern '%s' for replacement.\n"), pattern
);
2355 for ( size_t n
= 0; n
< WXSIZEOF(regExReplTestData
); n
++ )
2357 const RegExReplTestData
& data
= regExReplTestData
[n
];
2359 wxString text
= data
.text
;
2360 size_t nRepl
= re
.Replace(&text
, data
.repl
);
2362 wxPrintf(_T("%s =~ s/RE/%s/g: %u match%s, result = '%s' ("),
2363 data
.text
, data
.repl
,
2364 nRepl
, nRepl
== 1 ? _T("") : _T("es"),
2366 if ( text
== data
.result
&& nRepl
== data
.count
)
2372 wxPrintf(_T("ERROR: should be %u and '%s')\n"),
2373 data
.count
, data
.result
);
2378 static void TestRegExInteractive()
2380 wxPuts(_T("*** Testing RE interactively ***"));
2385 printf("\nEnter a pattern: ");
2386 if ( !fgets(pattern
, WXSIZEOF(pattern
), stdin
) )
2389 // kill the last '\n'
2390 pattern
[strlen(pattern
) - 1] = 0;
2393 if ( !re
.Compile(pattern
) )
2401 printf("Enter text to match: ");
2402 if ( !fgets(text
, WXSIZEOF(text
), stdin
) )
2405 // kill the last '\n'
2406 text
[strlen(text
) - 1] = 0;
2408 if ( !re
.Matches(text
) )
2410 printf("No match.\n");
2414 printf("Pattern matches at '%s'\n", re
.GetMatch(text
).c_str());
2417 for ( size_t n
= 1; ; n
++ )
2419 if ( !re
.GetMatch(&start
, &len
, n
) )
2424 printf("Subexpr %u matched '%s'\n",
2425 n
, wxString(text
+ start
, len
).c_str());
2432 #endif // TEST_REGEX
2434 // ----------------------------------------------------------------------------
2436 // ----------------------------------------------------------------------------
2446 static void TestDbOpen()
2454 // ----------------------------------------------------------------------------
2455 // registry and related stuff
2456 // ----------------------------------------------------------------------------
2458 // this is for MSW only
2461 #undef TEST_REGISTRY
2466 #include "wx/confbase.h"
2467 #include "wx/msw/regconf.h"
2469 static void TestRegConfWrite()
2471 wxRegConfig
regconf(_T("console"), _T("wxwindows"));
2472 regconf
.Write(_T("Hello"), wxString(_T("world")));
2475 #endif // TEST_REGCONF
2477 #ifdef TEST_REGISTRY
2479 #include "wx/msw/registry.h"
2481 // I chose this one because I liked its name, but it probably only exists under
2483 static const wxChar
*TESTKEY
=
2484 _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
2486 static void TestRegistryRead()
2488 puts("*** testing registry reading ***");
2490 wxRegKey
key(TESTKEY
);
2491 printf("The test key name is '%s'.\n", key
.GetName().c_str());
2494 puts("ERROR: test key can't be opened, aborting test.");
2499 size_t nSubKeys
, nValues
;
2500 if ( key
.GetKeyInfo(&nSubKeys
, NULL
, &nValues
, NULL
) )
2502 printf("It has %u subkeys and %u values.\n", nSubKeys
, nValues
);
2505 printf("Enumerating values:\n");
2509 bool cont
= key
.GetFirstValue(value
, dummy
);
2512 printf("Value '%s': type ", value
.c_str());
2513 switch ( key
.GetValueType(value
) )
2515 case wxRegKey::Type_None
: printf("ERROR (none)"); break;
2516 case wxRegKey::Type_String
: printf("SZ"); break;
2517 case wxRegKey::Type_Expand_String
: printf("EXPAND_SZ"); break;
2518 case wxRegKey::Type_Binary
: printf("BINARY"); break;
2519 case wxRegKey::Type_Dword
: printf("DWORD"); break;
2520 case wxRegKey::Type_Multi_String
: printf("MULTI_SZ"); break;
2521 default: printf("other (unknown)"); break;
2524 printf(", value = ");
2525 if ( key
.IsNumericValue(value
) )
2528 key
.QueryValue(value
, &val
);
2534 key
.QueryValue(value
, val
);
2535 printf("'%s'", val
.c_str());
2537 key
.QueryRawValue(value
, val
);
2538 printf(" (raw value '%s')", val
.c_str());
2543 cont
= key
.GetNextValue(value
, dummy
);
2547 static void TestRegistryAssociation()
2550 The second call to deleteself genertaes an error message, with a
2551 messagebox saying .flo is crucial to system operation, while the .ddf
2552 call also fails, but with no error message
2557 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
2559 key
= "ddxf_auto_file" ;
2560 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
2562 key
= "ddxf_auto_file" ;
2563 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
2566 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
2568 key
= "program \"%1\"" ;
2570 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
2572 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
2574 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
2576 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
2580 #endif // TEST_REGISTRY
2582 // ----------------------------------------------------------------------------
2584 // ----------------------------------------------------------------------------
2588 #include "wx/socket.h"
2589 #include "wx/protocol/protocol.h"
2590 #include "wx/protocol/http.h"
2592 static void TestSocketServer()
2594 puts("*** Testing wxSocketServer ***\n");
2596 static const int PORT
= 3000;
2601 wxSocketServer
*server
= new wxSocketServer(addr
);
2602 if ( !server
->Ok() )
2604 puts("ERROR: failed to bind");
2611 printf("Server: waiting for connection on port %d...\n", PORT
);
2613 wxSocketBase
*socket
= server
->Accept();
2616 puts("ERROR: wxSocketServer::Accept() failed.");
2620 puts("Server: got a client.");
2622 server
->SetTimeout(60); // 1 min
2624 while ( socket
->IsConnected() )
2630 if ( socket
->Read(&ch
, sizeof(ch
)).Error() )
2632 // don't log error if the client just close the connection
2633 if ( socket
->IsConnected() )
2635 puts("ERROR: in wxSocket::Read.");
2655 printf("Server: got '%s'.\n", s
.c_str());
2656 if ( s
== _T("bye") )
2663 socket
->Write(s
.MakeUpper().c_str(), s
.length());
2664 socket
->Write("\r\n", 2);
2665 printf("Server: wrote '%s'.\n", s
.c_str());
2668 puts("Server: lost a client.");
2673 // same as "delete server" but is consistent with GUI programs
2677 static void TestSocketClient()
2679 puts("*** Testing wxSocketClient ***\n");
2681 static const char *hostname
= "www.wxwindows.org";
2684 addr
.Hostname(hostname
);
2687 printf("--- Attempting to connect to %s:80...\n", hostname
);
2689 wxSocketClient client
;
2690 if ( !client
.Connect(addr
) )
2692 printf("ERROR: failed to connect to %s\n", hostname
);
2696 printf("--- Connected to %s:%u...\n",
2697 addr
.Hostname().c_str(), addr
.Service());
2701 // could use simply "GET" here I suppose
2703 wxString::Format("GET http://%s/\r\n", hostname
);
2704 client
.Write(cmdGet
, cmdGet
.length());
2705 printf("--- Sent command '%s' to the server\n",
2706 MakePrintable(cmdGet
).c_str());
2707 client
.Read(buf
, WXSIZEOF(buf
));
2708 printf("--- Server replied:\n%s", buf
);
2712 #endif // TEST_SOCKETS
2714 // ----------------------------------------------------------------------------
2716 // ----------------------------------------------------------------------------
2720 #include "wx/protocol/ftp.h"
2724 #define FTP_ANONYMOUS
2726 #ifdef FTP_ANONYMOUS
2727 static const char *directory
= "/pub";
2728 static const char *filename
= "welcome.msg";
2730 static const char *directory
= "/etc";
2731 static const char *filename
= "issue";
2734 static bool TestFtpConnect()
2736 puts("*** Testing FTP connect ***");
2738 #ifdef FTP_ANONYMOUS
2739 static const char *hostname
= "ftp.wxwindows.org";
2741 printf("--- Attempting to connect to %s:21 anonymously...\n", hostname
);
2742 #else // !FTP_ANONYMOUS
2743 static const char *hostname
= "localhost";
2746 fgets(user
, WXSIZEOF(user
), stdin
);
2747 user
[strlen(user
) - 1] = '\0'; // chop off '\n'
2751 printf("Password for %s: ", password
);
2752 fgets(password
, WXSIZEOF(password
), stdin
);
2753 password
[strlen(password
) - 1] = '\0'; // chop off '\n'
2754 ftp
.SetPassword(password
);
2756 printf("--- Attempting to connect to %s:21 as %s...\n", hostname
, user
);
2757 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
2759 if ( !ftp
.Connect(hostname
) )
2761 printf("ERROR: failed to connect to %s\n", hostname
);
2767 printf("--- Connected to %s, current directory is '%s'\n",
2768 hostname
, ftp
.Pwd().c_str());
2774 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
2775 static void TestFtpWuFtpd()
2778 static const char *hostname
= "ftp.eudora.com";
2779 if ( !ftp
.Connect(hostname
) )
2781 printf("ERROR: failed to connect to %s\n", hostname
);
2785 static const char *filename
= "eudora/pubs/draft-gellens-submit-09.txt";
2786 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2789 printf("ERROR: couldn't get input stream for %s\n", filename
);
2793 size_t size
= in
->StreamSize();
2794 printf("Reading file %s (%u bytes)...", filename
, size
);
2796 char *data
= new char[size
];
2797 if ( !in
->Read(data
, size
) )
2799 puts("ERROR: read error");
2803 printf("Successfully retrieved the file.\n");
2812 static void TestFtpList()
2814 puts("*** Testing wxFTP file listing ***\n");
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 // test NLIST and LIST
2825 wxArrayString files
;
2826 if ( !ftp
.GetFilesList(files
) )
2828 puts("ERROR: failed to get NLIST of files");
2832 printf("Brief list of files under '%s':\n", ftp
.Pwd().c_str());
2833 size_t count
= files
.GetCount();
2834 for ( size_t n
= 0; n
< count
; n
++ )
2836 printf("\t%s\n", files
[n
].c_str());
2838 puts("End of the file list");
2841 if ( !ftp
.GetDirList(files
) )
2843 puts("ERROR: failed to get LIST of files");
2847 printf("Detailed list of files under '%s':\n", ftp
.Pwd().c_str());
2848 size_t count
= files
.GetCount();
2849 for ( size_t n
= 0; n
< count
; n
++ )
2851 printf("\t%s\n", files
[n
].c_str());
2853 puts("End of the file list");
2856 if ( !ftp
.ChDir(_T("..")) )
2858 puts("ERROR: failed to cd to ..");
2861 printf("Current directory is '%s'\n", ftp
.Pwd().c_str());
2864 static void TestFtpDownload()
2866 puts("*** Testing wxFTP download ***\n");
2869 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2872 printf("ERROR: couldn't get input stream for %s\n", filename
);
2876 size_t size
= in
->StreamSize();
2877 printf("Reading file %s (%u bytes)...", filename
, size
);
2880 char *data
= new char[size
];
2881 if ( !in
->Read(data
, size
) )
2883 puts("ERROR: read error");
2887 printf("\nContents of %s:\n%s\n", filename
, data
);
2895 static void TestFtpFileSize()
2897 puts("*** Testing FTP SIZE command ***");
2899 if ( !ftp
.ChDir(directory
) )
2901 printf("ERROR: failed to cd to %s\n", directory
);
2904 printf("Current directory is '%s'\n", ftp
.Pwd().c_str());
2906 if ( ftp
.FileExists(filename
) )
2908 int size
= ftp
.GetFileSize(filename
);
2910 printf("ERROR: couldn't get size of '%s'\n", filename
);
2912 printf("Size of '%s' is %d bytes.\n", filename
, size
);
2916 printf("ERROR: '%s' doesn't exist\n", filename
);
2920 static void TestFtpMisc()
2922 puts("*** Testing miscellaneous wxFTP functions ***");
2924 if ( ftp
.SendCommand("STAT") != '2' )
2926 puts("ERROR: STAT failed");
2930 printf("STAT returned:\n\n%s\n", ftp
.GetLastResult().c_str());
2933 if ( ftp
.SendCommand("HELP SITE") != '2' )
2935 puts("ERROR: HELP SITE failed");
2939 printf("The list of site-specific commands:\n\n%s\n",
2940 ftp
.GetLastResult().c_str());
2944 static void TestFtpInteractive()
2946 puts("\n*** Interactive wxFTP test ***");
2952 printf("Enter FTP command: ");
2953 if ( !fgets(buf
, WXSIZEOF(buf
), stdin
) )
2956 // kill the last '\n'
2957 buf
[strlen(buf
) - 1] = 0;
2959 // special handling of LIST and NLST as they require data connection
2960 wxString
start(buf
, 4);
2962 if ( start
== "LIST" || start
== "NLST" )
2965 if ( strlen(buf
) > 4 )
2968 wxArrayString files
;
2969 if ( !ftp
.GetList(files
, wildcard
, start
== "LIST") )
2971 printf("ERROR: failed to get %s of files\n", start
.c_str());
2975 printf("--- %s of '%s' under '%s':\n",
2976 start
.c_str(), wildcard
.c_str(), ftp
.Pwd().c_str());
2977 size_t count
= files
.GetCount();
2978 for ( size_t n
= 0; n
< count
; n
++ )
2980 printf("\t%s\n", files
[n
].c_str());
2982 puts("--- End of the file list");
2987 char ch
= ftp
.SendCommand(buf
);
2988 printf("Command %s", ch
? "succeeded" : "failed");
2991 printf(" (return code %c)", ch
);
2994 printf(", server reply:\n%s\n\n", ftp
.GetLastResult().c_str());
2998 puts("\n*** done ***");
3001 static void TestFtpUpload()
3003 puts("*** Testing wxFTP uploading ***\n");
3006 static const char *file1
= "test1";
3007 static const char *file2
= "test2";
3008 wxOutputStream
*out
= ftp
.GetOutputStream(file1
);
3011 printf("--- Uploading to %s ---\n", file1
);
3012 out
->Write("First hello", 11);
3016 // send a command to check the remote file
3017 if ( ftp
.SendCommand(wxString("STAT ") + file1
) != '2' )
3019 printf("ERROR: STAT %s failed\n", file1
);
3023 printf("STAT %s returned:\n\n%s\n",
3024 file1
, ftp
.GetLastResult().c_str());
3027 out
= ftp
.GetOutputStream(file2
);
3030 printf("--- Uploading to %s ---\n", file1
);
3031 out
->Write("Second hello", 12);
3038 // ----------------------------------------------------------------------------
3040 // ----------------------------------------------------------------------------
3044 #include "wx/wfstream.h"
3045 #include "wx/mstream.h"
3047 static void TestFileStream()
3049 puts("*** Testing wxFileInputStream ***");
3051 static const wxChar
*filename
= _T("testdata.fs");
3053 wxFileOutputStream
fsOut(filename
);
3054 fsOut
.Write("foo", 3);
3057 wxFileInputStream
fsIn(filename
);
3058 printf("File stream size: %u\n", fsIn
.GetSize());
3059 while ( !fsIn
.Eof() )
3061 putchar(fsIn
.GetC());
3064 if ( !wxRemoveFile(filename
) )
3066 printf("ERROR: failed to remove the file '%s'.\n", filename
);
3069 puts("\n*** wxFileInputStream test done ***");
3072 static void TestMemoryStream()
3074 puts("*** Testing wxMemoryInputStream ***");
3077 wxStrncpy(buf
, _T("Hello, stream!"), WXSIZEOF(buf
));
3079 wxMemoryInputStream
memInpStream(buf
, wxStrlen(buf
));
3080 printf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
3081 while ( !memInpStream
.Eof() )
3083 putchar(memInpStream
.GetC());
3086 puts("\n*** wxMemoryInputStream test done ***");
3089 #endif // TEST_STREAMS
3091 // ----------------------------------------------------------------------------
3093 // ----------------------------------------------------------------------------
3097 #include "wx/timer.h"
3098 #include "wx/utils.h"
3100 static void TestStopWatch()
3102 puts("*** Testing wxStopWatch ***\n");
3106 printf("Initially paused, after 2 seconds time is...");
3109 printf("\t%ldms\n", sw
.Time());
3111 printf("Resuming stopwatch and sleeping 3 seconds...");
3115 printf("\telapsed time: %ldms\n", sw
.Time());
3118 printf("Pausing agan and sleeping 2 more seconds...");
3121 printf("\telapsed time: %ldms\n", sw
.Time());
3124 printf("Finally resuming and sleeping 2 more seconds...");
3127 printf("\telapsed time: %ldms\n", sw
.Time());
3130 puts("\nChecking for 'backwards clock' bug...");
3131 for ( size_t n
= 0; n
< 70; n
++ )
3135 for ( size_t m
= 0; m
< 100000; m
++ )
3137 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
3139 puts("\ntime is negative - ERROR!");
3150 #endif // TEST_TIMER
3152 // ----------------------------------------------------------------------------
3154 // ----------------------------------------------------------------------------
3158 #include "wx/vcard.h"
3160 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
3163 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
3167 wxString(_T('\t'), level
).c_str(),
3168 vcObj
->GetName().c_str());
3171 switch ( vcObj
->GetType() )
3173 case wxVCardObject::String
:
3174 case wxVCardObject::UString
:
3177 vcObj
->GetValue(&val
);
3178 value
<< _T('"') << val
<< _T('"');
3182 case wxVCardObject::Int
:
3185 vcObj
->GetValue(&i
);
3186 value
.Printf(_T("%u"), i
);
3190 case wxVCardObject::Long
:
3193 vcObj
->GetValue(&l
);
3194 value
.Printf(_T("%lu"), l
);
3198 case wxVCardObject::None
:
3201 case wxVCardObject::Object
:
3202 value
= _T("<node>");
3206 value
= _T("<unknown value type>");
3210 printf(" = %s", value
.c_str());
3213 DumpVObject(level
+ 1, *vcObj
);
3216 vcObj
= vcard
.GetNextProp(&cookie
);
3220 static void DumpVCardAddresses(const wxVCard
& vcard
)
3222 puts("\nShowing all addresses from vCard:\n");
3226 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3230 int flags
= addr
->GetFlags();
3231 if ( flags
& wxVCardAddress::Domestic
)
3233 flagsStr
<< _T("domestic ");
3235 if ( flags
& wxVCardAddress::Intl
)
3237 flagsStr
<< _T("international ");
3239 if ( flags
& wxVCardAddress::Postal
)
3241 flagsStr
<< _T("postal ");
3243 if ( flags
& wxVCardAddress::Parcel
)
3245 flagsStr
<< _T("parcel ");
3247 if ( flags
& wxVCardAddress::Home
)
3249 flagsStr
<< _T("home ");
3251 if ( flags
& wxVCardAddress::Work
)
3253 flagsStr
<< _T("work ");
3256 printf("Address %u:\n"
3258 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3261 addr
->GetPostOffice().c_str(),
3262 addr
->GetExtAddress().c_str(),
3263 addr
->GetStreet().c_str(),
3264 addr
->GetLocality().c_str(),
3265 addr
->GetRegion().c_str(),
3266 addr
->GetPostalCode().c_str(),
3267 addr
->GetCountry().c_str()
3271 addr
= vcard
.GetNextAddress(&cookie
);
3275 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
3277 puts("\nShowing all phone numbers from vCard:\n");
3281 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
3285 int flags
= phone
->GetFlags();
3286 if ( flags
& wxVCardPhoneNumber::Voice
)
3288 flagsStr
<< _T("voice ");
3290 if ( flags
& wxVCardPhoneNumber::Fax
)
3292 flagsStr
<< _T("fax ");
3294 if ( flags
& wxVCardPhoneNumber::Cellular
)
3296 flagsStr
<< _T("cellular ");
3298 if ( flags
& wxVCardPhoneNumber::Modem
)
3300 flagsStr
<< _T("modem ");
3302 if ( flags
& wxVCardPhoneNumber::Home
)
3304 flagsStr
<< _T("home ");
3306 if ( flags
& wxVCardPhoneNumber::Work
)
3308 flagsStr
<< _T("work ");
3311 printf("Phone number %u:\n"
3316 phone
->GetNumber().c_str()
3320 phone
= vcard
.GetNextPhoneNumber(&cookie
);
3324 static void TestVCardRead()
3326 puts("*** Testing wxVCard reading ***\n");
3328 wxVCard
vcard(_T("vcard.vcf"));
3329 if ( !vcard
.IsOk() )
3331 puts("ERROR: couldn't load vCard.");
3335 // read individual vCard properties
3336 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
3340 vcObj
->GetValue(&value
);
3345 value
= _T("<none>");
3348 printf("Full name retrieved directly: %s\n", value
.c_str());
3351 if ( !vcard
.GetFullName(&value
) )
3353 value
= _T("<none>");
3356 printf("Full name from wxVCard API: %s\n", value
.c_str());
3358 // now show how to deal with multiply occuring properties
3359 DumpVCardAddresses(vcard
);
3360 DumpVCardPhoneNumbers(vcard
);
3362 // and finally show all
3363 puts("\nNow dumping the entire vCard:\n"
3364 "-----------------------------\n");
3366 DumpVObject(0, vcard
);
3370 static void TestVCardWrite()
3372 puts("*** Testing wxVCard writing ***\n");
3375 if ( !vcard
.IsOk() )
3377 puts("ERROR: couldn't create vCard.");
3382 vcard
.SetName("Zeitlin", "Vadim");
3383 vcard
.SetFullName("Vadim Zeitlin");
3384 vcard
.SetOrganization("wxWindows", "R&D");
3386 // just dump the vCard back
3387 puts("Entire vCard follows:\n");
3388 puts(vcard
.Write());
3392 #endif // TEST_VCARD
3394 // ----------------------------------------------------------------------------
3396 // ----------------------------------------------------------------------------
3398 #if !defined(__WIN32__) || !wxUSE_FSVOLUME
3404 #include "wx/volume.h"
3406 static const wxChar
*volumeKinds
[] =
3412 _T("network volume"),
3416 static void TestFSVolume()
3418 wxPuts(_T("*** Testing wxFSVolume class ***"));
3420 wxArrayString volumes
= wxFSVolume::GetVolumes();
3421 size_t count
= volumes
.GetCount();
3425 wxPuts(_T("ERROR: no mounted volumes?"));
3429 wxPrintf(_T("%u mounted volumes found:\n"), count
);
3431 for ( size_t n
= 0; n
< count
; n
++ )
3433 wxFSVolume
vol(volumes
[n
]);
3436 wxPuts(_T("ERROR: couldn't create volume"));
3440 wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
3442 vol
.GetDisplayName().c_str(),
3443 vol
.GetName().c_str(),
3444 volumeKinds
[vol
.GetKind()],
3445 vol
.IsWritable() ? _T("rw") : _T("ro"),
3446 vol
.GetFlags() & wxFS_VOL_REMOVABLE
? _T("removable")
3451 #endif // TEST_VOLUME
3453 // ----------------------------------------------------------------------------
3454 // wide char (Unicode) support
3455 // ----------------------------------------------------------------------------
3459 #include "wx/strconv.h"
3460 #include "wx/fontenc.h"
3461 #include "wx/encconv.h"
3462 #include "wx/buffer.h"
3464 static const char textInUtf8
[] =
3466 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
3467 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
3468 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
3469 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
3470 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
3471 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
3472 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
3475 static void TestUtf8()
3477 puts("*** Testing UTF8 support ***\n");
3481 if ( wxConvUTF8
.MB2WC(wbuf
, textInUtf8
, WXSIZEOF(textInUtf8
)) <= 0 )
3483 puts("ERROR: UTF-8 decoding failed.");
3487 wxCSConv
conv(_T("koi8-r"));
3488 if ( conv
.WC2MB(buf
, wbuf
, 0 /* not needed wcslen(wbuf) */) <= 0 )
3490 puts("ERROR: conversion to KOI8-R failed.");
3494 printf("The resulting string (in KOI8-R): %s\n", buf
);
3498 if ( wxConvUTF8
.WC2MB(buf
, L
"Ã la", WXSIZEOF(buf
)) <= 0 )
3500 puts("ERROR: conversion to UTF-8 failed.");
3504 printf("The string in UTF-8: %s\n", buf
);
3510 static void TestEncodingConverter()
3512 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
3514 // using wxEncodingConverter should give the same result as above
3517 if ( wxConvUTF8
.MB2WC(wbuf
, textInUtf8
, WXSIZEOF(textInUtf8
)) <= 0 )
3519 puts("ERROR: UTF-8 decoding failed.");
3523 wxEncodingConverter ec
;
3524 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
3525 ec
.Convert(wbuf
, buf
);
3526 printf("The same string obtained using wxEC: %s\n", buf
);
3532 #endif // TEST_WCHAR
3534 // ----------------------------------------------------------------------------
3536 // ----------------------------------------------------------------------------
3540 #include "wx/filesys.h"
3541 #include "wx/fs_zip.h"
3542 #include "wx/zipstrm.h"
3544 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
3546 static void TestZipStreamRead()
3548 puts("*** Testing ZIP reading ***\n");
3550 static const wxChar
*filename
= _T("foo");
3551 wxZipInputStream
istr(TESTFILE_ZIP
, filename
);
3552 printf("Archive size: %u\n", istr
.GetSize());
3554 printf("Dumping the file '%s':\n", filename
);
3555 while ( !istr
.Eof() )
3557 putchar(istr
.GetC());
3561 puts("\n----- done ------");
3564 static void DumpZipDirectory(wxFileSystem
& fs
,
3565 const wxString
& dir
,
3566 const wxString
& indent
)
3568 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
3569 TESTFILE_ZIP
, dir
.c_str());
3570 wxString wildcard
= prefix
+ _T("/*");
3572 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
3573 while ( !dirname
.empty() )
3575 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
3577 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3582 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
3584 DumpZipDirectory(fs
, dirname
,
3585 indent
+ wxString(_T(' '), 4));
3587 dirname
= fs
.FindNext();
3590 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
3591 while ( !filename
.empty() )
3593 if ( !filename
.StartsWith(prefix
, &filename
) )
3595 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3600 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
3602 filename
= fs
.FindNext();
3606 static void TestZipFileSystem()
3608 puts("*** Testing ZIP file system ***\n");
3610 wxFileSystem::AddHandler(new wxZipFSHandler
);
3612 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
3614 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
3619 // ----------------------------------------------------------------------------
3621 // ----------------------------------------------------------------------------
3625 #include "wx/zstream.h"
3626 #include "wx/wfstream.h"
3628 static const wxChar
*FILENAME_GZ
= _T("test.gz");
3629 static const char *TEST_DATA
= "hello and hello and hello and hello and hello";
3631 static void TestZlibStreamWrite()
3633 puts("*** Testing Zlib stream reading ***\n");
3635 wxFileOutputStream
fileOutStream(FILENAME_GZ
);
3636 wxZlibOutputStream
ostr(fileOutStream
);
3637 printf("Compressing the test string... ");
3638 ostr
.Write(TEST_DATA
, strlen(TEST_DATA
) + 1);
3641 puts("(ERROR: failed)");
3648 puts("\n----- done ------");
3651 static void TestZlibStreamRead()
3653 puts("*** Testing Zlib stream reading ***\n");
3655 wxFileInputStream
fileInStream(FILENAME_GZ
);
3656 wxZlibInputStream
istr(fileInStream
);
3657 printf("Archive size: %u\n", istr
.GetSize());
3659 puts("Dumping the file:");
3660 while ( !istr
.Eof() )
3662 putchar(istr
.GetC());
3666 puts("\n----- done ------");
3671 // ----------------------------------------------------------------------------
3673 // ----------------------------------------------------------------------------
3675 #ifdef TEST_DATETIME
3679 #include "wx/date.h"
3680 #include "wx/datetime.h"
3685 wxDateTime::wxDateTime_t day
;
3686 wxDateTime::Month month
;
3688 wxDateTime::wxDateTime_t hour
, min
, sec
;
3690 wxDateTime::WeekDay wday
;
3691 time_t gmticks
, ticks
;
3693 void Init(const wxDateTime::Tm
& tm
)
3702 gmticks
= ticks
= -1;
3705 wxDateTime
DT() const
3706 { return wxDateTime(day
, month
, year
, hour
, min
, sec
); }
3708 bool SameDay(const wxDateTime::Tm
& tm
) const
3710 return day
== tm
.mday
&& month
== tm
.mon
&& year
== tm
.year
;
3713 wxString
Format() const
3716 s
.Printf("%02d:%02d:%02d %10s %02d, %4d%s",
3718 wxDateTime::GetMonthName(month
).c_str(),
3720 abs(wxDateTime::ConvertYearToBC(year
)),
3721 year
> 0 ? "AD" : "BC");
3725 wxString
FormatDate() const
3728 s
.Printf("%02d-%s-%4d%s",
3730 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
3731 abs(wxDateTime::ConvertYearToBC(year
)),
3732 year
> 0 ? "AD" : "BC");
3737 static const Date testDates
[] =
3739 { 1, wxDateTime::Jan
, 1970, 00, 00, 00, 2440587.5, wxDateTime::Thu
, 0, -3600 },
3740 { 21, wxDateTime::Jan
, 2222, 00, 00, 00, 2532648.5, wxDateTime::Mon
, -1, -1 },
3741 { 29, wxDateTime::May
, 1976, 12, 00, 00, 2442928.0, wxDateTime::Sat
, 202219200, 202212000 },
3742 { 29, wxDateTime::Feb
, 1976, 00, 00, 00, 2442837.5, wxDateTime::Sun
, 194400000, 194396400 },
3743 { 1, wxDateTime::Jan
, 1900, 12, 00, 00, 2415021.0, wxDateTime::Mon
, -1, -1 },
3744 { 1, wxDateTime::Jan
, 1900, 00, 00, 00, 2415020.5, wxDateTime::Mon
, -1, -1 },
3745 { 15, wxDateTime::Oct
, 1582, 00, 00, 00, 2299160.5, wxDateTime::Fri
, -1, -1 },
3746 { 4, wxDateTime::Oct
, 1582, 00, 00, 00, 2299149.5, wxDateTime::Mon
, -1, -1 },
3747 { 1, wxDateTime::Mar
, 1, 00, 00, 00, 1721484.5, wxDateTime::Thu
, -1, -1 },
3748 { 1, wxDateTime::Jan
, 1, 00, 00, 00, 1721425.5, wxDateTime::Mon
, -1, -1 },
3749 { 31, wxDateTime::Dec
, 0, 00, 00, 00, 1721424.5, wxDateTime::Sun
, -1, -1 },
3750 { 1, wxDateTime::Jan
, 0, 00, 00, 00, 1721059.5, wxDateTime::Sat
, -1, -1 },
3751 { 12, wxDateTime::Aug
, -1234, 00, 00, 00, 1270573.5, wxDateTime::Fri
, -1, -1 },
3752 { 12, wxDateTime::Aug
, -4000, 00, 00, 00, 260313.5, wxDateTime::Sat
, -1, -1 },
3753 { 24, wxDateTime::Nov
, -4713, 00, 00, 00, -0.5, wxDateTime::Mon
, -1, -1 },
3756 // this test miscellaneous static wxDateTime functions
3757 static void TestTimeStatic()
3759 puts("\n*** wxDateTime static methods test ***");
3761 // some info about the current date
3762 int year
= wxDateTime::GetCurrentYear();
3763 printf("Current year %d is %sa leap one and has %d days.\n",
3765 wxDateTime::IsLeapYear(year
) ? "" : "not ",
3766 wxDateTime::GetNumberOfDays(year
));
3768 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
3769 printf("Current month is '%s' ('%s') and it has %d days\n",
3770 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
3771 wxDateTime::GetMonthName(month
).c_str(),
3772 wxDateTime::GetNumberOfDays(month
));
3775 static const size_t nYears
= 5;
3776 static const size_t years
[2][nYears
] =
3778 // first line: the years to test
3779 { 1990, 1976, 2000, 2030, 1984, },
3781 // second line: TRUE if leap, FALSE otherwise
3782 { FALSE
, TRUE
, TRUE
, FALSE
, TRUE
}
3785 for ( size_t n
= 0; n
< nYears
; n
++ )
3787 int year
= years
[0][n
];
3788 bool should
= years
[1][n
] != 0,
3789 is
= wxDateTime::IsLeapYear(year
);
3791 printf("Year %d is %sa leap year (%s)\n",
3794 should
== is
? "ok" : "ERROR");
3796 wxASSERT( should
== wxDateTime::IsLeapYear(year
) );
3800 // test constructing wxDateTime objects
3801 static void TestTimeSet()
3803 puts("\n*** wxDateTime construction test ***");
3805 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
3807 const Date
& d1
= testDates
[n
];
3808 wxDateTime dt
= d1
.DT();
3811 d2
.Init(dt
.GetTm());
3813 wxString s1
= d1
.Format(),
3816 printf("Date: %s == %s (%s)\n",
3817 s1
.c_str(), s2
.c_str(),
3818 s1
== s2
? "ok" : "ERROR");
3822 // test time zones stuff
3823 static void TestTimeZones()
3825 puts("\n*** wxDateTime timezone test ***");
3827 wxDateTime now
= wxDateTime::Now();
3829 printf("Current GMT time:\t%s\n", now
.Format("%c", wxDateTime::GMT0
).c_str());
3830 printf("Unix epoch (GMT):\t%s\n", wxDateTime((time_t)0).Format("%c", wxDateTime::GMT0
).c_str());
3831 printf("Unix epoch (EST):\t%s\n", wxDateTime((time_t)0).Format("%c", wxDateTime::EST
).c_str());
3832 printf("Current time in Paris:\t%s\n", now
.Format("%c", wxDateTime::CET
).c_str());
3833 printf(" Moscow:\t%s\n", now
.Format("%c", wxDateTime::MSK
).c_str());
3834 printf(" New York:\t%s\n", now
.Format("%c", wxDateTime::EST
).c_str());
3836 wxDateTime::Tm tm
= now
.GetTm();
3837 if ( wxDateTime(tm
) != now
)
3839 printf("ERROR: got %s instead of %s\n",
3840 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
3844 // test some minimal support for the dates outside the standard range
3845 static void TestTimeRange()
3847 puts("\n*** wxDateTime out-of-standard-range dates test ***");
3849 static const char *fmt
= "%d-%b-%Y %H:%M:%S";
3851 printf("Unix epoch:\t%s\n",
3852 wxDateTime(2440587.5).Format(fmt
).c_str());
3853 printf("Feb 29, 0: \t%s\n",
3854 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
3855 printf("JDN 0: \t%s\n",
3856 wxDateTime(0.0).Format(fmt
).c_str());
3857 printf("Jan 1, 1AD:\t%s\n",
3858 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
3859 printf("May 29, 2099:\t%s\n",
3860 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
3863 static void TestTimeTicks()
3865 puts("\n*** wxDateTime ticks test ***");
3867 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
3869 const Date
& d
= testDates
[n
];
3870 if ( d
.ticks
== -1 )
3873 wxDateTime dt
= d
.DT();
3874 long ticks
= (dt
.GetValue() / 1000).ToLong();
3875 printf("Ticks of %s:\t% 10ld", d
.Format().c_str(), ticks
);
3876 if ( ticks
== d
.ticks
)
3882 printf(" (ERROR: should be %ld, delta = %ld)\n",
3883 (long)d
.ticks
, (long)(ticks
- d
.ticks
));
3886 dt
= d
.DT().ToTimezone(wxDateTime::GMT0
);
3887 ticks
= (dt
.GetValue() / 1000).ToLong();
3888 printf("GMtks of %s:\t% 10ld", d
.Format().c_str(), ticks
);
3889 if ( ticks
== d
.gmticks
)
3895 printf(" (ERROR: should be %ld, delta = %ld)\n",
3896 (long)d
.gmticks
, (long)(ticks
- d
.gmticks
));
3903 // test conversions to JDN &c
3904 static void TestTimeJDN()
3906 puts("\n*** wxDateTime to JDN test ***");
3908 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
3910 const Date
& d
= testDates
[n
];
3911 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
3912 double jdn
= dt
.GetJulianDayNumber();
3914 printf("JDN of %s is:\t% 15.6f", d
.Format().c_str(), jdn
);
3921 printf(" (ERROR: should be %f, delta = %f)\n",
3922 d
.jdn
, jdn
- d
.jdn
);
3927 // test week days computation
3928 static void TestTimeWDays()
3930 puts("\n*** wxDateTime weekday test ***");
3932 // test GetWeekDay()
3934 for ( n
= 0; n
< WXSIZEOF(testDates
); n
++ )
3936 const Date
& d
= testDates
[n
];
3937 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
3939 wxDateTime::WeekDay wday
= dt
.GetWeekDay();
3942 wxDateTime::GetWeekDayName(wday
).c_str());
3943 if ( wday
== d
.wday
)
3949 printf(" (ERROR: should be %s)\n",
3950 wxDateTime::GetWeekDayName(d
.wday
).c_str());
3956 // test SetToWeekDay()
3957 struct WeekDateTestData
3959 Date date
; // the real date (precomputed)
3960 int nWeek
; // its week index in the month
3961 wxDateTime::WeekDay wday
; // the weekday
3962 wxDateTime::Month month
; // the month
3963 int year
; // and the year
3965 wxString
Format() const
3968 switch ( nWeek
< -1 ? -nWeek
: nWeek
)
3970 case 1: which
= "first"; break;
3971 case 2: which
= "second"; break;
3972 case 3: which
= "third"; break;
3973 case 4: which
= "fourth"; break;
3974 case 5: which
= "fifth"; break;
3976 case -1: which
= "last"; break;
3981 which
+= " from end";
3984 s
.Printf("The %s %s of %s in %d",
3986 wxDateTime::GetWeekDayName(wday
).c_str(),
3987 wxDateTime::GetMonthName(month
).c_str(),
3994 // the array data was generated by the following python program
3996 from DateTime import *
3997 from whrandom import *
3998 from string import *
4000 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4001 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4003 week = DateTimeDelta(7)
4006 year = randint(1900, 2100)
4007 month = randint(1, 12)
4008 day = randint(1, 28)
4009 dt = DateTime(year, month, day)
4010 wday = dt.day_of_week
4012 countFromEnd = choice([-1, 1])
4015 while dt.month is month:
4016 dt = dt - countFromEnd * week
4017 weekNum = weekNum + countFromEnd
4019 data = { 'day': rjust(`day`, 2), 'month': monthNames[month - 1], 'year': year, 'weekNum': rjust(`weekNum`, 2), 'wday': wdayNames[wday] }
4021 print "{ { %(day)s, wxDateTime::%(month)s, %(year)d }, %(weekNum)d, "\
4022 "wxDateTime::%(wday)s, wxDateTime::%(month)s, %(year)d }," % data
4025 static const WeekDateTestData weekDatesTestData
[] =
4027 { { 20, wxDateTime::Mar
, 2045 }, 3, wxDateTime::Mon
, wxDateTime::Mar
, 2045 },
4028 { { 5, wxDateTime::Jun
, 1985 }, -4, wxDateTime::Wed
, wxDateTime::Jun
, 1985 },
4029 { { 12, wxDateTime::Nov
, 1961 }, -3, wxDateTime::Sun
, wxDateTime::Nov
, 1961 },
4030 { { 27, wxDateTime::Feb
, 2093 }, -1, wxDateTime::Fri
, wxDateTime::Feb
, 2093 },
4031 { { 4, wxDateTime::Jul
, 2070 }, -4, wxDateTime::Fri
, wxDateTime::Jul
, 2070 },
4032 { { 2, wxDateTime::Apr
, 1906 }, -5, wxDateTime::Mon
, wxDateTime::Apr
, 1906 },
4033 { { 19, wxDateTime::Jul
, 2023 }, -2, wxDateTime::Wed
, wxDateTime::Jul
, 2023 },
4034 { { 5, wxDateTime::May
, 1958 }, -4, wxDateTime::Mon
, wxDateTime::May
, 1958 },
4035 { { 11, wxDateTime::Aug
, 1900 }, 2, wxDateTime::Sat
, wxDateTime::Aug
, 1900 },
4036 { { 14, wxDateTime::Feb
, 1945 }, 2, wxDateTime::Wed
, wxDateTime::Feb
, 1945 },
4037 { { 25, wxDateTime::Jul
, 1967 }, -1, wxDateTime::Tue
, wxDateTime::Jul
, 1967 },
4038 { { 9, wxDateTime::May
, 1916 }, -4, wxDateTime::Tue
, wxDateTime::May
, 1916 },
4039 { { 20, wxDateTime::Jun
, 1927 }, 3, wxDateTime::Mon
, wxDateTime::Jun
, 1927 },
4040 { { 2, wxDateTime::Aug
, 2000 }, 1, wxDateTime::Wed
, wxDateTime::Aug
, 2000 },
4041 { { 20, wxDateTime::Apr
, 2044 }, 3, wxDateTime::Wed
, wxDateTime::Apr
, 2044 },
4042 { { 20, wxDateTime::Feb
, 1932 }, -2, wxDateTime::Sat
, wxDateTime::Feb
, 1932 },
4043 { { 25, wxDateTime::Jul
, 2069 }, 4, wxDateTime::Thu
, wxDateTime::Jul
, 2069 },
4044 { { 3, wxDateTime::Apr
, 1925 }, 1, wxDateTime::Fri
, wxDateTime::Apr
, 1925 },
4045 { { 21, wxDateTime::Mar
, 2093 }, 3, wxDateTime::Sat
, wxDateTime::Mar
, 2093 },
4046 { { 3, wxDateTime::Dec
, 2074 }, -5, wxDateTime::Mon
, wxDateTime::Dec
, 2074 },
4049 static const char *fmt
= "%d-%b-%Y";
4052 for ( n
= 0; n
< WXSIZEOF(weekDatesTestData
); n
++ )
4054 const WeekDateTestData
& wd
= weekDatesTestData
[n
];
4056 dt
.SetToWeekDay(wd
.wday
, wd
.nWeek
, wd
.month
, wd
.year
);
4058 printf("%s is %s", wd
.Format().c_str(), dt
.Format(fmt
).c_str());
4060 const Date
& d
= wd
.date
;
4061 if ( d
.SameDay(dt
.GetTm()) )
4067 dt
.Set(d
.day
, d
.month
, d
.year
);
4069 printf(" (ERROR: should be %s)\n", dt
.Format(fmt
).c_str());
4074 // test the computation of (ISO) week numbers
4075 static void TestTimeWNumber()
4077 puts("\n*** wxDateTime week number test ***");
4079 struct WeekNumberTestData
4081 Date date
; // the date
4082 wxDateTime::wxDateTime_t week
; // the week number in the year
4083 wxDateTime::wxDateTime_t wmon
; // the week number in the month
4084 wxDateTime::wxDateTime_t wmon2
; // same but week starts with Sun
4085 wxDateTime::wxDateTime_t dnum
; // day number in the year
4088 // data generated with the following python script:
4090 from DateTime import *
4091 from whrandom import *
4092 from string import *
4094 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4095 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4097 def GetMonthWeek(dt):
4098 weekNumMonth = dt.iso_week[1] - DateTime(dt.year, dt.month, 1).iso_week[1] + 1
4099 if weekNumMonth < 0:
4100 weekNumMonth = weekNumMonth + 53
4103 def GetLastSundayBefore(dt):
4104 if dt.iso_week[2] == 7:
4107 return dt - DateTimeDelta(dt.iso_week[2])
4110 year = randint(1900, 2100)
4111 month = randint(1, 12)
4112 day = randint(1, 28)
4113 dt = DateTime(year, month, day)
4114 dayNum = dt.day_of_year
4115 weekNum = dt.iso_week[1]
4116 weekNumMonth = GetMonthWeek(dt)
4119 dtSunday = GetLastSundayBefore(dt)
4121 while dtSunday >= GetLastSundayBefore(DateTime(dt.year, dt.month, 1)):
4122 weekNumMonth2 = weekNumMonth2 + 1
4123 dtSunday = dtSunday - DateTimeDelta(7)
4125 data = { 'day': rjust(`day`, 2), \
4126 'month': monthNames[month - 1], \
4128 'weekNum': rjust(`weekNum`, 2), \
4129 'weekNumMonth': weekNumMonth, \
4130 'weekNumMonth2': weekNumMonth2, \
4131 'dayNum': rjust(`dayNum`, 3) }
4133 print " { { %(day)s, "\
4134 "wxDateTime::%(month)s, "\
4137 "%(weekNumMonth)s, "\
4138 "%(weekNumMonth2)s, "\
4139 "%(dayNum)s }," % data
4142 static const WeekNumberTestData weekNumberTestDates
[] =
4144 { { 27, wxDateTime::Dec
, 1966 }, 52, 5, 5, 361 },
4145 { { 22, wxDateTime::Jul
, 1926 }, 29, 4, 4, 203 },
4146 { { 22, wxDateTime::Oct
, 2076 }, 43, 4, 4, 296 },
4147 { { 1, wxDateTime::Jul
, 1967 }, 26, 1, 1, 182 },
4148 { { 8, wxDateTime::Nov
, 2004 }, 46, 2, 2, 313 },
4149 { { 21, wxDateTime::Mar
, 1920 }, 12, 3, 4, 81 },
4150 { { 7, wxDateTime::Jan
, 1965 }, 1, 2, 2, 7 },
4151 { { 19, wxDateTime::Oct
, 1999 }, 42, 4, 4, 292 },
4152 { { 13, wxDateTime::Aug
, 1955 }, 32, 2, 2, 225 },
4153 { { 18, wxDateTime::Jul
, 2087 }, 29, 3, 3, 199 },
4154 { { 2, wxDateTime::Sep
, 2028 }, 35, 1, 1, 246 },
4155 { { 28, wxDateTime::Jul
, 1945 }, 30, 5, 4, 209 },
4156 { { 15, wxDateTime::Jun
, 1901 }, 24, 3, 3, 166 },
4157 { { 10, wxDateTime::Oct
, 1939 }, 41, 3, 2, 283 },
4158 { { 3, wxDateTime::Dec
, 1965 }, 48, 1, 1, 337 },
4159 { { 23, wxDateTime::Feb
, 1940 }, 8, 4, 4, 54 },
4160 { { 2, wxDateTime::Jan
, 1987 }, 1, 1, 1, 2 },
4161 { { 11, wxDateTime::Aug
, 2079 }, 32, 2, 2, 223 },
4162 { { 2, wxDateTime::Feb
, 2063 }, 5, 1, 1, 33 },
4163 { { 16, wxDateTime::Oct
, 1942 }, 42, 3, 3, 289 },
4166 for ( size_t n
= 0; n
< WXSIZEOF(weekNumberTestDates
); n
++ )
4168 const WeekNumberTestData
& wn
= weekNumberTestDates
[n
];
4169 const Date
& d
= wn
.date
;
4171 wxDateTime dt
= d
.DT();
4173 wxDateTime::wxDateTime_t
4174 week
= dt
.GetWeekOfYear(wxDateTime::Monday_First
),
4175 wmon
= dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4176 wmon2
= dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4177 dnum
= dt
.GetDayOfYear();
4179 printf("%s: the day number is %d",
4180 d
.FormatDate().c_str(), dnum
);
4181 if ( dnum
== wn
.dnum
)
4187 printf(" (ERROR: should be %d)", wn
.dnum
);
4190 printf(", week in month is %d", wmon
);
4191 if ( wmon
== wn
.wmon
)
4197 printf(" (ERROR: should be %d)", wn
.wmon
);
4200 printf(" or %d", wmon2
);
4201 if ( wmon2
== wn
.wmon2
)
4207 printf(" (ERROR: should be %d)", wn
.wmon2
);
4210 printf(", week in year is %d", week
);
4211 if ( week
== wn
.week
)
4217 printf(" (ERROR: should be %d)\n", wn
.week
);
4222 // test DST calculations
4223 static void TestTimeDST()
4225 puts("\n*** wxDateTime DST test ***");
4227 printf("DST is%s in effect now.\n\n",
4228 wxDateTime::Now().IsDST() ? "" : " not");
4230 // taken from http://www.energy.ca.gov/daylightsaving.html
4231 static const Date datesDST
[2][2004 - 1900 + 1] =
4234 { 1, wxDateTime::Apr
, 1990 },
4235 { 7, wxDateTime::Apr
, 1991 },
4236 { 5, wxDateTime::Apr
, 1992 },
4237 { 4, wxDateTime::Apr
, 1993 },
4238 { 3, wxDateTime::Apr
, 1994 },
4239 { 2, wxDateTime::Apr
, 1995 },
4240 { 7, wxDateTime::Apr
, 1996 },
4241 { 6, wxDateTime::Apr
, 1997 },
4242 { 5, wxDateTime::Apr
, 1998 },
4243 { 4, wxDateTime::Apr
, 1999 },
4244 { 2, wxDateTime::Apr
, 2000 },
4245 { 1, wxDateTime::Apr
, 2001 },
4246 { 7, wxDateTime::Apr
, 2002 },
4247 { 6, wxDateTime::Apr
, 2003 },
4248 { 4, wxDateTime::Apr
, 2004 },
4251 { 28, wxDateTime::Oct
, 1990 },
4252 { 27, wxDateTime::Oct
, 1991 },
4253 { 25, wxDateTime::Oct
, 1992 },
4254 { 31, wxDateTime::Oct
, 1993 },
4255 { 30, wxDateTime::Oct
, 1994 },
4256 { 29, wxDateTime::Oct
, 1995 },
4257 { 27, wxDateTime::Oct
, 1996 },
4258 { 26, wxDateTime::Oct
, 1997 },
4259 { 25, wxDateTime::Oct
, 1998 },
4260 { 31, wxDateTime::Oct
, 1999 },
4261 { 29, wxDateTime::Oct
, 2000 },
4262 { 28, wxDateTime::Oct
, 2001 },
4263 { 27, wxDateTime::Oct
, 2002 },
4264 { 26, wxDateTime::Oct
, 2003 },
4265 { 31, wxDateTime::Oct
, 2004 },
4270 for ( year
= 1990; year
< 2005; year
++ )
4272 wxDateTime dtBegin
= wxDateTime::GetBeginDST(year
, wxDateTime::USA
),
4273 dtEnd
= wxDateTime::GetEndDST(year
, wxDateTime::USA
);
4275 printf("DST period in the US for year %d: from %s to %s",
4276 year
, dtBegin
.Format().c_str(), dtEnd
.Format().c_str());
4278 size_t n
= year
- 1990;
4279 const Date
& dBegin
= datesDST
[0][n
];
4280 const Date
& dEnd
= datesDST
[1][n
];
4282 if ( dBegin
.SameDay(dtBegin
.GetTm()) && dEnd
.SameDay(dtEnd
.GetTm()) )
4288 printf(" (ERROR: should be %s %d to %s %d)\n",
4289 wxDateTime::GetMonthName(dBegin
.month
).c_str(), dBegin
.day
,
4290 wxDateTime::GetMonthName(dEnd
.month
).c_str(), dEnd
.day
);
4296 for ( year
= 1990; year
< 2005; year
++ )
4298 printf("DST period in Europe for year %d: from %s to %s\n",
4300 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
4301 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
4305 // test wxDateTime -> text conversion
4306 static void TestTimeFormat()
4308 puts("\n*** wxDateTime formatting test ***");
4310 // some information may be lost during conversion, so store what kind
4311 // of info should we recover after a round trip
4314 CompareNone
, // don't try comparing
4315 CompareBoth
, // dates and times should be identical
4316 CompareDate
, // dates only
4317 CompareTime
// time only
4322 CompareKind compareKind
;
4324 } formatTestFormats
[] =
4326 { CompareBoth
, "---> %c" },
4327 { CompareDate
, "Date is %A, %d of %B, in year %Y" },
4328 { CompareBoth
, "Date is %x, time is %X" },
4329 { CompareTime
, "Time is %H:%M:%S or %I:%M:%S %p" },
4330 { CompareNone
, "The day of year: %j, the week of year: %W" },
4331 { CompareDate
, "ISO date without separators: %4Y%2m%2d" },
4334 static const Date formatTestDates
[] =
4336 { 29, wxDateTime::May
, 1976, 18, 30, 00 },
4337 { 31, wxDateTime::Dec
, 1999, 23, 30, 00 },
4339 // this test can't work for other centuries because it uses two digit
4340 // years in formats, so don't even try it
4341 { 29, wxDateTime::May
, 2076, 18, 30, 00 },
4342 { 29, wxDateTime::Feb
, 2400, 02, 15, 25 },
4343 { 01, wxDateTime::Jan
, -52, 03, 16, 47 },
4347 // an extra test (as it doesn't depend on date, don't do it in the loop)
4348 printf("%s\n", wxDateTime::Now().Format("Our timezone is %Z").c_str());
4350 for ( size_t d
= 0; d
< WXSIZEOF(formatTestDates
) + 1; d
++ )
4354 wxDateTime dt
= d
== 0 ? wxDateTime::Now() : formatTestDates
[d
- 1].DT();
4355 for ( size_t n
= 0; n
< WXSIZEOF(formatTestFormats
); n
++ )
4357 wxString s
= dt
.Format(formatTestFormats
[n
].format
);
4358 printf("%s", s
.c_str());
4360 // what can we recover?
4361 int kind
= formatTestFormats
[n
].compareKind
;
4365 const wxChar
*result
= dt2
.ParseFormat(s
, formatTestFormats
[n
].format
);
4368 // converion failed - should it have?
4369 if ( kind
== CompareNone
)
4372 puts(" (ERROR: conversion back failed)");
4376 // should have parsed the entire string
4377 puts(" (ERROR: conversion back stopped too soon)");
4381 bool equal
= FALSE
; // suppress compilaer warning
4389 equal
= dt
.IsSameDate(dt2
);
4393 equal
= dt
.IsSameTime(dt2
);
4399 printf(" (ERROR: got back '%s' instead of '%s')\n",
4400 dt2
.Format().c_str(), dt
.Format().c_str());
4411 // test text -> wxDateTime conversion
4412 static void TestTimeParse()
4414 puts("\n*** wxDateTime parse test ***");
4416 struct ParseTestData
4423 static const ParseTestData parseTestDates
[] =
4425 { "Sat, 18 Dec 1999 00:46:40 +0100", { 18, wxDateTime::Dec
, 1999, 00, 46, 40 }, TRUE
},
4426 { "Wed, 1 Dec 1999 05:17:20 +0300", { 1, wxDateTime::Dec
, 1999, 03, 17, 20 }, TRUE
},
4429 for ( size_t n
= 0; n
< WXSIZEOF(parseTestDates
); n
++ )
4431 const char *format
= parseTestDates
[n
].format
;
4433 printf("%s => ", format
);
4436 if ( dt
.ParseRfc822Date(format
) )
4438 printf("%s ", dt
.Format().c_str());
4440 if ( parseTestDates
[n
].good
)
4442 wxDateTime dtReal
= parseTestDates
[n
].date
.DT();
4449 printf("(ERROR: should be %s)\n", dtReal
.Format().c_str());
4454 puts("(ERROR: bad format)");
4459 printf("bad format (%s)\n",
4460 parseTestDates
[n
].good
? "ERROR" : "ok");
4465 static void TestDateTimeInteractive()
4467 puts("\n*** interactive wxDateTime tests ***");
4473 printf("Enter a date: ");
4474 if ( !fgets(buf
, WXSIZEOF(buf
), stdin
) )
4477 // kill the last '\n'
4478 buf
[strlen(buf
) - 1] = 0;
4481 const char *p
= dt
.ParseDate(buf
);
4484 printf("ERROR: failed to parse the date '%s'.\n", buf
);
4490 printf("WARNING: parsed only first %u characters.\n", p
- buf
);
4493 printf("%s: day %u, week of month %u/%u, week of year %u\n",
4494 dt
.Format("%b %d, %Y").c_str(),
4496 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4497 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4498 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
4501 puts("\n*** done ***");
4504 static void TestTimeMS()
4506 puts("*** testing millisecond-resolution support in wxDateTime ***");
4508 wxDateTime dt1
= wxDateTime::Now(),
4509 dt2
= wxDateTime::UNow();
4511 printf("Now = %s\n", dt1
.Format("%H:%M:%S:%l").c_str());
4512 printf("UNow = %s\n", dt2
.Format("%H:%M:%S:%l").c_str());
4513 printf("Dummy loop: ");
4514 for ( int i
= 0; i
< 6000; i
++ )
4516 //for ( int j = 0; j < 10; j++ )
4519 s
.Printf("%g", sqrt(i
));
4528 dt2
= wxDateTime::UNow();
4529 printf("UNow = %s\n", dt2
.Format("%H:%M:%S:%l").c_str());
4531 printf("Loop executed in %s ms\n", (dt2
- dt1
).Format("%l").c_str());
4533 puts("\n*** done ***");
4536 static void TestTimeArithmetics()
4538 puts("\n*** testing arithmetic operations on wxDateTime ***");
4540 static const struct ArithmData
4542 ArithmData(const wxDateSpan
& sp
, const char *nam
)
4543 : span(sp
), name(nam
) { }
4547 } testArithmData
[] =
4549 ArithmData(wxDateSpan::Day(), "day"),
4550 ArithmData(wxDateSpan::Week(), "week"),
4551 ArithmData(wxDateSpan::Month(), "month"),
4552 ArithmData(wxDateSpan::Year(), "year"),
4553 ArithmData(wxDateSpan(1, 2, 3, 4), "year, 2 months, 3 weeks, 4 days"),
4556 wxDateTime
dt(29, wxDateTime::Dec
, 1999), dt1
, dt2
;
4558 for ( size_t n
= 0; n
< WXSIZEOF(testArithmData
); n
++ )
4560 wxDateSpan span
= testArithmData
[n
].span
;
4564 const char *name
= testArithmData
[n
].name
;
4565 printf("%s + %s = %s, %s - %s = %s\n",
4566 dt
.FormatISODate().c_str(), name
, dt1
.FormatISODate().c_str(),
4567 dt
.FormatISODate().c_str(), name
, dt2
.FormatISODate().c_str());
4569 printf("Going back: %s", (dt1
- span
).FormatISODate().c_str());
4570 if ( dt1
- span
== dt
)
4576 printf(" (ERROR: should be %s)\n", dt
.FormatISODate().c_str());
4579 printf("Going forward: %s", (dt2
+ span
).FormatISODate().c_str());
4580 if ( dt2
+ span
== dt
)
4586 printf(" (ERROR: should be %s)\n", dt
.FormatISODate().c_str());
4589 printf("Double increment: %s", (dt2
+ 2*span
).FormatISODate().c_str());
4590 if ( dt2
+ 2*span
== dt1
)
4596 printf(" (ERROR: should be %s)\n", dt2
.FormatISODate().c_str());
4603 static void TestTimeHolidays()
4605 puts("\n*** testing wxDateTimeHolidayAuthority ***\n");
4607 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
4608 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
4609 dtEnd
= dtStart
.GetLastMonthDay();
4611 wxDateTimeArray hol
;
4612 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
4614 const wxChar
*format
= "%d-%b-%Y (%a)";
4616 printf("All holidays between %s and %s:\n",
4617 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
4619 size_t count
= hol
.GetCount();
4620 for ( size_t n
= 0; n
< count
; n
++ )
4622 printf("\t%s\n", hol
[n
].Format(format
).c_str());
4628 static void TestTimeZoneBug()
4630 puts("\n*** testing for DST/timezone bug ***\n");
4632 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
4633 for ( int i
= 0; i
< 31; i
++ )
4635 printf("Date %s: week day %s.\n",
4636 date
.Format(_T("%d-%m-%Y")).c_str(),
4637 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
4639 date
+= wxDateSpan::Day();
4645 static void TestTimeSpanFormat()
4647 puts("\n*** wxTimeSpan tests ***");
4649 static const char *formats
[] =
4651 _T("(default) %H:%M:%S"),
4652 _T("%E weeks and %D days"),
4653 _T("%l milliseconds"),
4654 _T("(with ms) %H:%M:%S:%l"),
4655 _T("100%% of minutes is %M"), // test "%%"
4656 _T("%D days and %H hours"),
4657 _T("or also %S seconds"),
4660 wxTimeSpan
ts1(1, 2, 3, 4),
4662 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
4664 printf("ts1 = %s\tts2 = %s\n",
4665 ts1
.Format(formats
[n
]).c_str(),
4666 ts2
.Format(formats
[n
]).c_str());
4674 // test compatibility with the old wxDate/wxTime classes
4675 static void TestTimeCompatibility()
4677 puts("\n*** wxDateTime compatibility test ***");
4679 printf("wxDate for JDN 0: %s\n", wxDate(0l).FormatDate().c_str());
4680 printf("wxDate for MJD 0: %s\n", wxDate(2400000).FormatDate().c_str());
4682 double jdnNow
= wxDateTime::Now().GetJDN();
4683 long jdnMidnight
= (long)(jdnNow
- 0.5);
4684 printf("wxDate for today: %s\n", wxDate(jdnMidnight
).FormatDate().c_str());
4686 jdnMidnight
= wxDate().Set().GetJulianDate();
4687 printf("wxDateTime for today: %s\n",
4688 wxDateTime((double)(jdnMidnight
+ 0.5)).Format("%c", wxDateTime::GMT0
).c_str());
4690 int flags
= wxEUROPEAN
;//wxFULL;
4693 printf("Today is %s\n", date
.FormatDate(flags
).c_str());
4694 for ( int n
= 0; n
< 7; n
++ )
4696 printf("Previous %s is %s\n",
4697 wxDateTime::GetWeekDayName((wxDateTime::WeekDay
)n
),
4698 date
.Previous(n
+ 1).FormatDate(flags
).c_str());
4704 #endif // TEST_DATETIME
4706 // ----------------------------------------------------------------------------
4708 // ----------------------------------------------------------------------------
4712 #include "wx/thread.h"
4714 static size_t gs_counter
= (size_t)-1;
4715 static wxCriticalSection gs_critsect
;
4716 static wxSemaphore gs_cond
;
4718 class MyJoinableThread
: public wxThread
4721 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
4722 { m_n
= n
; Create(); }
4724 // thread execution starts here
4725 virtual ExitCode
Entry();
4731 wxThread::ExitCode
MyJoinableThread::Entry()
4733 unsigned long res
= 1;
4734 for ( size_t n
= 1; n
< m_n
; n
++ )
4738 // it's a loooong calculation :-)
4742 return (ExitCode
)res
;
4745 class MyDetachedThread
: public wxThread
4748 MyDetachedThread(size_t n
, char ch
)
4752 m_cancelled
= FALSE
;
4757 // thread execution starts here
4758 virtual ExitCode
Entry();
4761 virtual void OnExit();
4764 size_t m_n
; // number of characters to write
4765 char m_ch
; // character to write
4767 bool m_cancelled
; // FALSE if we exit normally
4770 wxThread::ExitCode
MyDetachedThread::Entry()
4773 wxCriticalSectionLocker
lock(gs_critsect
);
4774 if ( gs_counter
== (size_t)-1 )
4780 for ( size_t n
= 0; n
< m_n
; n
++ )
4782 if ( TestDestroy() )
4792 wxThread::Sleep(100);
4798 void MyDetachedThread::OnExit()
4800 wxLogTrace("thread", "Thread %ld is in OnExit", GetId());
4802 wxCriticalSectionLocker
lock(gs_critsect
);
4803 if ( !--gs_counter
&& !m_cancelled
)
4807 static void TestDetachedThreads()
4809 puts("\n*** Testing detached threads ***");
4811 static const size_t nThreads
= 3;
4812 MyDetachedThread
*threads
[nThreads
];
4814 for ( n
= 0; n
< nThreads
; n
++ )
4816 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
4819 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
4820 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
4822 for ( n
= 0; n
< nThreads
; n
++ )
4827 // wait until all threads terminate
4833 static void TestJoinableThreads()
4835 puts("\n*** Testing a joinable thread (a loooong calculation...) ***");
4837 // calc 10! in the background
4838 MyJoinableThread
thread(10);
4841 printf("\nThread terminated with exit code %lu.\n",
4842 (unsigned long)thread
.Wait());
4845 static void TestThreadSuspend()
4847 puts("\n*** Testing thread suspend/resume functions ***");
4849 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
4853 // this is for this demo only, in a real life program we'd use another
4854 // condition variable which would be signaled from wxThread::Entry() to
4855 // tell us that the thread really started running - but here just wait a
4856 // bit and hope that it will be enough (the problem is, of course, that
4857 // the thread might still not run when we call Pause() which will result
4859 wxThread::Sleep(300);
4861 for ( size_t n
= 0; n
< 3; n
++ )
4865 puts("\nThread suspended");
4868 // don't sleep but resume immediately the first time
4869 wxThread::Sleep(300);
4871 puts("Going to resume the thread");
4876 puts("Waiting until it terminates now");
4878 // wait until the thread terminates
4884 static void TestThreadDelete()
4886 // As above, using Sleep() is only for testing here - we must use some
4887 // synchronisation object instead to ensure that the thread is still
4888 // running when we delete it - deleting a detached thread which already
4889 // terminated will lead to a crash!
4891 puts("\n*** Testing thread delete function ***");
4893 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
4897 puts("\nDeleted a thread which didn't start to run yet.");
4899 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
4903 wxThread::Sleep(300);
4907 puts("\nDeleted a running thread.");
4909 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
4913 wxThread::Sleep(300);
4919 puts("\nDeleted a sleeping thread.");
4921 MyJoinableThread
thread3(20);
4926 puts("\nDeleted a joinable thread.");
4928 MyJoinableThread
thread4(2);
4931 wxThread::Sleep(300);
4935 puts("\nDeleted a joinable thread which already terminated.");
4940 class MyWaitingThread
: public wxThread
4943 MyWaitingThread( wxMutex
*mutex
, wxCondition
*condition
)
4946 m_condition
= condition
;
4951 virtual ExitCode
Entry()
4953 printf("Thread %lu has started running.\n", GetId());
4958 printf("Thread %lu starts to wait...\n", GetId());
4962 m_condition
->Wait();
4965 printf("Thread %lu finished to wait, exiting.\n", GetId());
4973 wxCondition
*m_condition
;
4976 static void TestThreadConditions()
4979 wxCondition
condition(mutex
);
4981 // otherwise its difficult to understand which log messages pertain to
4983 //wxLogTrace("thread", "Local condition var is %08x, gs_cond = %08x",
4984 // condition.GetId(), gs_cond.GetId());
4986 // create and launch threads
4987 MyWaitingThread
*threads
[10];
4990 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
4992 threads
[n
] = new MyWaitingThread( &mutex
, &condition
);
4995 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5000 // wait until all threads run
5001 puts("Main thread is waiting for the other threads to start");
5004 size_t nRunning
= 0;
5005 while ( nRunning
< WXSIZEOF(threads
) )
5011 printf("Main thread: %u already running\n", nRunning
);
5015 puts("Main thread: all threads started up.");
5018 wxThread::Sleep(500);
5021 // now wake one of them up
5022 printf("Main thread: about to signal the condition.\n");
5027 wxThread::Sleep(200);
5029 // wake all the (remaining) threads up, so that they can exit
5030 printf("Main thread: about to broadcast the condition.\n");
5032 condition
.Broadcast();
5034 // give them time to terminate (dirty!)
5035 wxThread::Sleep(500);
5038 #include "wx/utils.h"
5040 class MyExecThread
: public wxThread
5043 MyExecThread(const wxString
& command
) : wxThread(wxTHREAD_JOINABLE
),
5049 virtual ExitCode
Entry()
5051 return (ExitCode
)wxExecute(m_command
, wxEXEC_SYNC
);
5058 static void TestThreadExec()
5060 wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
5062 MyExecThread
thread(_T("true"));
5065 wxPrintf(_T("Main program exit code: %ld.\n"),
5066 wxExecute(_T("false"), wxEXEC_SYNC
));
5068 wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread
.Wait());
5072 #include "wx/datetime.h"
5074 class MySemaphoreThread
: public wxThread
5077 MySemaphoreThread(int i
, wxSemaphore
*sem
)
5078 : wxThread(wxTHREAD_JOINABLE
),
5085 virtual ExitCode
Entry()
5087 wxPrintf(_T("%s: Thread %d starting to wait for semaphore...\n"),
5088 wxDateTime::Now().FormatTime().c_str(), m_i
);
5092 wxPrintf(_T("%s: Thread %d acquired the semaphore.\n"),
5093 wxDateTime::Now().FormatTime().c_str(), m_i
);
5097 wxPrintf(_T("%s: Thread %d releasing the semaphore.\n"),
5098 wxDateTime::Now().FormatTime().c_str(), m_i
);
5110 WX_DEFINE_ARRAY(wxThread
*, ArrayThreads
);
5112 static void TestSemaphore()
5114 wxPuts(_T("*** Testing wxSemaphore class. ***"));
5116 static const int SEM_LIMIT
= 3;
5118 wxSemaphore
sem(SEM_LIMIT
, SEM_LIMIT
);
5119 ArrayThreads threads
;
5121 for ( int i
= 0; i
< 3*SEM_LIMIT
; i
++ )
5123 threads
.Add(new MySemaphoreThread(i
, &sem
));
5124 threads
.Last()->Run();
5127 for ( size_t n
= 0; n
< threads
.GetCount(); n
++ )
5134 #endif // TEST_THREADS
5136 // ----------------------------------------------------------------------------
5138 // ----------------------------------------------------------------------------
5142 #include "wx/dynarray.h"
5144 typedef unsigned short ushort
;
5146 #define DefineCompare(name, T) \
5148 int wxCMPFUNC_CONV name ## CompareValues(T first, T second) \
5150 return first - second; \
5153 int wxCMPFUNC_CONV name ## Compare(T* first, T* second) \
5155 return *first - *second; \
5158 int wxCMPFUNC_CONV name ## RevCompare(T* first, T* second) \
5160 return *second - *first; \
5163 DefineCompare(UShort, ushort);
5164 DefineCompare(Int
, int);
5166 // test compilation of all macros
5167 WX_DEFINE_ARRAY_SHORT(ushort
, wxArrayUShort
);
5168 WX_DEFINE_SORTED_ARRAY_SHORT(ushort
, wxSortedArrayUShortNoCmp
);
5169 WX_DEFINE_SORTED_ARRAY_CMP_SHORT(ushort
, UShortCompareValues
, wxSortedArrayUShort
);
5170 WX_DEFINE_SORTED_ARRAY_CMP_INT(int, IntCompareValues
, wxSortedArrayInt
);
5172 WX_DECLARE_OBJARRAY(Bar
, ArrayBars
);
5173 #include "wx/arrimpl.cpp"
5174 WX_DEFINE_OBJARRAY(ArrayBars
);
5176 static void PrintArray(const char* name
, const wxArrayString
& array
)
5178 printf("Dump of the array '%s'\n", name
);
5180 size_t nCount
= array
.GetCount();
5181 for ( size_t n
= 0; n
< nCount
; n
++ )
5183 printf("\t%s[%u] = '%s'\n", name
, n
, array
[n
].c_str());
5187 int wxCMPFUNC_CONV
StringLenCompare(const wxString
& first
,
5188 const wxString
& second
)
5190 return first
.length() - second
.length();
5193 #define TestArrayOf(name) \
5195 static void PrintArray(const char* name, const wxSortedArray##name & array) \
5197 printf("Dump of the array '%s'\n", name); \
5199 size_t nCount = array.GetCount(); \
5200 for ( size_t n = 0; n < nCount; n++ ) \
5202 printf("\t%s[%u] = %d\n", name, n, array[n]); \
5206 static void PrintArray(const char* name, const wxArray##name & array) \
5208 printf("Dump of the array '%s'\n", name); \
5210 size_t nCount = array.GetCount(); \
5211 for ( size_t n = 0; n < nCount; n++ ) \
5213 printf("\t%s[%u] = %d\n", name, n, array[n]); \
5217 static void TestArrayOf ## name ## s() \
5219 printf("*** Testing wxArray%s ***\n", #name); \
5227 puts("Initially:"); \
5228 PrintArray("a", a); \
5230 puts("After sort:"); \
5231 a.Sort(name ## Compare); \
5232 PrintArray("a", a); \
5234 puts("After reverse sort:"); \
5235 a.Sort(name ## RevCompare); \
5236 PrintArray("a", a); \
5238 wxSortedArray##name b; \
5244 puts("Sorted array initially:"); \
5245 PrintArray("b", b); \
5248 TestArrayOf(UShort
);
5251 static void TestArrayOfObjects()
5253 puts("*** Testing wxObjArray ***\n");
5257 Bar
bar("second bar (two copies!)");
5259 printf("Initially: %u objects in the array, %u objects total.\n",
5260 bars
.GetCount(), Bar::GetNumber());
5262 bars
.Add(new Bar("first bar"));
5265 printf("Now: %u objects in the array, %u objects total.\n",
5266 bars
.GetCount(), Bar::GetNumber());
5268 bars
.RemoveAt(1, bars
.GetCount() - 1);
5270 printf("After removing all but first element: %u objects in the "
5271 "array, %u objects total.\n",
5272 bars
.GetCount(), Bar::GetNumber());
5276 printf("After Empty(): %u objects in the array, %u objects total.\n",
5277 bars
.GetCount(), Bar::GetNumber());
5280 printf("Finally: no more objects in the array, %u objects total.\n",
5284 #endif // TEST_ARRAYS
5286 // ----------------------------------------------------------------------------
5288 // ----------------------------------------------------------------------------
5292 #include "wx/timer.h"
5293 #include "wx/tokenzr.h"
5295 static void TestStringConstruction()
5297 puts("*** Testing wxString constructores ***");
5299 #define TEST_CTOR(args, res) \
5302 printf("wxString%s = %s ", #args, s.c_str()); \
5309 printf("(ERROR: should be %s)\n", res); \
5313 TEST_CTOR((_T('Z'), 4), _T("ZZZZ"));
5314 TEST_CTOR((_T("Hello"), 4), _T("Hell"));
5315 TEST_CTOR((_T("Hello"), 5), _T("Hello"));
5316 // TEST_CTOR((_T("Hello"), 6), _T("Hello")); -- should give assert failure
5318 static const wxChar
*s
= _T("?really!");
5319 const wxChar
*start
= wxStrchr(s
, _T('r'));
5320 const wxChar
*end
= wxStrchr(s
, _T('!'));
5321 TEST_CTOR((start
, end
), _T("really"));
5326 static void TestString()
5336 for (int i
= 0; i
< 1000000; ++i
)
5340 c
= "! How'ya doin'?";
5343 c
= "Hello world! What's up?";
5348 printf ("TestString elapsed time: %ld\n", sw
.Time());
5351 static void TestPChar()
5359 for (int i
= 0; i
< 1000000; ++i
)
5361 strcpy (a
, "Hello");
5362 strcpy (b
, " world");
5363 strcpy (c
, "! How'ya doin'?");
5366 strcpy (c
, "Hello world! What's up?");
5367 if (strcmp (c
, a
) == 0)
5371 printf ("TestPChar elapsed time: %ld\n", sw
.Time());
5374 static void TestStringSub()
5376 wxString
s("Hello, world!");
5378 puts("*** Testing wxString substring extraction ***");
5380 printf("String = '%s'\n", s
.c_str());
5381 printf("Left(5) = '%s'\n", s
.Left(5).c_str());
5382 printf("Right(6) = '%s'\n", s
.Right(6).c_str());
5383 printf("Mid(3, 5) = '%s'\n", s(3, 5).c_str());
5384 printf("Mid(3) = '%s'\n", s
.Mid(3).c_str());
5385 printf("substr(3, 5) = '%s'\n", s
.substr(3, 5).c_str());
5386 printf("substr(3) = '%s'\n", s
.substr(3).c_str());
5388 static const wxChar
*prefixes
[] =
5392 _T("Hello, world!"),
5393 _T("Hello, world!!!"),
5399 for ( size_t n
= 0; n
< WXSIZEOF(prefixes
); n
++ )
5401 wxString prefix
= prefixes
[n
], rest
;
5402 bool rc
= s
.StartsWith(prefix
, &rest
);
5403 printf("StartsWith('%s') = %s", prefix
.c_str(), rc
? "TRUE" : "FALSE");
5406 printf(" (the rest is '%s')\n", rest
.c_str());
5417 static void TestStringFormat()
5419 puts("*** Testing wxString formatting ***");
5422 s
.Printf("%03d", 18);
5424 printf("Number 18: %s\n", wxString::Format("%03d", 18).c_str());
5425 printf("Number 18: %s\n", s
.c_str());
5430 // returns "not found" for npos, value for all others
5431 static wxString
PosToString(size_t res
)
5433 wxString s
= res
== wxString::npos
? wxString(_T("not found"))
5434 : wxString::Format(_T("%u"), res
);
5438 static void TestStringFind()
5440 puts("*** Testing wxString find() functions ***");
5442 static const wxChar
*strToFind
= _T("ell");
5443 static const struct StringFindTest
5447 result
; // of searching "ell" in str
5450 { _T("Well, hello world"), 0, 1 },
5451 { _T("Well, hello world"), 6, 7 },
5452 { _T("Well, hello world"), 9, wxString::npos
},
5455 for ( size_t n
= 0; n
< WXSIZEOF(findTestData
); n
++ )
5457 const StringFindTest
& ft
= findTestData
[n
];
5458 size_t res
= wxString(ft
.str
).find(strToFind
, ft
.start
);
5460 printf(_T("Index of '%s' in '%s' starting from %u is %s "),
5461 strToFind
, ft
.str
, ft
.start
, PosToString(res
).c_str());
5463 size_t resTrue
= ft
.result
;
5464 if ( res
== resTrue
)
5470 printf(_T("(ERROR: should be %s)\n"),
5471 PosToString(resTrue
).c_str());
5478 static void TestStringTokenizer()
5480 puts("*** Testing wxStringTokenizer ***");
5482 static const wxChar
*modeNames
[] =
5486 _T("return all empty"),
5491 static const struct StringTokenizerTest
5493 const wxChar
*str
; // string to tokenize
5494 const wxChar
*delims
; // delimiters to use
5495 size_t count
; // count of token
5496 wxStringTokenizerMode mode
; // how should we tokenize it
5497 } tokenizerTestData
[] =
5499 { _T(""), _T(" "), 0 },
5500 { _T("Hello, world"), _T(" "), 2 },
5501 { _T("Hello, world "), _T(" "), 2 },
5502 { _T("Hello, world"), _T(","), 2 },
5503 { _T("Hello, world!"), _T(",!"), 2 },
5504 { _T("Hello,, world!"), _T(",!"), 3 },
5505 { _T("Hello, world!"), _T(",!"), 3, wxTOKEN_RET_EMPTY_ALL
},
5506 { _T("username:password:uid:gid:gecos:home:shell"), _T(":"), 7 },
5507 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 4 },
5508 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 6, wxTOKEN_RET_EMPTY
},
5509 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 9, wxTOKEN_RET_EMPTY_ALL
},
5510 { _T("01/02/99"), _T("/-"), 3 },
5511 { _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS
},
5514 for ( size_t n
= 0; n
< WXSIZEOF(tokenizerTestData
); n
++ )
5516 const StringTokenizerTest
& tt
= tokenizerTestData
[n
];
5517 wxStringTokenizer
tkz(tt
.str
, tt
.delims
, tt
.mode
);
5519 size_t count
= tkz
.CountTokens();
5520 printf(_T("String '%s' has %u tokens delimited by '%s' (mode = %s) "),
5521 MakePrintable(tt
.str
).c_str(),
5523 MakePrintable(tt
.delims
).c_str(),
5524 modeNames
[tkz
.GetMode()]);
5525 if ( count
== tt
.count
)
5531 printf(_T("(ERROR: should be %u)\n"), tt
.count
);
5536 // if we emulate strtok(), check that we do it correctly
5537 wxChar
*buf
, *s
= NULL
, *last
;
5539 if ( tkz
.GetMode() == wxTOKEN_STRTOK
)
5541 buf
= new wxChar
[wxStrlen(tt
.str
) + 1];
5542 wxStrcpy(buf
, tt
.str
);
5544 s
= wxStrtok(buf
, tt
.delims
, &last
);
5551 // now show the tokens themselves
5553 while ( tkz
.HasMoreTokens() )
5555 wxString token
= tkz
.GetNextToken();
5557 printf(_T("\ttoken %u: '%s'"),
5559 MakePrintable(token
).c_str());
5569 printf(" (ERROR: should be %s)\n", s
);
5572 s
= wxStrtok(NULL
, tt
.delims
, &last
);
5576 // nothing to compare with
5581 if ( count2
!= count
)
5583 puts(_T("\tERROR: token count mismatch"));
5592 static void TestStringReplace()
5594 puts("*** Testing wxString::replace ***");
5596 static const struct StringReplaceTestData
5598 const wxChar
*original
; // original test string
5599 size_t start
, len
; // the part to replace
5600 const wxChar
*replacement
; // the replacement string
5601 const wxChar
*result
; // and the expected result
5602 } stringReplaceTestData
[] =
5604 { _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") },
5605 { _T("increase"), 0, 2, _T("de"), _T("decrease") },
5606 { _T("wxWindow"), 8, 0, _T("s"), _T("wxWindows") },
5607 { _T("foobar"), 3, 0, _T("-"), _T("foo-bar") },
5608 { _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") },
5611 for ( size_t n
= 0; n
< WXSIZEOF(stringReplaceTestData
); n
++ )
5613 const StringReplaceTestData data
= stringReplaceTestData
[n
];
5615 wxString original
= data
.original
;
5616 original
.replace(data
.start
, data
.len
, data
.replacement
);
5618 wxPrintf(_T("wxString(\"%s\").replace(%u, %u, %s) = %s "),
5619 data
.original
, data
.start
, data
.len
, data
.replacement
,
5622 if ( original
== data
.result
)
5628 wxPrintf(_T("(ERROR: should be '%s')\n"), data
.result
);
5635 static void TestStringMatch()
5637 wxPuts(_T("*** Testing wxString::Matches() ***"));
5639 static const struct StringMatchTestData
5642 const wxChar
*wildcard
;
5644 } stringMatchTestData
[] =
5646 { _T("foobar"), _T("foo*"), 1 },
5647 { _T("foobar"), _T("*oo*"), 1 },
5648 { _T("foobar"), _T("*bar"), 1 },
5649 { _T("foobar"), _T("??????"), 1 },
5650 { _T("foobar"), _T("f??b*"), 1 },
5651 { _T("foobar"), _T("f?b*"), 0 },
5652 { _T("foobar"), _T("*goo*"), 0 },
5653 { _T("foobar"), _T("*foo"), 0 },
5654 { _T("foobarfoo"), _T("*foo"), 1 },
5655 { _T(""), _T("*"), 1 },
5656 { _T(""), _T("?"), 0 },
5659 for ( size_t n
= 0; n
< WXSIZEOF(stringMatchTestData
); n
++ )
5661 const StringMatchTestData
& data
= stringMatchTestData
[n
];
5662 bool matches
= wxString(data
.text
).Matches(data
.wildcard
);
5663 wxPrintf(_T("'%s' %s '%s' (%s)\n"),
5665 matches
? _T("matches") : _T("doesn't match"),
5667 matches
== data
.matches
? _T("ok") : _T("ERROR"));
5673 #endif // TEST_STRINGS
5675 // ----------------------------------------------------------------------------
5677 // ----------------------------------------------------------------------------
5679 #ifdef TEST_SNGLINST
5680 #include "wx/snglinst.h"
5681 #endif // TEST_SNGLINST
5683 int main(int argc
, char **argv
)
5685 wxApp::CheckBuildOptions(wxBuildOptions());
5687 wxInitializer initializer
;
5690 fprintf(stderr
, "Failed to initialize the wxWindows library, aborting.");
5695 #ifdef TEST_SNGLINST
5696 wxSingleInstanceChecker checker
;
5697 if ( checker
.Create(_T(".wxconsole.lock")) )
5699 if ( checker
.IsAnotherRunning() )
5701 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
5706 // wait some time to give time to launch another instance
5707 wxPrintf(_T("Press \"Enter\" to continue..."));
5710 else // failed to create
5712 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
5714 #endif // TEST_SNGLINST
5718 #endif // TEST_CHARSET
5721 TestCmdLineConvert();
5723 #if wxUSE_CMDLINE_PARSER
5724 static const wxCmdLineEntryDesc cmdLineDesc
[] =
5726 { wxCMD_LINE_SWITCH
, _T("h"), _T("help"), "show this help message",
5727 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
5728 { wxCMD_LINE_SWITCH
, "v", "verbose", "be verbose" },
5729 { wxCMD_LINE_SWITCH
, "q", "quiet", "be quiet" },
5731 { wxCMD_LINE_OPTION
, "o", "output", "output file" },
5732 { wxCMD_LINE_OPTION
, "i", "input", "input dir" },
5733 { wxCMD_LINE_OPTION
, "s", "size", "output block size",
5734 wxCMD_LINE_VAL_NUMBER
},
5735 { wxCMD_LINE_OPTION
, "d", "date", "output file date",
5736 wxCMD_LINE_VAL_DATE
},
5738 { wxCMD_LINE_PARAM
, NULL
, NULL
, "input file",
5739 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
5744 wxCmdLineParser
parser(cmdLineDesc
, argc
, argv
);
5746 parser
.AddOption("project_name", "", "full path to project file",
5747 wxCMD_LINE_VAL_STRING
,
5748 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
5750 switch ( parser
.Parse() )
5753 wxLogMessage("Help was given, terminating.");
5757 ShowCmdLine(parser
);
5761 wxLogMessage("Syntax error detected, aborting.");
5764 #endif // wxUSE_CMDLINE_PARSER
5766 #endif // TEST_CMDLINE
5774 TestStringConstruction();
5777 TestStringTokenizer();
5778 TestStringReplace();
5784 #endif // TEST_STRINGS
5797 puts("*** Initially:");
5799 PrintArray("a1", a1
);
5801 wxArrayString
a2(a1
);
5802 PrintArray("a2", a2
);
5804 wxSortedArrayString
a3(a1
);
5805 PrintArray("a3", a3
);
5807 puts("*** After deleting three strings from a1");
5810 PrintArray("a1", a1
);
5811 PrintArray("a2", a2
);
5812 PrintArray("a3", a3
);
5814 puts("*** After reassigning a1 to a2 and a3");
5816 PrintArray("a2", a2
);
5817 PrintArray("a3", a3
);
5819 puts("*** After sorting a1");
5821 PrintArray("a1", a1
);
5823 puts("*** After sorting a1 in reverse order");
5825 PrintArray("a1", a1
);
5827 puts("*** After sorting a1 by the string length");
5828 a1
.Sort(StringLenCompare
);
5829 PrintArray("a1", a1
);
5831 TestArrayOfObjects();
5832 TestArrayOfUShorts();
5836 #endif // TEST_ARRAYS
5847 #ifdef TEST_DLLLOADER
5849 #endif // TEST_DLLLOADER
5853 #endif // TEST_ENVIRON
5857 #endif // TEST_EXECUTE
5859 #ifdef TEST_FILECONF
5861 #endif // TEST_FILECONF
5869 #endif // TEST_LOCALE
5873 for ( size_t n
= 0; n
< 8000; n
++ )
5875 s
<< (char)('A' + (n
% 26));
5879 msg
.Printf("A very very long message: '%s', the end!\n", s
.c_str());
5881 // this one shouldn't be truncated
5884 // but this one will because log functions use fixed size buffer
5885 // (note that it doesn't need '\n' at the end neither - will be added
5887 wxLogMessage("A very very long message 2: '%s', the end!", s
.c_str());
5899 #ifdef TEST_FILENAME
5903 fn
.Assign("c:\\foo", "bar.baz");
5904 fn
.Assign("/u/os9-port/Viewer/tvision/WEI2HZ-3B3-14_05-04-00MSC1.asc");
5909 TestFileNameConstruction();
5912 TestFileNameConstruction();
5913 TestFileNameMakeRelative();
5914 TestFileNameSplit();
5917 TestFileNameComparison();
5918 TestFileNameOperations();
5920 #endif // TEST_FILENAME
5922 #ifdef TEST_FILETIME
5926 #endif // TEST_FILETIME
5929 wxLog::AddTraceMask(FTP_TRACE_MASK
);
5930 if ( TestFtpConnect() )
5941 if ( TEST_INTERACTIVE
)
5942 TestFtpInteractive();
5944 //else: connecting to the FTP server failed
5950 #ifdef TEST_LONGLONG
5951 // seed pseudo random generator
5952 srand((unsigned)time(NULL
));
5961 TestMultiplication();
5964 TestLongLongConversion();
5965 TestBitOperations();
5966 TestLongLongComparison();
5967 TestLongLongPrint();
5969 #endif // TEST_LONGLONG
5977 #endif // TEST_HASHMAP
5980 wxLog::AddTraceMask(_T("mime"));
5988 TestMimeAssociate();
5991 #ifdef TEST_INFO_FUNCTIONS
5997 if ( TEST_INTERACTIVE
)
6000 #endif // TEST_INFO_FUNCTIONS
6002 #ifdef TEST_PATHLIST
6004 #endif // TEST_PATHLIST
6012 #endif // TEST_REGCONF
6015 // TODO: write a real test using src/regex/tests file
6020 TestRegExSubmatch();
6021 TestRegExReplacement();
6023 if ( TEST_INTERACTIVE
)
6024 TestRegExInteractive();
6026 #endif // TEST_REGEX
6028 #ifdef TEST_REGISTRY
6030 TestRegistryAssociation();
6031 #endif // TEST_REGISTRY
6036 #endif // TEST_SOCKETS
6041 #endif // TEST_STREAMS
6044 int nCPUs
= wxThread::GetCPUCount();
6045 printf("This system has %d CPUs\n", nCPUs
);
6047 wxThread::SetConcurrency(nCPUs
);
6051 TestDetachedThreads();
6052 TestJoinableThreads();
6053 TestThreadSuspend();
6055 TestThreadConditions();
6060 #endif // TEST_THREADS
6064 #endif // TEST_TIMER
6066 #ifdef TEST_DATETIME
6079 TestTimeArithmetics();
6082 TestTimeSpanFormat();
6088 if ( TEST_INTERACTIVE
)
6089 TestDateTimeInteractive();
6090 #endif // TEST_DATETIME
6093 puts("Sleeping for 3 seconds... z-z-z-z-z...");
6095 #endif // TEST_USLEEP
6100 #endif // TEST_VCARD
6104 #endif // TEST_VOLUME
6108 TestEncodingConverter();
6109 #endif // TEST_WCHAR
6112 TestZipStreamRead();
6113 TestZipFileSystem();
6117 TestZlibStreamWrite();
6118 TestZlibStreamRead();