1 /////////////////////////////////////////////////////////////////////////////
2 // Name: samples/console/console.cpp
3 // Purpose: a sample console (as opposed to GUI) progam using wxWindows
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
23 #error "This sample can't be compiled in GUI mode."
28 #include "wx/string.h"
32 // without this pragma, the stupid compiler precompiles #defines below so that
33 // changing them doesn't "take place" later!
38 // ----------------------------------------------------------------------------
39 // conditional compilation
40 // ----------------------------------------------------------------------------
43 A note about all these conditional compilation macros: this file is used
44 both as a test suite for various non-GUI wxWindows classes and as a
45 scratchpad for quick tests. So there are two compilation modes: if you
46 define TEST_ALL all tests are run, otherwise you may enable the individual
47 tests individually in the "#else" branch below.
50 // what to test (in alphabetic order)? uncomment the line below to do all tests
58 #define TEST_DLLLOADER
68 #define TEST_INFO_FUNCTIONS
84 // #define TEST_VCARD -- don't enable this (VZ)
90 static const bool TEST_ALL
= TRUE
;
95 static const bool TEST_ALL
= FALSE
;
98 // some tests are interactive, define this to run them
99 #ifdef TEST_INTERACTIVE
100 #undef TEST_INTERACTIVE
102 static const bool TEST_INTERACTIVE
= FALSE
;
104 static const bool TEST_INTERACTIVE
= FALSE
;
107 // ----------------------------------------------------------------------------
108 // test class for container objects
109 // ----------------------------------------------------------------------------
111 #if defined(TEST_ARRAYS) || defined(TEST_LIST)
113 class Bar
// Foo is already taken in the hash test
116 Bar(const wxString
& name
) : m_name(name
) { ms_bars
++; }
117 ~Bar() { ms_bars
--; }
119 static size_t GetNumber() { return ms_bars
; }
121 const char *GetName() const { return m_name
; }
126 static size_t ms_bars
;
129 size_t Bar::ms_bars
= 0;
131 #endif // defined(TEST_ARRAYS) || defined(TEST_LIST)
133 // ============================================================================
135 // ============================================================================
137 // ----------------------------------------------------------------------------
139 // ----------------------------------------------------------------------------
141 #if defined(TEST_STRINGS) || defined(TEST_SOCKETS)
143 // replace TABs with \t and CRs with \n
144 static wxString
MakePrintable(const wxChar
*s
)
147 (void)str
.Replace(_T("\t"), _T("\\t"));
148 (void)str
.Replace(_T("\n"), _T("\\n"));
149 (void)str
.Replace(_T("\r"), _T("\\r"));
154 #endif // MakePrintable() is used
156 // ----------------------------------------------------------------------------
157 // wxFontMapper::CharsetToEncoding
158 // ----------------------------------------------------------------------------
162 #include "wx/fontmap.h"
164 static void TestCharset()
166 static const wxChar
*charsets
[] =
168 // some vali charsets
177 // and now some bogus ones
184 for ( size_t n
= 0; n
< WXSIZEOF(charsets
); n
++ )
186 wxFontEncoding enc
= wxTheFontMapper
->CharsetToEncoding(charsets
[n
]);
187 wxPrintf(_T("Charset: %s\tEncoding: %s (%s)\n"),
189 wxTheFontMapper
->GetEncodingName(enc
).c_str(),
190 wxTheFontMapper
->GetEncodingDescription(enc
).c_str());
194 #endif // TEST_CHARSET
196 // ----------------------------------------------------------------------------
198 // ----------------------------------------------------------------------------
202 #include "wx/cmdline.h"
203 #include "wx/datetime.h"
205 #if wxUSE_CMDLINE_PARSER
207 static void ShowCmdLine(const wxCmdLineParser
& parser
)
209 wxString s
= "Input files: ";
211 size_t count
= parser
.GetParamCount();
212 for ( size_t param
= 0; param
< count
; param
++ )
214 s
<< parser
.GetParam(param
) << ' ';
218 << "Verbose:\t" << (parser
.Found("v") ? "yes" : "no") << '\n'
219 << "Quiet:\t" << (parser
.Found("q") ? "yes" : "no") << '\n';
224 if ( parser
.Found("o", &strVal
) )
225 s
<< "Output file:\t" << strVal
<< '\n';
226 if ( parser
.Found("i", &strVal
) )
227 s
<< "Input dir:\t" << strVal
<< '\n';
228 if ( parser
.Found("s", &lVal
) )
229 s
<< "Size:\t" << lVal
<< '\n';
230 if ( parser
.Found("d", &dt
) )
231 s
<< "Date:\t" << dt
.FormatISODate() << '\n';
232 if ( parser
.Found("project_name", &strVal
) )
233 s
<< "Project:\t" << strVal
<< '\n';
238 #endif // wxUSE_CMDLINE_PARSER
240 static void TestCmdLineConvert()
242 static const char *cmdlines
[] =
245 "-a \"-bstring 1\" -c\"string 2\" \"string 3\"",
246 "literal \\\" and \"\"",
249 for ( size_t n
= 0; n
< WXSIZEOF(cmdlines
); n
++ )
251 const char *cmdline
= cmdlines
[n
];
252 printf("Parsing: %s\n", cmdline
);
253 wxArrayString args
= wxCmdLineParser::ConvertStringToArgs(cmdline
);
255 size_t count
= args
.GetCount();
256 printf("\targc = %u\n", count
);
257 for ( size_t arg
= 0; arg
< count
; arg
++ )
259 printf("\targv[%u] = %s\n", arg
, args
[arg
].c_str());
264 #endif // TEST_CMDLINE
266 // ----------------------------------------------------------------------------
268 // ----------------------------------------------------------------------------
275 static const wxChar
*ROOTDIR
= _T("/");
276 static const wxChar
*TESTDIR
= _T("/usr");
277 #elif defined(__WXMSW__)
278 static const wxChar
*ROOTDIR
= _T("c:\\");
279 static const wxChar
*TESTDIR
= _T("d:\\");
281 #error "don't know where the root directory is"
284 static void TestDirEnumHelper(wxDir
& dir
,
285 int flags
= wxDIR_DEFAULT
,
286 const wxString
& filespec
= wxEmptyString
)
290 if ( !dir
.IsOpened() )
293 bool cont
= dir
.GetFirst(&filename
, filespec
, flags
);
296 printf("\t%s\n", filename
.c_str());
298 cont
= dir
.GetNext(&filename
);
304 static void TestDirEnum()
306 puts("*** Testing wxDir::GetFirst/GetNext ***");
308 wxDir
dir(wxGetCwd());
310 puts("Enumerating everything in current directory:");
311 TestDirEnumHelper(dir
);
313 puts("Enumerating really everything in current directory:");
314 TestDirEnumHelper(dir
, wxDIR_DEFAULT
| wxDIR_DOTDOT
);
316 puts("Enumerating object files in current directory:");
317 TestDirEnumHelper(dir
, wxDIR_DEFAULT
, "*.o");
319 puts("Enumerating directories in current directory:");
320 TestDirEnumHelper(dir
, wxDIR_DIRS
);
322 puts("Enumerating files in current directory:");
323 TestDirEnumHelper(dir
, wxDIR_FILES
);
325 puts("Enumerating files including hidden in current directory:");
326 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
330 puts("Enumerating everything in root directory:");
331 TestDirEnumHelper(dir
, wxDIR_DEFAULT
);
333 puts("Enumerating directories in root directory:");
334 TestDirEnumHelper(dir
, wxDIR_DIRS
);
336 puts("Enumerating files in root directory:");
337 TestDirEnumHelper(dir
, wxDIR_FILES
);
339 puts("Enumerating files including hidden in root directory:");
340 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
342 puts("Enumerating files in non existing directory:");
343 wxDir
dirNo("nosuchdir");
344 TestDirEnumHelper(dirNo
);
347 class DirPrintTraverser
: public wxDirTraverser
350 virtual wxDirTraverseResult
OnFile(const wxString
& filename
)
352 return wxDIR_CONTINUE
;
355 virtual wxDirTraverseResult
OnDir(const wxString
& dirname
)
357 wxString path
, name
, ext
;
358 wxSplitPath(dirname
, &path
, &name
, &ext
);
361 name
<< _T('.') << ext
;
364 for ( const wxChar
*p
= path
.c_str(); *p
; p
++ )
366 if ( wxIsPathSeparator(*p
) )
370 printf("%s%s\n", indent
.c_str(), name
.c_str());
372 return wxDIR_CONTINUE
;
376 static void TestDirTraverse()
378 puts("*** Testing wxDir::Traverse() ***");
382 size_t n
= wxDir::GetAllFiles(TESTDIR
, &files
);
383 printf("There are %u files under '%s'\n", n
, TESTDIR
);
386 printf("First one is '%s'\n", files
[0u].c_str());
387 printf(" last one is '%s'\n", files
[n
- 1].c_str());
390 // enum again with custom traverser
392 DirPrintTraverser traverser
;
393 dir
.Traverse(traverser
, _T(""), wxDIR_DIRS
| wxDIR_HIDDEN
);
398 // ----------------------------------------------------------------------------
400 // ----------------------------------------------------------------------------
402 #ifdef TEST_DLLLOADER
404 #include "wx/dynlib.h"
406 static void TestDllLoad()
408 #if defined(__WXMSW__)
409 static const wxChar
*LIB_NAME
= _T("kernel32.dll");
410 static const wxChar
*FUNC_NAME
= _T("lstrlenA");
411 #elif defined(__UNIX__)
412 // weird: using just libc.so does *not* work!
413 static const wxChar
*LIB_NAME
= _T("/lib/libc-2.0.7.so");
414 static const wxChar
*FUNC_NAME
= _T("strlen");
416 #error "don't know how to test wxDllLoader on this platform"
419 puts("*** testing wxDllLoader ***\n");
421 wxDllType dllHandle
= wxDllLoader::LoadLibrary(LIB_NAME
);
424 wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME
);
428 typedef int (*strlenType
)(const char *);
429 strlenType pfnStrlen
= (strlenType
)wxDllLoader::GetSymbol(dllHandle
, FUNC_NAME
);
432 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
433 FUNC_NAME
, LIB_NAME
);
437 if ( pfnStrlen("foo") != 3 )
439 wxPrintf(_T("ERROR: loaded function is not strlen()!\n"));
447 wxDllLoader::UnloadLibrary(dllHandle
);
451 #endif // TEST_DLLLOADER
453 // ----------------------------------------------------------------------------
455 // ----------------------------------------------------------------------------
459 #include "wx/utils.h"
461 static wxString
MyGetEnv(const wxString
& var
)
464 if ( !wxGetEnv(var
, &val
) )
467 val
= wxString(_T('\'')) + val
+ _T('\'');
472 static void TestEnvironment()
474 const wxChar
*var
= _T("wxTestVar");
476 puts("*** testing environment access functions ***");
478 printf("Initially getenv(%s) = %s\n", var
, MyGetEnv(var
).c_str());
479 wxSetEnv(var
, _T("value for wxTestVar"));
480 printf("After wxSetEnv: getenv(%s) = %s\n", var
, MyGetEnv(var
).c_str());
481 wxSetEnv(var
, _T("another value"));
482 printf("After 2nd wxSetEnv: getenv(%s) = %s\n", var
, MyGetEnv(var
).c_str());
484 printf("After wxUnsetEnv: getenv(%s) = %s\n", var
, MyGetEnv(var
).c_str());
485 printf("PATH = %s\n", MyGetEnv(_T("PATH")).c_str());
488 #endif // TEST_ENVIRON
490 // ----------------------------------------------------------------------------
492 // ----------------------------------------------------------------------------
496 #include "wx/utils.h"
498 static void TestExecute()
500 puts("*** testing wxExecute ***");
503 #define COMMAND "cat -n ../../Makefile" // "echo hi"
504 #define SHELL_COMMAND "echo hi from shell"
505 #define REDIRECT_COMMAND COMMAND // "date"
506 #elif defined(__WXMSW__)
507 #define COMMAND "command.com -c 'echo hi'"
508 #define SHELL_COMMAND "echo hi"
509 #define REDIRECT_COMMAND COMMAND
511 #error "no command to exec"
514 printf("Testing wxShell: ");
516 if ( wxShell(SHELL_COMMAND
) )
521 printf("Testing wxExecute: ");
523 if ( wxExecute(COMMAND
, TRUE
/* sync */) == 0 )
528 #if 0 // no, it doesn't work (yet?)
529 printf("Testing async wxExecute: ");
531 if ( wxExecute(COMMAND
) != 0 )
532 puts("Ok (command launched).");
537 printf("Testing wxExecute with redirection:\n");
538 wxArrayString output
;
539 if ( wxExecute(REDIRECT_COMMAND
, output
) != 0 )
545 size_t count
= output
.GetCount();
546 for ( size_t n
= 0; n
< count
; n
++ )
548 printf("\t%s\n", output
[n
].c_str());
555 #endif // TEST_EXECUTE
557 // ----------------------------------------------------------------------------
559 // ----------------------------------------------------------------------------
564 #include "wx/ffile.h"
565 #include "wx/textfile.h"
567 static void TestFileRead()
569 puts("*** wxFile read test ***");
571 wxFile
file(_T("testdata.fc"));
572 if ( file
.IsOpened() )
574 printf("File length: %lu\n", file
.Length());
576 puts("File dump:\n----------");
578 static const off_t len
= 1024;
582 off_t nRead
= file
.Read(buf
, len
);
583 if ( nRead
== wxInvalidOffset
)
585 printf("Failed to read the file.");
589 fwrite(buf
, nRead
, 1, stdout
);
599 printf("ERROR: can't open test file.\n");
605 static void TestTextFileRead()
607 puts("*** wxTextFile read test ***");
609 wxTextFile
file(_T("testdata.fc"));
612 printf("Number of lines: %u\n", file
.GetLineCount());
613 printf("Last line: '%s'\n", file
.GetLastLine().c_str());
617 puts("\nDumping the entire file:");
618 for ( s
= file
.GetFirstLine(); !file
.Eof(); s
= file
.GetNextLine() )
620 printf("%6u: %s\n", file
.GetCurrentLine() + 1, s
.c_str());
622 printf("%6u: %s\n", file
.GetCurrentLine() + 1, s
.c_str());
624 puts("\nAnd now backwards:");
625 for ( s
= file
.GetLastLine();
626 file
.GetCurrentLine() != 0;
627 s
= file
.GetPrevLine() )
629 printf("%6u: %s\n", file
.GetCurrentLine() + 1, s
.c_str());
631 printf("%6u: %s\n", file
.GetCurrentLine() + 1, s
.c_str());
635 printf("ERROR: can't open '%s'\n", file
.GetName());
641 static void TestFileCopy()
643 puts("*** Testing wxCopyFile ***");
645 static const wxChar
*filename1
= _T("testdata.fc");
646 static const wxChar
*filename2
= _T("test2");
647 if ( !wxCopyFile(filename1
, filename2
) )
649 puts("ERROR: failed to copy file");
653 wxFFile
f1(filename1
, "rb"),
656 if ( !f1
.IsOpened() || !f2
.IsOpened() )
658 puts("ERROR: failed to open file(s)");
663 if ( !f1
.ReadAll(&s1
) || !f2
.ReadAll(&s2
) )
665 puts("ERROR: failed to read file(s)");
669 if ( (s1
.length() != s2
.length()) ||
670 (memcmp(s1
.c_str(), s2
.c_str(), s1
.length()) != 0) )
672 puts("ERROR: copy error!");
676 puts("File was copied ok.");
682 if ( !wxRemoveFile(filename2
) )
684 puts("ERROR: failed to remove the file");
692 // ----------------------------------------------------------------------------
694 // ----------------------------------------------------------------------------
698 #include "wx/confbase.h"
699 #include "wx/fileconf.h"
701 static const struct FileConfTestData
703 const wxChar
*name
; // value name
704 const wxChar
*value
; // the value from the file
707 { _T("value1"), _T("one") },
708 { _T("value2"), _T("two") },
709 { _T("novalue"), _T("default") },
712 static void TestFileConfRead()
714 puts("*** testing wxFileConfig loading/reading ***");
716 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
717 _T("testdata.fc"), wxEmptyString
,
718 wxCONFIG_USE_RELATIVE_PATH
);
720 // test simple reading
721 puts("\nReading config file:");
722 wxString
defValue(_T("default")), value
;
723 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
725 const FileConfTestData
& data
= fcTestData
[n
];
726 value
= fileconf
.Read(data
.name
, defValue
);
727 printf("\t%s = %s ", data
.name
, value
.c_str());
728 if ( value
== data
.value
)
734 printf("(ERROR: should be %s)\n", data
.value
);
738 // test enumerating the entries
739 puts("\nEnumerating all root entries:");
742 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
745 printf("\t%s = %s\n",
747 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
749 cont
= fileconf
.GetNextEntry(name
, dummy
);
753 #endif // TEST_FILECONF
755 // ----------------------------------------------------------------------------
757 // ----------------------------------------------------------------------------
761 #include "wx/filename.h"
763 static void DumpFileName(const wxFileName
& fn
)
765 wxString full
= fn
.GetFullPath();
767 wxString vol
, path
, name
, ext
;
768 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
770 wxPrintf(_T("Filename '%s' -> vol '%s', path '%s', name '%s', ext '%s'\n"),
771 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
774 static struct FileNameInfo
776 const wxChar
*fullname
;
777 const wxChar
*volume
;
786 { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), TRUE
, wxPATH_UNIX
},
787 { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), TRUE
, wxPATH_UNIX
},
788 { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), TRUE
, wxPATH_UNIX
},
789 { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), FALSE
, wxPATH_UNIX
},
790 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_UNIX
},
791 { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), TRUE
, wxPATH_UNIX
},
792 { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), TRUE
, wxPATH_UNIX
},
793 { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), FALSE
, wxPATH_UNIX
},
794 { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), TRUE
, wxPATH_UNIX
},
796 // Windows file names
797 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
798 { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
799 { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
800 { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
801 { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), TRUE
, wxPATH_DOS
},
802 { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
805 { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE
, wxPATH_MAC
},
806 { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), TRUE
, wxPATH_MAC
},
807 { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), TRUE
, wxPATH_MAC
},
808 { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), FALSE
, wxPATH_MAC
},
809 { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE
, wxPATH_MAC
},
810 { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE
, wxPATH_MAC
},
813 { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), TRUE
, wxPATH_VMS
},
814 { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), FALSE
, wxPATH_VMS
},
817 static void TestFileNameConstruction()
819 puts("*** testing wxFileName construction ***");
821 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
823 const FileNameInfo
& fni
= filenames
[n
];
825 wxFileName
fn(fni
.fullname
, fni
.format
);
827 wxString fullname
= fn
.GetFullPath(fni
.format
);
828 if ( fullname
!= fni
.fullname
)
830 printf("ERROR: fullname should be '%s'\n", fni
.fullname
);
833 bool isAbsolute
= fn
.IsAbsolute();
834 printf("'%s' is %s (%s)\n\t",
836 isAbsolute
? "absolute" : "relative",
837 isAbsolute
== fni
.isAbsolute
? "ok" : "ERROR");
839 if ( !fn
.Normalize(wxPATH_NORM_ALL
, _T(""), fni
.format
) )
841 puts("ERROR (couldn't be normalized)");
845 printf("normalized: '%s'\n", fn
.GetFullPath(fni
.format
).c_str());
852 static void TestFileNameSplit()
854 puts("*** testing wxFileName splitting ***");
856 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
858 const FileNameInfo
& fni
= filenames
[n
];
859 wxString volume
, path
, name
, ext
;
860 wxFileName::SplitPath(fni
.fullname
,
861 &volume
, &path
, &name
, &ext
, fni
.format
);
863 printf("%s -> volume = '%s', path = '%s', name = '%s', ext = '%s'",
865 volume
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
867 if ( volume
!= fni
.volume
)
868 printf(" (ERROR: volume = '%s')", fni
.volume
);
869 if ( path
!= fni
.path
)
870 printf(" (ERROR: path = '%s')", fni
.path
);
871 if ( name
!= fni
.name
)
872 printf(" (ERROR: name = '%s')", fni
.name
);
873 if ( ext
!= fni
.ext
)
874 printf(" (ERROR: ext = '%s')", fni
.ext
);
880 static void TestFileNameTemp()
882 puts("*** testing wxFileName temp file creation ***");
884 static const char *tmpprefixes
[] =
890 "/tmp/foo/bar", // this one must be an error
893 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
895 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
898 printf("Prefix '%s'\t-> temp file '%s'\n",
899 tmpprefixes
[n
], path
.c_str());
901 if ( !wxRemoveFile(path
) )
903 wxLogWarning("Failed to remove temp file '%s'", path
.c_str());
909 static void TestFileNameMakeRelative()
911 puts("*** testing wxFileName::MakeRelativeTo() ***");
913 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
915 const FileNameInfo
& fni
= filenames
[n
];
917 wxFileName
fn(fni
.fullname
, fni
.format
);
919 // choose the base dir of the same format
921 switch ( fni
.format
)
933 // TODO: I don't know how this is supposed to work there
936 case wxPATH_NATIVE
: // make gcc happy
938 wxFAIL_MSG( "unexpected path format" );
941 printf("'%s' relative to '%s': ",
942 fn
.GetFullPath(fni
.format
).c_str(), base
.c_str());
944 if ( !fn
.MakeRelativeTo(base
, fni
.format
) )
950 printf("'%s'\n", fn
.GetFullPath(fni
.format
).c_str());
955 static void TestFileNameComparison()
960 static void TestFileNameOperations()
965 static void TestFileNameCwd()
970 #endif // TEST_FILENAME
972 // ----------------------------------------------------------------------------
973 // wxFileName time functions
974 // ----------------------------------------------------------------------------
978 #include <wx/filename.h>
979 #include <wx/datetime.h>
981 static void TestFileGetTimes()
983 wxFileName
fn(_T("testdata.fc"));
985 wxDateTime dtAccess
, dtMod
, dtChange
;
986 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtChange
) )
988 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
992 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
994 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
995 wxPrintf(_T("Access: \t%s\n"), dtAccess
.Format(fmt
).c_str());
996 wxPrintf(_T("Mod/creation:\t%s\n"), dtMod
.Format(fmt
).c_str());
997 wxPrintf(_T("Change: \t%s\n"), dtChange
.Format(fmt
).c_str());
1001 static void TestFileSetTimes()
1003 wxFileName
fn(_T("testdata.fc"));
1007 wxPrintf(_T("ERROR: Touch() failed.\n"));
1011 #endif // TEST_FILETIME
1013 // ----------------------------------------------------------------------------
1015 // ----------------------------------------------------------------------------
1019 #include "wx/hash.h"
1023 Foo(int n_
) { n
= n_
; count
++; }
1028 static size_t count
;
1031 size_t Foo::count
= 0;
1033 WX_DECLARE_LIST(Foo
, wxListFoos
);
1034 WX_DECLARE_HASH(Foo
, wxListFoos
, wxHashFoos
);
1036 #include "wx/listimpl.cpp"
1038 WX_DEFINE_LIST(wxListFoos
);
1040 static void TestHash()
1042 puts("*** Testing wxHashTable ***\n");
1046 hash
.DeleteContents(TRUE
);
1048 printf("Hash created: %u foos in hash, %u foos totally\n",
1049 hash
.GetCount(), Foo::count
);
1051 static const int hashTestData
[] =
1053 0, 1, 17, -2, 2, 4, -4, 345, 3, 3, 2, 1,
1057 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1059 hash
.Put(hashTestData
[n
], n
, new Foo(n
));
1062 printf("Hash filled: %u foos in hash, %u foos totally\n",
1063 hash
.GetCount(), Foo::count
);
1065 puts("Hash access test:");
1066 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1068 printf("\tGetting element with key %d, value %d: ",
1069 hashTestData
[n
], n
);
1070 Foo
*foo
= hash
.Get(hashTestData
[n
], n
);
1073 printf("ERROR, not found.\n");
1077 printf("%d (%s)\n", foo
->n
,
1078 (size_t)foo
->n
== n
? "ok" : "ERROR");
1082 printf("\nTrying to get an element not in hash: ");
1084 if ( hash
.Get(1234) || hash
.Get(1, 0) )
1086 puts("ERROR: found!");
1090 puts("ok (not found)");
1094 printf("Hash destroyed: %u foos left\n", Foo::count
);
1099 // ----------------------------------------------------------------------------
1101 // ----------------------------------------------------------------------------
1105 #include "wx/hashmap.h"
1107 // test compilation of basic map types
1108 WX_DECLARE_HASH_MAP( int*, int*, wxPointerHash
, wxPointerEqual
, myPtrHashMap
);
1109 WX_DECLARE_HASH_MAP( long, long, wxIntegerHash
, wxIntegerEqual
, myLongHashMap
);
1110 WX_DECLARE_HASH_MAP( unsigned long, unsigned, wxIntegerHash
, wxIntegerEqual
,
1111 myUnsignedHashMap
);
1112 WX_DECLARE_HASH_MAP( unsigned int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1114 WX_DECLARE_HASH_MAP( int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1116 WX_DECLARE_HASH_MAP( short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1118 WX_DECLARE_HASH_MAP( unsigned short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1120 WX_DECLARE_HASH_MAP( wxString
, wxString
, wxStringHash
, wxStringEqual
,
1123 typedef myStringHashMap::iterator Itor
;
1125 static void TestHashMap()
1127 puts("*** Testing wxHashMap ***\n");
1128 myStringHashMap
sh(0); // as small as possible
1131 const size_t count
= 10000;
1133 // init with some data
1134 for( i
= 0; i
< count
; ++i
)
1136 buf
.Printf(wxT("%d"), i
);
1137 sh
[buf
] = wxT("A") + buf
+ wxT("C");
1140 // test that insertion worked
1141 if( sh
.size() != count
)
1143 printf("*** ERROR: %u ELEMENTS, SHOULD BE %u ***\n", sh
.size(), count
);
1146 for( i
= 0; i
< count
; ++i
)
1148 buf
.Printf(wxT("%d"), i
);
1149 if( sh
[buf
] != wxT("A") + buf
+ wxT("C") )
1151 printf("*** ERROR INSERTION BROKEN! STOPPING NOW! ***\n");
1156 // check that iterators work
1158 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1162 printf("*** ERROR ITERATORS DO NOT TERMINATE! STOPPING NOW! ***\n");
1166 if( it
->second
!= sh
[it
->first
] )
1168 printf("*** ERROR ITERATORS BROKEN! STOPPING NOW! ***\n");
1173 if( sh
.size() != i
)
1175 printf("*** ERROR: %u ELEMENTS ITERATED, SHOULD BE %u ***\n", i
, count
);
1178 // test copy ctor, assignment operator
1179 myStringHashMap
h1( sh
), h2( 0 );
1182 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1184 if( h1
[it
->first
] != it
->second
)
1186 printf("*** ERROR: COPY CTOR BROKEN %s ***\n", it
->first
.c_str());
1189 if( h2
[it
->first
] != it
->second
)
1191 printf("*** ERROR: OPERATOR= BROKEN %s ***\n", it
->first
.c_str());
1196 for( i
= 0; i
< count
; ++i
)
1198 buf
.Printf(wxT("%d"), i
);
1199 size_t sz
= sh
.size();
1201 // test find() and erase(it)
1204 it
= sh
.find( buf
);
1205 if( it
!= sh
.end() )
1209 if( sh
.find( buf
) != sh
.end() )
1211 printf("*** ERROR: FOUND DELETED ELEMENT %u ***\n", i
);
1215 printf("*** ERROR: CANT FIND ELEMENT %u ***\n", i
);
1220 size_t c
= sh
.erase( buf
);
1222 printf("*** ERROR: SHOULD RETURN 1 ***\n");
1224 if( sh
.find( buf
) != sh
.end() )
1226 printf("*** ERROR: FOUND DELETED ELEMENT %u ***\n", i
);
1230 // count should decrease
1231 if( sh
.size() != sz
- 1 )
1233 printf("*** ERROR: COUNT DID NOT DECREASE ***\n");
1237 printf("*** Finished testing wxHashMap ***\n");
1242 // ----------------------------------------------------------------------------
1244 // ----------------------------------------------------------------------------
1248 #include "wx/list.h"
1250 WX_DECLARE_LIST(Bar
, wxListBars
);
1251 #include "wx/listimpl.cpp"
1252 WX_DEFINE_LIST(wxListBars
);
1254 static void TestListCtor()
1256 puts("*** Testing wxList construction ***\n");
1260 list1
.Append(new Bar(_T("first")));
1261 list1
.Append(new Bar(_T("second")));
1263 printf("After 1st list creation: %u objects in the list, %u objects total.\n",
1264 list1
.GetCount(), Bar::GetNumber());
1269 printf("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n",
1270 list1
.GetCount(), list2
.GetCount(), Bar::GetNumber());
1272 list1
.DeleteContents(TRUE
);
1275 printf("After list destruction: %u objects left.\n", Bar::GetNumber());
1280 // ----------------------------------------------------------------------------
1282 // ----------------------------------------------------------------------------
1286 #include "wx/intl.h"
1287 #include "wx/utils.h" // for wxSetEnv
1289 static wxLocale
gs_localeDefault(wxLANGUAGE_ENGLISH
);
1291 // find the name of the language from its value
1292 static const char *GetLangName(int lang
)
1294 static const char *languageNames
[] =
1315 "ARABIC_SAUDI_ARABIA",
1340 "CHINESE_SIMPLIFIED",
1341 "CHINESE_TRADITIONAL",
1344 "CHINESE_SINGAPORE",
1355 "ENGLISH_AUSTRALIA",
1359 "ENGLISH_CARIBBEAN",
1363 "ENGLISH_NEW_ZEALAND",
1364 "ENGLISH_PHILIPPINES",
1365 "ENGLISH_SOUTH_AFRICA",
1377 "FRENCH_LUXEMBOURG",
1386 "GERMAN_LIECHTENSTEIN",
1387 "GERMAN_LUXEMBOURG",
1428 "MALAY_BRUNEI_DARUSSALAM",
1440 "NORWEGIAN_NYNORSK",
1447 "PORTUGUESE_BRAZILIAN",
1472 "SPANISH_ARGENTINA",
1476 "SPANISH_COSTA_RICA",
1477 "SPANISH_DOMINICAN_REPUBLIC",
1479 "SPANISH_EL_SALVADOR",
1480 "SPANISH_GUATEMALA",
1484 "SPANISH_NICARAGUA",
1488 "SPANISH_PUERTO_RICO",
1491 "SPANISH_VENEZUELA",
1528 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1529 return languageNames
[lang
];
1534 static void TestDefaultLang()
1536 puts("*** Testing wxLocale::GetSystemLanguage ***");
1538 static const wxChar
*langStrings
[] =
1540 NULL
, // system default
1547 _T("de_DE.iso88591"),
1549 _T("?"), // invalid lang spec
1550 _T("klingonese"), // I bet on some systems it does exist...
1553 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1554 wxLocale::GetSystemEncodingName().c_str(),
1555 wxLocale::GetSystemEncoding());
1557 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1559 const char *langStr
= langStrings
[n
];
1562 // FIXME: this doesn't do anything at all under Windows, we need
1563 // to create a new wxLocale!
1564 wxSetEnv(_T("LC_ALL"), langStr
);
1567 int lang
= gs_localeDefault
.GetSystemLanguage();
1568 printf("Locale for '%s' is %s.\n",
1569 langStr
? langStr
: "system default", GetLangName(lang
));
1573 #endif // TEST_LOCALE
1575 // ----------------------------------------------------------------------------
1577 // ----------------------------------------------------------------------------
1581 #include "wx/mimetype.h"
1583 static void TestMimeEnum()
1585 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1587 wxArrayString mimetypes
;
1589 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1591 printf("*** All %u known filetypes: ***\n", count
);
1596 for ( size_t n
= 0; n
< count
; n
++ )
1598 wxFileType
*filetype
=
1599 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1602 printf("nothing known about the filetype '%s'!\n",
1603 mimetypes
[n
].c_str());
1607 filetype
->GetDescription(&desc
);
1608 filetype
->GetExtensions(exts
);
1610 filetype
->GetIcon(NULL
);
1613 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1616 extsAll
<< _T(", ");
1620 printf("\t%s: %s (%s)\n",
1621 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
1627 static void TestMimeOverride()
1629 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
1631 static const wxChar
*mailcap
= _T("/tmp/mailcap");
1632 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
1634 if ( wxFile::Exists(mailcap
) )
1635 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
1637 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
1639 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
1642 if ( wxFile::Exists(mimetypes
) )
1643 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
1645 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
1647 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
1653 static void TestMimeFilename()
1655 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
1657 static const wxChar
*filenames
[] =
1664 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1666 const wxString fname
= filenames
[n
];
1667 wxString ext
= fname
.AfterLast(_T('.'));
1668 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
1671 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
1676 if ( !ft
->GetDescription(&desc
) )
1677 desc
= _T("<no description>");
1680 if ( !ft
->GetOpenCommand(&cmd
,
1681 wxFileType::MessageParameters(fname
, _T(""))) )
1682 cmd
= _T("<no command available>");
1684 wxPrintf(_T("To open %s (%s) do '%s'.\n"),
1685 fname
.c_str(), desc
.c_str(), cmd
.c_str());
1694 static void TestMimeAssociate()
1696 wxPuts(_T("*** Testing creation of filetype association ***\n"));
1698 wxFileTypeInfo
ftInfo(
1699 _T("application/x-xyz"),
1700 _T("xyzview '%s'"), // open cmd
1701 _T(""), // print cmd
1702 _T("XYZ File") // description
1703 _T(".xyz"), // extensions
1704 NULL
// end of extensions
1706 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
1708 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
1711 wxPuts(_T("ERROR: failed to create association!"));
1715 // TODO: read it back
1724 // ----------------------------------------------------------------------------
1725 // misc information functions
1726 // ----------------------------------------------------------------------------
1728 #ifdef TEST_INFO_FUNCTIONS
1730 #include "wx/utils.h"
1732 static void TestDiskInfo()
1734 puts("*** Testing wxGetDiskSpace() ***");
1739 printf("\nEnter a directory name: ");
1740 if ( !fgets(pathname
, WXSIZEOF(pathname
), stdin
) )
1743 // kill the last '\n'
1744 pathname
[strlen(pathname
) - 1] = 0;
1746 wxLongLong total
, free
;
1747 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
1749 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
1753 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
1754 (total
/ 1024).ToString().c_str(),
1755 (free
/ 1024).ToString().c_str(),
1761 static void TestOsInfo()
1763 puts("*** Testing OS info functions ***\n");
1766 wxGetOsVersion(&major
, &minor
);
1767 printf("Running under: %s, version %d.%d\n",
1768 wxGetOsDescription().c_str(), major
, minor
);
1770 printf("%ld free bytes of memory left.\n", wxGetFreeMemory());
1772 printf("Host name is %s (%s).\n",
1773 wxGetHostName().c_str(), wxGetFullHostName().c_str());
1778 static void TestUserInfo()
1780 puts("*** Testing user info functions ***\n");
1782 printf("User id is:\t%s\n", wxGetUserId().c_str());
1783 printf("User name is:\t%s\n", wxGetUserName().c_str());
1784 printf("Home dir is:\t%s\n", wxGetHomeDir().c_str());
1785 printf("Email address:\t%s\n", wxGetEmailAddress().c_str());
1790 #endif // TEST_INFO_FUNCTIONS
1792 // ----------------------------------------------------------------------------
1794 // ----------------------------------------------------------------------------
1796 #ifdef TEST_LONGLONG
1798 #include "wx/longlong.h"
1799 #include "wx/timer.h"
1801 // make a 64 bit number from 4 16 bit ones
1802 #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3)
1804 // get a random 64 bit number
1805 #define RAND_LL() MAKE_LL(rand(), rand(), rand(), rand())
1807 static const long testLongs
[] =
1818 #if wxUSE_LONGLONG_WX
1819 inline bool operator==(const wxLongLongWx
& a
, const wxLongLongNative
& b
)
1820 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1821 inline bool operator==(const wxLongLongNative
& a
, const wxLongLongWx
& b
)
1822 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1823 #endif // wxUSE_LONGLONG_WX
1825 static void TestSpeed()
1827 static const long max
= 100000000;
1834 for ( n
= 0; n
< max
; n
++ )
1839 printf("Summing longs took %ld milliseconds.\n", sw
.Time());
1842 #if wxUSE_LONGLONG_NATIVE
1847 for ( n
= 0; n
< max
; n
++ )
1852 printf("Summing wxLongLong_t took %ld milliseconds.\n", sw
.Time());
1854 #endif // wxUSE_LONGLONG_NATIVE
1860 for ( n
= 0; n
< max
; n
++ )
1865 printf("Summing wxLongLongs took %ld milliseconds.\n", sw
.Time());
1869 static void TestLongLongConversion()
1871 puts("*** Testing wxLongLong conversions ***\n");
1875 for ( size_t n
= 0; n
< 100000; n
++ )
1879 #if wxUSE_LONGLONG_NATIVE
1880 wxLongLongNative
b(a
.GetHi(), a
.GetLo());
1882 wxASSERT_MSG( a
== b
, "conversions failure" );
1884 puts("Can't do it without native long long type, test skipped.");
1887 #endif // wxUSE_LONGLONG_NATIVE
1889 if ( !(nTested
% 1000) )
1901 static void TestMultiplication()
1903 puts("*** Testing wxLongLong multiplication ***\n");
1907 for ( size_t n
= 0; n
< 100000; n
++ )
1912 #if wxUSE_LONGLONG_NATIVE
1913 wxLongLongNative
aa(a
.GetHi(), a
.GetLo());
1914 wxLongLongNative
bb(b
.GetHi(), b
.GetLo());
1916 wxASSERT_MSG( a
*b
== aa
*bb
, "multiplication failure" );
1917 #else // !wxUSE_LONGLONG_NATIVE
1918 puts("Can't do it without native long long type, test skipped.");
1921 #endif // wxUSE_LONGLONG_NATIVE
1923 if ( !(nTested
% 1000) )
1935 static void TestDivision()
1937 puts("*** Testing wxLongLong division ***\n");
1941 for ( size_t n
= 0; n
< 100000; n
++ )
1943 // get a random wxLongLong (shifting by 12 the MSB ensures that the
1944 // multiplication will not overflow)
1945 wxLongLong ll
= MAKE_LL((rand() >> 12), rand(), rand(), rand());
1947 // get a random long (not wxLongLong for now) to divide it with
1952 #if wxUSE_LONGLONG_NATIVE
1953 wxLongLongNative
m(ll
.GetHi(), ll
.GetLo());
1955 wxLongLongNative p
= m
/ l
, s
= m
% l
;
1956 wxASSERT_MSG( q
== p
&& r
== s
, "division failure" );
1957 #else // !wxUSE_LONGLONG_NATIVE
1958 // verify the result
1959 wxASSERT_MSG( ll
== q
*l
+ r
, "division failure" );
1960 #endif // wxUSE_LONGLONG_NATIVE
1962 if ( !(nTested
% 1000) )
1974 static void TestAddition()
1976 puts("*** Testing wxLongLong addition ***\n");
1980 for ( size_t n
= 0; n
< 100000; n
++ )
1986 #if wxUSE_LONGLONG_NATIVE
1987 wxASSERT_MSG( c
== wxLongLongNative(a
.GetHi(), a
.GetLo()) +
1988 wxLongLongNative(b
.GetHi(), b
.GetLo()),
1989 "addition failure" );
1990 #else // !wxUSE_LONGLONG_NATIVE
1991 wxASSERT_MSG( c
- b
== a
, "addition failure" );
1992 #endif // wxUSE_LONGLONG_NATIVE
1994 if ( !(nTested
% 1000) )
2006 static void TestBitOperations()
2008 puts("*** Testing wxLongLong bit operation ***\n");
2012 for ( size_t n
= 0; n
< 100000; n
++ )
2016 #if wxUSE_LONGLONG_NATIVE
2017 for ( size_t n
= 0; n
< 33; n
++ )
2020 #else // !wxUSE_LONGLONG_NATIVE
2021 puts("Can't do it without native long long type, test skipped.");
2024 #endif // wxUSE_LONGLONG_NATIVE
2026 if ( !(nTested
% 1000) )
2038 static void TestLongLongComparison()
2040 #if wxUSE_LONGLONG_WX
2041 puts("*** Testing wxLongLong comparison ***\n");
2043 static const long ls
[2] =
2049 wxLongLongWx lls
[2];
2053 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2057 for ( size_t m
= 0; m
< WXSIZEOF(lls
); m
++ )
2059 res
= lls
[m
] > testLongs
[n
];
2060 printf("0x%lx > 0x%lx is %s (%s)\n",
2061 ls
[m
], testLongs
[n
], res
? "true" : "false",
2062 res
== (ls
[m
] > testLongs
[n
]) ? "ok" : "ERROR");
2064 res
= lls
[m
] < testLongs
[n
];
2065 printf("0x%lx < 0x%lx is %s (%s)\n",
2066 ls
[m
], testLongs
[n
], res
? "true" : "false",
2067 res
== (ls
[m
] < testLongs
[n
]) ? "ok" : "ERROR");
2069 res
= lls
[m
] == testLongs
[n
];
2070 printf("0x%lx == 0x%lx is %s (%s)\n",
2071 ls
[m
], testLongs
[n
], res
? "true" : "false",
2072 res
== (ls
[m
] == testLongs
[n
]) ? "ok" : "ERROR");
2075 #endif // wxUSE_LONGLONG_WX
2078 static void TestLongLongPrint()
2080 wxPuts(_T("*** Testing wxLongLong printing ***\n"));
2082 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2084 wxLongLong ll
= testLongs
[n
];
2085 wxPrintf(_T("%ld == %s\n"), testLongs
[n
], ll
.ToString().c_str());
2088 wxLongLong
ll(0x12345678, 0x87654321);
2089 wxPrintf(_T("0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2092 wxPrintf(_T("-0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2098 #endif // TEST_LONGLONG
2100 // ----------------------------------------------------------------------------
2102 // ----------------------------------------------------------------------------
2104 #ifdef TEST_PATHLIST
2106 static void TestPathList()
2108 puts("*** Testing wxPathList ***\n");
2110 wxPathList pathlist
;
2111 pathlist
.AddEnvList("PATH");
2112 wxString path
= pathlist
.FindValidPath("ls");
2115 printf("ERROR: command not found in the path.\n");
2119 printf("Command found in the path as '%s'.\n", path
.c_str());
2123 #endif // TEST_PATHLIST
2125 // ----------------------------------------------------------------------------
2126 // regular expressions
2127 // ----------------------------------------------------------------------------
2131 #include "wx/regex.h"
2133 static void TestRegExCompile()
2135 wxPuts(_T("*** Testing RE compilation ***\n"));
2137 static struct RegExCompTestData
2139 const wxChar
*pattern
;
2141 } regExCompTestData
[] =
2143 { _T("foo"), TRUE
},
2144 { _T("foo("), FALSE
},
2145 { _T("foo(bar"), FALSE
},
2146 { _T("foo(bar)"), TRUE
},
2147 { _T("foo["), FALSE
},
2148 { _T("foo[bar"), FALSE
},
2149 { _T("foo[bar]"), TRUE
},
2150 { _T("foo{"), TRUE
},
2151 { _T("foo{1"), FALSE
},
2152 { _T("foo{bar"), TRUE
},
2153 { _T("foo{1}"), TRUE
},
2154 { _T("foo{1,2}"), TRUE
},
2155 { _T("foo{bar}"), TRUE
},
2156 { _T("foo*"), TRUE
},
2157 { _T("foo**"), FALSE
},
2158 { _T("foo+"), TRUE
},
2159 { _T("foo++"), FALSE
},
2160 { _T("foo?"), TRUE
},
2161 { _T("foo??"), FALSE
},
2162 { _T("foo?+"), FALSE
},
2166 for ( size_t n
= 0; n
< WXSIZEOF(regExCompTestData
); n
++ )
2168 const RegExCompTestData
& data
= regExCompTestData
[n
];
2169 bool ok
= re
.Compile(data
.pattern
);
2171 wxPrintf(_T("'%s' is %sa valid RE (%s)\n"),
2173 ok
? _T("") : _T("not "),
2174 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2178 static void TestRegExMatch()
2180 wxPuts(_T("*** Testing RE matching ***\n"));
2182 static struct RegExMatchTestData
2184 const wxChar
*pattern
;
2187 } regExMatchTestData
[] =
2189 { _T("foo"), _T("bar"), FALSE
},
2190 { _T("foo"), _T("foobar"), TRUE
},
2191 { _T("^foo"), _T("foobar"), TRUE
},
2192 { _T("^foo"), _T("barfoo"), FALSE
},
2193 { _T("bar$"), _T("barbar"), TRUE
},
2194 { _T("bar$"), _T("barbar "), FALSE
},
2197 for ( size_t n
= 0; n
< WXSIZEOF(regExMatchTestData
); n
++ )
2199 const RegExMatchTestData
& data
= regExMatchTestData
[n
];
2201 wxRegEx
re(data
.pattern
);
2202 bool ok
= re
.Matches(data
.text
);
2204 wxPrintf(_T("'%s' %s %s (%s)\n"),
2206 ok
? _T("matches") : _T("doesn't match"),
2208 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2212 static void TestRegExSubmatch()
2214 wxPuts(_T("*** Testing RE subexpressions ***\n"));
2216 wxRegEx
re(_T("([[:alpha:]]+) ([[:alpha:]]+) ([[:digit:]]+).*([[:digit:]]+)$"));
2217 if ( !re
.IsValid() )
2219 wxPuts(_T("ERROR: compilation failed."));
2223 wxString text
= _T("Fri Jul 13 18:37:52 CEST 2001");
2225 if ( !re
.Matches(text
) )
2227 wxPuts(_T("ERROR: match expected."));
2231 wxPrintf(_T("Entire match: %s\n"), re
.GetMatch(text
).c_str());
2233 wxPrintf(_T("Date: %s/%s/%s, wday: %s\n"),
2234 re
.GetMatch(text
, 3).c_str(),
2235 re
.GetMatch(text
, 2).c_str(),
2236 re
.GetMatch(text
, 4).c_str(),
2237 re
.GetMatch(text
, 1).c_str());
2241 static void TestRegExReplacement()
2243 wxPuts(_T("*** Testing RE replacement ***"));
2245 static struct RegExReplTestData
2249 const wxChar
*result
;
2251 } regExReplTestData
[] =
2253 { _T("foo123"), _T("bar"), _T("bar"), 1 },
2254 { _T("foo123"), _T("\\2\\1"), _T("123foo"), 1 },
2255 { _T("foo_123"), _T("\\2\\1"), _T("123foo"), 1 },
2256 { _T("123foo"), _T("bar"), _T("123foo"), 0 },
2257 { _T("123foo456foo"), _T("&&"), _T("123foo456foo456foo"), 1 },
2258 { _T("foo123foo123"), _T("bar"), _T("barbar"), 2 },
2259 { _T("foo123_foo456_foo789"), _T("bar"), _T("bar_bar_bar"), 3 },
2262 const wxChar
*pattern
= _T("([a-z]+)[^0-9]*([0-9]+)");
2263 wxRegEx
re(pattern
);
2265 wxPrintf(_T("Using pattern '%s' for replacement.\n"), pattern
);
2267 for ( size_t n
= 0; n
< WXSIZEOF(regExReplTestData
); n
++ )
2269 const RegExReplTestData
& data
= regExReplTestData
[n
];
2271 wxString text
= data
.text
;
2272 size_t nRepl
= re
.Replace(&text
, data
.repl
);
2274 wxPrintf(_T("%s =~ s/RE/%s/g: %u match%s, result = '%s' ("),
2275 data
.text
, data
.repl
,
2276 nRepl
, nRepl
== 1 ? _T("") : _T("es"),
2278 if ( text
== data
.result
&& nRepl
== data
.count
)
2284 wxPrintf(_T("ERROR: should be %u and '%s')\n"),
2285 data
.count
, data
.result
);
2290 static void TestRegExInteractive()
2292 wxPuts(_T("*** Testing RE interactively ***"));
2297 printf("\nEnter a pattern: ");
2298 if ( !fgets(pattern
, WXSIZEOF(pattern
), stdin
) )
2301 // kill the last '\n'
2302 pattern
[strlen(pattern
) - 1] = 0;
2305 if ( !re
.Compile(pattern
) )
2313 printf("Enter text to match: ");
2314 if ( !fgets(text
, WXSIZEOF(text
), stdin
) )
2317 // kill the last '\n'
2318 text
[strlen(text
) - 1] = 0;
2320 if ( !re
.Matches(text
) )
2322 printf("No match.\n");
2326 printf("Pattern matches at '%s'\n", re
.GetMatch(text
).c_str());
2329 for ( size_t n
= 1; ; n
++ )
2331 if ( !re
.GetMatch(&start
, &len
, n
) )
2336 printf("Subexpr %u matched '%s'\n",
2337 n
, wxString(text
+ start
, len
).c_str());
2344 #endif // TEST_REGEX
2346 // ----------------------------------------------------------------------------
2347 // registry and related stuff
2348 // ----------------------------------------------------------------------------
2350 // this is for MSW only
2353 #undef TEST_REGISTRY
2358 #include "wx/confbase.h"
2359 #include "wx/msw/regconf.h"
2361 static void TestRegConfWrite()
2363 wxRegConfig
regconf(_T("console"), _T("wxwindows"));
2364 regconf
.Write(_T("Hello"), wxString(_T("world")));
2367 #endif // TEST_REGCONF
2369 #ifdef TEST_REGISTRY
2371 #include "wx/msw/registry.h"
2373 // I chose this one because I liked its name, but it probably only exists under
2375 static const wxChar
*TESTKEY
=
2376 _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
2378 static void TestRegistryRead()
2380 puts("*** testing registry reading ***");
2382 wxRegKey
key(TESTKEY
);
2383 printf("The test key name is '%s'.\n", key
.GetName().c_str());
2386 puts("ERROR: test key can't be opened, aborting test.");
2391 size_t nSubKeys
, nValues
;
2392 if ( key
.GetKeyInfo(&nSubKeys
, NULL
, &nValues
, NULL
) )
2394 printf("It has %u subkeys and %u values.\n", nSubKeys
, nValues
);
2397 printf("Enumerating values:\n");
2401 bool cont
= key
.GetFirstValue(value
, dummy
);
2404 printf("Value '%s': type ", value
.c_str());
2405 switch ( key
.GetValueType(value
) )
2407 case wxRegKey::Type_None
: printf("ERROR (none)"); break;
2408 case wxRegKey::Type_String
: printf("SZ"); break;
2409 case wxRegKey::Type_Expand_String
: printf("EXPAND_SZ"); break;
2410 case wxRegKey::Type_Binary
: printf("BINARY"); break;
2411 case wxRegKey::Type_Dword
: printf("DWORD"); break;
2412 case wxRegKey::Type_Multi_String
: printf("MULTI_SZ"); break;
2413 default: printf("other (unknown)"); break;
2416 printf(", value = ");
2417 if ( key
.IsNumericValue(value
) )
2420 key
.QueryValue(value
, &val
);
2426 key
.QueryValue(value
, val
);
2427 printf("'%s'", val
.c_str());
2429 key
.QueryRawValue(value
, val
);
2430 printf(" (raw value '%s')", val
.c_str());
2435 cont
= key
.GetNextValue(value
, dummy
);
2439 static void TestRegistryAssociation()
2442 The second call to deleteself genertaes an error message, with a
2443 messagebox saying .flo is crucial to system operation, while the .ddf
2444 call also fails, but with no error message
2449 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
2451 key
= "ddxf_auto_file" ;
2452 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
2454 key
= "ddxf_auto_file" ;
2455 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
2458 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
2460 key
= "program \"%1\"" ;
2462 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
2464 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
2466 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
2468 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
2472 #endif // TEST_REGISTRY
2474 // ----------------------------------------------------------------------------
2476 // ----------------------------------------------------------------------------
2480 #include "wx/socket.h"
2481 #include "wx/protocol/protocol.h"
2482 #include "wx/protocol/http.h"
2484 static void TestSocketServer()
2486 puts("*** Testing wxSocketServer ***\n");
2488 static const int PORT
= 3000;
2493 wxSocketServer
*server
= new wxSocketServer(addr
);
2494 if ( !server
->Ok() )
2496 puts("ERROR: failed to bind");
2503 printf("Server: waiting for connection on port %d...\n", PORT
);
2505 wxSocketBase
*socket
= server
->Accept();
2508 puts("ERROR: wxSocketServer::Accept() failed.");
2512 puts("Server: got a client.");
2514 server
->SetTimeout(60); // 1 min
2516 while ( socket
->IsConnected() )
2522 if ( socket
->Read(&ch
, sizeof(ch
)).Error() )
2524 // don't log error if the client just close the connection
2525 if ( socket
->IsConnected() )
2527 puts("ERROR: in wxSocket::Read.");
2547 printf("Server: got '%s'.\n", s
.c_str());
2548 if ( s
== _T("bye") )
2555 socket
->Write(s
.MakeUpper().c_str(), s
.length());
2556 socket
->Write("\r\n", 2);
2557 printf("Server: wrote '%s'.\n", s
.c_str());
2560 puts("Server: lost a client.");
2565 // same as "delete server" but is consistent with GUI programs
2569 static void TestSocketClient()
2571 puts("*** Testing wxSocketClient ***\n");
2573 static const char *hostname
= "www.wxwindows.org";
2576 addr
.Hostname(hostname
);
2579 printf("--- Attempting to connect to %s:80...\n", hostname
);
2581 wxSocketClient client
;
2582 if ( !client
.Connect(addr
) )
2584 printf("ERROR: failed to connect to %s\n", hostname
);
2588 printf("--- Connected to %s:%u...\n",
2589 addr
.Hostname().c_str(), addr
.Service());
2593 // could use simply "GET" here I suppose
2595 wxString::Format("GET http://%s/\r\n", hostname
);
2596 client
.Write(cmdGet
, cmdGet
.length());
2597 printf("--- Sent command '%s' to the server\n",
2598 MakePrintable(cmdGet
).c_str());
2599 client
.Read(buf
, WXSIZEOF(buf
));
2600 printf("--- Server replied:\n%s", buf
);
2604 #endif // TEST_SOCKETS
2606 // ----------------------------------------------------------------------------
2608 // ----------------------------------------------------------------------------
2612 #include "wx/protocol/ftp.h"
2616 #define FTP_ANONYMOUS
2618 #ifdef FTP_ANONYMOUS
2619 static const char *directory
= "/pub";
2620 static const char *filename
= "welcome.msg";
2622 static const char *directory
= "/etc";
2623 static const char *filename
= "issue";
2626 static bool TestFtpConnect()
2628 puts("*** Testing FTP connect ***");
2630 #ifdef FTP_ANONYMOUS
2631 static const char *hostname
= "ftp.wxwindows.org";
2633 printf("--- Attempting to connect to %s:21 anonymously...\n", hostname
);
2634 #else // !FTP_ANONYMOUS
2635 static const char *hostname
= "localhost";
2638 fgets(user
, WXSIZEOF(user
), stdin
);
2639 user
[strlen(user
) - 1] = '\0'; // chop off '\n'
2643 printf("Password for %s: ", password
);
2644 fgets(password
, WXSIZEOF(password
), stdin
);
2645 password
[strlen(password
) - 1] = '\0'; // chop off '\n'
2646 ftp
.SetPassword(password
);
2648 printf("--- Attempting to connect to %s:21 as %s...\n", hostname
, user
);
2649 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
2651 if ( !ftp
.Connect(hostname
) )
2653 printf("ERROR: failed to connect to %s\n", hostname
);
2659 printf("--- Connected to %s, current directory is '%s'\n",
2660 hostname
, ftp
.Pwd().c_str());
2666 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
2667 static void TestFtpWuFtpd()
2670 static const char *hostname
= "ftp.eudora.com";
2671 if ( !ftp
.Connect(hostname
) )
2673 printf("ERROR: failed to connect to %s\n", hostname
);
2677 static const char *filename
= "eudora/pubs/draft-gellens-submit-09.txt";
2678 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2681 printf("ERROR: couldn't get input stream for %s\n", filename
);
2685 size_t size
= in
->StreamSize();
2686 printf("Reading file %s (%u bytes)...", filename
, size
);
2688 char *data
= new char[size
];
2689 if ( !in
->Read(data
, size
) )
2691 puts("ERROR: read error");
2695 printf("Successfully retrieved the file.\n");
2704 static void TestFtpList()
2706 puts("*** Testing wxFTP file listing ***\n");
2709 if ( !ftp
.ChDir(directory
) )
2711 printf("ERROR: failed to cd to %s\n", directory
);
2714 printf("Current directory is '%s'\n", ftp
.Pwd().c_str());
2716 // test NLIST and LIST
2717 wxArrayString files
;
2718 if ( !ftp
.GetFilesList(files
) )
2720 puts("ERROR: failed to get NLIST of files");
2724 printf("Brief list of files under '%s':\n", ftp
.Pwd().c_str());
2725 size_t count
= files
.GetCount();
2726 for ( size_t n
= 0; n
< count
; n
++ )
2728 printf("\t%s\n", files
[n
].c_str());
2730 puts("End of the file list");
2733 if ( !ftp
.GetDirList(files
) )
2735 puts("ERROR: failed to get LIST of files");
2739 printf("Detailed list of files under '%s':\n", ftp
.Pwd().c_str());
2740 size_t count
= files
.GetCount();
2741 for ( size_t n
= 0; n
< count
; n
++ )
2743 printf("\t%s\n", files
[n
].c_str());
2745 puts("End of the file list");
2748 if ( !ftp
.ChDir(_T("..")) )
2750 puts("ERROR: failed to cd to ..");
2753 printf("Current directory is '%s'\n", ftp
.Pwd().c_str());
2756 static void TestFtpDownload()
2758 puts("*** Testing wxFTP download ***\n");
2761 wxInputStream
*in
= ftp
.GetInputStream(filename
);
2764 printf("ERROR: couldn't get input stream for %s\n", filename
);
2768 size_t size
= in
->StreamSize();
2769 printf("Reading file %s (%u bytes)...", filename
, size
);
2772 char *data
= new char[size
];
2773 if ( !in
->Read(data
, size
) )
2775 puts("ERROR: read error");
2779 printf("\nContents of %s:\n%s\n", filename
, data
);
2787 static void TestFtpFileSize()
2789 puts("*** Testing FTP SIZE command ***");
2791 if ( !ftp
.ChDir(directory
) )
2793 printf("ERROR: failed to cd to %s\n", directory
);
2796 printf("Current directory is '%s'\n", ftp
.Pwd().c_str());
2798 if ( ftp
.FileExists(filename
) )
2800 int size
= ftp
.GetFileSize(filename
);
2802 printf("ERROR: couldn't get size of '%s'\n", filename
);
2804 printf("Size of '%s' is %d bytes.\n", filename
, size
);
2808 printf("ERROR: '%s' doesn't exist\n", filename
);
2812 static void TestFtpMisc()
2814 puts("*** Testing miscellaneous wxFTP functions ***");
2816 if ( ftp
.SendCommand("STAT") != '2' )
2818 puts("ERROR: STAT failed");
2822 printf("STAT returned:\n\n%s\n", ftp
.GetLastResult().c_str());
2825 if ( ftp
.SendCommand("HELP SITE") != '2' )
2827 puts("ERROR: HELP SITE failed");
2831 printf("The list of site-specific commands:\n\n%s\n",
2832 ftp
.GetLastResult().c_str());
2836 static void TestFtpInteractive()
2838 puts("\n*** Interactive wxFTP test ***");
2844 printf("Enter FTP command: ");
2845 if ( !fgets(buf
, WXSIZEOF(buf
), stdin
) )
2848 // kill the last '\n'
2849 buf
[strlen(buf
) - 1] = 0;
2851 // special handling of LIST and NLST as they require data connection
2852 wxString
start(buf
, 4);
2854 if ( start
== "LIST" || start
== "NLST" )
2857 if ( strlen(buf
) > 4 )
2860 wxArrayString files
;
2861 if ( !ftp
.GetList(files
, wildcard
, start
== "LIST") )
2863 printf("ERROR: failed to get %s of files\n", start
.c_str());
2867 printf("--- %s of '%s' under '%s':\n",
2868 start
.c_str(), wildcard
.c_str(), ftp
.Pwd().c_str());
2869 size_t count
= files
.GetCount();
2870 for ( size_t n
= 0; n
< count
; n
++ )
2872 printf("\t%s\n", files
[n
].c_str());
2874 puts("--- End of the file list");
2879 char ch
= ftp
.SendCommand(buf
);
2880 printf("Command %s", ch
? "succeeded" : "failed");
2883 printf(" (return code %c)", ch
);
2886 printf(", server reply:\n%s\n\n", ftp
.GetLastResult().c_str());
2890 puts("\n*** done ***");
2893 static void TestFtpUpload()
2895 puts("*** Testing wxFTP uploading ***\n");
2898 static const char *file1
= "test1";
2899 static const char *file2
= "test2";
2900 wxOutputStream
*out
= ftp
.GetOutputStream(file1
);
2903 printf("--- Uploading to %s ---\n", file1
);
2904 out
->Write("First hello", 11);
2908 // send a command to check the remote file
2909 if ( ftp
.SendCommand(wxString("STAT ") + file1
) != '2' )
2911 printf("ERROR: STAT %s failed\n", file1
);
2915 printf("STAT %s returned:\n\n%s\n",
2916 file1
, ftp
.GetLastResult().c_str());
2919 out
= ftp
.GetOutputStream(file2
);
2922 printf("--- Uploading to %s ---\n", file1
);
2923 out
->Write("Second hello", 12);
2930 // ----------------------------------------------------------------------------
2932 // ----------------------------------------------------------------------------
2936 #include "wx/wfstream.h"
2937 #include "wx/mstream.h"
2939 static void TestFileStream()
2941 puts("*** Testing wxFileInputStream ***");
2943 static const wxChar
*filename
= _T("testdata.fs");
2945 wxFileOutputStream
fsOut(filename
);
2946 fsOut
.Write("foo", 3);
2949 wxFileInputStream
fsIn(filename
);
2950 printf("File stream size: %u\n", fsIn
.GetSize());
2951 while ( !fsIn
.Eof() )
2953 putchar(fsIn
.GetC());
2956 if ( !wxRemoveFile(filename
) )
2958 printf("ERROR: failed to remove the file '%s'.\n", filename
);
2961 puts("\n*** wxFileInputStream test done ***");
2964 static void TestMemoryStream()
2966 puts("*** Testing wxMemoryInputStream ***");
2969 wxStrncpy(buf
, _T("Hello, stream!"), WXSIZEOF(buf
));
2971 wxMemoryInputStream
memInpStream(buf
, wxStrlen(buf
));
2972 printf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
2973 while ( !memInpStream
.Eof() )
2975 putchar(memInpStream
.GetC());
2978 puts("\n*** wxMemoryInputStream test done ***");
2981 #endif // TEST_STREAMS
2983 // ----------------------------------------------------------------------------
2985 // ----------------------------------------------------------------------------
2989 #include "wx/timer.h"
2990 #include "wx/utils.h"
2992 static void TestStopWatch()
2994 puts("*** Testing wxStopWatch ***\n");
2997 printf("Sleeping 3 seconds...");
2999 printf("\telapsed time: %ldms\n", sw
.Time());
3002 printf("Sleeping 2 more seconds...");
3004 printf("\telapsed time: %ldms\n", sw
.Time());
3007 printf("And 3 more seconds...");
3009 printf("\telapsed time: %ldms\n", sw
.Time());
3012 puts("\nChecking for 'backwards clock' bug...");
3013 for ( size_t n
= 0; n
< 70; n
++ )
3017 for ( size_t m
= 0; m
< 100000; m
++ )
3019 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
3021 puts("\ntime is negative - ERROR!");
3031 #endif // TEST_TIMER
3033 // ----------------------------------------------------------------------------
3035 // ----------------------------------------------------------------------------
3039 #include "wx/vcard.h"
3041 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
3044 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
3048 wxString(_T('\t'), level
).c_str(),
3049 vcObj
->GetName().c_str());
3052 switch ( vcObj
->GetType() )
3054 case wxVCardObject::String
:
3055 case wxVCardObject::UString
:
3058 vcObj
->GetValue(&val
);
3059 value
<< _T('"') << val
<< _T('"');
3063 case wxVCardObject::Int
:
3066 vcObj
->GetValue(&i
);
3067 value
.Printf(_T("%u"), i
);
3071 case wxVCardObject::Long
:
3074 vcObj
->GetValue(&l
);
3075 value
.Printf(_T("%lu"), l
);
3079 case wxVCardObject::None
:
3082 case wxVCardObject::Object
:
3083 value
= _T("<node>");
3087 value
= _T("<unknown value type>");
3091 printf(" = %s", value
.c_str());
3094 DumpVObject(level
+ 1, *vcObj
);
3097 vcObj
= vcard
.GetNextProp(&cookie
);
3101 static void DumpVCardAddresses(const wxVCard
& vcard
)
3103 puts("\nShowing all addresses from vCard:\n");
3107 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3111 int flags
= addr
->GetFlags();
3112 if ( flags
& wxVCardAddress::Domestic
)
3114 flagsStr
<< _T("domestic ");
3116 if ( flags
& wxVCardAddress::Intl
)
3118 flagsStr
<< _T("international ");
3120 if ( flags
& wxVCardAddress::Postal
)
3122 flagsStr
<< _T("postal ");
3124 if ( flags
& wxVCardAddress::Parcel
)
3126 flagsStr
<< _T("parcel ");
3128 if ( flags
& wxVCardAddress::Home
)
3130 flagsStr
<< _T("home ");
3132 if ( flags
& wxVCardAddress::Work
)
3134 flagsStr
<< _T("work ");
3137 printf("Address %u:\n"
3139 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3142 addr
->GetPostOffice().c_str(),
3143 addr
->GetExtAddress().c_str(),
3144 addr
->GetStreet().c_str(),
3145 addr
->GetLocality().c_str(),
3146 addr
->GetRegion().c_str(),
3147 addr
->GetPostalCode().c_str(),
3148 addr
->GetCountry().c_str()
3152 addr
= vcard
.GetNextAddress(&cookie
);
3156 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
3158 puts("\nShowing all phone numbers from vCard:\n");
3162 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
3166 int flags
= phone
->GetFlags();
3167 if ( flags
& wxVCardPhoneNumber::Voice
)
3169 flagsStr
<< _T("voice ");
3171 if ( flags
& wxVCardPhoneNumber::Fax
)
3173 flagsStr
<< _T("fax ");
3175 if ( flags
& wxVCardPhoneNumber::Cellular
)
3177 flagsStr
<< _T("cellular ");
3179 if ( flags
& wxVCardPhoneNumber::Modem
)
3181 flagsStr
<< _T("modem ");
3183 if ( flags
& wxVCardPhoneNumber::Home
)
3185 flagsStr
<< _T("home ");
3187 if ( flags
& wxVCardPhoneNumber::Work
)
3189 flagsStr
<< _T("work ");
3192 printf("Phone number %u:\n"
3197 phone
->GetNumber().c_str()
3201 phone
= vcard
.GetNextPhoneNumber(&cookie
);
3205 static void TestVCardRead()
3207 puts("*** Testing wxVCard reading ***\n");
3209 wxVCard
vcard(_T("vcard.vcf"));
3210 if ( !vcard
.IsOk() )
3212 puts("ERROR: couldn't load vCard.");
3216 // read individual vCard properties
3217 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
3221 vcObj
->GetValue(&value
);
3226 value
= _T("<none>");
3229 printf("Full name retrieved directly: %s\n", value
.c_str());
3232 if ( !vcard
.GetFullName(&value
) )
3234 value
= _T("<none>");
3237 printf("Full name from wxVCard API: %s\n", value
.c_str());
3239 // now show how to deal with multiply occuring properties
3240 DumpVCardAddresses(vcard
);
3241 DumpVCardPhoneNumbers(vcard
);
3243 // and finally show all
3244 puts("\nNow dumping the entire vCard:\n"
3245 "-----------------------------\n");
3247 DumpVObject(0, vcard
);
3251 static void TestVCardWrite()
3253 puts("*** Testing wxVCard writing ***\n");
3256 if ( !vcard
.IsOk() )
3258 puts("ERROR: couldn't create vCard.");
3263 vcard
.SetName("Zeitlin", "Vadim");
3264 vcard
.SetFullName("Vadim Zeitlin");
3265 vcard
.SetOrganization("wxWindows", "R&D");
3267 // just dump the vCard back
3268 puts("Entire vCard follows:\n");
3269 puts(vcard
.Write());
3273 #endif // TEST_VCARD
3275 // ----------------------------------------------------------------------------
3276 // wide char (Unicode) support
3277 // ----------------------------------------------------------------------------
3281 #include "wx/strconv.h"
3282 #include "wx/fontenc.h"
3283 #include "wx/encconv.h"
3284 #include "wx/buffer.h"
3286 static void TestUtf8()
3288 puts("*** Testing UTF8 support ***\n");
3290 static const char textInUtf8
[] =
3292 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
3293 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
3294 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
3295 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
3296 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
3297 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
3298 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
3303 if ( wxConvUTF8
.MB2WC(wbuf
, textInUtf8
, WXSIZEOF(textInUtf8
)) <= 0 )
3305 puts("ERROR: UTF-8 decoding failed.");
3309 // using wxEncodingConverter
3311 wxEncodingConverter ec
;
3312 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
3313 ec
.Convert(wbuf
, buf
);
3314 #else // using wxCSConv
3315 wxCSConv
conv(_T("koi8-r"));
3316 if ( conv
.WC2MB(buf
, wbuf
, 0 /* not needed wcslen(wbuf) */) <= 0 )
3318 puts("ERROR: conversion to KOI8-R failed.");
3323 printf("The resulting string (in koi8-r): %s\n", buf
);
3327 #endif // TEST_WCHAR
3329 // ----------------------------------------------------------------------------
3331 // ----------------------------------------------------------------------------
3335 #include "wx/filesys.h"
3336 #include "wx/fs_zip.h"
3337 #include "wx/zipstrm.h"
3339 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
3341 static void TestZipStreamRead()
3343 puts("*** Testing ZIP reading ***\n");
3345 static const wxChar
*filename
= _T("foo");
3346 wxZipInputStream
istr(TESTFILE_ZIP
, filename
);
3347 printf("Archive size: %u\n", istr
.GetSize());
3349 printf("Dumping the file '%s':\n", filename
);
3350 while ( !istr
.Eof() )
3352 putchar(istr
.GetC());
3356 puts("\n----- done ------");
3359 static void DumpZipDirectory(wxFileSystem
& fs
,
3360 const wxString
& dir
,
3361 const wxString
& indent
)
3363 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
3364 TESTFILE_ZIP
, dir
.c_str());
3365 wxString wildcard
= prefix
+ _T("/*");
3367 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
3368 while ( !dirname
.empty() )
3370 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
3372 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3377 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
3379 DumpZipDirectory(fs
, dirname
,
3380 indent
+ wxString(_T(' '), 4));
3382 dirname
= fs
.FindNext();
3385 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
3386 while ( !filename
.empty() )
3388 if ( !filename
.StartsWith(prefix
, &filename
) )
3390 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3395 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
3397 filename
= fs
.FindNext();
3401 static void TestZipFileSystem()
3403 puts("*** Testing ZIP file system ***\n");
3405 wxFileSystem::AddHandler(new wxZipFSHandler
);
3407 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
3409 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
3414 // ----------------------------------------------------------------------------
3416 // ----------------------------------------------------------------------------
3420 #include "wx/zstream.h"
3421 #include "wx/wfstream.h"
3423 static const wxChar
*FILENAME_GZ
= _T("test.gz");
3424 static const char *TEST_DATA
= "hello and hello again";
3426 static void TestZlibStreamWrite()
3428 puts("*** Testing Zlib stream reading ***\n");
3430 wxFileOutputStream
fileOutStream(FILENAME_GZ
);
3431 wxZlibOutputStream
ostr(fileOutStream
, 0);
3432 printf("Compressing the test string... ");
3433 ostr
.Write(TEST_DATA
, sizeof(TEST_DATA
));
3436 puts("(ERROR: failed)");
3443 puts("\n----- done ------");
3446 static void TestZlibStreamRead()
3448 puts("*** Testing Zlib stream reading ***\n");
3450 wxFileInputStream
fileInStream(FILENAME_GZ
);
3451 wxZlibInputStream
istr(fileInStream
);
3452 printf("Archive size: %u\n", istr
.GetSize());
3454 puts("Dumping the file:");
3455 while ( !istr
.Eof() )
3457 putchar(istr
.GetC());
3461 puts("\n----- done ------");
3466 // ----------------------------------------------------------------------------
3468 // ----------------------------------------------------------------------------
3470 #ifdef TEST_DATETIME
3474 #include "wx/date.h"
3475 #include "wx/datetime.h"
3480 wxDateTime::wxDateTime_t day
;
3481 wxDateTime::Month month
;
3483 wxDateTime::wxDateTime_t hour
, min
, sec
;
3485 wxDateTime::WeekDay wday
;
3486 time_t gmticks
, ticks
;
3488 void Init(const wxDateTime::Tm
& tm
)
3497 gmticks
= ticks
= -1;
3500 wxDateTime
DT() const
3501 { return wxDateTime(day
, month
, year
, hour
, min
, sec
); }
3503 bool SameDay(const wxDateTime::Tm
& tm
) const
3505 return day
== tm
.mday
&& month
== tm
.mon
&& year
== tm
.year
;
3508 wxString
Format() const
3511 s
.Printf("%02d:%02d:%02d %10s %02d, %4d%s",
3513 wxDateTime::GetMonthName(month
).c_str(),
3515 abs(wxDateTime::ConvertYearToBC(year
)),
3516 year
> 0 ? "AD" : "BC");
3520 wxString
FormatDate() const
3523 s
.Printf("%02d-%s-%4d%s",
3525 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
3526 abs(wxDateTime::ConvertYearToBC(year
)),
3527 year
> 0 ? "AD" : "BC");
3532 static const Date testDates
[] =
3534 { 1, wxDateTime::Jan
, 1970, 00, 00, 00, 2440587.5, wxDateTime::Thu
, 0, -3600 },
3535 { 21, wxDateTime::Jan
, 2222, 00, 00, 00, 2532648.5, wxDateTime::Mon
, -1, -1 },
3536 { 29, wxDateTime::May
, 1976, 12, 00, 00, 2442928.0, wxDateTime::Sat
, 202219200, 202212000 },
3537 { 29, wxDateTime::Feb
, 1976, 00, 00, 00, 2442837.5, wxDateTime::Sun
, 194400000, 194396400 },
3538 { 1, wxDateTime::Jan
, 1900, 12, 00, 00, 2415021.0, wxDateTime::Mon
, -1, -1 },
3539 { 1, wxDateTime::Jan
, 1900, 00, 00, 00, 2415020.5, wxDateTime::Mon
, -1, -1 },
3540 { 15, wxDateTime::Oct
, 1582, 00, 00, 00, 2299160.5, wxDateTime::Fri
, -1, -1 },
3541 { 4, wxDateTime::Oct
, 1582, 00, 00, 00, 2299149.5, wxDateTime::Mon
, -1, -1 },
3542 { 1, wxDateTime::Mar
, 1, 00, 00, 00, 1721484.5, wxDateTime::Thu
, -1, -1 },
3543 { 1, wxDateTime::Jan
, 1, 00, 00, 00, 1721425.5, wxDateTime::Mon
, -1, -1 },
3544 { 31, wxDateTime::Dec
, 0, 00, 00, 00, 1721424.5, wxDateTime::Sun
, -1, -1 },
3545 { 1, wxDateTime::Jan
, 0, 00, 00, 00, 1721059.5, wxDateTime::Sat
, -1, -1 },
3546 { 12, wxDateTime::Aug
, -1234, 00, 00, 00, 1270573.5, wxDateTime::Fri
, -1, -1 },
3547 { 12, wxDateTime::Aug
, -4000, 00, 00, 00, 260313.5, wxDateTime::Sat
, -1, -1 },
3548 { 24, wxDateTime::Nov
, -4713, 00, 00, 00, -0.5, wxDateTime::Mon
, -1, -1 },
3551 // this test miscellaneous static wxDateTime functions
3552 static void TestTimeStatic()
3554 puts("\n*** wxDateTime static methods test ***");
3556 // some info about the current date
3557 int year
= wxDateTime::GetCurrentYear();
3558 printf("Current year %d is %sa leap one and has %d days.\n",
3560 wxDateTime::IsLeapYear(year
) ? "" : "not ",
3561 wxDateTime::GetNumberOfDays(year
));
3563 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
3564 printf("Current month is '%s' ('%s') and it has %d days\n",
3565 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
3566 wxDateTime::GetMonthName(month
).c_str(),
3567 wxDateTime::GetNumberOfDays(month
));
3570 static const size_t nYears
= 5;
3571 static const size_t years
[2][nYears
] =
3573 // first line: the years to test
3574 { 1990, 1976, 2000, 2030, 1984, },
3576 // second line: TRUE if leap, FALSE otherwise
3577 { FALSE
, TRUE
, TRUE
, FALSE
, TRUE
}
3580 for ( size_t n
= 0; n
< nYears
; n
++ )
3582 int year
= years
[0][n
];
3583 bool should
= years
[1][n
] != 0,
3584 is
= wxDateTime::IsLeapYear(year
);
3586 printf("Year %d is %sa leap year (%s)\n",
3589 should
== is
? "ok" : "ERROR");
3591 wxASSERT( should
== wxDateTime::IsLeapYear(year
) );
3595 // test constructing wxDateTime objects
3596 static void TestTimeSet()
3598 puts("\n*** wxDateTime construction test ***");
3600 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
3602 const Date
& d1
= testDates
[n
];
3603 wxDateTime dt
= d1
.DT();
3606 d2
.Init(dt
.GetTm());
3608 wxString s1
= d1
.Format(),
3611 printf("Date: %s == %s (%s)\n",
3612 s1
.c_str(), s2
.c_str(),
3613 s1
== s2
? "ok" : "ERROR");
3617 // test time zones stuff
3618 static void TestTimeZones()
3620 puts("\n*** wxDateTime timezone test ***");
3622 wxDateTime now
= wxDateTime::Now();
3624 printf("Current GMT time:\t%s\n", now
.Format("%c", wxDateTime::GMT0
).c_str());
3625 printf("Unix epoch (GMT):\t%s\n", wxDateTime((time_t)0).Format("%c", wxDateTime::GMT0
).c_str());
3626 printf("Unix epoch (EST):\t%s\n", wxDateTime((time_t)0).Format("%c", wxDateTime::EST
).c_str());
3627 printf("Current time in Paris:\t%s\n", now
.Format("%c", wxDateTime::CET
).c_str());
3628 printf(" Moscow:\t%s\n", now
.Format("%c", wxDateTime::MSK
).c_str());
3629 printf(" New York:\t%s\n", now
.Format("%c", wxDateTime::EST
).c_str());
3631 wxDateTime::Tm tm
= now
.GetTm();
3632 if ( wxDateTime(tm
) != now
)
3634 printf("ERROR: got %s instead of %s\n",
3635 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
3639 // test some minimal support for the dates outside the standard range
3640 static void TestTimeRange()
3642 puts("\n*** wxDateTime out-of-standard-range dates test ***");
3644 static const char *fmt
= "%d-%b-%Y %H:%M:%S";
3646 printf("Unix epoch:\t%s\n",
3647 wxDateTime(2440587.5).Format(fmt
).c_str());
3648 printf("Feb 29, 0: \t%s\n",
3649 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
3650 printf("JDN 0: \t%s\n",
3651 wxDateTime(0.0).Format(fmt
).c_str());
3652 printf("Jan 1, 1AD:\t%s\n",
3653 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
3654 printf("May 29, 2099:\t%s\n",
3655 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
3658 static void TestTimeTicks()
3660 puts("\n*** wxDateTime ticks test ***");
3662 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
3664 const Date
& d
= testDates
[n
];
3665 if ( d
.ticks
== -1 )
3668 wxDateTime dt
= d
.DT();
3669 long ticks
= (dt
.GetValue() / 1000).ToLong();
3670 printf("Ticks of %s:\t% 10ld", d
.Format().c_str(), ticks
);
3671 if ( ticks
== d
.ticks
)
3677 printf(" (ERROR: should be %ld, delta = %ld)\n",
3678 d
.ticks
, ticks
- d
.ticks
);
3681 dt
= d
.DT().ToTimezone(wxDateTime::GMT0
);
3682 ticks
= (dt
.GetValue() / 1000).ToLong();
3683 printf("GMtks of %s:\t% 10ld", d
.Format().c_str(), ticks
);
3684 if ( ticks
== d
.gmticks
)
3690 printf(" (ERROR: should be %ld, delta = %ld)\n",
3691 d
.gmticks
, ticks
- d
.gmticks
);
3698 // test conversions to JDN &c
3699 static void TestTimeJDN()
3701 puts("\n*** wxDateTime to JDN test ***");
3703 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
3705 const Date
& d
= testDates
[n
];
3706 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
3707 double jdn
= dt
.GetJulianDayNumber();
3709 printf("JDN of %s is:\t% 15.6f", d
.Format().c_str(), jdn
);
3716 printf(" (ERROR: should be %f, delta = %f)\n",
3717 d
.jdn
, jdn
- d
.jdn
);
3722 // test week days computation
3723 static void TestTimeWDays()
3725 puts("\n*** wxDateTime weekday test ***");
3727 // test GetWeekDay()
3729 for ( n
= 0; n
< WXSIZEOF(testDates
); n
++ )
3731 const Date
& d
= testDates
[n
];
3732 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
3734 wxDateTime::WeekDay wday
= dt
.GetWeekDay();
3737 wxDateTime::GetWeekDayName(wday
).c_str());
3738 if ( wday
== d
.wday
)
3744 printf(" (ERROR: should be %s)\n",
3745 wxDateTime::GetWeekDayName(d
.wday
).c_str());
3751 // test SetToWeekDay()
3752 struct WeekDateTestData
3754 Date date
; // the real date (precomputed)
3755 int nWeek
; // its week index in the month
3756 wxDateTime::WeekDay wday
; // the weekday
3757 wxDateTime::Month month
; // the month
3758 int year
; // and the year
3760 wxString
Format() const
3763 switch ( nWeek
< -1 ? -nWeek
: nWeek
)
3765 case 1: which
= "first"; break;
3766 case 2: which
= "second"; break;
3767 case 3: which
= "third"; break;
3768 case 4: which
= "fourth"; break;
3769 case 5: which
= "fifth"; break;
3771 case -1: which
= "last"; break;
3776 which
+= " from end";
3779 s
.Printf("The %s %s of %s in %d",
3781 wxDateTime::GetWeekDayName(wday
).c_str(),
3782 wxDateTime::GetMonthName(month
).c_str(),
3789 // the array data was generated by the following python program
3791 from DateTime import *
3792 from whrandom import *
3793 from string import *
3795 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
3796 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
3798 week = DateTimeDelta(7)
3801 year = randint(1900, 2100)
3802 month = randint(1, 12)
3803 day = randint(1, 28)
3804 dt = DateTime(year, month, day)
3805 wday = dt.day_of_week
3807 countFromEnd = choice([-1, 1])
3810 while dt.month is month:
3811 dt = dt - countFromEnd * week
3812 weekNum = weekNum + countFromEnd
3814 data = { 'day': rjust(`day`, 2), 'month': monthNames[month - 1], 'year': year, 'weekNum': rjust(`weekNum`, 2), 'wday': wdayNames[wday] }
3816 print "{ { %(day)s, wxDateTime::%(month)s, %(year)d }, %(weekNum)d, "\
3817 "wxDateTime::%(wday)s, wxDateTime::%(month)s, %(year)d }," % data
3820 static const WeekDateTestData weekDatesTestData
[] =
3822 { { 20, wxDateTime::Mar
, 2045 }, 3, wxDateTime::Mon
, wxDateTime::Mar
, 2045 },
3823 { { 5, wxDateTime::Jun
, 1985 }, -4, wxDateTime::Wed
, wxDateTime::Jun
, 1985 },
3824 { { 12, wxDateTime::Nov
, 1961 }, -3, wxDateTime::Sun
, wxDateTime::Nov
, 1961 },
3825 { { 27, wxDateTime::Feb
, 2093 }, -1, wxDateTime::Fri
, wxDateTime::Feb
, 2093 },
3826 { { 4, wxDateTime::Jul
, 2070 }, -4, wxDateTime::Fri
, wxDateTime::Jul
, 2070 },
3827 { { 2, wxDateTime::Apr
, 1906 }, -5, wxDateTime::Mon
, wxDateTime::Apr
, 1906 },
3828 { { 19, wxDateTime::Jul
, 2023 }, -2, wxDateTime::Wed
, wxDateTime::Jul
, 2023 },
3829 { { 5, wxDateTime::May
, 1958 }, -4, wxDateTime::Mon
, wxDateTime::May
, 1958 },
3830 { { 11, wxDateTime::Aug
, 1900 }, 2, wxDateTime::Sat
, wxDateTime::Aug
, 1900 },
3831 { { 14, wxDateTime::Feb
, 1945 }, 2, wxDateTime::Wed
, wxDateTime::Feb
, 1945 },
3832 { { 25, wxDateTime::Jul
, 1967 }, -1, wxDateTime::Tue
, wxDateTime::Jul
, 1967 },
3833 { { 9, wxDateTime::May
, 1916 }, -4, wxDateTime::Tue
, wxDateTime::May
, 1916 },
3834 { { 20, wxDateTime::Jun
, 1927 }, 3, wxDateTime::Mon
, wxDateTime::Jun
, 1927 },
3835 { { 2, wxDateTime::Aug
, 2000 }, 1, wxDateTime::Wed
, wxDateTime::Aug
, 2000 },
3836 { { 20, wxDateTime::Apr
, 2044 }, 3, wxDateTime::Wed
, wxDateTime::Apr
, 2044 },
3837 { { 20, wxDateTime::Feb
, 1932 }, -2, wxDateTime::Sat
, wxDateTime::Feb
, 1932 },
3838 { { 25, wxDateTime::Jul
, 2069 }, 4, wxDateTime::Thu
, wxDateTime::Jul
, 2069 },
3839 { { 3, wxDateTime::Apr
, 1925 }, 1, wxDateTime::Fri
, wxDateTime::Apr
, 1925 },
3840 { { 21, wxDateTime::Mar
, 2093 }, 3, wxDateTime::Sat
, wxDateTime::Mar
, 2093 },
3841 { { 3, wxDateTime::Dec
, 2074 }, -5, wxDateTime::Mon
, wxDateTime::Dec
, 2074 },
3844 static const char *fmt
= "%d-%b-%Y";
3847 for ( n
= 0; n
< WXSIZEOF(weekDatesTestData
); n
++ )
3849 const WeekDateTestData
& wd
= weekDatesTestData
[n
];
3851 dt
.SetToWeekDay(wd
.wday
, wd
.nWeek
, wd
.month
, wd
.year
);
3853 printf("%s is %s", wd
.Format().c_str(), dt
.Format(fmt
).c_str());
3855 const Date
& d
= wd
.date
;
3856 if ( d
.SameDay(dt
.GetTm()) )
3862 dt
.Set(d
.day
, d
.month
, d
.year
);
3864 printf(" (ERROR: should be %s)\n", dt
.Format(fmt
).c_str());
3869 // test the computation of (ISO) week numbers
3870 static void TestTimeWNumber()
3872 puts("\n*** wxDateTime week number test ***");
3874 struct WeekNumberTestData
3876 Date date
; // the date
3877 wxDateTime::wxDateTime_t week
; // the week number in the year
3878 wxDateTime::wxDateTime_t wmon
; // the week number in the month
3879 wxDateTime::wxDateTime_t wmon2
; // same but week starts with Sun
3880 wxDateTime::wxDateTime_t dnum
; // day number in the year
3883 // data generated with the following python script:
3885 from DateTime import *
3886 from whrandom import *
3887 from string import *
3889 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
3890 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
3892 def GetMonthWeek(dt):
3893 weekNumMonth = dt.iso_week[1] - DateTime(dt.year, dt.month, 1).iso_week[1] + 1
3894 if weekNumMonth < 0:
3895 weekNumMonth = weekNumMonth + 53
3898 def GetLastSundayBefore(dt):
3899 if dt.iso_week[2] == 7:
3902 return dt - DateTimeDelta(dt.iso_week[2])
3905 year = randint(1900, 2100)
3906 month = randint(1, 12)
3907 day = randint(1, 28)
3908 dt = DateTime(year, month, day)
3909 dayNum = dt.day_of_year
3910 weekNum = dt.iso_week[1]
3911 weekNumMonth = GetMonthWeek(dt)
3914 dtSunday = GetLastSundayBefore(dt)
3916 while dtSunday >= GetLastSundayBefore(DateTime(dt.year, dt.month, 1)):
3917 weekNumMonth2 = weekNumMonth2 + 1
3918 dtSunday = dtSunday - DateTimeDelta(7)
3920 data = { 'day': rjust(`day`, 2), \
3921 'month': monthNames[month - 1], \
3923 'weekNum': rjust(`weekNum`, 2), \
3924 'weekNumMonth': weekNumMonth, \
3925 'weekNumMonth2': weekNumMonth2, \
3926 'dayNum': rjust(`dayNum`, 3) }
3928 print " { { %(day)s, "\
3929 "wxDateTime::%(month)s, "\
3932 "%(weekNumMonth)s, "\
3933 "%(weekNumMonth2)s, "\
3934 "%(dayNum)s }," % data
3937 static const WeekNumberTestData weekNumberTestDates
[] =
3939 { { 27, wxDateTime::Dec
, 1966 }, 52, 5, 5, 361 },
3940 { { 22, wxDateTime::Jul
, 1926 }, 29, 4, 4, 203 },
3941 { { 22, wxDateTime::Oct
, 2076 }, 43, 4, 4, 296 },
3942 { { 1, wxDateTime::Jul
, 1967 }, 26, 1, 1, 182 },
3943 { { 8, wxDateTime::Nov
, 2004 }, 46, 2, 2, 313 },
3944 { { 21, wxDateTime::Mar
, 1920 }, 12, 3, 4, 81 },
3945 { { 7, wxDateTime::Jan
, 1965 }, 1, 2, 2, 7 },
3946 { { 19, wxDateTime::Oct
, 1999 }, 42, 4, 4, 292 },
3947 { { 13, wxDateTime::Aug
, 1955 }, 32, 2, 2, 225 },
3948 { { 18, wxDateTime::Jul
, 2087 }, 29, 3, 3, 199 },
3949 { { 2, wxDateTime::Sep
, 2028 }, 35, 1, 1, 246 },
3950 { { 28, wxDateTime::Jul
, 1945 }, 30, 5, 4, 209 },
3951 { { 15, wxDateTime::Jun
, 1901 }, 24, 3, 3, 166 },
3952 { { 10, wxDateTime::Oct
, 1939 }, 41, 3, 2, 283 },
3953 { { 3, wxDateTime::Dec
, 1965 }, 48, 1, 1, 337 },
3954 { { 23, wxDateTime::Feb
, 1940 }, 8, 4, 4, 54 },
3955 { { 2, wxDateTime::Jan
, 1987 }, 1, 1, 1, 2 },
3956 { { 11, wxDateTime::Aug
, 2079 }, 32, 2, 2, 223 },
3957 { { 2, wxDateTime::Feb
, 2063 }, 5, 1, 1, 33 },
3958 { { 16, wxDateTime::Oct
, 1942 }, 42, 3, 3, 289 },
3961 for ( size_t n
= 0; n
< WXSIZEOF(weekNumberTestDates
); n
++ )
3963 const WeekNumberTestData
& wn
= weekNumberTestDates
[n
];
3964 const Date
& d
= wn
.date
;
3966 wxDateTime dt
= d
.DT();
3968 wxDateTime::wxDateTime_t
3969 week
= dt
.GetWeekOfYear(wxDateTime::Monday_First
),
3970 wmon
= dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
3971 wmon2
= dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
3972 dnum
= dt
.GetDayOfYear();
3974 printf("%s: the day number is %d",
3975 d
.FormatDate().c_str(), dnum
);
3976 if ( dnum
== wn
.dnum
)
3982 printf(" (ERROR: should be %d)", wn
.dnum
);
3985 printf(", week in month is %d", wmon
);
3986 if ( wmon
== wn
.wmon
)
3992 printf(" (ERROR: should be %d)", wn
.wmon
);
3995 printf(" or %d", wmon2
);
3996 if ( wmon2
== wn
.wmon2
)
4002 printf(" (ERROR: should be %d)", wn
.wmon2
);
4005 printf(", week in year is %d", week
);
4006 if ( week
== wn
.week
)
4012 printf(" (ERROR: should be %d)\n", wn
.week
);
4017 // test DST calculations
4018 static void TestTimeDST()
4020 puts("\n*** wxDateTime DST test ***");
4022 printf("DST is%s in effect now.\n\n",
4023 wxDateTime::Now().IsDST() ? "" : " not");
4025 // taken from http://www.energy.ca.gov/daylightsaving.html
4026 static const Date datesDST
[2][2004 - 1900 + 1] =
4029 { 1, wxDateTime::Apr
, 1990 },
4030 { 7, wxDateTime::Apr
, 1991 },
4031 { 5, wxDateTime::Apr
, 1992 },
4032 { 4, wxDateTime::Apr
, 1993 },
4033 { 3, wxDateTime::Apr
, 1994 },
4034 { 2, wxDateTime::Apr
, 1995 },
4035 { 7, wxDateTime::Apr
, 1996 },
4036 { 6, wxDateTime::Apr
, 1997 },
4037 { 5, wxDateTime::Apr
, 1998 },
4038 { 4, wxDateTime::Apr
, 1999 },
4039 { 2, wxDateTime::Apr
, 2000 },
4040 { 1, wxDateTime::Apr
, 2001 },
4041 { 7, wxDateTime::Apr
, 2002 },
4042 { 6, wxDateTime::Apr
, 2003 },
4043 { 4, wxDateTime::Apr
, 2004 },
4046 { 28, wxDateTime::Oct
, 1990 },
4047 { 27, wxDateTime::Oct
, 1991 },
4048 { 25, wxDateTime::Oct
, 1992 },
4049 { 31, wxDateTime::Oct
, 1993 },
4050 { 30, wxDateTime::Oct
, 1994 },
4051 { 29, wxDateTime::Oct
, 1995 },
4052 { 27, wxDateTime::Oct
, 1996 },
4053 { 26, wxDateTime::Oct
, 1997 },
4054 { 25, wxDateTime::Oct
, 1998 },
4055 { 31, wxDateTime::Oct
, 1999 },
4056 { 29, wxDateTime::Oct
, 2000 },
4057 { 28, wxDateTime::Oct
, 2001 },
4058 { 27, wxDateTime::Oct
, 2002 },
4059 { 26, wxDateTime::Oct
, 2003 },
4060 { 31, wxDateTime::Oct
, 2004 },
4065 for ( year
= 1990; year
< 2005; year
++ )
4067 wxDateTime dtBegin
= wxDateTime::GetBeginDST(year
, wxDateTime::USA
),
4068 dtEnd
= wxDateTime::GetEndDST(year
, wxDateTime::USA
);
4070 printf("DST period in the US for year %d: from %s to %s",
4071 year
, dtBegin
.Format().c_str(), dtEnd
.Format().c_str());
4073 size_t n
= year
- 1990;
4074 const Date
& dBegin
= datesDST
[0][n
];
4075 const Date
& dEnd
= datesDST
[1][n
];
4077 if ( dBegin
.SameDay(dtBegin
.GetTm()) && dEnd
.SameDay(dtEnd
.GetTm()) )
4083 printf(" (ERROR: should be %s %d to %s %d)\n",
4084 wxDateTime::GetMonthName(dBegin
.month
).c_str(), dBegin
.day
,
4085 wxDateTime::GetMonthName(dEnd
.month
).c_str(), dEnd
.day
);
4091 for ( year
= 1990; year
< 2005; year
++ )
4093 printf("DST period in Europe for year %d: from %s to %s\n",
4095 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
4096 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
4100 // test wxDateTime -> text conversion
4101 static void TestTimeFormat()
4103 puts("\n*** wxDateTime formatting test ***");
4105 // some information may be lost during conversion, so store what kind
4106 // of info should we recover after a round trip
4109 CompareNone
, // don't try comparing
4110 CompareBoth
, // dates and times should be identical
4111 CompareDate
, // dates only
4112 CompareTime
// time only
4117 CompareKind compareKind
;
4119 } formatTestFormats
[] =
4121 { CompareBoth
, "---> %c" },
4122 { CompareDate
, "Date is %A, %d of %B, in year %Y" },
4123 { CompareBoth
, "Date is %x, time is %X" },
4124 { CompareTime
, "Time is %H:%M:%S or %I:%M:%S %p" },
4125 { CompareNone
, "The day of year: %j, the week of year: %W" },
4126 { CompareDate
, "ISO date without separators: %4Y%2m%2d" },
4129 static const Date formatTestDates
[] =
4131 { 29, wxDateTime::May
, 1976, 18, 30, 00 },
4132 { 31, wxDateTime::Dec
, 1999, 23, 30, 00 },
4134 // this test can't work for other centuries because it uses two digit
4135 // years in formats, so don't even try it
4136 { 29, wxDateTime::May
, 2076, 18, 30, 00 },
4137 { 29, wxDateTime::Feb
, 2400, 02, 15, 25 },
4138 { 01, wxDateTime::Jan
, -52, 03, 16, 47 },
4142 // an extra test (as it doesn't depend on date, don't do it in the loop)
4143 printf("%s\n", wxDateTime::Now().Format("Our timezone is %Z").c_str());
4145 for ( size_t d
= 0; d
< WXSIZEOF(formatTestDates
) + 1; d
++ )
4149 wxDateTime dt
= d
== 0 ? wxDateTime::Now() : formatTestDates
[d
- 1].DT();
4150 for ( size_t n
= 0; n
< WXSIZEOF(formatTestFormats
); n
++ )
4152 wxString s
= dt
.Format(formatTestFormats
[n
].format
);
4153 printf("%s", s
.c_str());
4155 // what can we recover?
4156 int kind
= formatTestFormats
[n
].compareKind
;
4160 const wxChar
*result
= dt2
.ParseFormat(s
, formatTestFormats
[n
].format
);
4163 // converion failed - should it have?
4164 if ( kind
== CompareNone
)
4167 puts(" (ERROR: conversion back failed)");
4171 // should have parsed the entire string
4172 puts(" (ERROR: conversion back stopped too soon)");
4176 bool equal
= FALSE
; // suppress compilaer warning
4184 equal
= dt
.IsSameDate(dt2
);
4188 equal
= dt
.IsSameTime(dt2
);
4194 printf(" (ERROR: got back '%s' instead of '%s')\n",
4195 dt2
.Format().c_str(), dt
.Format().c_str());
4206 // test text -> wxDateTime conversion
4207 static void TestTimeParse()
4209 puts("\n*** wxDateTime parse test ***");
4211 struct ParseTestData
4218 static const ParseTestData parseTestDates
[] =
4220 { "Sat, 18 Dec 1999 00:46:40 +0100", { 18, wxDateTime::Dec
, 1999, 00, 46, 40 }, TRUE
},
4221 { "Wed, 1 Dec 1999 05:17:20 +0300", { 1, wxDateTime::Dec
, 1999, 03, 17, 20 }, TRUE
},
4224 for ( size_t n
= 0; n
< WXSIZEOF(parseTestDates
); n
++ )
4226 const char *format
= parseTestDates
[n
].format
;
4228 printf("%s => ", format
);
4231 if ( dt
.ParseRfc822Date(format
) )
4233 printf("%s ", dt
.Format().c_str());
4235 if ( parseTestDates
[n
].good
)
4237 wxDateTime dtReal
= parseTestDates
[n
].date
.DT();
4244 printf("(ERROR: should be %s)\n", dtReal
.Format().c_str());
4249 puts("(ERROR: bad format)");
4254 printf("bad format (%s)\n",
4255 parseTestDates
[n
].good
? "ERROR" : "ok");
4260 static void TestDateTimeInteractive()
4262 puts("\n*** interactive wxDateTime tests ***");
4268 printf("Enter a date: ");
4269 if ( !fgets(buf
, WXSIZEOF(buf
), stdin
) )
4272 // kill the last '\n'
4273 buf
[strlen(buf
) - 1] = 0;
4276 const char *p
= dt
.ParseDate(buf
);
4279 printf("ERROR: failed to parse the date '%s'.\n", buf
);
4285 printf("WARNING: parsed only first %u characters.\n", p
- buf
);
4288 printf("%s: day %u, week of month %u/%u, week of year %u\n",
4289 dt
.Format("%b %d, %Y").c_str(),
4291 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4292 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4293 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
4296 puts("\n*** done ***");
4299 static void TestTimeMS()
4301 puts("*** testing millisecond-resolution support in wxDateTime ***");
4303 wxDateTime dt1
= wxDateTime::Now(),
4304 dt2
= wxDateTime::UNow();
4306 printf("Now = %s\n", dt1
.Format("%H:%M:%S:%l").c_str());
4307 printf("UNow = %s\n", dt2
.Format("%H:%M:%S:%l").c_str());
4308 printf("Dummy loop: ");
4309 for ( int i
= 0; i
< 6000; i
++ )
4311 //for ( int j = 0; j < 10; j++ )
4314 s
.Printf("%g", sqrt(i
));
4323 dt2
= wxDateTime::UNow();
4324 printf("UNow = %s\n", dt2
.Format("%H:%M:%S:%l").c_str());
4326 printf("Loop executed in %s ms\n", (dt2
- dt1
).Format("%l").c_str());
4328 puts("\n*** done ***");
4331 static void TestTimeArithmetics()
4333 puts("\n*** testing arithmetic operations on wxDateTime ***");
4335 static const struct ArithmData
4337 ArithmData(const wxDateSpan
& sp
, const char *nam
)
4338 : span(sp
), name(nam
) { }
4342 } testArithmData
[] =
4344 ArithmData(wxDateSpan::Day(), "day"),
4345 ArithmData(wxDateSpan::Week(), "week"),
4346 ArithmData(wxDateSpan::Month(), "month"),
4347 ArithmData(wxDateSpan::Year(), "year"),
4348 ArithmData(wxDateSpan(1, 2, 3, 4), "year, 2 months, 3 weeks, 4 days"),
4351 wxDateTime
dt(29, wxDateTime::Dec
, 1999), dt1
, dt2
;
4353 for ( size_t n
= 0; n
< WXSIZEOF(testArithmData
); n
++ )
4355 wxDateSpan span
= testArithmData
[n
].span
;
4359 const char *name
= testArithmData
[n
].name
;
4360 printf("%s + %s = %s, %s - %s = %s\n",
4361 dt
.FormatISODate().c_str(), name
, dt1
.FormatISODate().c_str(),
4362 dt
.FormatISODate().c_str(), name
, dt2
.FormatISODate().c_str());
4364 printf("Going back: %s", (dt1
- span
).FormatISODate().c_str());
4365 if ( dt1
- span
== dt
)
4371 printf(" (ERROR: should be %s)\n", dt
.FormatISODate().c_str());
4374 printf("Going forward: %s", (dt2
+ span
).FormatISODate().c_str());
4375 if ( dt2
+ span
== dt
)
4381 printf(" (ERROR: should be %s)\n", dt
.FormatISODate().c_str());
4384 printf("Double increment: %s", (dt2
+ 2*span
).FormatISODate().c_str());
4385 if ( dt2
+ 2*span
== dt1
)
4391 printf(" (ERROR: should be %s)\n", dt2
.FormatISODate().c_str());
4398 static void TestTimeHolidays()
4400 puts("\n*** testing wxDateTimeHolidayAuthority ***\n");
4402 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
4403 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
4404 dtEnd
= dtStart
.GetLastMonthDay();
4406 wxDateTimeArray hol
;
4407 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
4409 const wxChar
*format
= "%d-%b-%Y (%a)";
4411 printf("All holidays between %s and %s:\n",
4412 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
4414 size_t count
= hol
.GetCount();
4415 for ( size_t n
= 0; n
< count
; n
++ )
4417 printf("\t%s\n", hol
[n
].Format(format
).c_str());
4423 static void TestTimeZoneBug()
4425 puts("\n*** testing for DST/timezone bug ***\n");
4427 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
4428 for ( int i
= 0; i
< 31; i
++ )
4430 printf("Date %s: week day %s.\n",
4431 date
.Format(_T("%d-%m-%Y")).c_str(),
4432 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
4434 date
+= wxDateSpan::Day();
4440 static void TestTimeSpanFormat()
4442 puts("\n*** wxTimeSpan tests ***");
4444 static const char *formats
[] =
4446 _T("(default) %H:%M:%S"),
4447 _T("%E weeks and %D days"),
4448 _T("%l milliseconds"),
4449 _T("(with ms) %H:%M:%S:%l"),
4450 _T("100%% of minutes is %M"), // test "%%"
4451 _T("%D days and %H hours"),
4452 _T("or also %S seconds"),
4455 wxTimeSpan
ts1(1, 2, 3, 4),
4457 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
4459 printf("ts1 = %s\tts2 = %s\n",
4460 ts1
.Format(formats
[n
]).c_str(),
4461 ts2
.Format(formats
[n
]).c_str());
4469 // test compatibility with the old wxDate/wxTime classes
4470 static void TestTimeCompatibility()
4472 puts("\n*** wxDateTime compatibility test ***");
4474 printf("wxDate for JDN 0: %s\n", wxDate(0l).FormatDate().c_str());
4475 printf("wxDate for MJD 0: %s\n", wxDate(2400000).FormatDate().c_str());
4477 double jdnNow
= wxDateTime::Now().GetJDN();
4478 long jdnMidnight
= (long)(jdnNow
- 0.5);
4479 printf("wxDate for today: %s\n", wxDate(jdnMidnight
).FormatDate().c_str());
4481 jdnMidnight
= wxDate().Set().GetJulianDate();
4482 printf("wxDateTime for today: %s\n",
4483 wxDateTime((double)(jdnMidnight
+ 0.5)).Format("%c", wxDateTime::GMT0
).c_str());
4485 int flags
= wxEUROPEAN
;//wxFULL;
4488 printf("Today is %s\n", date
.FormatDate(flags
).c_str());
4489 for ( int n
= 0; n
< 7; n
++ )
4491 printf("Previous %s is %s\n",
4492 wxDateTime::GetWeekDayName((wxDateTime::WeekDay
)n
),
4493 date
.Previous(n
+ 1).FormatDate(flags
).c_str());
4499 #endif // TEST_DATETIME
4501 // ----------------------------------------------------------------------------
4503 // ----------------------------------------------------------------------------
4507 #include "wx/thread.h"
4509 static size_t gs_counter
= (size_t)-1;
4510 static wxCriticalSection gs_critsect
;
4511 static wxCondition gs_cond
;
4513 class MyJoinableThread
: public wxThread
4516 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
4517 { m_n
= n
; Create(); }
4519 // thread execution starts here
4520 virtual ExitCode
Entry();
4526 wxThread::ExitCode
MyJoinableThread::Entry()
4528 unsigned long res
= 1;
4529 for ( size_t n
= 1; n
< m_n
; n
++ )
4533 // it's a loooong calculation :-)
4537 return (ExitCode
)res
;
4540 class MyDetachedThread
: public wxThread
4543 MyDetachedThread(size_t n
, char ch
)
4547 m_cancelled
= FALSE
;
4552 // thread execution starts here
4553 virtual ExitCode
Entry();
4556 virtual void OnExit();
4559 size_t m_n
; // number of characters to write
4560 char m_ch
; // character to write
4562 bool m_cancelled
; // FALSE if we exit normally
4565 wxThread::ExitCode
MyDetachedThread::Entry()
4568 wxCriticalSectionLocker
lock(gs_critsect
);
4569 if ( gs_counter
== (size_t)-1 )
4575 for ( size_t n
= 0; n
< m_n
; n
++ )
4577 if ( TestDestroy() )
4587 wxThread::Sleep(100);
4593 void MyDetachedThread::OnExit()
4595 wxLogTrace("thread", "Thread %ld is in OnExit", GetId());
4597 wxCriticalSectionLocker
lock(gs_critsect
);
4598 if ( !--gs_counter
&& !m_cancelled
)
4602 void TestDetachedThreads()
4604 puts("\n*** Testing detached threads ***");
4606 static const size_t nThreads
= 3;
4607 MyDetachedThread
*threads
[nThreads
];
4609 for ( n
= 0; n
< nThreads
; n
++ )
4611 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
4614 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
4615 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
4617 for ( n
= 0; n
< nThreads
; n
++ )
4622 // wait until all threads terminate
4628 void TestJoinableThreads()
4630 puts("\n*** Testing a joinable thread (a loooong calculation...) ***");
4632 // calc 10! in the background
4633 MyJoinableThread
thread(10);
4636 printf("\nThread terminated with exit code %lu.\n",
4637 (unsigned long)thread
.Wait());
4640 void TestThreadSuspend()
4642 puts("\n*** Testing thread suspend/resume functions ***");
4644 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
4648 // this is for this demo only, in a real life program we'd use another
4649 // condition variable which would be signaled from wxThread::Entry() to
4650 // tell us that the thread really started running - but here just wait a
4651 // bit and hope that it will be enough (the problem is, of course, that
4652 // the thread might still not run when we call Pause() which will result
4654 wxThread::Sleep(300);
4656 for ( size_t n
= 0; n
< 3; n
++ )
4660 puts("\nThread suspended");
4663 // don't sleep but resume immediately the first time
4664 wxThread::Sleep(300);
4666 puts("Going to resume the thread");
4671 puts("Waiting until it terminates now");
4673 // wait until the thread terminates
4679 void TestThreadDelete()
4681 // As above, using Sleep() is only for testing here - we must use some
4682 // synchronisation object instead to ensure that the thread is still
4683 // running when we delete it - deleting a detached thread which already
4684 // terminated will lead to a crash!
4686 puts("\n*** Testing thread delete function ***");
4688 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
4692 puts("\nDeleted a thread which didn't start to run yet.");
4694 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
4698 wxThread::Sleep(300);
4702 puts("\nDeleted a running thread.");
4704 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
4708 wxThread::Sleep(300);
4714 puts("\nDeleted a sleeping thread.");
4716 MyJoinableThread
thread3(20);
4721 puts("\nDeleted a joinable thread.");
4723 MyJoinableThread
thread4(2);
4726 wxThread::Sleep(300);
4730 puts("\nDeleted a joinable thread which already terminated.");
4735 #endif // TEST_THREADS
4737 // ----------------------------------------------------------------------------
4739 // ----------------------------------------------------------------------------
4743 static void PrintArray(const char* name
, const wxArrayString
& array
)
4745 printf("Dump of the array '%s'\n", name
);
4747 size_t nCount
= array
.GetCount();
4748 for ( size_t n
= 0; n
< nCount
; n
++ )
4750 printf("\t%s[%u] = '%s'\n", name
, n
, array
[n
].c_str());
4754 static void PrintArray(const char* name
, const wxArrayInt
& array
)
4756 printf("Dump of the array '%s'\n", name
);
4758 size_t nCount
= array
.GetCount();
4759 for ( size_t n
= 0; n
< nCount
; n
++ )
4761 printf("\t%s[%u] = %d\n", name
, n
, array
[n
]);
4765 int wxCMPFUNC_CONV
StringLenCompare(const wxString
& first
,
4766 const wxString
& second
)
4768 return first
.length() - second
.length();
4771 int wxCMPFUNC_CONV
IntCompare(int *first
,
4774 return *first
- *second
;
4777 int wxCMPFUNC_CONV
IntRevCompare(int *first
,
4780 return *second
- *first
;
4783 static void TestArrayOfInts()
4785 puts("*** Testing wxArrayInt ***\n");
4796 puts("After sort:");
4800 puts("After reverse sort:");
4801 a
.Sort(IntRevCompare
);
4805 #include "wx/dynarray.h"
4807 WX_DECLARE_OBJARRAY(Bar
, ArrayBars
);
4808 #include "wx/arrimpl.cpp"
4809 WX_DEFINE_OBJARRAY(ArrayBars
);
4811 static void TestArrayOfObjects()
4813 puts("*** Testing wxObjArray ***\n");
4817 Bar
bar("second bar");
4819 printf("Initially: %u objects in the array, %u objects total.\n",
4820 bars
.GetCount(), Bar::GetNumber());
4822 bars
.Add(new Bar("first bar"));
4825 printf("Now: %u objects in the array, %u objects total.\n",
4826 bars
.GetCount(), Bar::GetNumber());
4830 printf("After Empty(): %u objects in the array, %u objects total.\n",
4831 bars
.GetCount(), Bar::GetNumber());
4834 printf("Finally: no more objects in the array, %u objects total.\n",
4838 #endif // TEST_ARRAYS
4840 // ----------------------------------------------------------------------------
4842 // ----------------------------------------------------------------------------
4846 #include "wx/timer.h"
4847 #include "wx/tokenzr.h"
4849 static void TestStringConstruction()
4851 puts("*** Testing wxString constructores ***");
4853 #define TEST_CTOR(args, res) \
4856 printf("wxString%s = %s ", #args, s.c_str()); \
4863 printf("(ERROR: should be %s)\n", res); \
4867 TEST_CTOR((_T('Z'), 4), _T("ZZZZ"));
4868 TEST_CTOR((_T("Hello"), 4), _T("Hell"));
4869 TEST_CTOR((_T("Hello"), 5), _T("Hello"));
4870 // TEST_CTOR((_T("Hello"), 6), _T("Hello")); -- should give assert failure
4872 static const wxChar
*s
= _T("?really!");
4873 const wxChar
*start
= wxStrchr(s
, _T('r'));
4874 const wxChar
*end
= wxStrchr(s
, _T('!'));
4875 TEST_CTOR((start
, end
), _T("really"));
4880 static void TestString()
4890 for (int i
= 0; i
< 1000000; ++i
)
4894 c
= "! How'ya doin'?";
4897 c
= "Hello world! What's up?";
4902 printf ("TestString elapsed time: %ld\n", sw
.Time());
4905 static void TestPChar()
4913 for (int i
= 0; i
< 1000000; ++i
)
4915 strcpy (a
, "Hello");
4916 strcpy (b
, " world");
4917 strcpy (c
, "! How'ya doin'?");
4920 strcpy (c
, "Hello world! What's up?");
4921 if (strcmp (c
, a
) == 0)
4925 printf ("TestPChar elapsed time: %ld\n", sw
.Time());
4928 static void TestStringSub()
4930 wxString
s("Hello, world!");
4932 puts("*** Testing wxString substring extraction ***");
4934 printf("String = '%s'\n", s
.c_str());
4935 printf("Left(5) = '%s'\n", s
.Left(5).c_str());
4936 printf("Right(6) = '%s'\n", s
.Right(6).c_str());
4937 printf("Mid(3, 5) = '%s'\n", s(3, 5).c_str());
4938 printf("Mid(3) = '%s'\n", s
.Mid(3).c_str());
4939 printf("substr(3, 5) = '%s'\n", s
.substr(3, 5).c_str());
4940 printf("substr(3) = '%s'\n", s
.substr(3).c_str());
4942 static const wxChar
*prefixes
[] =
4946 _T("Hello, world!"),
4947 _T("Hello, world!!!"),
4953 for ( size_t n
= 0; n
< WXSIZEOF(prefixes
); n
++ )
4955 wxString prefix
= prefixes
[n
], rest
;
4956 bool rc
= s
.StartsWith(prefix
, &rest
);
4957 printf("StartsWith('%s') = %s", prefix
.c_str(), rc
? "TRUE" : "FALSE");
4960 printf(" (the rest is '%s')\n", rest
.c_str());
4971 static void TestStringFormat()
4973 puts("*** Testing wxString formatting ***");
4976 s
.Printf("%03d", 18);
4978 printf("Number 18: %s\n", wxString::Format("%03d", 18).c_str());
4979 printf("Number 18: %s\n", s
.c_str());
4984 // returns "not found" for npos, value for all others
4985 static wxString
PosToString(size_t res
)
4987 wxString s
= res
== wxString::npos
? wxString(_T("not found"))
4988 : wxString::Format(_T("%u"), res
);
4992 static void TestStringFind()
4994 puts("*** Testing wxString find() functions ***");
4996 static const wxChar
*strToFind
= _T("ell");
4997 static const struct StringFindTest
5001 result
; // of searching "ell" in str
5004 { _T("Well, hello world"), 0, 1 },
5005 { _T("Well, hello world"), 6, 7 },
5006 { _T("Well, hello world"), 9, wxString::npos
},
5009 for ( size_t n
= 0; n
< WXSIZEOF(findTestData
); n
++ )
5011 const StringFindTest
& ft
= findTestData
[n
];
5012 size_t res
= wxString(ft
.str
).find(strToFind
, ft
.start
);
5014 printf(_T("Index of '%s' in '%s' starting from %u is %s "),
5015 strToFind
, ft
.str
, ft
.start
, PosToString(res
).c_str());
5017 size_t resTrue
= ft
.result
;
5018 if ( res
== resTrue
)
5024 printf(_T("(ERROR: should be %s)\n"),
5025 PosToString(resTrue
).c_str());
5032 static void TestStringTokenizer()
5034 puts("*** Testing wxStringTokenizer ***");
5036 static const wxChar
*modeNames
[] =
5040 _T("return all empty"),
5045 static const struct StringTokenizerTest
5047 const wxChar
*str
; // string to tokenize
5048 const wxChar
*delims
; // delimiters to use
5049 size_t count
; // count of token
5050 wxStringTokenizerMode mode
; // how should we tokenize it
5051 } tokenizerTestData
[] =
5053 { _T(""), _T(" "), 0 },
5054 { _T("Hello, world"), _T(" "), 2 },
5055 { _T("Hello, world "), _T(" "), 2 },
5056 { _T("Hello, world"), _T(","), 2 },
5057 { _T("Hello, world!"), _T(",!"), 2 },
5058 { _T("Hello,, world!"), _T(",!"), 3 },
5059 { _T("Hello, world!"), _T(",!"), 3, wxTOKEN_RET_EMPTY_ALL
},
5060 { _T("username:password:uid:gid:gecos:home:shell"), _T(":"), 7 },
5061 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 4 },
5062 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 6, wxTOKEN_RET_EMPTY
},
5063 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 9, wxTOKEN_RET_EMPTY_ALL
},
5064 { _T("01/02/99"), _T("/-"), 3 },
5065 { _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS
},
5068 for ( size_t n
= 0; n
< WXSIZEOF(tokenizerTestData
); n
++ )
5070 const StringTokenizerTest
& tt
= tokenizerTestData
[n
];
5071 wxStringTokenizer
tkz(tt
.str
, tt
.delims
, tt
.mode
);
5073 size_t count
= tkz
.CountTokens();
5074 printf(_T("String '%s' has %u tokens delimited by '%s' (mode = %s) "),
5075 MakePrintable(tt
.str
).c_str(),
5077 MakePrintable(tt
.delims
).c_str(),
5078 modeNames
[tkz
.GetMode()]);
5079 if ( count
== tt
.count
)
5085 printf(_T("(ERROR: should be %u)\n"), tt
.count
);
5090 // if we emulate strtok(), check that we do it correctly
5091 wxChar
*buf
, *s
= NULL
, *last
;
5093 if ( tkz
.GetMode() == wxTOKEN_STRTOK
)
5095 buf
= new wxChar
[wxStrlen(tt
.str
) + 1];
5096 wxStrcpy(buf
, tt
.str
);
5098 s
= wxStrtok(buf
, tt
.delims
, &last
);
5105 // now show the tokens themselves
5107 while ( tkz
.HasMoreTokens() )
5109 wxString token
= tkz
.GetNextToken();
5111 printf(_T("\ttoken %u: '%s'"),
5113 MakePrintable(token
).c_str());
5123 printf(" (ERROR: should be %s)\n", s
);
5126 s
= wxStrtok(NULL
, tt
.delims
, &last
);
5130 // nothing to compare with
5135 if ( count2
!= count
)
5137 puts(_T("\tERROR: token count mismatch"));
5146 static void TestStringReplace()
5148 puts("*** Testing wxString::replace ***");
5150 static const struct StringReplaceTestData
5152 const wxChar
*original
; // original test string
5153 size_t start
, len
; // the part to replace
5154 const wxChar
*replacement
; // the replacement string
5155 const wxChar
*result
; // and the expected result
5156 } stringReplaceTestData
[] =
5158 { _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") },
5159 { _T("increase"), 0, 2, _T("de"), _T("decrease") },
5160 { _T("wxWindow"), 8, 0, _T("s"), _T("wxWindows") },
5161 { _T("foobar"), 3, 0, _T("-"), _T("foo-bar") },
5162 { _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") },
5165 for ( size_t n
= 0; n
< WXSIZEOF(stringReplaceTestData
); n
++ )
5167 const StringReplaceTestData data
= stringReplaceTestData
[n
];
5169 wxString original
= data
.original
;
5170 original
.replace(data
.start
, data
.len
, data
.replacement
);
5172 wxPrintf(_T("wxString(\"%s\").replace(%u, %u, %s) = %s "),
5173 data
.original
, data
.start
, data
.len
, data
.replacement
,
5176 if ( original
== data
.result
)
5182 wxPrintf(_T("(ERROR: should be '%s')\n"), data
.result
);
5189 static void TestStringMatch()
5191 wxPuts(_T("*** Testing wxString::Matches() ***"));
5193 static const struct StringMatchTestData
5196 const wxChar
*wildcard
;
5198 } stringMatchTestData
[] =
5200 { _T("foobar"), _T("foo*"), 1 },
5201 { _T("foobar"), _T("*oo*"), 1 },
5202 { _T("foobar"), _T("*bar"), 1 },
5203 { _T("foobar"), _T("??????"), 1 },
5204 { _T("foobar"), _T("f??b*"), 1 },
5205 { _T("foobar"), _T("f?b*"), 0 },
5206 { _T("foobar"), _T("*goo*"), 0 },
5207 { _T("foobar"), _T("*foo"), 0 },
5208 { _T("foobarfoo"), _T("*foo"), 1 },
5209 { _T(""), _T("*"), 1 },
5210 { _T(""), _T("?"), 0 },
5213 for ( size_t n
= 0; n
< WXSIZEOF(stringMatchTestData
); n
++ )
5215 const StringMatchTestData
& data
= stringMatchTestData
[n
];
5216 bool matches
= wxString(data
.text
).Matches(data
.wildcard
);
5217 wxPrintf(_T("'%s' %s '%s' (%s)\n"),
5219 matches
? _T("matches") : _T("doesn't match"),
5221 matches
== data
.matches
? _T("ok") : _T("ERROR"));
5227 #endif // TEST_STRINGS
5229 // ----------------------------------------------------------------------------
5231 // ----------------------------------------------------------------------------
5233 #ifdef TEST_SNGLINST
5234 #include "wx/snglinst.h"
5235 #endif // TEST_SNGLINST
5237 int main(int argc
, char **argv
)
5239 wxInitializer initializer
;
5242 fprintf(stderr
, "Failed to initialize the wxWindows library, aborting.");
5247 #ifdef TEST_SNGLINST
5248 wxSingleInstanceChecker checker
;
5249 if ( checker
.Create(_T(".wxconsole.lock")) )
5251 if ( checker
.IsAnotherRunning() )
5253 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
5258 // wait some time to give time to launch another instance
5259 wxPrintf(_T("Press \"Enter\" to continue..."));
5262 else // failed to create
5264 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
5266 #endif // TEST_SNGLINST
5270 #endif // TEST_CHARSET
5273 TestCmdLineConvert();
5275 #if wxUSE_CMDLINE_PARSER
5276 static const wxCmdLineEntryDesc cmdLineDesc
[] =
5278 { wxCMD_LINE_SWITCH
, _T("h"), _T("help"), "show this help message",
5279 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
5280 { wxCMD_LINE_SWITCH
, "v", "verbose", "be verbose" },
5281 { wxCMD_LINE_SWITCH
, "q", "quiet", "be quiet" },
5283 { wxCMD_LINE_OPTION
, "o", "output", "output file" },
5284 { wxCMD_LINE_OPTION
, "i", "input", "input dir" },
5285 { wxCMD_LINE_OPTION
, "s", "size", "output block size",
5286 wxCMD_LINE_VAL_NUMBER
},
5287 { wxCMD_LINE_OPTION
, "d", "date", "output file date",
5288 wxCMD_LINE_VAL_DATE
},
5290 { wxCMD_LINE_PARAM
, NULL
, NULL
, "input file",
5291 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
5296 wxCmdLineParser
parser(cmdLineDesc
, argc
, argv
);
5298 parser
.AddOption("project_name", "", "full path to project file",
5299 wxCMD_LINE_VAL_STRING
,
5300 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
5302 switch ( parser
.Parse() )
5305 wxLogMessage("Help was given, terminating.");
5309 ShowCmdLine(parser
);
5313 wxLogMessage("Syntax error detected, aborting.");
5316 #endif // wxUSE_CMDLINE_PARSER
5318 #endif // TEST_CMDLINE
5326 TestStringConstruction();
5329 TestStringTokenizer();
5330 TestStringReplace();
5336 #endif // TEST_STRINGS
5349 puts("*** Initially:");
5351 PrintArray("a1", a1
);
5353 wxArrayString
a2(a1
);
5354 PrintArray("a2", a2
);
5356 wxSortedArrayString
a3(a1
);
5357 PrintArray("a3", a3
);
5359 puts("*** After deleting a string from a1");
5362 PrintArray("a1", a1
);
5363 PrintArray("a2", a2
);
5364 PrintArray("a3", a3
);
5366 puts("*** After reassigning a1 to a2 and a3");
5368 PrintArray("a2", a2
);
5369 PrintArray("a3", a3
);
5371 puts("*** After sorting a1");
5373 PrintArray("a1", a1
);
5375 puts("*** After sorting a1 in reverse order");
5377 PrintArray("a1", a1
);
5379 puts("*** After sorting a1 by the string length");
5380 a1
.Sort(StringLenCompare
);
5381 PrintArray("a1", a1
);
5383 TestArrayOfObjects();
5389 #endif // TEST_ARRAYS
5399 #ifdef TEST_DLLLOADER
5401 #endif // TEST_DLLLOADER
5405 #endif // TEST_ENVIRON
5409 #endif // TEST_EXECUTE
5411 #ifdef TEST_FILECONF
5413 #endif // TEST_FILECONF
5421 #endif // TEST_LOCALE
5425 for ( size_t n
= 0; n
< 8000; n
++ )
5427 s
<< (char)('A' + (n
% 26));
5431 msg
.Printf("A very very long message: '%s', the end!\n", s
.c_str());
5433 // this one shouldn't be truncated
5436 // but this one will because log functions use fixed size buffer
5437 // (note that it doesn't need '\n' at the end neither - will be added
5439 wxLogMessage("A very very long message 2: '%s', the end!", s
.c_str());
5451 #ifdef TEST_FILENAME
5455 fn
.Assign("c:\\foo", "bar.baz");
5462 TestFileNameConstruction();
5463 TestFileNameMakeRelative();
5464 TestFileNameSplit();
5467 TestFileNameComparison();
5468 TestFileNameOperations();
5470 #endif // TEST_FILENAME
5472 #ifdef TEST_FILETIME
5475 #endif // TEST_FILETIME
5478 wxLog::AddTraceMask(FTP_TRACE_MASK
);
5479 if ( TestFtpConnect() )
5490 if ( TEST_INTERACTIVE
)
5491 TestFtpInteractive();
5493 //else: connecting to the FTP server failed
5500 int nCPUs
= wxThread::GetCPUCount();
5501 printf("This system has %d CPUs\n", nCPUs
);
5503 wxThread::SetConcurrency(nCPUs
);
5505 if ( argc
> 1 && argv
[1][0] == 't' )
5506 wxLog::AddTraceMask("thread");
5509 TestDetachedThreads();
5511 TestJoinableThreads();
5513 TestThreadSuspend();
5517 #endif // TEST_THREADS
5519 #ifdef TEST_LONGLONG
5520 // seed pseudo random generator
5521 srand((unsigned)time(NULL
));
5530 TestMultiplication();
5533 TestLongLongConversion();
5534 TestBitOperations();
5535 TestLongLongComparison();
5536 TestLongLongPrint();
5538 #endif // TEST_LONGLONG
5546 #endif // TEST_HASHMAP
5549 wxLog::AddTraceMask(_T("mime"));
5557 TestMimeAssociate();
5560 #ifdef TEST_INFO_FUNCTIONS
5567 #endif // TEST_INFO_FUNCTIONS
5569 #ifdef TEST_PATHLIST
5571 #endif // TEST_PATHLIST
5575 #endif // TEST_REGCONF
5578 // TODO: write a real test using src/regex/tests file
5583 TestRegExSubmatch();
5584 TestRegExReplacement();
5586 if ( TEST_INTERACTIVE
)
5587 TestRegExInteractive();
5589 #endif // TEST_REGEX
5591 #ifdef TEST_REGISTRY
5593 TestRegistryAssociation();
5594 #endif // TEST_REGISTRY
5599 #endif // TEST_SOCKETS
5604 #endif // TEST_STREAMS
5608 #endif // TEST_TIMER
5610 #ifdef TEST_DATETIME
5623 TestTimeArithmetics();
5626 TestTimeSpanFormat();
5632 if ( TEST_INTERACTIVE
)
5633 TestDateTimeInteractive();
5634 #endif // TEST_DATETIME
5637 puts("Sleeping for 3 seconds... z-z-z-z-z...");
5639 #endif // TEST_USLEEP
5644 #endif // TEST_VCARD
5648 #endif // TEST_WCHAR
5651 TestZipStreamRead();
5652 TestZipFileSystem();
5656 TestZlibStreamWrite();
5657 TestZlibStreamRead();