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 // ----------------------------------------------------------------------------
24 #include "wx/string.h"
29 // without this pragma, the stupid compiler precompiles #defines below so that
30 // changing them doesn't "take place" later!
35 // ----------------------------------------------------------------------------
36 // conditional compilation
37 // ----------------------------------------------------------------------------
40 A note about all these conditional compilation macros: this file is used
41 both as a test suite for various non-GUI wxWindows classes and as a
42 scratchpad for quick tests. So there are two compilation modes: if you
43 define TEST_ALL all tests are run, otherwise you may enable the individual
44 tests individually in the "#else" branch below.
47 // what to test (in alphabetic order)? uncomment the line below to do all tests
55 #define TEST_DLLLOADER
66 #define TEST_INFO_FUNCTIONS
78 #define TEST_SCOPEGUARD
83 #define TEST_TEXTSTREAM
87 // #define TEST_VCARD -- don't enable this (VZ)
94 static const bool TEST_ALL
= true;
98 static const bool TEST_ALL
= false;
101 // some tests are interactive, define this to run them
102 #ifdef TEST_INTERACTIVE
103 #undef TEST_INTERACTIVE
105 static const bool TEST_INTERACTIVE
= true;
107 static const bool TEST_INTERACTIVE
= false;
110 // ----------------------------------------------------------------------------
111 // test class for container objects
112 // ----------------------------------------------------------------------------
114 #if defined(TEST_ARRAYS) || defined(TEST_LIST)
116 class Bar
// Foo is already taken in the hash test
119 Bar(const wxString
& name
) : m_name(name
) { ms_bars
++; }
120 Bar(const Bar
& bar
) : m_name(bar
.m_name
) { ms_bars
++; }
121 ~Bar() { ms_bars
--; }
123 static size_t GetNumber() { return ms_bars
; }
125 const wxChar
*GetName() const { return m_name
; }
130 static size_t ms_bars
;
133 size_t Bar::ms_bars
= 0;
135 #endif // defined(TEST_ARRAYS) || defined(TEST_LIST)
137 // ============================================================================
139 // ============================================================================
141 // ----------------------------------------------------------------------------
143 // ----------------------------------------------------------------------------
145 #if defined(TEST_STRINGS) || defined(TEST_SOCKETS)
147 // replace TABs with \t and CRs with \n
148 static wxString
MakePrintable(const wxChar
*s
)
151 (void)str
.Replace(_T("\t"), _T("\\t"));
152 (void)str
.Replace(_T("\n"), _T("\\n"));
153 (void)str
.Replace(_T("\r"), _T("\\r"));
158 #endif // MakePrintable() is used
160 // ----------------------------------------------------------------------------
161 // wxFontMapper::CharsetToEncoding
162 // ----------------------------------------------------------------------------
166 #include "wx/fontmap.h"
168 static void TestCharset()
170 static const wxChar
*charsets
[] =
172 // some vali charsets
181 // and now some bogus ones
188 for ( size_t n
= 0; n
< WXSIZEOF(charsets
); n
++ )
190 wxFontEncoding enc
= wxFontMapper::Get()->CharsetToEncoding(charsets
[n
]);
191 wxPrintf(_T("Charset: %s\tEncoding: %s (%s)\n"),
193 wxFontMapper::Get()->GetEncodingName(enc
).c_str(),
194 wxFontMapper::Get()->GetEncodingDescription(enc
).c_str());
198 #endif // TEST_CHARSET
200 // ----------------------------------------------------------------------------
202 // ----------------------------------------------------------------------------
206 #include "wx/cmdline.h"
207 #include "wx/datetime.h"
209 #if wxUSE_CMDLINE_PARSER
211 static void ShowCmdLine(const wxCmdLineParser
& parser
)
213 wxString s
= _T("Input files: ");
215 size_t count
= parser
.GetParamCount();
216 for ( size_t param
= 0; param
< count
; param
++ )
218 s
<< parser
.GetParam(param
) << ' ';
222 << _T("Verbose:\t") << (parser
.Found(_T("v")) ? _T("yes") : _T("no")) << '\n'
223 << _T("Quiet:\t") << (parser
.Found(_T("q")) ? _T("yes") : _T("no")) << '\n';
228 if ( parser
.Found(_T("o"), &strVal
) )
229 s
<< _T("Output file:\t") << strVal
<< '\n';
230 if ( parser
.Found(_T("i"), &strVal
) )
231 s
<< _T("Input dir:\t") << strVal
<< '\n';
232 if ( parser
.Found(_T("s"), &lVal
) )
233 s
<< _T("Size:\t") << lVal
<< '\n';
234 if ( parser
.Found(_T("d"), &dt
) )
235 s
<< _T("Date:\t") << dt
.FormatISODate() << '\n';
236 if ( parser
.Found(_T("project_name"), &strVal
) )
237 s
<< _T("Project:\t") << strVal
<< '\n';
242 #endif // wxUSE_CMDLINE_PARSER
244 static void TestCmdLineConvert()
246 static const wxChar
*cmdlines
[] =
249 _T("-a \"-bstring 1\" -c\"string 2\" \"string 3\""),
250 _T("literal \\\" and \"\""),
253 for ( size_t n
= 0; n
< WXSIZEOF(cmdlines
); n
++ )
255 const wxChar
*cmdline
= cmdlines
[n
];
256 wxPrintf(_T("Parsing: %s\n"), cmdline
);
257 wxArrayString args
= wxCmdLineParser::ConvertStringToArgs(cmdline
);
259 size_t count
= args
.GetCount();
260 wxPrintf(_T("\targc = %u\n"), count
);
261 for ( size_t arg
= 0; arg
< count
; arg
++ )
263 wxPrintf(_T("\targv[%u] = %s\n"), arg
, args
[arg
].c_str());
268 #endif // TEST_CMDLINE
270 // ----------------------------------------------------------------------------
272 // ----------------------------------------------------------------------------
279 static const wxChar
*ROOTDIR
= _T("/");
280 static const wxChar
*TESTDIR
= _T("/usr/local/share");
281 #elif defined(__WXMSW__)
282 static const wxChar
*ROOTDIR
= _T("c:\\");
283 static const wxChar
*TESTDIR
= _T("d:\\");
285 #error "don't know where the root directory is"
288 static void TestDirEnumHelper(wxDir
& dir
,
289 int flags
= wxDIR_DEFAULT
,
290 const wxString
& filespec
= wxEmptyString
)
294 if ( !dir
.IsOpened() )
297 bool cont
= dir
.GetFirst(&filename
, filespec
, flags
);
300 wxPrintf(_T("\t%s\n"), filename
.c_str());
302 cont
= dir
.GetNext(&filename
);
308 static void TestDirEnum()
310 wxPuts(_T("*** Testing wxDir::GetFirst/GetNext ***"));
312 wxString cwd
= wxGetCwd();
313 if ( !wxDir::Exists(cwd
) )
315 wxPrintf(_T("ERROR: current directory '%s' doesn't exist?\n"), cwd
.c_str());
320 if ( !dir
.IsOpened() )
322 wxPrintf(_T("ERROR: failed to open current directory '%s'.\n"), cwd
.c_str());
326 wxPuts(_T("Enumerating everything in current directory:"));
327 TestDirEnumHelper(dir
);
329 wxPuts(_T("Enumerating really everything in current directory:"));
330 TestDirEnumHelper(dir
, wxDIR_DEFAULT
| wxDIR_DOTDOT
);
332 wxPuts(_T("Enumerating object files in current directory:"));
333 TestDirEnumHelper(dir
, wxDIR_DEFAULT
, _T("*.o*"));
335 wxPuts(_T("Enumerating directories in current directory:"));
336 TestDirEnumHelper(dir
, wxDIR_DIRS
);
338 wxPuts(_T("Enumerating files in current directory:"));
339 TestDirEnumHelper(dir
, wxDIR_FILES
);
341 wxPuts(_T("Enumerating files including hidden in current directory:"));
342 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
346 wxPuts(_T("Enumerating everything in root directory:"));
347 TestDirEnumHelper(dir
, wxDIR_DEFAULT
);
349 wxPuts(_T("Enumerating directories in root directory:"));
350 TestDirEnumHelper(dir
, wxDIR_DIRS
);
352 wxPuts(_T("Enumerating files in root directory:"));
353 TestDirEnumHelper(dir
, wxDIR_FILES
);
355 wxPuts(_T("Enumerating files including hidden in root directory:"));
356 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
358 wxPuts(_T("Enumerating files in non existing directory:"));
359 wxDir
dirNo(_T("nosuchdir"));
360 TestDirEnumHelper(dirNo
);
363 class DirPrintTraverser
: public wxDirTraverser
366 virtual wxDirTraverseResult
OnFile(const wxString
& filename
)
368 return wxDIR_CONTINUE
;
371 virtual wxDirTraverseResult
OnDir(const wxString
& dirname
)
373 wxString path
, name
, ext
;
374 wxSplitPath(dirname
, &path
, &name
, &ext
);
377 name
<< _T('.') << ext
;
380 for ( const wxChar
*p
= path
.c_str(); *p
; p
++ )
382 if ( wxIsPathSeparator(*p
) )
386 wxPrintf(_T("%s%s\n"), indent
.c_str(), name
.c_str());
388 return wxDIR_CONTINUE
;
392 static void TestDirTraverse()
394 wxPuts(_T("*** Testing wxDir::Traverse() ***"));
398 size_t n
= wxDir::GetAllFiles(TESTDIR
, &files
);
399 wxPrintf(_T("There are %u files under '%s'\n"), n
, TESTDIR
);
402 wxPrintf(_T("First one is '%s'\n"), files
[0u].c_str());
403 wxPrintf(_T(" last one is '%s'\n"), files
[n
- 1].c_str());
406 // enum again with custom traverser
407 wxPuts(_T("Now enumerating directories:"));
409 DirPrintTraverser traverser
;
410 dir
.Traverse(traverser
, _T(""), wxDIR_DIRS
| wxDIR_HIDDEN
);
413 static void TestDirExists()
415 wxPuts(_T("*** Testing wxDir::Exists() ***"));
417 static const wxChar
*dirnames
[] =
420 #if defined(__WXMSW__)
423 _T("\\\\share\\file"),
427 _T("c:\\autoexec.bat"),
428 #elif defined(__UNIX__)
437 for ( size_t n
= 0; n
< WXSIZEOF(dirnames
); n
++ )
439 wxPrintf(_T("%-40s: %s\n"),
441 wxDir::Exists(dirnames
[n
]) ? _T("exists")
442 : _T("doesn't exist"));
448 // ----------------------------------------------------------------------------
450 // ----------------------------------------------------------------------------
452 #ifdef TEST_DLLLOADER
454 #include "wx/dynlib.h"
456 static void TestDllLoad()
458 #if defined(__WXMSW__)
459 static const wxChar
*LIB_NAME
= _T("kernel32.dll");
460 static const wxChar
*FUNC_NAME
= _T("lstrlenA");
461 #elif defined(__UNIX__)
462 // weird: using just libc.so does *not* work!
463 static const wxChar
*LIB_NAME
= _T("/lib/libc-2.0.7.so");
464 static const wxChar
*FUNC_NAME
= _T("strlen");
466 #error "don't know how to test wxDllLoader on this platform"
469 wxPuts(_T("*** testing wxDllLoader ***\n"));
471 wxDynamicLibrary
lib(LIB_NAME
);
472 if ( !lib
.IsLoaded() )
474 wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME
);
478 typedef int (*wxStrlenType
)(const char *);
479 wxStrlenType pfnStrlen
= (wxStrlenType
)lib
.GetSymbol(FUNC_NAME
);
482 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
483 FUNC_NAME
, LIB_NAME
);
487 if ( pfnStrlen("foo") != 3 )
489 wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
493 wxPuts(_T("... ok"));
499 #endif // TEST_DLLLOADER
501 // ----------------------------------------------------------------------------
503 // ----------------------------------------------------------------------------
507 #include "wx/utils.h"
509 static wxString
MyGetEnv(const wxString
& var
)
512 if ( !wxGetEnv(var
, &val
) )
515 val
= wxString(_T('\'')) + val
+ _T('\'');
520 static void TestEnvironment()
522 const wxChar
*var
= _T("wxTestVar");
524 wxPuts(_T("*** testing environment access functions ***"));
526 wxPrintf(_T("Initially getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
527 wxSetEnv(var
, _T("value for wxTestVar"));
528 wxPrintf(_T("After wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
529 wxSetEnv(var
, _T("another value"));
530 wxPrintf(_T("After 2nd wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
532 wxPrintf(_T("After wxUnsetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
533 wxPrintf(_T("PATH = %s\n"), MyGetEnv(_T("PATH")).c_str());
536 #endif // TEST_ENVIRON
538 // ----------------------------------------------------------------------------
540 // ----------------------------------------------------------------------------
544 #include "wx/utils.h"
546 static void TestExecute()
548 wxPuts(_T("*** testing wxExecute ***"));
551 #define COMMAND "cat -n ../../Makefile" // "echo hi"
552 #define SHELL_COMMAND "echo hi from shell"
553 #define REDIRECT_COMMAND COMMAND // "date"
554 #elif defined(__WXMSW__)
555 #define COMMAND "command.com /c echo hi"
556 #define SHELL_COMMAND "echo hi"
557 #define REDIRECT_COMMAND COMMAND
559 #error "no command to exec"
562 wxPrintf(_T("Testing wxShell: "));
564 if ( wxShell(_T(SHELL_COMMAND
)) )
567 wxPuts(_T("ERROR."));
569 wxPrintf(_T("Testing wxExecute: "));
571 if ( wxExecute(_T(COMMAND
), true /* sync */) == 0 )
574 wxPuts(_T("ERROR."));
576 #if 0 // no, it doesn't work (yet?)
577 wxPrintf(_T("Testing async wxExecute: "));
579 if ( wxExecute(COMMAND
) != 0 )
580 wxPuts(_T("Ok (command launched)."));
582 wxPuts(_T("ERROR."));
585 wxPrintf(_T("Testing wxExecute with redirection:\n"));
586 wxArrayString output
;
587 if ( wxExecute(_T(REDIRECT_COMMAND
), output
) != 0 )
589 wxPuts(_T("ERROR."));
593 size_t count
= output
.GetCount();
594 for ( size_t n
= 0; n
< count
; n
++ )
596 wxPrintf(_T("\t%s\n"), output
[n
].c_str());
603 #endif // TEST_EXECUTE
605 // ----------------------------------------------------------------------------
607 // ----------------------------------------------------------------------------
612 #include "wx/ffile.h"
613 #include "wx/textfile.h"
615 static void TestFileRead()
617 wxPuts(_T("*** wxFile read test ***"));
619 wxFile
file(_T("testdata.fc"));
620 if ( file
.IsOpened() )
622 wxPrintf(_T("File length: %lu\n"), file
.Length());
624 wxPuts(_T("File dump:\n----------"));
626 static const off_t len
= 1024;
630 off_t nRead
= file
.Read(buf
, len
);
631 if ( nRead
== wxInvalidOffset
)
633 wxPrintf(_T("Failed to read the file."));
637 fwrite(buf
, nRead
, 1, stdout
);
643 wxPuts(_T("----------"));
647 wxPrintf(_T("ERROR: can't open test file.\n"));
653 static void TestTextFileRead()
655 wxPuts(_T("*** wxTextFile read test ***"));
657 wxTextFile
file(_T("testdata.fc"));
660 wxPrintf(_T("Number of lines: %u\n"), file
.GetLineCount());
661 wxPrintf(_T("Last line: '%s'\n"), file
.GetLastLine().c_str());
665 wxPuts(_T("\nDumping the entire file:"));
666 for ( s
= file
.GetFirstLine(); !file
.Eof(); s
= file
.GetNextLine() )
668 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
670 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
672 wxPuts(_T("\nAnd now backwards:"));
673 for ( s
= file
.GetLastLine();
674 file
.GetCurrentLine() != 0;
675 s
= file
.GetPrevLine() )
677 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
679 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
683 wxPrintf(_T("ERROR: can't open '%s'\n"), file
.GetName());
689 static void TestFileCopy()
691 wxPuts(_T("*** Testing wxCopyFile ***"));
693 static const wxChar
*filename1
= _T("testdata.fc");
694 static const wxChar
*filename2
= _T("test2");
695 if ( !wxCopyFile(filename1
, filename2
) )
697 wxPuts(_T("ERROR: failed to copy file"));
701 wxFFile
f1(filename1
, _T("rb")),
702 f2(filename2
, _T("rb"));
704 if ( !f1
.IsOpened() || !f2
.IsOpened() )
706 wxPuts(_T("ERROR: failed to open file(s)"));
711 if ( !f1
.ReadAll(&s1
) || !f2
.ReadAll(&s2
) )
713 wxPuts(_T("ERROR: failed to read file(s)"));
717 if ( (s1
.length() != s2
.length()) ||
718 (memcmp(s1
.c_str(), s2
.c_str(), s1
.length()) != 0) )
720 wxPuts(_T("ERROR: copy error!"));
724 wxPuts(_T("File was copied ok."));
730 if ( !wxRemoveFile(filename2
) )
732 wxPuts(_T("ERROR: failed to remove the file"));
740 // ----------------------------------------------------------------------------
742 // ----------------------------------------------------------------------------
746 #include "wx/confbase.h"
747 #include "wx/fileconf.h"
749 static const struct FileConfTestData
751 const wxChar
*name
; // value name
752 const wxChar
*value
; // the value from the file
755 { _T("value1"), _T("one") },
756 { _T("value2"), _T("two") },
757 { _T("novalue"), _T("default") },
760 static void TestFileConfRead()
762 wxPuts(_T("*** testing wxFileConfig loading/reading ***"));
764 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
765 _T("testdata.fc"), wxEmptyString
,
766 wxCONFIG_USE_RELATIVE_PATH
);
768 // test simple reading
769 wxPuts(_T("\nReading config file:"));
770 wxString
defValue(_T("default")), value
;
771 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
773 const FileConfTestData
& data
= fcTestData
[n
];
774 value
= fileconf
.Read(data
.name
, defValue
);
775 wxPrintf(_T("\t%s = %s "), data
.name
, value
.c_str());
776 if ( value
== data
.value
)
782 wxPrintf(_T("(ERROR: should be %s)\n"), data
.value
);
786 // test enumerating the entries
787 wxPuts(_T("\nEnumerating all root entries:"));
790 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
793 wxPrintf(_T("\t%s = %s\n"),
795 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
797 cont
= fileconf
.GetNextEntry(name
, dummy
);
800 static const wxChar
*testEntry
= _T("TestEntry");
801 wxPrintf(_T("\nTesting deletion of newly created \"Test\" entry: "));
802 fileconf
.Write(testEntry
, _T("A value"));
803 fileconf
.DeleteEntry(testEntry
);
804 wxPrintf(fileconf
.HasEntry(testEntry
) ? _T("ERROR\n") : _T("ok\n"));
807 #endif // TEST_FILECONF
809 // ----------------------------------------------------------------------------
811 // ----------------------------------------------------------------------------
815 #include "wx/filename.h"
817 static void DumpFileName(const wxFileName
& fn
)
819 wxString full
= fn
.GetFullPath();
821 wxString vol
, path
, name
, ext
;
822 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
824 wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
825 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
827 wxFileName::SplitPath(full
, &path
, &name
, &ext
);
828 wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
829 path
.c_str(), name
.c_str(), ext
.c_str());
831 wxPrintf(_T("path is also:\t'%s'\n"), fn
.GetPath().c_str());
832 wxPrintf(_T("with volume: \t'%s'\n"),
833 fn
.GetPath(wxPATH_GET_VOLUME
).c_str());
834 wxPrintf(_T("with separator:\t'%s'\n"),
835 fn
.GetPath(wxPATH_GET_SEPARATOR
).c_str());
836 wxPrintf(_T("with both: \t'%s'\n"),
837 fn
.GetPath(wxPATH_GET_SEPARATOR
| wxPATH_GET_VOLUME
).c_str());
839 wxPuts(_T("The directories in the path are:"));
840 wxArrayString dirs
= fn
.GetDirs();
841 size_t count
= dirs
.GetCount();
842 for ( size_t n
= 0; n
< count
; n
++ )
844 wxPrintf(_T("\t%u: %s\n"), n
, dirs
[n
].c_str());
848 static struct FileNameInfo
850 const wxChar
*fullname
;
851 const wxChar
*volume
;
860 { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), true, wxPATH_UNIX
},
861 { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), true, wxPATH_UNIX
},
862 { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), true, wxPATH_UNIX
},
863 { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), false, wxPATH_UNIX
},
864 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), false, wxPATH_UNIX
},
865 { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), true, wxPATH_UNIX
},
866 { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), true, wxPATH_UNIX
},
867 { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), false, wxPATH_UNIX
},
868 { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), true, wxPATH_UNIX
},
870 // Windows file names
871 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), false, wxPATH_DOS
},
872 { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), false, wxPATH_DOS
},
873 { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), false, wxPATH_DOS
},
874 { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS
},
875 { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), true, wxPATH_DOS
},
876 { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS
},
877 { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), true, wxPATH_DOS
},
879 // wxFileName support for Mac file names is broken currently
882 { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), true, wxPATH_MAC
},
883 { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), true, wxPATH_MAC
},
884 { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), true, wxPATH_MAC
},
885 { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), false, wxPATH_MAC
},
886 { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC
},
887 { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC
},
891 { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), true, wxPATH_VMS
},
892 { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), false, wxPATH_VMS
},
895 static void TestFileNameConstruction()
897 wxPuts(_T("*** testing wxFileName construction ***"));
899 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
901 const FileNameInfo
& fni
= filenames
[n
];
903 wxFileName
fn(fni
.fullname
, fni
.format
);
905 wxString fullname
= fn
.GetFullPath(fni
.format
);
906 if ( fullname
!= fni
.fullname
)
908 wxPrintf(_T("ERROR: fullname should be '%s'\n"), fni
.fullname
);
911 bool isAbsolute
= fn
.IsAbsolute(fni
.format
);
912 wxPrintf(_T("'%s' is %s (%s)\n\t"),
914 isAbsolute
? "absolute" : "relative",
915 isAbsolute
== fni
.isAbsolute
? "ok" : "ERROR");
917 if ( !fn
.Normalize(wxPATH_NORM_ALL
, _T(""), fni
.format
) )
919 wxPuts(_T("ERROR (couldn't be normalized)"));
923 wxPrintf(_T("normalized: '%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
930 static void TestFileNameSplit()
932 wxPuts(_T("*** testing wxFileName splitting ***"));
934 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
936 const FileNameInfo
& fni
= filenames
[n
];
937 wxString volume
, path
, name
, ext
;
938 wxFileName::SplitPath(fni
.fullname
,
939 &volume
, &path
, &name
, &ext
, fni
.format
);
941 wxPrintf(_T("%s -> volume = '%s', path = '%s', name = '%s', ext = '%s'"),
943 volume
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
945 if ( volume
!= fni
.volume
)
946 wxPrintf(_T(" (ERROR: volume = '%s')"), fni
.volume
);
947 if ( path
!= fni
.path
)
948 wxPrintf(_T(" (ERROR: path = '%s')"), fni
.path
);
949 if ( name
!= fni
.name
)
950 wxPrintf(_T(" (ERROR: name = '%s')"), fni
.name
);
951 if ( ext
!= fni
.ext
)
952 wxPrintf(_T(" (ERROR: ext = '%s')"), fni
.ext
);
958 static void TestFileNameTemp()
960 wxPuts(_T("*** testing wxFileName temp file creation ***"));
962 static const wxChar
*tmpprefixes
[] =
970 _T("/tmp/foo/bar"), // this one must be an error
974 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
976 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
979 // "error" is not in upper case because it may be ok
980 wxPrintf(_T("Prefix '%s'\t-> error\n"), tmpprefixes
[n
]);
984 wxPrintf(_T("Prefix '%s'\t-> temp file '%s'\n"),
985 tmpprefixes
[n
], path
.c_str());
987 if ( !wxRemoveFile(path
) )
989 wxLogWarning(_T("Failed to remove temp file '%s'"),
996 static void TestFileNameMakeRelative()
998 wxPuts(_T("*** testing wxFileName::MakeRelativeTo() ***"));
1000 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1002 const FileNameInfo
& fni
= filenames
[n
];
1004 wxFileName
fn(fni
.fullname
, fni
.format
);
1006 // choose the base dir of the same format
1008 switch ( fni
.format
)
1011 base
= _T("/usr/bin/");
1020 // TODO: I don't know how this is supposed to work there
1023 case wxPATH_NATIVE
: // make gcc happy
1025 wxFAIL_MSG( _T("unexpected path format") );
1028 wxPrintf(_T("'%s' relative to '%s': "),
1029 fn
.GetFullPath(fni
.format
).c_str(), base
.c_str());
1031 if ( !fn
.MakeRelativeTo(base
, fni
.format
) )
1033 wxPuts(_T("unchanged"));
1037 wxPrintf(_T("'%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
1042 static void TestFileNameMakeAbsolute()
1044 wxPuts(_T("*** testing wxFileName::MakeAbsolute() ***"));
1046 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1048 const FileNameInfo
& fni
= filenames
[n
];
1049 wxFileName
fn(fni
.fullname
, fni
.format
);
1051 wxPrintf(_T("'%s' absolutized: "),
1052 fn
.GetFullPath(fni
.format
).c_str());
1054 wxPrintf(_T("'%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
1060 static void TestFileNameComparison()
1065 static void TestFileNameOperations()
1070 static void TestFileNameCwd()
1075 #endif // TEST_FILENAME
1077 // ----------------------------------------------------------------------------
1078 // wxFileName time functions
1079 // ----------------------------------------------------------------------------
1081 #ifdef TEST_FILETIME
1083 #include <wx/filename.h>
1084 #include <wx/datetime.h>
1086 static void TestFileGetTimes()
1088 wxFileName
fn(_T("testdata.fc"));
1090 wxDateTime dtAccess
, dtMod
, dtCreate
;
1091 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtCreate
) )
1093 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
1097 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
1099 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
1100 wxPrintf(_T("Creation: \t%s\n"), dtCreate
.Format(fmt
).c_str());
1101 wxPrintf(_T("Last read: \t%s\n"), dtAccess
.Format(fmt
).c_str());
1102 wxPrintf(_T("Last write: \t%s\n"), dtMod
.Format(fmt
).c_str());
1106 static void TestFileSetTimes()
1108 wxFileName
fn(_T("testdata.fc"));
1112 wxPrintf(_T("ERROR: Touch() failed.\n"));
1116 #endif // TEST_FILETIME
1118 // ----------------------------------------------------------------------------
1120 // ----------------------------------------------------------------------------
1124 #include "wx/hash.h"
1128 Foo(int n_
) { n
= n_
; count
++; }
1133 static size_t count
;
1136 size_t Foo::count
= 0;
1138 WX_DECLARE_LIST(Foo
, wxListFoos
);
1139 WX_DECLARE_HASH(Foo
, wxListFoos
, wxHashFoos
);
1141 #include "wx/listimpl.cpp"
1143 WX_DEFINE_LIST(wxListFoos
);
1145 static void TestHash()
1147 wxPuts(_T("*** Testing wxHashTable ***\n"));
1150 wxHashTable
hash(wxKEY_INTEGER
, 10), hash2(wxKEY_STRING
);
1154 for ( i
= 0; i
< 100; ++i
)
1155 hash
.Put(i
, &o
+ i
);
1158 wxHashTable::compatibility_iterator it
= hash
.Next();
1168 wxPuts(_T("Error in wxHashTable::compatibility_iterator\n"));
1170 for ( i
= 99; i
>= 0; --i
)
1171 if( hash
.Get(i
) != &o
+ i
)
1172 wxPuts(_T("Error in wxHashTable::Get/Put\n"));
1174 for ( i
= 0; i
< 100; ++i
)
1175 hash
.Put(i
, &o
+ i
+ 20);
1177 for ( i
= 99; i
>= 0; --i
)
1178 if( hash
.Get(i
) != &o
+ i
)
1179 wxPuts(_T("Error (2) in wxHashTable::Get/Put\n"));
1181 for ( i
= 0; i
< 50; ++i
)
1182 if( hash
.Delete(i
) != &o
+ i
)
1183 wxPuts(_T("Error in wxHashTable::Delete\n"));
1185 for ( i
= 50; i
< 100; ++i
)
1186 if( hash
.Get(i
) != &o
+ i
)
1187 wxPuts(_T("Error (3) in wxHashTable::Get/Put\n"));
1189 for ( i
= 0; i
< 50; ++i
)
1190 if( hash
.Get(i
) != &o
+ i
+ 20)
1191 wxPuts(_T("Error (4) in wxHashTable::Put/Delete\n"));
1193 for ( i
= 0; i
< 50; ++i
)
1194 if( hash
.Delete(i
) != &o
+ i
+ 20)
1195 wxPuts(_T("Error (2) in wxHashTable::Delete\n"));
1197 for ( i
= 0; i
< 50; ++i
)
1198 if( hash
.Get(i
) != NULL
)
1199 wxPuts(_T("Error (5) in wxHashTable::Put/Delete\n"));
1201 hash2
.Put(_T("foo"), &o
+ 1);
1202 hash2
.Put(_T("bar"), &o
+ 2);
1203 hash2
.Put(_T("baz"), &o
+ 3);
1205 if (hash2
.Get(_T("moo")) != NULL
)
1206 wxPuts(_T("Error in wxHashTable::Get\n"));
1208 if (hash2
.Get(_T("bar")) != &o
+ 2)
1209 wxPuts(_T("Error in wxHashTable::Get/Put\n"));
1211 hash2
.Put(_T("bar"), &o
+ 0);
1213 if (hash2
.Get(_T("bar")) != &o
+ 2)
1214 wxPuts(_T("Error (2) in wxHashTable::Get/Put\n"));
1219 hash
.DeleteContents(true);
1221 wxPrintf(_T("Hash created: %u foos in hash, %u foos totally\n"),
1222 hash
.GetCount(), Foo::count
);
1224 static const int hashTestData
[] =
1226 0, 1, 17, -2, 2, 4, -4, 345, 3, 3, 2, 1,
1230 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1232 hash
.Put(hashTestData
[n
], n
, new Foo(n
));
1235 wxPrintf(_T("Hash filled: %u foos in hash, %u foos totally\n"),
1236 hash
.GetCount(), Foo::count
);
1238 wxPuts(_T("Hash access test:"));
1239 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1241 wxPrintf(_T("\tGetting element with key %d, value %d: "),
1242 hashTestData
[n
], n
);
1243 Foo
*foo
= hash
.Get(hashTestData
[n
], n
);
1246 wxPrintf(_T("ERROR, not found.\n"));
1250 wxPrintf(_T("%d (%s)\n"), foo
->n
,
1251 (size_t)foo
->n
== n
? "ok" : "ERROR");
1255 wxPrintf(_T("\nTrying to get an element not in hash: "));
1257 if ( hash
.Get(1234) || hash
.Get(1, 0) )
1259 wxPuts(_T("ERROR: found!"));
1263 wxPuts(_T("ok (not found)"));
1268 wxPrintf(_T("Hash destroyed: %u foos left\n"), Foo::count
);
1269 wxPuts(_T("*** Testing wxHashTable finished ***\n"));
1274 // ----------------------------------------------------------------------------
1276 // ----------------------------------------------------------------------------
1280 #include "wx/hashmap.h"
1282 // test compilation of basic map types
1283 WX_DECLARE_HASH_MAP( int*, int*, wxPointerHash
, wxPointerEqual
, myPtrHashMap
);
1284 WX_DECLARE_HASH_MAP( long, long, wxIntegerHash
, wxIntegerEqual
, myLongHashMap
);
1285 WX_DECLARE_HASH_MAP( unsigned long, unsigned, wxIntegerHash
, wxIntegerEqual
,
1286 myUnsignedHashMap
);
1287 WX_DECLARE_HASH_MAP( unsigned int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1289 WX_DECLARE_HASH_MAP( int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1291 WX_DECLARE_HASH_MAP( short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1293 WX_DECLARE_HASH_MAP( unsigned short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1297 // WX_DECLARE_HASH_MAP( wxString, wxString, wxStringHash, wxStringEqual,
1298 // myStringHashMap );
1299 WX_DECLARE_STRING_HASH_MAP(wxString
, myStringHashMap
);
1301 typedef myStringHashMap::iterator Itor
;
1303 static void TestHashMap()
1305 wxPuts(_T("*** Testing wxHashMap ***\n"));
1306 myStringHashMap
sh(0); // as small as possible
1309 const size_t count
= 10000;
1311 // init with some data
1312 for( i
= 0; i
< count
; ++i
)
1314 buf
.Printf(wxT("%d"), i
);
1315 sh
[buf
] = wxT("A") + buf
+ wxT("C");
1318 // test that insertion worked
1319 if( sh
.size() != count
)
1321 wxPrintf(_T("*** ERROR: %u ELEMENTS, SHOULD BE %u ***\n"), sh
.size(), count
);
1324 for( i
= 0; i
< count
; ++i
)
1326 buf
.Printf(wxT("%d"), i
);
1327 if( sh
[buf
] != wxT("A") + buf
+ wxT("C") )
1329 wxPrintf(_T("*** ERROR INSERTION BROKEN! STOPPING NOW! ***\n"));
1334 // check that iterators work
1336 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1340 wxPrintf(_T("*** ERROR ITERATORS DO NOT TERMINATE! STOPPING NOW! ***\n"));
1344 if( it
->second
!= sh
[it
->first
] )
1346 wxPrintf(_T("*** ERROR ITERATORS BROKEN! STOPPING NOW! ***\n"));
1351 if( sh
.size() != i
)
1353 wxPrintf(_T("*** ERROR: %u ELEMENTS ITERATED, SHOULD BE %u ***\n"), i
, count
);
1356 // test copy ctor, assignment operator
1357 myStringHashMap
h1( sh
), h2( 0 );
1360 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1362 if( h1
[it
->first
] != it
->second
)
1364 wxPrintf(_T("*** ERROR: COPY CTOR BROKEN %s ***\n"), it
->first
.c_str());
1367 if( h2
[it
->first
] != it
->second
)
1369 wxPrintf(_T("*** ERROR: OPERATOR= BROKEN %s ***\n"), it
->first
.c_str());
1374 for( i
= 0; i
< count
; ++i
)
1376 buf
.Printf(wxT("%d"), i
);
1377 size_t sz
= sh
.size();
1379 // test find() and erase(it)
1382 it
= sh
.find( buf
);
1383 if( it
!= sh
.end() )
1387 if( sh
.find( buf
) != sh
.end() )
1389 wxPrintf(_T("*** ERROR: FOUND DELETED ELEMENT %u ***\n"), i
);
1393 wxPrintf(_T("*** ERROR: CANT FIND ELEMENT %u ***\n"), i
);
1398 size_t c
= sh
.erase( buf
);
1400 wxPrintf(_T("*** ERROR: SHOULD RETURN 1 ***\n"));
1402 if( sh
.find( buf
) != sh
.end() )
1404 wxPrintf(_T("*** ERROR: FOUND DELETED ELEMENT %u ***\n"), i
);
1408 // count should decrease
1409 if( sh
.size() != sz
- 1 )
1411 wxPrintf(_T("*** ERROR: COUNT DID NOT DECREASE ***\n"));
1415 wxPrintf(_T("*** Finished testing wxHashMap ***\n"));
1418 #endif // TEST_HASHMAP
1420 // ----------------------------------------------------------------------------
1422 // ----------------------------------------------------------------------------
1426 #include "wx/hashset.h"
1428 // test compilation of basic map types
1429 WX_DECLARE_HASH_SET( int*, wxPointerHash
, wxPointerEqual
, myPtrHashSet
);
1430 WX_DECLARE_HASH_SET( long, wxIntegerHash
, wxIntegerEqual
, myLongHashSet
);
1431 WX_DECLARE_HASH_SET( unsigned long, wxIntegerHash
, wxIntegerEqual
,
1432 myUnsignedHashSet
);
1433 WX_DECLARE_HASH_SET( unsigned int, wxIntegerHash
, wxIntegerEqual
,
1435 WX_DECLARE_HASH_SET( int, wxIntegerHash
, wxIntegerEqual
,
1437 WX_DECLARE_HASH_SET( short, wxIntegerHash
, wxIntegerEqual
,
1439 WX_DECLARE_HASH_SET( unsigned short, wxIntegerHash
, wxIntegerEqual
,
1441 WX_DECLARE_HASH_SET( wxString
, wxStringHash
, wxStringEqual
,
1453 unsigned long operator()(const MyStruct
& s
) const
1454 { return m_dummy(s
.ptr
); }
1455 MyHash
& operator=(const MyHash
&) { return *this; }
1457 wxPointerHash m_dummy
;
1463 bool operator()(const MyStruct
& s1
, const MyStruct
& s2
) const
1464 { return s1
.ptr
== s2
.ptr
; }
1465 MyEqual
& operator=(const MyEqual
&) { return *this; }
1468 WX_DECLARE_HASH_SET( MyStruct
, MyHash
, MyEqual
, mySet
);
1470 typedef myTestHashSet5 wxStringHashSet
;
1472 static void TestHashSet()
1474 wxPrintf(_T("*** Testing wxHashSet ***\n"));
1476 wxStringHashSet set1
;
1478 set1
.insert( _T("abc") );
1479 set1
.insert( _T("bbc") );
1480 set1
.insert( _T("cbc") );
1481 set1
.insert( _T("abc") );
1483 if( set1
.size() != 3 )
1484 wxPrintf(_T("*** ERROR IN INSERT ***\n"));
1490 tmp
.ptr
= &dummy
; tmp
.str
= _T("ABC");
1492 tmp
.ptr
= &dummy
+ 1;
1494 tmp
.ptr
= &dummy
; tmp
.str
= _T("CDE");
1497 if( set2
.size() != 2 )
1498 wxPrintf(_T("*** ERROR IN INSERT - 2 ***\n"));
1500 mySet::iterator it
= set2
.find( tmp
);
1502 if( it
== set2
.end() )
1503 wxPrintf(_T("*** ERROR IN FIND - 1 ***\n"));
1504 if( it
->ptr
!= &dummy
)
1505 wxPrintf(_T("*** ERROR IN FIND - 2 ***\n"));
1506 if( it
->str
!= _T("ABC") )
1507 wxPrintf(_T("*** ERROR IN INSERT - 3 ***\n"));
1509 wxPrintf(_T("*** Finished testing wxHashSet ***\n"));
1512 #endif // TEST_HASHSET
1514 // ----------------------------------------------------------------------------
1516 // ----------------------------------------------------------------------------
1520 #include "wx/list.h"
1522 WX_DECLARE_LIST(Bar
, wxListBars
);
1523 #include "wx/listimpl.cpp"
1524 WX_DEFINE_LIST(wxListBars
);
1526 WX_DECLARE_LIST(int, wxListInt
);
1527 WX_DEFINE_LIST(wxListInt
);
1529 static void TestList()
1531 wxPuts(_T("*** Testing wxList operations ***\n"));
1537 for ( i
= 0; i
< 5; ++i
)
1538 list1
.Append(dummy
+ i
);
1540 if ( list1
.GetCount() != 5 )
1541 wxPuts(_T("Wrong number of items in list\n"));
1543 if ( list1
.Item(3)->GetData() != dummy
+ 3 )
1544 wxPuts(_T("Error in Item()\n"));
1546 if ( !list1
.Find(dummy
+ 4) )
1547 wxPuts(_T("Error in Find()\n"));
1549 wxListInt::compatibility_iterator node
= list1
.GetFirst();
1554 if ( node
->GetData() != dummy
+ i
)
1555 wxPuts(_T("Error in compatibility_iterator\n"));
1556 node
= node
->GetNext();
1560 if ( size_t(i
) != list1
.GetCount() )
1561 wxPuts(_T("Error in compatibility_iterator\n"));
1563 list1
.Insert(dummy
+ 0);
1564 list1
.Insert(1, dummy
+ 1);
1565 list1
.Insert(list1
.GetFirst()->GetNext()->GetNext(), dummy
+ 2);
1567 node
= list1
.GetFirst();
1572 int* t
= node
->GetData();
1573 if ( t
!= dummy
+ i
)
1574 wxPuts(_T("Error in Insert\n"));
1575 node
= node
->GetNext();
1580 wxPuts(_T("*** Testing wxList operations finished ***\n"));
1582 wxPuts(_T("*** Testing std::list operations ***\n"));
1586 wxListInt::iterator it
, en
;
1587 wxListInt::reverse_iterator rit
, ren
;
1589 for ( i
= 0; i
< 5; ++i
)
1590 list1
.push_back(i
+ &i
);
1592 for ( it
= list1
.begin(), en
= list1
.end(), i
= 0;
1593 it
!= en
; ++it
, ++i
)
1594 if ( *it
!= i
+ &i
)
1595 wxPuts(_T("Error in iterator\n"));
1597 for ( rit
= list1
.rbegin(), ren
= list1
.rend(), i
= 4;
1598 rit
!= ren
; ++rit
, --i
)
1599 if ( *rit
!= i
+ &i
)
1600 wxPuts(_T("Error in reverse_iterator\n"));
1602 if ( *list1
.rbegin() != *--list1
.end() ||
1603 *list1
.begin() != *--list1
.rend() )
1604 wxPuts(_T("Error in iterator/reverse_iterator\n"));
1605 if ( *list1
.begin() != *--++list1
.begin() ||
1606 *list1
.rbegin() != *--++list1
.rbegin() )
1607 wxPuts(_T("Error in iterator/reverse_iterator\n"));
1609 if ( list1
.front() != &i
|| list1
.back() != &i
+ 4 )
1610 wxPuts(_T("Error in front()/back()\n"));
1612 list1
.erase(list1
.begin());
1613 list1
.erase(--list1
.end());
1615 for ( it
= list1
.begin(), en
= list1
.end(), i
= 1;
1616 it
!= en
; ++it
, ++i
)
1617 if ( *it
!= i
+ &i
)
1618 wxPuts(_T("Error in erase()\n"));
1621 wxPuts(_T("*** Testing std::list operations finished ***\n"));
1624 static void TestListCtor()
1626 wxPuts(_T("*** Testing wxList construction ***\n"));
1630 list1
.Append(new Bar(_T("first")));
1631 list1
.Append(new Bar(_T("second")));
1633 wxPrintf(_T("After 1st list creation: %u objects in the list, %u objects total.\n"),
1634 list1
.GetCount(), Bar::GetNumber());
1639 wxPrintf(_T("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n"),
1640 list1
.GetCount(), list2
.GetCount(), Bar::GetNumber());
1643 list1
.DeleteContents(true);
1645 WX_CLEAR_LIST(wxListBars
, list1
);
1649 wxPrintf(_T("After list destruction: %u objects left.\n"), Bar::GetNumber());
1654 // ----------------------------------------------------------------------------
1656 // ----------------------------------------------------------------------------
1660 #include "wx/intl.h"
1661 #include "wx/utils.h" // for wxSetEnv
1663 static wxLocale
gs_localeDefault(wxLANGUAGE_ENGLISH
);
1665 // find the name of the language from its value
1666 static const wxChar
*GetLangName(int lang
)
1668 static const wxChar
*languageNames
[] =
1678 _T("ARABIC_ALGERIA"),
1679 _T("ARABIC_BAHRAIN"),
1682 _T("ARABIC_JORDAN"),
1683 _T("ARABIC_KUWAIT"),
1684 _T("ARABIC_LEBANON"),
1686 _T("ARABIC_MOROCCO"),
1689 _T("ARABIC_SAUDI_ARABIA"),
1692 _T("ARABIC_TUNISIA"),
1699 _T("AZERI_CYRILLIC"),
1714 _T("CHINESE_SIMPLIFIED"),
1715 _T("CHINESE_TRADITIONAL"),
1716 _T("CHINESE_HONGKONG"),
1717 _T("CHINESE_MACAU"),
1718 _T("CHINESE_SINGAPORE"),
1719 _T("CHINESE_TAIWAN"),
1725 _T("DUTCH_BELGIAN"),
1729 _T("ENGLISH_AUSTRALIA"),
1730 _T("ENGLISH_BELIZE"),
1731 _T("ENGLISH_BOTSWANA"),
1732 _T("ENGLISH_CANADA"),
1733 _T("ENGLISH_CARIBBEAN"),
1734 _T("ENGLISH_DENMARK"),
1736 _T("ENGLISH_JAMAICA"),
1737 _T("ENGLISH_NEW_ZEALAND"),
1738 _T("ENGLISH_PHILIPPINES"),
1739 _T("ENGLISH_SOUTH_AFRICA"),
1740 _T("ENGLISH_TRINIDAD"),
1741 _T("ENGLISH_ZIMBABWE"),
1749 _T("FRENCH_BELGIAN"),
1750 _T("FRENCH_CANADIAN"),
1751 _T("FRENCH_LUXEMBOURG"),
1752 _T("FRENCH_MONACO"),
1758 _T("GERMAN_AUSTRIAN"),
1759 _T("GERMAN_BELGIUM"),
1760 _T("GERMAN_LIECHTENSTEIN"),
1761 _T("GERMAN_LUXEMBOURG"),
1779 _T("ITALIAN_SWISS"),
1784 _T("KASHMIRI_INDIA"),
1802 _T("MALAY_BRUNEI_DARUSSALAM"),
1803 _T("MALAY_MALAYSIA"),
1813 _T("NORWEGIAN_BOKMAL"),
1814 _T("NORWEGIAN_NYNORSK"),
1821 _T("PORTUGUESE_BRAZILIAN"),
1824 _T("RHAETO_ROMANCE"),
1827 _T("RUSSIAN_UKRAINE"),
1833 _T("SERBIAN_CYRILLIC"),
1834 _T("SERBIAN_LATIN"),
1835 _T("SERBO_CROATIAN"),
1846 _T("SPANISH_ARGENTINA"),
1847 _T("SPANISH_BOLIVIA"),
1848 _T("SPANISH_CHILE"),
1849 _T("SPANISH_COLOMBIA"),
1850 _T("SPANISH_COSTA_RICA"),
1851 _T("SPANISH_DOMINICAN_REPUBLIC"),
1852 _T("SPANISH_ECUADOR"),
1853 _T("SPANISH_EL_SALVADOR"),
1854 _T("SPANISH_GUATEMALA"),
1855 _T("SPANISH_HONDURAS"),
1856 _T("SPANISH_MEXICAN"),
1857 _T("SPANISH_MODERN"),
1858 _T("SPANISH_NICARAGUA"),
1859 _T("SPANISH_PANAMA"),
1860 _T("SPANISH_PARAGUAY"),
1862 _T("SPANISH_PUERTO_RICO"),
1863 _T("SPANISH_URUGUAY"),
1865 _T("SPANISH_VENEZUELA"),
1869 _T("SWEDISH_FINLAND"),
1887 _T("URDU_PAKISTAN"),
1889 _T("UZBEK_CYRILLIC"),
1902 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1903 return languageNames
[lang
];
1905 return _T("INVALID");
1908 static void TestDefaultLang()
1910 wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
1912 static const wxChar
*langStrings
[] =
1914 NULL
, // system default
1921 _T("de_DE.iso88591"),
1923 _T("?"), // invalid lang spec
1924 _T("klingonese"), // I bet on some systems it does exist...
1927 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1928 wxLocale::GetSystemEncodingName().c_str(),
1929 wxLocale::GetSystemEncoding());
1931 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1933 const wxChar
*langStr
= langStrings
[n
];
1936 // FIXME: this doesn't do anything at all under Windows, we need
1937 // to create a new wxLocale!
1938 wxSetEnv(_T("LC_ALL"), langStr
);
1941 int lang
= gs_localeDefault
.GetSystemLanguage();
1942 wxPrintf(_T("Locale for '%s' is %s.\n"),
1943 langStr
? langStr
: _T("system default"), GetLangName(lang
));
1947 #endif // TEST_LOCALE
1949 // ----------------------------------------------------------------------------
1951 // ----------------------------------------------------------------------------
1955 #include "wx/mimetype.h"
1957 static void TestMimeEnum()
1959 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1961 wxArrayString mimetypes
;
1963 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1965 wxPrintf(_T("*** All %u known filetypes: ***\n"), count
);
1970 for ( size_t n
= 0; n
< count
; n
++ )
1972 wxFileType
*filetype
=
1973 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1976 wxPrintf(_T("nothing known about the filetype '%s'!\n"),
1977 mimetypes
[n
].c_str());
1981 filetype
->GetDescription(&desc
);
1982 filetype
->GetExtensions(exts
);
1984 filetype
->GetIcon(NULL
);
1987 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1990 extsAll
<< _T(", ");
1994 wxPrintf(_T("\t%s: %s (%s)\n"),
1995 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
2001 static void TestMimeOverride()
2003 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
2005 static const wxChar
*mailcap
= _T("/tmp/mailcap");
2006 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
2008 if ( wxFile::Exists(mailcap
) )
2009 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
2011 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
2013 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
2016 if ( wxFile::Exists(mimetypes
) )
2017 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
2019 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
2021 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
2027 static void TestMimeFilename()
2029 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
2031 static const wxChar
*filenames
[] =
2039 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
2041 const wxString fname
= filenames
[n
];
2042 wxString ext
= fname
.AfterLast(_T('.'));
2043 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
2046 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
2051 if ( !ft
->GetDescription(&desc
) )
2052 desc
= _T("<no description>");
2055 if ( !ft
->GetOpenCommand(&cmd
,
2056 wxFileType::MessageParameters(fname
, _T(""))) )
2057 cmd
= _T("<no command available>");
2059 cmd
= wxString(_T('"')) + cmd
+ _T('"');
2061 wxPrintf(_T("To open %s (%s) do %s.\n"),
2062 fname
.c_str(), desc
.c_str(), cmd
.c_str());
2071 static void TestMimeAssociate()
2073 wxPuts(_T("*** Testing creation of filetype association ***\n"));
2075 wxFileTypeInfo
ftInfo(
2076 _T("application/x-xyz"),
2077 _T("xyzview '%s'"), // open cmd
2078 _T(""), // print cmd
2079 _T("XYZ File"), // description
2080 _T(".xyz"), // extensions
2081 NULL
// end of extensions
2083 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
2085 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
2088 wxPuts(_T("ERROR: failed to create association!"));
2092 // TODO: read it back
2101 // ----------------------------------------------------------------------------
2102 // misc information functions
2103 // ----------------------------------------------------------------------------
2105 #ifdef TEST_INFO_FUNCTIONS
2107 #include "wx/utils.h"
2109 static void TestDiskInfo()
2111 wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
2115 wxChar pathname
[128];
2116 wxPrintf(_T("\nEnter a directory name: "));
2117 if ( !wxFgets(pathname
, WXSIZEOF(pathname
), stdin
) )
2120 // kill the last '\n'
2121 pathname
[wxStrlen(pathname
) - 1] = 0;
2123 wxLongLong total
, free
;
2124 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
2126 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
2130 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
2131 (total
/ 1024).ToString().c_str(),
2132 (free
/ 1024).ToString().c_str(),
2138 static void TestOsInfo()
2140 wxPuts(_T("*** Testing OS info functions ***\n"));
2143 wxGetOsVersion(&major
, &minor
);
2144 wxPrintf(_T("Running under: %s, version %d.%d\n"),
2145 wxGetOsDescription().c_str(), major
, minor
);
2147 wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory());
2149 wxPrintf(_T("Host name is %s (%s).\n"),
2150 wxGetHostName().c_str(), wxGetFullHostName().c_str());
2155 static void TestUserInfo()
2157 wxPuts(_T("*** Testing user info functions ***\n"));
2159 wxPrintf(_T("User id is:\t%s\n"), wxGetUserId().c_str());
2160 wxPrintf(_T("User name is:\t%s\n"), wxGetUserName().c_str());
2161 wxPrintf(_T("Home dir is:\t%s\n"), wxGetHomeDir().c_str());
2162 wxPrintf(_T("Email address:\t%s\n"), wxGetEmailAddress().c_str());
2167 #endif // TEST_INFO_FUNCTIONS
2169 // ----------------------------------------------------------------------------
2171 // ----------------------------------------------------------------------------
2173 #ifdef TEST_LONGLONG
2175 #include "wx/longlong.h"
2176 #include "wx/timer.h"
2178 // make a 64 bit number from 4 16 bit ones
2179 #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3)
2181 // get a random 64 bit number
2182 #define RAND_LL() MAKE_LL(rand(), rand(), rand(), rand())
2184 static const long testLongs
[] =
2195 #if wxUSE_LONGLONG_WX
2196 inline bool operator==(const wxLongLongWx
& a
, const wxLongLongNative
& b
)
2197 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
2198 inline bool operator==(const wxLongLongNative
& a
, const wxLongLongWx
& b
)
2199 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
2200 #endif // wxUSE_LONGLONG_WX
2202 static void TestSpeed()
2204 static const long max
= 100000000;
2211 for ( n
= 0; n
< max
; n
++ )
2216 wxPrintf(_T("Summing longs took %ld milliseconds.\n"), sw
.Time());
2219 #if wxUSE_LONGLONG_NATIVE
2224 for ( n
= 0; n
< max
; n
++ )
2229 wxPrintf(_T("Summing wxLongLong_t took %ld milliseconds.\n"), sw
.Time());
2231 #endif // wxUSE_LONGLONG_NATIVE
2237 for ( n
= 0; n
< max
; n
++ )
2242 wxPrintf(_T("Summing wxLongLongs took %ld milliseconds.\n"), sw
.Time());
2246 static void TestLongLongConversion()
2248 wxPuts(_T("*** Testing wxLongLong conversions ***\n"));
2252 for ( size_t n
= 0; n
< 100000; n
++ )
2256 #if wxUSE_LONGLONG_NATIVE
2257 wxLongLongNative
b(a
.GetHi(), a
.GetLo());
2259 wxASSERT_MSG( a
== b
, _T("conversions failure") );
2261 wxPuts(_T("Can't do it without native long long type, test skipped."));
2264 #endif // wxUSE_LONGLONG_NATIVE
2266 if ( !(nTested
% 1000) )
2275 wxPuts(_T(" done!"));
2278 static void TestMultiplication()
2280 wxPuts(_T("*** Testing wxLongLong multiplication ***\n"));
2284 for ( size_t n
= 0; n
< 100000; n
++ )
2289 #if wxUSE_LONGLONG_NATIVE
2290 wxLongLongNative
aa(a
.GetHi(), a
.GetLo());
2291 wxLongLongNative
bb(b
.GetHi(), b
.GetLo());
2293 wxASSERT_MSG( a
*b
== aa
*bb
, _T("multiplication failure") );
2294 #else // !wxUSE_LONGLONG_NATIVE
2295 wxPuts(_T("Can't do it without native long long type, test skipped."));
2298 #endif // wxUSE_LONGLONG_NATIVE
2300 if ( !(nTested
% 1000) )
2309 wxPuts(_T(" done!"));
2312 static void TestDivision()
2314 wxPuts(_T("*** Testing wxLongLong division ***\n"));
2318 for ( size_t n
= 0; n
< 100000; n
++ )
2320 // get a random wxLongLong (shifting by 12 the MSB ensures that the
2321 // multiplication will not overflow)
2322 wxLongLong ll
= MAKE_LL((rand() >> 12), rand(), rand(), rand());
2324 // get a random (but non null) long (not wxLongLong for now) to divide
2336 #if wxUSE_LONGLONG_NATIVE
2337 wxLongLongNative
m(ll
.GetHi(), ll
.GetLo());
2339 wxLongLongNative p
= m
/ l
, s
= m
% l
;
2340 wxASSERT_MSG( q
== p
&& r
== s
, _T("division failure") );
2341 #else // !wxUSE_LONGLONG_NATIVE
2342 // verify the result
2343 wxASSERT_MSG( ll
== q
*l
+ r
, "division failure" );
2344 #endif // wxUSE_LONGLONG_NATIVE
2346 if ( !(nTested
% 1000) )
2355 wxPuts(_T(" done!"));
2358 static void TestAddition()
2360 wxPuts(_T("*** Testing wxLongLong addition ***\n"));
2364 for ( size_t n
= 0; n
< 100000; n
++ )
2370 #if wxUSE_LONGLONG_NATIVE
2371 wxASSERT_MSG( c
== wxLongLongNative(a
.GetHi(), a
.GetLo()) +
2372 wxLongLongNative(b
.GetHi(), b
.GetLo()),
2373 _T("addition failure") );
2374 #else // !wxUSE_LONGLONG_NATIVE
2375 wxASSERT_MSG( c
- b
== a
, "addition failure" );
2376 #endif // wxUSE_LONGLONG_NATIVE
2378 if ( !(nTested
% 1000) )
2387 wxPuts(_T(" done!"));
2390 static void TestBitOperations()
2392 wxPuts(_T("*** Testing wxLongLong bit operation ***\n"));
2396 for ( size_t n
= 0; n
< 100000; n
++ )
2400 #if wxUSE_LONGLONG_NATIVE
2401 for ( size_t n
= 0; n
< 33; n
++ )
2404 #else // !wxUSE_LONGLONG_NATIVE
2405 wxPuts(_T("Can't do it without native long long type, test skipped."));
2408 #endif // wxUSE_LONGLONG_NATIVE
2410 if ( !(nTested
% 1000) )
2419 wxPuts(_T(" done!"));
2422 static void TestLongLongComparison()
2424 #if wxUSE_LONGLONG_WX
2425 wxPuts(_T("*** Testing wxLongLong comparison ***\n"));
2427 static const long ls
[2] =
2433 wxLongLongWx lls
[2];
2437 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2441 for ( size_t m
= 0; m
< WXSIZEOF(lls
); m
++ )
2443 res
= lls
[m
] > testLongs
[n
];
2444 wxPrintf(_T("0x%lx > 0x%lx is %s (%s)\n"),
2445 ls
[m
], testLongs
[n
], res
? "true" : "false",
2446 res
== (ls
[m
] > testLongs
[n
]) ? "ok" : "ERROR");
2448 res
= lls
[m
] < testLongs
[n
];
2449 wxPrintf(_T("0x%lx < 0x%lx is %s (%s)\n"),
2450 ls
[m
], testLongs
[n
], res
? "true" : "false",
2451 res
== (ls
[m
] < testLongs
[n
]) ? "ok" : "ERROR");
2453 res
= lls
[m
] == testLongs
[n
];
2454 wxPrintf(_T("0x%lx == 0x%lx is %s (%s)\n"),
2455 ls
[m
], testLongs
[n
], res
? "true" : "false",
2456 res
== (ls
[m
] == testLongs
[n
]) ? "ok" : "ERROR");
2459 #endif // wxUSE_LONGLONG_WX
2462 static void TestLongLongToString()
2464 wxPuts(_T("*** Testing wxLongLong::ToString() ***\n"));
2466 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2468 wxLongLong ll
= testLongs
[n
];
2469 wxPrintf(_T("%ld == %s\n"), testLongs
[n
], ll
.ToString().c_str());
2472 wxLongLong
ll(0x12345678, 0x87654321);
2473 wxPrintf(_T("0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2476 wxPrintf(_T("-0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2479 static void TestLongLongPrintf()
2481 wxPuts(_T("*** Testing wxLongLong printing ***\n"));
2483 #ifdef wxLongLongFmtSpec
2484 wxLongLong ll
= wxLL(0x1234567890abcdef);
2485 wxString s
= wxString::Format(_T("%") wxLongLongFmtSpec
_T("x"), ll
);
2486 wxPrintf(_T("0x1234567890abcdef -> %s (%s)\n"),
2487 s
.c_str(), s
== _T("1234567890abcdef") ? _T("ok") : _T("ERROR"));
2488 #else // !wxLongLongFmtSpec
2489 #error "wxLongLongFmtSpec not defined for this compiler/platform"
2496 #endif // TEST_LONGLONG
2498 // ----------------------------------------------------------------------------
2500 // ----------------------------------------------------------------------------
2502 #ifdef TEST_PATHLIST
2505 #define CMD_IN_PATH _T("ls")
2507 #define CMD_IN_PATH _T("command.com")
2510 static void TestPathList()
2512 wxPuts(_T("*** Testing wxPathList ***\n"));
2514 wxPathList pathlist
;
2515 pathlist
.AddEnvList(_T("PATH"));
2516 wxString path
= pathlist
.FindValidPath(CMD_IN_PATH
);
2519 wxPrintf(_T("ERROR: command not found in the path.\n"));
2523 wxPrintf(_T("Command found in the path as '%s'.\n"), path
.c_str());
2527 #endif // TEST_PATHLIST
2529 // ----------------------------------------------------------------------------
2530 // regular expressions
2531 // ----------------------------------------------------------------------------
2535 #include "wx/regex.h"
2537 static void TestRegExCompile()
2539 wxPuts(_T("*** Testing RE compilation ***\n"));
2541 static struct RegExCompTestData
2543 const wxChar
*pattern
;
2545 } regExCompTestData
[] =
2547 { _T("foo"), true },
2548 { _T("foo("), false },
2549 { _T("foo(bar"), false },
2550 { _T("foo(bar)"), true },
2551 { _T("foo["), false },
2552 { _T("foo[bar"), false },
2553 { _T("foo[bar]"), true },
2554 { _T("foo{"), true },
2555 { _T("foo{1"), false },
2556 { _T("foo{bar"), true },
2557 { _T("foo{1}"), true },
2558 { _T("foo{1,2}"), true },
2559 { _T("foo{bar}"), true },
2560 { _T("foo*"), true },
2561 { _T("foo**"), false },
2562 { _T("foo+"), true },
2563 { _T("foo++"), false },
2564 { _T("foo?"), true },
2565 { _T("foo??"), false },
2566 { _T("foo?+"), false },
2570 for ( size_t n
= 0; n
< WXSIZEOF(regExCompTestData
); n
++ )
2572 const RegExCompTestData
& data
= regExCompTestData
[n
];
2573 bool ok
= re
.Compile(data
.pattern
);
2575 wxPrintf(_T("'%s' is %sa valid RE (%s)\n"),
2577 ok
? _T("") : _T("not "),
2578 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2582 static void TestRegExMatch()
2584 wxPuts(_T("*** Testing RE matching ***\n"));
2586 static struct RegExMatchTestData
2588 const wxChar
*pattern
;
2591 } regExMatchTestData
[] =
2593 { _T("foo"), _T("bar"), false },
2594 { _T("foo"), _T("foobar"), true },
2595 { _T("^foo"), _T("foobar"), true },
2596 { _T("^foo"), _T("barfoo"), false },
2597 { _T("bar$"), _T("barbar"), true },
2598 { _T("bar$"), _T("barbar "), false },
2601 for ( size_t n
= 0; n
< WXSIZEOF(regExMatchTestData
); n
++ )
2603 const RegExMatchTestData
& data
= regExMatchTestData
[n
];
2605 wxRegEx
re(data
.pattern
);
2606 bool ok
= re
.Matches(data
.text
);
2608 wxPrintf(_T("'%s' %s %s (%s)\n"),
2610 ok
? _T("matches") : _T("doesn't match"),
2612 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2616 static void TestRegExSubmatch()
2618 wxPuts(_T("*** Testing RE subexpressions ***\n"));
2620 wxRegEx
re(_T("([[:alpha:]]+) ([[:alpha:]]+) ([[:digit:]]+).*([[:digit:]]+)$"));
2621 if ( !re
.IsValid() )
2623 wxPuts(_T("ERROR: compilation failed."));
2627 wxString text
= _T("Fri Jul 13 18:37:52 CEST 2001");
2629 if ( !re
.Matches(text
) )
2631 wxPuts(_T("ERROR: match expected."));
2635 wxPrintf(_T("Entire match: %s\n"), re
.GetMatch(text
).c_str());
2637 wxPrintf(_T("Date: %s/%s/%s, wday: %s\n"),
2638 re
.GetMatch(text
, 3).c_str(),
2639 re
.GetMatch(text
, 2).c_str(),
2640 re
.GetMatch(text
, 4).c_str(),
2641 re
.GetMatch(text
, 1).c_str());
2645 static void TestRegExReplacement()
2647 wxPuts(_T("*** Testing RE replacement ***"));
2649 static struct RegExReplTestData
2653 const wxChar
*result
;
2655 } regExReplTestData
[] =
2657 { _T("foo123"), _T("bar"), _T("bar"), 1 },
2658 { _T("foo123"), _T("\\2\\1"), _T("123foo"), 1 },
2659 { _T("foo_123"), _T("\\2\\1"), _T("123foo"), 1 },
2660 { _T("123foo"), _T("bar"), _T("123foo"), 0 },
2661 { _T("123foo456foo"), _T("&&"), _T("123foo456foo456foo"), 1 },
2662 { _T("foo123foo123"), _T("bar"), _T("barbar"), 2 },
2663 { _T("foo123_foo456_foo789"), _T("bar"), _T("bar_bar_bar"), 3 },
2666 const wxChar
*pattern
= _T("([a-z]+)[^0-9]*([0-9]+)");
2667 wxRegEx
re(pattern
);
2669 wxPrintf(_T("Using pattern '%s' for replacement.\n"), pattern
);
2671 for ( size_t n
= 0; n
< WXSIZEOF(regExReplTestData
); n
++ )
2673 const RegExReplTestData
& data
= regExReplTestData
[n
];
2675 wxString text
= data
.text
;
2676 size_t nRepl
= re
.Replace(&text
, data
.repl
);
2678 wxPrintf(_T("%s =~ s/RE/%s/g: %u match%s, result = '%s' ("),
2679 data
.text
, data
.repl
,
2680 nRepl
, nRepl
== 1 ? _T("") : _T("es"),
2682 if ( text
== data
.result
&& nRepl
== data
.count
)
2688 wxPrintf(_T("ERROR: should be %u and '%s')\n"),
2689 data
.count
, data
.result
);
2694 static void TestRegExInteractive()
2696 wxPuts(_T("*** Testing RE interactively ***"));
2700 wxChar pattern
[128];
2701 wxPrintf(_T("\nEnter a pattern: "));
2702 if ( !wxFgets(pattern
, WXSIZEOF(pattern
), stdin
) )
2705 // kill the last '\n'
2706 pattern
[wxStrlen(pattern
) - 1] = 0;
2709 if ( !re
.Compile(pattern
) )
2717 wxPrintf(_T("Enter text to match: "));
2718 if ( !wxFgets(text
, WXSIZEOF(text
), stdin
) )
2721 // kill the last '\n'
2722 text
[wxStrlen(text
) - 1] = 0;
2724 if ( !re
.Matches(text
) )
2726 wxPrintf(_T("No match.\n"));
2730 wxPrintf(_T("Pattern matches at '%s'\n"), re
.GetMatch(text
).c_str());
2733 for ( size_t n
= 1; ; n
++ )
2735 if ( !re
.GetMatch(&start
, &len
, n
) )
2740 wxPrintf(_T("Subexpr %u matched '%s'\n"),
2741 n
, wxString(text
+ start
, len
).c_str());
2748 #endif // TEST_REGEX
2750 // ----------------------------------------------------------------------------
2752 // ----------------------------------------------------------------------------
2762 static void TestDbOpen()
2770 // ----------------------------------------------------------------------------
2772 // ----------------------------------------------------------------------------
2775 NB: this stuff was taken from the glibc test suite and modified to build
2776 in wxWindows: if I read the copyright below properly, this shouldn't
2782 #ifdef wxTEST_PRINTF
2783 // use our functions from wxchar.cpp
2787 // NB: do _not_ use ATTRIBUTE_PRINTF here, we have some invalid formats
2788 // in the tests below
2789 int wxPrintf( const wxChar
*format
, ... );
2790 int wxSprintf( wxChar
*str
, const wxChar
*format
, ... );
2793 #include "wx/longlong.h"
2797 static void rfg1 (void);
2798 static void rfg2 (void);
2802 fmtchk (const wxChar
*fmt
)
2804 (void) wxPrintf(_T("%s:\t`"), fmt
);
2805 (void) wxPrintf(fmt
, 0x12);
2806 (void) wxPrintf(_T("'\n"));
2810 fmtst1chk (const wxChar
*fmt
)
2812 (void) wxPrintf(_T("%s:\t`"), fmt
);
2813 (void) wxPrintf(fmt
, 4, 0x12);
2814 (void) wxPrintf(_T("'\n"));
2818 fmtst2chk (const wxChar
*fmt
)
2820 (void) wxPrintf(_T("%s:\t`"), fmt
);
2821 (void) wxPrintf(fmt
, 4, 4, 0x12);
2822 (void) wxPrintf(_T("'\n"));
2825 /* This page is covered by the following copyright: */
2827 /* (C) Copyright C E Chew
2829 * Feel free to copy, use and distribute this software provided:
2831 * 1. you do not pretend that you wrote it
2832 * 2. you leave this copyright notice intact.
2836 * Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans.
2843 /* Formatted Output Test
2845 * This exercises the output formatting code.
2853 wxChar
*prefix
= buf
;
2856 wxPuts(_T("\nFormatted output test"));
2857 wxPrintf(_T("prefix 6d 6o 6x 6X 6u\n"));
2858 wxStrcpy(prefix
, _T("%"));
2859 for (i
= 0; i
< 2; i
++) {
2860 for (j
= 0; j
< 2; j
++) {
2861 for (k
= 0; k
< 2; k
++) {
2862 for (l
= 0; l
< 2; l
++) {
2863 wxStrcpy(prefix
, _T("%"));
2864 if (i
== 0) wxStrcat(prefix
, _T("-"));
2865 if (j
== 0) wxStrcat(prefix
, _T("+"));
2866 if (k
== 0) wxStrcat(prefix
, _T("#"));
2867 if (l
== 0) wxStrcat(prefix
, _T("0"));
2868 wxPrintf(_T("%5s |"), prefix
);
2869 wxStrcpy(tp
, prefix
);
2870 wxStrcat(tp
, _T("6d |"));
2872 wxStrcpy(tp
, prefix
);
2873 wxStrcat(tp
, _T("6o |"));
2875 wxStrcpy(tp
, prefix
);
2876 wxStrcat(tp
, _T("6x |"));
2878 wxStrcpy(tp
, prefix
);
2879 wxStrcat(tp
, _T("6X |"));
2881 wxStrcpy(tp
, prefix
);
2882 wxStrcat(tp
, _T("6u |"));
2889 wxPrintf(_T("%10s\n"), (wxChar
*) NULL
);
2890 wxPrintf(_T("%-10s\n"), (wxChar
*) NULL
);
2893 static void TestPrintf()
2895 static wxChar shortstr
[] = _T("Hi, Z.");
2896 static wxChar longstr
[] = _T("Good morning, Doctor Chandra. This is Hal. \
2897 I am ready for my first lesson today.");
2902 fmtchk(_T("%4.4x"));
2903 fmtchk(_T("%04.4x"));
2904 fmtchk(_T("%4.3x"));
2905 fmtchk(_T("%04.3x"));
2907 fmtst1chk(_T("%.*x"));
2908 fmtst1chk(_T("%0*x"));
2909 fmtst2chk(_T("%*.*x"));
2910 fmtst2chk(_T("%0*.*x"));
2912 wxPrintf(_T("bad format:\t\"%b\"\n"));
2913 wxPrintf(_T("nil pointer (padded):\t\"%10p\"\n"), (void *) NULL
);
2915 wxPrintf(_T("decimal negative:\t\"%d\"\n"), -2345);
2916 wxPrintf(_T("octal negative:\t\"%o\"\n"), -2345);
2917 wxPrintf(_T("hex negative:\t\"%x\"\n"), -2345);
2918 wxPrintf(_T("long decimal number:\t\"%ld\"\n"), -123456L);
2919 wxPrintf(_T("long octal negative:\t\"%lo\"\n"), -2345L);
2920 wxPrintf(_T("long unsigned decimal number:\t\"%lu\"\n"), -123456L);
2921 wxPrintf(_T("zero-padded LDN:\t\"%010ld\"\n"), -123456L);
2922 wxPrintf(_T("left-adjusted ZLDN:\t\"%-010ld\"\n"), -123456);
2923 wxPrintf(_T("space-padded LDN:\t\"%10ld\"\n"), -123456L);
2924 wxPrintf(_T("left-adjusted SLDN:\t\"%-10ld\"\n"), -123456L);
2926 wxPrintf(_T("zero-padded string:\t\"%010s\"\n"), shortstr
);
2927 wxPrintf(_T("left-adjusted Z string:\t\"%-010s\"\n"), shortstr
);
2928 wxPrintf(_T("space-padded string:\t\"%10s\"\n"), shortstr
);
2929 wxPrintf(_T("left-adjusted S string:\t\"%-10s\"\n"), shortstr
);
2930 wxPrintf(_T("null string:\t\"%s\"\n"), (wxChar
*)NULL
);
2931 wxPrintf(_T("limited string:\t\"%.22s\"\n"), longstr
);
2933 wxPrintf(_T("e-style >= 1:\t\"%e\"\n"), 12.34);
2934 wxPrintf(_T("e-style >= .1:\t\"%e\"\n"), 0.1234);
2935 wxPrintf(_T("e-style < .1:\t\"%e\"\n"), 0.001234);
2936 wxPrintf(_T("e-style big:\t\"%.60e\"\n"), 1e20
);
2937 wxPrintf(_T("e-style == .1:\t\"%e\"\n"), 0.1);
2938 wxPrintf(_T("f-style >= 1:\t\"%f\"\n"), 12.34);
2939 wxPrintf(_T("f-style >= .1:\t\"%f\"\n"), 0.1234);
2940 wxPrintf(_T("f-style < .1:\t\"%f\"\n"), 0.001234);
2941 wxPrintf(_T("g-style >= 1:\t\"%g\"\n"), 12.34);
2942 wxPrintf(_T("g-style >= .1:\t\"%g\"\n"), 0.1234);
2943 wxPrintf(_T("g-style < .1:\t\"%g\"\n"), 0.001234);
2944 wxPrintf(_T("g-style big:\t\"%.60g\"\n"), 1e20
);
2946 wxPrintf (_T(" %6.5f\n"), .099999999860301614);
2947 wxPrintf (_T(" %6.5f\n"), .1);
2948 wxPrintf (_T("x%5.4fx\n"), .5);
2950 wxPrintf (_T("%#03x\n"), 1);
2952 //wxPrintf (_T("something really insane: %.10000f\n"), 1.0);
2958 while (niter
-- != 0)
2959 wxPrintf (_T("%.17e\n"), d
/ 2);
2963 wxPrintf (_T("%15.5e\n"), 4.9406564584124654e-324);
2965 #define FORMAT _T("|%12.4f|%12.4e|%12.4g|\n")
2966 wxPrintf (FORMAT
, 0.0, 0.0, 0.0);
2967 wxPrintf (FORMAT
, 1.0, 1.0, 1.0);
2968 wxPrintf (FORMAT
, -1.0, -1.0, -1.0);
2969 wxPrintf (FORMAT
, 100.0, 100.0, 100.0);
2970 wxPrintf (FORMAT
, 1000.0, 1000.0, 1000.0);
2971 wxPrintf (FORMAT
, 10000.0, 10000.0, 10000.0);
2972 wxPrintf (FORMAT
, 12345.0, 12345.0, 12345.0);
2973 wxPrintf (FORMAT
, 100000.0, 100000.0, 100000.0);
2974 wxPrintf (FORMAT
, 123456.0, 123456.0, 123456.0);
2979 int rc
= wxSnprintf (buf
, WXSIZEOF(buf
), _T("%30s"), _T("foo"));
2981 wxPrintf(_T("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n"),
2982 rc
, WXSIZEOF(buf
), buf
);
2985 wxPrintf ("snprintf (\"%%.999999u\", 10)\n",
2986 wxSnprintf(buf2
, WXSIZEOFbuf2
), "%.999999u", 10));
2992 wxPrintf (_T("%e should be 1.234568e+06\n"), 1234567.8);
2993 wxPrintf (_T("%f should be 1234567.800000\n"), 1234567.8);
2994 wxPrintf (_T("%g should be 1.23457e+06\n"), 1234567.8);
2995 wxPrintf (_T("%g should be 123.456\n"), 123.456);
2996 wxPrintf (_T("%g should be 1e+06\n"), 1000000.0);
2997 wxPrintf (_T("%g should be 10\n"), 10.0);
2998 wxPrintf (_T("%g should be 0.02\n"), 0.02);
3002 wxPrintf(_T("%.17f\n"),(1.0/x
/10.0+1.0)*x
-x
);
3008 wxSprintf(buf
,_T("%*s%*s%*s"),-1,_T("one"),-20,_T("two"),-30,_T("three"));
3010 result
|= wxStrcmp (buf
,
3011 _T("onetwo three "));
3013 wxPuts (result
!= 0 ? _T("Test failed!") : _T("Test ok."));
3020 wxSprintf(buf
, _T("%07") wxLongLongFmtSpec
_T("o"), wxLL(040000000000));
3022 // for some reason below line fails under Borland
3023 wxPrintf (_T("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf
);
3026 if (wxStrcmp (buf
, _T("40000000000")) != 0)
3029 wxPuts (_T("\tFAILED"));
3033 #endif // wxLongLong_t
3035 wxPrintf (_T("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX
+ 2, UCHAR_MAX
+ 2);
3036 wxPrintf (_T("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX
+ 2, USHRT_MAX
+ 2);
3038 wxPuts (_T("--- Should be no further output. ---"));
3047 memset (bytes
, '\xff', sizeof bytes
);
3048 wxSprintf (buf
, _T("foo%hhn\n"), &bytes
[3]);
3049 if (bytes
[0] != '\xff' || bytes
[1] != '\xff' || bytes
[2] != '\xff'
3050 || bytes
[4] != '\xff' || bytes
[5] != '\xff' || bytes
[6] != '\xff')
3052 wxPuts (_T("%hhn overwrite more bytes"));
3057 wxPuts (_T("%hhn wrote incorrect value"));
3069 wxSprintf (buf
, _T("%5.s"), _T("xyz"));
3070 if (wxStrcmp (buf
, _T(" ")) != 0)
3071 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" "));
3072 wxSprintf (buf
, _T("%5.f"), 33.3);
3073 if (wxStrcmp (buf
, _T(" 33")) != 0)
3074 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 33"));
3075 wxSprintf (buf
, _T("%8.e"), 33.3e7
);
3076 if (wxStrcmp (buf
, _T(" 3e+08")) != 0)
3077 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3e+08"));
3078 wxSprintf (buf
, _T("%8.E"), 33.3e7
);
3079 if (wxStrcmp (buf
, _T(" 3E+08")) != 0)
3080 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3E+08"));
3081 wxSprintf (buf
, _T("%.g"), 33.3);
3082 if (wxStrcmp (buf
, _T("3e+01")) != 0)
3083 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3e+01"));
3084 wxSprintf (buf
, _T("%.G"), 33.3);
3085 if (wxStrcmp (buf
, _T("3E+01")) != 0)
3086 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3E+01"));
3096 wxSprintf (buf
, _T("%.*g"), prec
, 3.3);
3097 if (wxStrcmp (buf
, _T("3")) != 0)
3098 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
3100 wxSprintf (buf
, _T("%.*G"), prec
, 3.3);
3101 if (wxStrcmp (buf
, _T("3")) != 0)
3102 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
3104 wxSprintf (buf
, _T("%7.*G"), prec
, 3.33);
3105 if (wxStrcmp (buf
, _T(" 3")) != 0)
3106 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3"));
3108 wxSprintf (buf
, _T("%04.*o"), prec
, 33);
3109 if (wxStrcmp (buf
, _T(" 041")) != 0)
3110 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 041"));
3112 wxSprintf (buf
, _T("%09.*u"), prec
, 33);
3113 if (wxStrcmp (buf
, _T(" 0000033")) != 0)
3114 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 0000033"));
3116 wxSprintf (buf
, _T("%04.*x"), prec
, 33);
3117 if (wxStrcmp (buf
, _T(" 021")) != 0)
3118 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
3120 wxSprintf (buf
, _T("%04.*X"), prec
, 33);
3121 if (wxStrcmp (buf
, _T(" 021")) != 0)
3122 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
3125 #endif // TEST_PRINTF
3127 // ----------------------------------------------------------------------------
3128 // registry and related stuff
3129 // ----------------------------------------------------------------------------
3131 // this is for MSW only
3134 #undef TEST_REGISTRY
3139 #include "wx/confbase.h"
3140 #include "wx/msw/regconf.h"
3142 static void TestRegConfWrite()
3144 wxRegConfig
regconf(_T("console"), _T("wxwindows"));
3145 regconf
.Write(_T("Hello"), wxString(_T("world")));
3148 #endif // TEST_REGCONF
3150 #ifdef TEST_REGISTRY
3152 #include "wx/msw/registry.h"
3154 // I chose this one because I liked its name, but it probably only exists under
3156 static const wxChar
*TESTKEY
=
3157 _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
3159 static void TestRegistryRead()
3161 wxPuts(_T("*** testing registry reading ***"));
3163 wxRegKey
key(TESTKEY
);
3164 wxPrintf(_T("The test key name is '%s'.\n"), key
.GetName().c_str());
3167 wxPuts(_T("ERROR: test key can't be opened, aborting test."));
3172 size_t nSubKeys
, nValues
;
3173 if ( key
.GetKeyInfo(&nSubKeys
, NULL
, &nValues
, NULL
) )
3175 wxPrintf(_T("It has %u subkeys and %u values.\n"), nSubKeys
, nValues
);
3178 wxPrintf(_T("Enumerating values:\n"));
3182 bool cont
= key
.GetFirstValue(value
, dummy
);
3185 wxPrintf(_T("Value '%s': type "), value
.c_str());
3186 switch ( key
.GetValueType(value
) )
3188 case wxRegKey::Type_None
: wxPrintf(_T("ERROR (none)")); break;
3189 case wxRegKey::Type_String
: wxPrintf(_T("SZ")); break;
3190 case wxRegKey::Type_Expand_String
: wxPrintf(_T("EXPAND_SZ")); break;
3191 case wxRegKey::Type_Binary
: wxPrintf(_T("BINARY")); break;
3192 case wxRegKey::Type_Dword
: wxPrintf(_T("DWORD")); break;
3193 case wxRegKey::Type_Multi_String
: wxPrintf(_T("MULTI_SZ")); break;
3194 default: wxPrintf(_T("other (unknown)")); break;
3197 wxPrintf(_T(", value = "));
3198 if ( key
.IsNumericValue(value
) )
3201 key
.QueryValue(value
, &val
);
3202 wxPrintf(_T("%ld"), val
);
3207 key
.QueryValue(value
, val
);
3208 wxPrintf(_T("'%s'"), val
.c_str());
3210 key
.QueryRawValue(value
, val
);
3211 wxPrintf(_T(" (raw value '%s')"), val
.c_str());
3216 cont
= key
.GetNextValue(value
, dummy
);
3220 static void TestRegistryAssociation()
3223 The second call to deleteself genertaes an error message, with a
3224 messagebox saying .flo is crucial to system operation, while the .ddf
3225 call also fails, but with no error message
3230 key
.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
3232 key
= _T("ddxf_auto_file") ;
3233 key
.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
3235 key
= _T("ddxf_auto_file") ;
3236 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
3238 key
= _T("program,0") ;
3239 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
3241 key
= _T("program \"%1\"") ;
3243 key
.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
3245 key
.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
3247 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
3249 key
.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
3253 #endif // TEST_REGISTRY
3255 // ----------------------------------------------------------------------------
3257 // ----------------------------------------------------------------------------
3259 #ifdef TEST_SCOPEGUARD
3261 #include "wx/scopeguard.h"
3263 static void function0() { puts("function0()"); }
3264 static void function1(int n
) { printf("function1(%d)\n", n
); }
3265 static void function2(double x
, char c
) { printf("function2(%g, %c)\n", x
, c
); }
3269 void method0() { printf("method0()\n"); }
3270 void method1(int n
) { printf("method1(%d)\n", n
); }
3271 void method2(double x
, char c
) { printf("method2(%g, %c)\n", x
, c
); }
3274 static void TestScopeGuard()
3276 ON_BLOCK_EXIT0(function0
);
3277 ON_BLOCK_EXIT1(function1
, 17);
3278 ON_BLOCK_EXIT2(function2
, 3.14, 'p');
3281 ON_BLOCK_EXIT_OBJ0(obj
, &Object::method0
);
3282 ON_BLOCK_EXIT_OBJ1(obj
, &Object::method1
, 7);
3283 ON_BLOCK_EXIT_OBJ2(obj
, &Object::method2
, 2.71, 'e');
3285 wxScopeGuard dismissed
= wxMakeGuard(function0
);
3286 dismissed
.Dismiss();
3291 // ----------------------------------------------------------------------------
3293 // ----------------------------------------------------------------------------
3297 #include "wx/socket.h"
3298 #include "wx/protocol/protocol.h"
3299 #include "wx/protocol/http.h"
3301 static void TestSocketServer()
3303 wxPuts(_T("*** Testing wxSocketServer ***\n"));
3305 static const int PORT
= 3000;
3310 wxSocketServer
*server
= new wxSocketServer(addr
);
3311 if ( !server
->Ok() )
3313 wxPuts(_T("ERROR: failed to bind"));
3321 wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT
);
3323 wxSocketBase
*socket
= server
->Accept();
3326 wxPuts(_T("ERROR: wxSocketServer::Accept() failed."));
3330 wxPuts(_T("Server: got a client."));
3332 server
->SetTimeout(60); // 1 min
3335 while ( !close
&& socket
->IsConnected() )
3338 wxChar ch
= _T('\0');
3341 if ( socket
->Read(&ch
, sizeof(ch
)).Error() )
3343 // don't log error if the client just close the connection
3344 if ( socket
->IsConnected() )
3346 wxPuts(_T("ERROR: in wxSocket::Read."));
3366 wxPrintf(_T("Server: got '%s'.\n"), s
.c_str());
3367 if ( s
== _T("close") )
3369 wxPuts(_T("Closing connection"));
3373 else if ( s
== _T("quit") )
3378 wxPuts(_T("Shutting down the server"));
3380 else // not a special command
3382 socket
->Write(s
.MakeUpper().c_str(), s
.length());
3383 socket
->Write("\r\n", 2);
3384 wxPrintf(_T("Server: wrote '%s'.\n"), s
.c_str());
3390 wxPuts(_T("Server: lost a client unexpectedly."));
3396 // same as "delete server" but is consistent with GUI programs
3400 static void TestSocketClient()
3402 wxPuts(_T("*** Testing wxSocketClient ***\n"));
3404 static const wxChar
*hostname
= _T("www.wxwindows.org");
3407 addr
.Hostname(hostname
);
3410 wxPrintf(_T("--- Attempting to connect to %s:80...\n"), hostname
);
3412 wxSocketClient client
;
3413 if ( !client
.Connect(addr
) )
3415 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3419 wxPrintf(_T("--- Connected to %s:%u...\n"),
3420 addr
.Hostname().c_str(), addr
.Service());
3424 // could use simply "GET" here I suppose
3426 wxString::Format(_T("GET http://%s/\r\n"), hostname
);
3427 client
.Write(cmdGet
, cmdGet
.length());
3428 wxPrintf(_T("--- Sent command '%s' to the server\n"),
3429 MakePrintable(cmdGet
).c_str());
3430 client
.Read(buf
, WXSIZEOF(buf
));
3431 wxPrintf(_T("--- Server replied:\n%s"), buf
);
3435 #endif // TEST_SOCKETS
3437 // ----------------------------------------------------------------------------
3439 // ----------------------------------------------------------------------------
3443 #include "wx/protocol/ftp.h"
3447 #define FTP_ANONYMOUS
3449 #ifdef FTP_ANONYMOUS
3450 static const wxChar
*directory
= _T("/pub");
3451 static const wxChar
*filename
= _T("welcome.msg");
3453 static const wxChar
*directory
= _T("/etc");
3454 static const wxChar
*filename
= _T("issue");
3457 static bool TestFtpConnect()
3459 wxPuts(_T("*** Testing FTP connect ***"));
3461 #ifdef FTP_ANONYMOUS
3462 static const wxChar
*hostname
= _T("ftp.wxwindows.org");
3464 wxPrintf(_T("--- Attempting to connect to %s:21 anonymously...\n"), hostname
);
3465 #else // !FTP_ANONYMOUS
3466 static const wxChar
*hostname
= "localhost";
3469 wxFgets(user
, WXSIZEOF(user
), stdin
);
3470 user
[wxStrlen(user
) - 1] = '\0'; // chop off '\n'
3473 wxChar password
[256];
3474 wxPrintf(_T("Password for %s: "), password
);
3475 wxFgets(password
, WXSIZEOF(password
), stdin
);
3476 password
[wxStrlen(password
) - 1] = '\0'; // chop off '\n'
3477 ftp
.SetPassword(password
);
3479 wxPrintf(_T("--- Attempting to connect to %s:21 as %s...\n"), hostname
, user
);
3480 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
3482 if ( !ftp
.Connect(hostname
) )
3484 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3490 wxPrintf(_T("--- Connected to %s, current directory is '%s'\n"),
3491 hostname
, ftp
.Pwd().c_str());
3497 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
3498 static void TestFtpWuFtpd()
3501 static const wxChar
*hostname
= _T("ftp.eudora.com");
3502 if ( !ftp
.Connect(hostname
) )
3504 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3508 static const wxChar
*filename
= _T("eudora/pubs/draft-gellens-submit-09.txt");
3509 wxInputStream
*in
= ftp
.GetInputStream(filename
);
3512 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
3516 size_t size
= in
->GetSize();
3517 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
3519 wxChar
*data
= new wxChar
[size
];
3520 if ( !in
->Read(data
, size
) )
3522 wxPuts(_T("ERROR: read error"));
3526 wxPrintf(_T("Successfully retrieved the file.\n"));
3535 static void TestFtpList()
3537 wxPuts(_T("*** Testing wxFTP file listing ***\n"));
3540 if ( !ftp
.ChDir(directory
) )
3542 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
3545 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3547 // test NLIST and LIST
3548 wxArrayString files
;
3549 if ( !ftp
.GetFilesList(files
) )
3551 wxPuts(_T("ERROR: failed to get NLIST of files"));
3555 wxPrintf(_T("Brief list of files under '%s':\n"), ftp
.Pwd().c_str());
3556 size_t count
= files
.GetCount();
3557 for ( size_t n
= 0; n
< count
; n
++ )
3559 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3561 wxPuts(_T("End of the file list"));
3564 if ( !ftp
.GetDirList(files
) )
3566 wxPuts(_T("ERROR: failed to get LIST of files"));
3570 wxPrintf(_T("Detailed list of files under '%s':\n"), ftp
.Pwd().c_str());
3571 size_t count
= files
.GetCount();
3572 for ( size_t n
= 0; n
< count
; n
++ )
3574 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3576 wxPuts(_T("End of the file list"));
3579 if ( !ftp
.ChDir(_T("..")) )
3581 wxPuts(_T("ERROR: failed to cd to .."));
3584 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3587 static void TestFtpDownload()
3589 wxPuts(_T("*** Testing wxFTP download ***\n"));
3592 wxInputStream
*in
= ftp
.GetInputStream(filename
);
3595 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
3599 size_t size
= in
->GetSize();
3600 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
3603 wxChar
*data
= new wxChar
[size
];
3604 if ( !in
->Read(data
, size
) )
3606 wxPuts(_T("ERROR: read error"));
3610 wxPrintf(_T("\nContents of %s:\n%s\n"), filename
, data
);
3618 static void TestFtpFileSize()
3620 wxPuts(_T("*** Testing FTP SIZE command ***"));
3622 if ( !ftp
.ChDir(directory
) )
3624 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
3627 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3629 if ( ftp
.FileExists(filename
) )
3631 int size
= ftp
.GetFileSize(filename
);
3633 wxPrintf(_T("ERROR: couldn't get size of '%s'\n"), filename
);
3635 wxPrintf(_T("Size of '%s' is %d bytes.\n"), filename
, size
);
3639 wxPrintf(_T("ERROR: '%s' doesn't exist\n"), filename
);
3643 static void TestFtpMisc()
3645 wxPuts(_T("*** Testing miscellaneous wxFTP functions ***"));
3647 if ( ftp
.SendCommand(_T("STAT")) != '2' )
3649 wxPuts(_T("ERROR: STAT failed"));
3653 wxPrintf(_T("STAT returned:\n\n%s\n"), ftp
.GetLastResult().c_str());
3656 if ( ftp
.SendCommand(_T("HELP SITE")) != '2' )
3658 wxPuts(_T("ERROR: HELP SITE failed"));
3662 wxPrintf(_T("The list of site-specific commands:\n\n%s\n"),
3663 ftp
.GetLastResult().c_str());
3667 static void TestFtpInteractive()
3669 wxPuts(_T("\n*** Interactive wxFTP test ***"));
3675 wxPrintf(_T("Enter FTP command: "));
3676 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
3679 // kill the last '\n'
3680 buf
[wxStrlen(buf
) - 1] = 0;
3682 // special handling of LIST and NLST as they require data connection
3683 wxString
start(buf
, 4);
3685 if ( start
== _T("LIST") || start
== _T("NLST") )
3688 if ( wxStrlen(buf
) > 4 )
3691 wxArrayString files
;
3692 if ( !ftp
.GetList(files
, wildcard
, start
== _T("LIST")) )
3694 wxPrintf(_T("ERROR: failed to get %s of files\n"), start
.c_str());
3698 wxPrintf(_T("--- %s of '%s' under '%s':\n"),
3699 start
.c_str(), wildcard
.c_str(), ftp
.Pwd().c_str());
3700 size_t count
= files
.GetCount();
3701 for ( size_t n
= 0; n
< count
; n
++ )
3703 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3705 wxPuts(_T("--- End of the file list"));
3710 wxChar ch
= ftp
.SendCommand(buf
);
3711 wxPrintf(_T("Command %s"), ch
? _T("succeeded") : _T("failed"));
3714 wxPrintf(_T(" (return code %c)"), ch
);
3717 wxPrintf(_T(", server reply:\n%s\n\n"), ftp
.GetLastResult().c_str());
3721 wxPuts(_T("\n*** done ***"));
3724 static void TestFtpUpload()
3726 wxPuts(_T("*** Testing wxFTP uploading ***\n"));
3729 static const wxChar
*file1
= _T("test1");
3730 static const wxChar
*file2
= _T("test2");
3731 wxOutputStream
*out
= ftp
.GetOutputStream(file1
);
3734 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
3735 out
->Write("First hello", 11);
3739 // send a command to check the remote file
3740 if ( ftp
.SendCommand(wxString(_T("STAT ")) + file1
) != '2' )
3742 wxPrintf(_T("ERROR: STAT %s failed\n"), file1
);
3746 wxPrintf(_T("STAT %s returned:\n\n%s\n"),
3747 file1
, ftp
.GetLastResult().c_str());
3750 out
= ftp
.GetOutputStream(file2
);
3753 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
3754 out
->Write("Second hello", 12);
3761 // ----------------------------------------------------------------------------
3763 // ----------------------------------------------------------------------------
3767 #include "wx/wfstream.h"
3768 #include "wx/mstream.h"
3770 static void TestFileStream()
3772 wxPuts(_T("*** Testing wxFileInputStream ***"));
3774 static const wxChar
*filename
= _T("testdata.fs");
3776 wxFileOutputStream
fsOut(filename
);
3777 fsOut
.Write("foo", 3);
3780 wxFileInputStream
fsIn(filename
);
3781 wxPrintf(_T("File stream size: %u\n"), fsIn
.GetSize());
3782 while ( !fsIn
.Eof() )
3784 putchar(fsIn
.GetC());
3787 if ( !wxRemoveFile(filename
) )
3789 wxPrintf(_T("ERROR: failed to remove the file '%s'.\n"), filename
);
3792 wxPuts(_T("\n*** wxFileInputStream test done ***"));
3795 static void TestMemoryStream()
3797 wxPuts(_T("*** Testing wxMemoryOutputStream ***"));
3799 wxMemoryOutputStream memOutStream
;
3800 wxPrintf(_T("Initially out stream offset: %lu\n"),
3801 (unsigned long)memOutStream
.TellO());
3803 for ( const wxChar
*p
= _T("Hello, stream!"); *p
; p
++ )
3805 memOutStream
.PutC(*p
);
3808 wxPrintf(_T("Final out stream offset: %lu\n"),
3809 (unsigned long)memOutStream
.TellO());
3811 wxPuts(_T("*** Testing wxMemoryInputStream ***"));
3814 size_t len
= memOutStream
.CopyTo(buf
, WXSIZEOF(buf
));
3816 wxMemoryInputStream
memInpStream(buf
, len
);
3817 wxPrintf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
3818 while ( !memInpStream
.Eof() )
3820 putchar(memInpStream
.GetC());
3823 wxPuts(_T("\n*** wxMemoryInputStream test done ***"));
3826 #endif // TEST_STREAMS
3828 // ----------------------------------------------------------------------------
3830 // ----------------------------------------------------------------------------
3834 #include "wx/timer.h"
3835 #include "wx/utils.h"
3837 static void TestStopWatch()
3839 wxPuts(_T("*** Testing wxStopWatch ***\n"));
3843 wxPrintf(_T("Initially paused, after 2 seconds time is..."));
3846 wxPrintf(_T("\t%ldms\n"), sw
.Time());
3848 wxPrintf(_T("Resuming stopwatch and sleeping 3 seconds..."));
3852 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3855 wxPrintf(_T("Pausing agan and sleeping 2 more seconds..."));
3858 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3861 wxPrintf(_T("Finally resuming and sleeping 2 more seconds..."));
3864 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3867 wxPuts(_T("\nChecking for 'backwards clock' bug..."));
3868 for ( size_t n
= 0; n
< 70; n
++ )
3872 for ( size_t m
= 0; m
< 100000; m
++ )
3874 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
3876 wxPuts(_T("\ntime is negative - ERROR!"));
3884 wxPuts(_T(", ok."));
3887 #endif // TEST_TIMER
3889 // ----------------------------------------------------------------------------
3891 // ----------------------------------------------------------------------------
3895 #include "wx/vcard.h"
3897 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
3900 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
3903 wxPrintf(_T("%s%s"),
3904 wxString(_T('\t'), level
).c_str(),
3905 vcObj
->GetName().c_str());
3908 switch ( vcObj
->GetType() )
3910 case wxVCardObject::String
:
3911 case wxVCardObject::UString
:
3914 vcObj
->GetValue(&val
);
3915 value
<< _T('"') << val
<< _T('"');
3919 case wxVCardObject::Int
:
3922 vcObj
->GetValue(&i
);
3923 value
.Printf(_T("%u"), i
);
3927 case wxVCardObject::Long
:
3930 vcObj
->GetValue(&l
);
3931 value
.Printf(_T("%lu"), l
);
3935 case wxVCardObject::None
:
3938 case wxVCardObject::Object
:
3939 value
= _T("<node>");
3943 value
= _T("<unknown value type>");
3947 wxPrintf(_T(" = %s"), value
.c_str());
3950 DumpVObject(level
+ 1, *vcObj
);
3953 vcObj
= vcard
.GetNextProp(&cookie
);
3957 static void DumpVCardAddresses(const wxVCard
& vcard
)
3959 wxPuts(_T("\nShowing all addresses from vCard:\n"));
3963 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3967 int flags
= addr
->GetFlags();
3968 if ( flags
& wxVCardAddress::Domestic
)
3970 flagsStr
<< _T("domestic ");
3972 if ( flags
& wxVCardAddress::Intl
)
3974 flagsStr
<< _T("international ");
3976 if ( flags
& wxVCardAddress::Postal
)
3978 flagsStr
<< _T("postal ");
3980 if ( flags
& wxVCardAddress::Parcel
)
3982 flagsStr
<< _T("parcel ");
3984 if ( flags
& wxVCardAddress::Home
)
3986 flagsStr
<< _T("home ");
3988 if ( flags
& wxVCardAddress::Work
)
3990 flagsStr
<< _T("work ");
3993 wxPrintf(_T("Address %u:\n")
3995 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3998 addr
->GetPostOffice().c_str(),
3999 addr
->GetExtAddress().c_str(),
4000 addr
->GetStreet().c_str(),
4001 addr
->GetLocality().c_str(),
4002 addr
->GetRegion().c_str(),
4003 addr
->GetPostalCode().c_str(),
4004 addr
->GetCountry().c_str()
4008 addr
= vcard
.GetNextAddress(&cookie
);
4012 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
4014 wxPuts(_T("\nShowing all phone numbers from vCard:\n"));
4018 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
4022 int flags
= phone
->GetFlags();
4023 if ( flags
& wxVCardPhoneNumber::Voice
)
4025 flagsStr
<< _T("voice ");
4027 if ( flags
& wxVCardPhoneNumber::Fax
)
4029 flagsStr
<< _T("fax ");
4031 if ( flags
& wxVCardPhoneNumber::Cellular
)
4033 flagsStr
<< _T("cellular ");
4035 if ( flags
& wxVCardPhoneNumber::Modem
)
4037 flagsStr
<< _T("modem ");
4039 if ( flags
& wxVCardPhoneNumber::Home
)
4041 flagsStr
<< _T("home ");
4043 if ( flags
& wxVCardPhoneNumber::Work
)
4045 flagsStr
<< _T("work ");
4048 wxPrintf(_T("Phone number %u:\n")
4053 phone
->GetNumber().c_str()
4057 phone
= vcard
.GetNextPhoneNumber(&cookie
);
4061 static void TestVCardRead()
4063 wxPuts(_T("*** Testing wxVCard reading ***\n"));
4065 wxVCard
vcard(_T("vcard.vcf"));
4066 if ( !vcard
.IsOk() )
4068 wxPuts(_T("ERROR: couldn't load vCard."));
4072 // read individual vCard properties
4073 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
4077 vcObj
->GetValue(&value
);
4082 value
= _T("<none>");
4085 wxPrintf(_T("Full name retrieved directly: %s\n"), value
.c_str());
4088 if ( !vcard
.GetFullName(&value
) )
4090 value
= _T("<none>");
4093 wxPrintf(_T("Full name from wxVCard API: %s\n"), value
.c_str());
4095 // now show how to deal with multiply occuring properties
4096 DumpVCardAddresses(vcard
);
4097 DumpVCardPhoneNumbers(vcard
);
4099 // and finally show all
4100 wxPuts(_T("\nNow dumping the entire vCard:\n")
4101 "-----------------------------\n");
4103 DumpVObject(0, vcard
);
4107 static void TestVCardWrite()
4109 wxPuts(_T("*** Testing wxVCard writing ***\n"));
4112 if ( !vcard
.IsOk() )
4114 wxPuts(_T("ERROR: couldn't create vCard."));
4119 vcard
.SetName("Zeitlin", "Vadim");
4120 vcard
.SetFullName("Vadim Zeitlin");
4121 vcard
.SetOrganization("wxWindows", "R&D");
4123 // just dump the vCard back
4124 wxPuts(_T("Entire vCard follows:\n"));
4125 wxPuts(vcard
.Write());
4129 #endif // TEST_VCARD
4131 // ----------------------------------------------------------------------------
4133 // ----------------------------------------------------------------------------
4135 #if !defined(__WIN32__) || !wxUSE_FSVOLUME
4141 #include "wx/volume.h"
4143 static const wxChar
*volumeKinds
[] =
4149 _T("network volume"),
4153 static void TestFSVolume()
4155 wxPuts(_T("*** Testing wxFSVolume class ***"));
4157 wxArrayString volumes
= wxFSVolume::GetVolumes();
4158 size_t count
= volumes
.GetCount();
4162 wxPuts(_T("ERROR: no mounted volumes?"));
4166 wxPrintf(_T("%u mounted volumes found:\n"), count
);
4168 for ( size_t n
= 0; n
< count
; n
++ )
4170 wxFSVolume
vol(volumes
[n
]);
4173 wxPuts(_T("ERROR: couldn't create volume"));
4177 wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
4179 vol
.GetDisplayName().c_str(),
4180 vol
.GetName().c_str(),
4181 volumeKinds
[vol
.GetKind()],
4182 vol
.IsWritable() ? _T("rw") : _T("ro"),
4183 vol
.GetFlags() & wxFS_VOL_REMOVABLE
? _T("removable")
4188 #endif // TEST_VOLUME
4190 // ----------------------------------------------------------------------------
4191 // wide char and Unicode support
4192 // ----------------------------------------------------------------------------
4196 static void TestUnicodeToFromAscii()
4198 wxPuts(_T("Testing wxString::To/FromAscii()\n"));
4200 static const char *msg
= "Hello, world!";
4201 wxString s
= wxString::FromAscii(msg
);
4203 wxPrintf(_T("Message in Unicode: %s\n"), s
.c_str());
4204 printf("Message in ASCII: %s\n", (const char *)s
.ToAscii());
4206 wxPutchar(_T('\n'));
4209 #endif // TEST_UNICODE
4213 #include "wx/strconv.h"
4214 #include "wx/fontenc.h"
4215 #include "wx/encconv.h"
4216 #include "wx/buffer.h"
4218 static const unsigned char utf8koi8r
[] =
4220 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
4221 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
4222 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
4223 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
4224 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
4225 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
4226 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
4229 static const unsigned char utf8iso8859_1
[] =
4231 0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e,
4232 0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65,
4233 0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65,
4234 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65,
4235 0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0
4238 static const unsigned char utf8Invalid
[] =
4240 0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30,
4241 0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6,
4242 0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88,
4243 0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70,
4247 static const struct Utf8Data
4249 const unsigned char *text
;
4251 const wxChar
*charset
;
4252 wxFontEncoding encoding
;
4255 { utf8Invalid
, WXSIZEOF(utf8Invalid
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
4256 { utf8koi8r
, WXSIZEOF(utf8koi8r
), _T("koi8-r"), wxFONTENCODING_KOI8
},
4257 { utf8iso8859_1
, WXSIZEOF(utf8iso8859_1
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
4260 static void TestUtf8()
4262 wxPuts(_T("*** Testing UTF8 support ***\n"));
4267 for ( size_t n
= 0; n
< WXSIZEOF(utf8data
); n
++ )
4269 const Utf8Data
& u8d
= utf8data
[n
];
4270 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)u8d
.text
,
4271 WXSIZEOF(wbuf
)) == (size_t)-1 )
4273 wxPuts(_T("ERROR: UTF-8 decoding failed."));
4277 wxCSConv
conv(u8d
.charset
);
4278 if ( conv
.WC2MB(buf
, wbuf
, WXSIZEOF(buf
)) == (size_t)-1 )
4280 wxPrintf(_T("ERROR: conversion to %s failed.\n"), u8d
.charset
);
4284 wxPrintf(_T("String in %s: %s\n"), u8d
.charset
, buf
);
4288 wxString
s(wxConvUTF8
.cMB2WC((const char *)u8d
.text
), *wxConvCurrent
);
4290 s
= _T("<< conversion failed >>");
4291 wxPrintf(_T("String in current cset: %s\n"), s
.c_str());
4298 static void TestEncodingConverter()
4300 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
4302 // using wxEncodingConverter should give the same result as above
4305 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)utf8koi8r
,
4306 WXSIZEOF(utf8koi8r
)) == (size_t)-1 )
4308 wxPuts(_T("ERROR: UTF-8 decoding failed."));
4312 wxEncodingConverter ec
;
4313 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
4314 ec
.Convert(wbuf
, buf
);
4315 wxPrintf(_T("The same KOI8-R string using wxEC: %s\n"), buf
);
4321 #endif // TEST_WCHAR
4323 // ----------------------------------------------------------------------------
4325 // ----------------------------------------------------------------------------
4329 #include "wx/filesys.h"
4330 #include "wx/fs_zip.h"
4331 #include "wx/zipstrm.h"
4333 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
4335 static void TestZipStreamRead()
4337 wxPuts(_T("*** Testing ZIP reading ***\n"));
4339 static const wxChar
*filename
= _T("foo");
4340 wxZipInputStream
istr(TESTFILE_ZIP
, filename
);
4341 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
4343 wxPrintf(_T("Dumping the file '%s':\n"), filename
);
4344 while ( !istr
.Eof() )
4346 putchar(istr
.GetC());
4350 wxPuts(_T("\n----- done ------"));
4353 static void DumpZipDirectory(wxFileSystem
& fs
,
4354 const wxString
& dir
,
4355 const wxString
& indent
)
4357 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
4358 TESTFILE_ZIP
, dir
.c_str());
4359 wxString wildcard
= prefix
+ _T("/*");
4361 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
4362 while ( !dirname
.empty() )
4364 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
4366 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
4371 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
4373 DumpZipDirectory(fs
, dirname
,
4374 indent
+ wxString(_T(' '), 4));
4376 dirname
= fs
.FindNext();
4379 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
4380 while ( !filename
.empty() )
4382 if ( !filename
.StartsWith(prefix
, &filename
) )
4384 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
4389 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
4391 filename
= fs
.FindNext();
4395 static void TestZipFileSystem()
4397 wxPuts(_T("*** Testing ZIP file system ***\n"));
4399 wxFileSystem::AddHandler(new wxZipFSHandler
);
4401 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
4403 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
4408 // ----------------------------------------------------------------------------
4410 // ----------------------------------------------------------------------------
4414 #include "wx/zstream.h"
4415 #include "wx/wfstream.h"
4417 static const wxChar
*FILENAME_GZ
= _T("test.gz");
4418 static const wxChar
*TEST_DATA
= _T("hello and hello and hello and hello and hello");
4420 static void TestZlibStreamWrite()
4422 wxPuts(_T("*** Testing Zlib stream reading ***\n"));
4424 wxFileOutputStream
fileOutStream(FILENAME_GZ
);
4425 wxZlibOutputStream
ostr(fileOutStream
);
4426 wxPrintf(_T("Compressing the test string... "));
4427 ostr
.Write(TEST_DATA
, wxStrlen(TEST_DATA
) + 1);
4430 wxPuts(_T("(ERROR: failed)"));
4437 wxPuts(_T("\n----- done ------"));
4440 static void TestZlibStreamRead()
4442 wxPuts(_T("*** Testing Zlib stream reading ***\n"));
4444 wxFileInputStream
fileInStream(FILENAME_GZ
);
4445 wxZlibInputStream
istr(fileInStream
);
4446 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
4448 wxPuts(_T("Dumping the file:"));
4449 while ( !istr
.Eof() )
4451 putchar(istr
.GetC());
4455 wxPuts(_T("\n----- done ------"));
4460 // ----------------------------------------------------------------------------
4462 // ----------------------------------------------------------------------------
4464 #ifdef TEST_DATETIME
4468 #include "wx/datetime.h"
4473 wxDateTime::wxDateTime_t day
;
4474 wxDateTime::Month month
;
4476 wxDateTime::wxDateTime_t hour
, min
, sec
;
4478 wxDateTime::WeekDay wday
;
4479 time_t gmticks
, ticks
;
4481 void Init(const wxDateTime::Tm
& tm
)
4490 gmticks
= ticks
= -1;
4493 wxDateTime
DT() const
4494 { return wxDateTime(day
, month
, year
, hour
, min
, sec
); }
4496 bool SameDay(const wxDateTime::Tm
& tm
) const
4498 return day
== tm
.mday
&& month
== tm
.mon
&& year
== tm
.year
;
4501 wxString
Format() const
4504 s
.Printf(_T("%02d:%02d:%02d %10s %02d, %4d%s"),
4506 wxDateTime::GetMonthName(month
).c_str(),
4508 abs(wxDateTime::ConvertYearToBC(year
)),
4509 year
> 0 ? _T("AD") : _T("BC"));
4513 wxString
FormatDate() const
4516 s
.Printf(_T("%02d-%s-%4d%s"),
4518 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
4519 abs(wxDateTime::ConvertYearToBC(year
)),
4520 year
> 0 ? _T("AD") : _T("BC"));
4525 static const Date testDates
[] =
4527 { 1, wxDateTime::Jan
, 1970, 00, 00, 00, 2440587.5, wxDateTime::Thu
, 0, -3600 },
4528 { 7, wxDateTime::Feb
, 2036, 00, 00, 00, 2464730.5, wxDateTime::Thu
, -1, -1 },
4529 { 8, wxDateTime::Feb
, 2036, 00, 00, 00, 2464731.5, wxDateTime::Fri
, -1, -1 },
4530 { 1, wxDateTime::Jan
, 2037, 00, 00, 00, 2465059.5, wxDateTime::Thu
, -1, -1 },
4531 { 1, wxDateTime::Jan
, 2038, 00, 00, 00, 2465424.5, wxDateTime::Fri
, -1, -1 },
4532 { 21, wxDateTime::Jan
, 2222, 00, 00, 00, 2532648.5, wxDateTime::Mon
, -1, -1 },
4533 { 29, wxDateTime::May
, 1976, 12, 00, 00, 2442928.0, wxDateTime::Sat
, 202219200, 202212000 },
4534 { 29, wxDateTime::Feb
, 1976, 00, 00, 00, 2442837.5, wxDateTime::Sun
, 194400000, 194396400 },
4535 { 1, wxDateTime::Jan
, 1900, 12, 00, 00, 2415021.0, wxDateTime::Mon
, -1, -1 },
4536 { 1, wxDateTime::Jan
, 1900, 00, 00, 00, 2415020.5, wxDateTime::Mon
, -1, -1 },
4537 { 15, wxDateTime::Oct
, 1582, 00, 00, 00, 2299160.5, wxDateTime::Fri
, -1, -1 },
4538 { 4, wxDateTime::Oct
, 1582, 00, 00, 00, 2299149.5, wxDateTime::Mon
, -1, -1 },
4539 { 1, wxDateTime::Mar
, 1, 00, 00, 00, 1721484.5, wxDateTime::Thu
, -1, -1 },
4540 { 1, wxDateTime::Jan
, 1, 00, 00, 00, 1721425.5, wxDateTime::Mon
, -1, -1 },
4541 { 31, wxDateTime::Dec
, 0, 00, 00, 00, 1721424.5, wxDateTime::Sun
, -1, -1 },
4542 { 1, wxDateTime::Jan
, 0, 00, 00, 00, 1721059.5, wxDateTime::Sat
, -1, -1 },
4543 { 12, wxDateTime::Aug
, -1234, 00, 00, 00, 1270573.5, wxDateTime::Fri
, -1, -1 },
4544 { 12, wxDateTime::Aug
, -4000, 00, 00, 00, 260313.5, wxDateTime::Sat
, -1, -1 },
4545 { 24, wxDateTime::Nov
, -4713, 00, 00, 00, -0.5, wxDateTime::Mon
, -1, -1 },
4548 // this test miscellaneous static wxDateTime functions
4549 static void TestTimeStatic()
4551 wxPuts(_T("\n*** wxDateTime static methods test ***"));
4553 // some info about the current date
4554 int year
= wxDateTime::GetCurrentYear();
4555 wxPrintf(_T("Current year %d is %sa leap one and has %d days.\n"),
4557 wxDateTime::IsLeapYear(year
) ? "" : "not ",
4558 wxDateTime::GetNumberOfDays(year
));
4560 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
4561 wxPrintf(_T("Current month is '%s' ('%s') and it has %d days\n"),
4562 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
4563 wxDateTime::GetMonthName(month
).c_str(),
4564 wxDateTime::GetNumberOfDays(month
));
4567 static const size_t nYears
= 5;
4568 static const size_t years
[2][nYears
] =
4570 // first line: the years to test
4571 { 1990, 1976, 2000, 2030, 1984, },
4573 // second line: true if leap, false otherwise
4574 { false, true, true, false, true }
4577 for ( size_t n
= 0; n
< nYears
; n
++ )
4579 int year
= years
[0][n
];
4580 bool should
= years
[1][n
] != 0,
4581 is
= wxDateTime::IsLeapYear(year
);
4583 wxPrintf(_T("Year %d is %sa leap year (%s)\n"),
4586 should
== is
? "ok" : "ERROR");
4588 wxASSERT( should
== wxDateTime::IsLeapYear(year
) );
4592 // test constructing wxDateTime objects
4593 static void TestTimeSet()
4595 wxPuts(_T("\n*** wxDateTime construction test ***"));
4597 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4599 const Date
& d1
= testDates
[n
];
4600 wxDateTime dt
= d1
.DT();
4603 d2
.Init(dt
.GetTm());
4605 wxString s1
= d1
.Format(),
4608 wxPrintf(_T("Date: %s == %s (%s)\n"),
4609 s1
.c_str(), s2
.c_str(),
4610 s1
== s2
? _T("ok") : _T("ERROR"));
4614 // test time zones stuff
4615 static void TestTimeZones()
4617 wxPuts(_T("\n*** wxDateTime timezone test ***"));
4619 wxDateTime now
= wxDateTime::Now();
4621 wxPrintf(_T("Current GMT time:\t%s\n"), now
.Format(_T("%c"), wxDateTime::GMT0
).c_str());
4622 wxPrintf(_T("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::GMT0
).c_str());
4623 wxPrintf(_T("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::EST
).c_str());
4624 wxPrintf(_T("Current time in Paris:\t%s\n"), now
.Format(_T("%c"), wxDateTime::CET
).c_str());
4625 wxPrintf(_T(" Moscow:\t%s\n"), now
.Format(_T("%c"), wxDateTime::MSK
).c_str());
4626 wxPrintf(_T(" New York:\t%s\n"), now
.Format(_T("%c"), wxDateTime::EST
).c_str());
4628 wxDateTime::Tm tm
= now
.GetTm();
4629 if ( wxDateTime(tm
) != now
)
4631 wxPrintf(_T("ERROR: got %s instead of %s\n"),
4632 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
4636 // test some minimal support for the dates outside the standard range
4637 static void TestTimeRange()
4639 wxPuts(_T("\n*** wxDateTime out-of-standard-range dates test ***"));
4641 static const wxChar
*fmt
= _T("%d-%b-%Y %H:%M:%S");
4643 wxPrintf(_T("Unix epoch:\t%s\n"),
4644 wxDateTime(2440587.5).Format(fmt
).c_str());
4645 wxPrintf(_T("Feb 29, 0: \t%s\n"),
4646 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
4647 wxPrintf(_T("JDN 0: \t%s\n"),
4648 wxDateTime(0.0).Format(fmt
).c_str());
4649 wxPrintf(_T("Jan 1, 1AD:\t%s\n"),
4650 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
4651 wxPrintf(_T("May 29, 2099:\t%s\n"),
4652 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
4655 static void TestTimeTicks()
4657 wxPuts(_T("\n*** wxDateTime ticks test ***"));
4659 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4661 const Date
& d
= testDates
[n
];
4662 if ( d
.ticks
== -1 )
4665 wxDateTime dt
= d
.DT();
4666 long ticks
= (dt
.GetValue() / 1000).ToLong();
4667 wxPrintf(_T("Ticks of %s:\t% 10ld"), d
.Format().c_str(), ticks
);
4668 if ( ticks
== d
.ticks
)
4670 wxPuts(_T(" (ok)"));
4674 wxPrintf(_T(" (ERROR: should be %ld, delta = %ld)\n"),
4675 (long)d
.ticks
, (long)(ticks
- d
.ticks
));
4678 dt
= d
.DT().ToTimezone(wxDateTime::GMT0
);
4679 ticks
= (dt
.GetValue() / 1000).ToLong();
4680 wxPrintf(_T("GMtks of %s:\t% 10ld"), d
.Format().c_str(), ticks
);
4681 if ( ticks
== d
.gmticks
)
4683 wxPuts(_T(" (ok)"));
4687 wxPrintf(_T(" (ERROR: should be %ld, delta = %ld)\n"),
4688 (long)d
.gmticks
, (long)(ticks
- d
.gmticks
));
4695 // test conversions to JDN &c
4696 static void TestTimeJDN()
4698 wxPuts(_T("\n*** wxDateTime to JDN test ***"));
4700 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4702 const Date
& d
= testDates
[n
];
4703 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
4704 double jdn
= dt
.GetJulianDayNumber();
4706 wxPrintf(_T("JDN of %s is:\t% 15.6f"), d
.Format().c_str(), jdn
);
4709 wxPuts(_T(" (ok)"));
4713 wxPrintf(_T(" (ERROR: should be %f, delta = %f)\n"),
4714 d
.jdn
, jdn
- d
.jdn
);
4719 // test week days computation
4720 static void TestTimeWDays()
4722 wxPuts(_T("\n*** wxDateTime weekday test ***"));
4724 // test GetWeekDay()
4726 for ( n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4728 const Date
& d
= testDates
[n
];
4729 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
4731 wxDateTime::WeekDay wday
= dt
.GetWeekDay();
4732 wxPrintf(_T("%s is: %s"),
4734 wxDateTime::GetWeekDayName(wday
).c_str());
4735 if ( wday
== d
.wday
)
4737 wxPuts(_T(" (ok)"));
4741 wxPrintf(_T(" (ERROR: should be %s)\n"),
4742 wxDateTime::GetWeekDayName(d
.wday
).c_str());
4748 // test SetToWeekDay()
4749 struct WeekDateTestData
4751 Date date
; // the real date (precomputed)
4752 int nWeek
; // its week index in the month
4753 wxDateTime::WeekDay wday
; // the weekday
4754 wxDateTime::Month month
; // the month
4755 int year
; // and the year
4757 wxString
Format() const
4760 switch ( nWeek
< -1 ? -nWeek
: nWeek
)
4762 case 1: which
= _T("first"); break;
4763 case 2: which
= _T("second"); break;
4764 case 3: which
= _T("third"); break;
4765 case 4: which
= _T("fourth"); break;
4766 case 5: which
= _T("fifth"); break;
4768 case -1: which
= _T("last"); break;
4773 which
+= _T(" from end");
4776 s
.Printf(_T("The %s %s of %s in %d"),
4778 wxDateTime::GetWeekDayName(wday
).c_str(),
4779 wxDateTime::GetMonthName(month
).c_str(),
4786 // the array data was generated by the following python program
4788 from DateTime import *
4789 from whrandom import *
4790 from string import *
4792 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4793 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4795 week = DateTimeDelta(7)
4798 year = randint(1900, 2100)
4799 month = randint(1, 12)
4800 day = randint(1, 28)
4801 dt = DateTime(year, month, day)
4802 wday = dt.day_of_week
4804 countFromEnd = choice([-1, 1])
4807 while dt.month is month:
4808 dt = dt - countFromEnd * week
4809 weekNum = weekNum + countFromEnd
4811 data = { 'day': rjust(`day`, 2), 'month': monthNames[month - 1], 'year': year, 'weekNum': rjust(`weekNum`, 2), 'wday': wdayNames[wday] }
4813 print "{ { %(day)s, wxDateTime::%(month)s, %(year)d }, %(weekNum)d, "\
4814 "wxDateTime::%(wday)s, wxDateTime::%(month)s, %(year)d }," % data
4817 static const WeekDateTestData weekDatesTestData
[] =
4819 { { 20, wxDateTime::Mar
, 2045 }, 3, wxDateTime::Mon
, wxDateTime::Mar
, 2045 },
4820 { { 5, wxDateTime::Jun
, 1985 }, -4, wxDateTime::Wed
, wxDateTime::Jun
, 1985 },
4821 { { 12, wxDateTime::Nov
, 1961 }, -3, wxDateTime::Sun
, wxDateTime::Nov
, 1961 },
4822 { { 27, wxDateTime::Feb
, 2093 }, -1, wxDateTime::Fri
, wxDateTime::Feb
, 2093 },
4823 { { 4, wxDateTime::Jul
, 2070 }, -4, wxDateTime::Fri
, wxDateTime::Jul
, 2070 },
4824 { { 2, wxDateTime::Apr
, 1906 }, -5, wxDateTime::Mon
, wxDateTime::Apr
, 1906 },
4825 { { 19, wxDateTime::Jul
, 2023 }, -2, wxDateTime::Wed
, wxDateTime::Jul
, 2023 },
4826 { { 5, wxDateTime::May
, 1958 }, -4, wxDateTime::Mon
, wxDateTime::May
, 1958 },
4827 { { 11, wxDateTime::Aug
, 1900 }, 2, wxDateTime::Sat
, wxDateTime::Aug
, 1900 },
4828 { { 14, wxDateTime::Feb
, 1945 }, 2, wxDateTime::Wed
, wxDateTime::Feb
, 1945 },
4829 { { 25, wxDateTime::Jul
, 1967 }, -1, wxDateTime::Tue
, wxDateTime::Jul
, 1967 },
4830 { { 9, wxDateTime::May
, 1916 }, -4, wxDateTime::Tue
, wxDateTime::May
, 1916 },
4831 { { 20, wxDateTime::Jun
, 1927 }, 3, wxDateTime::Mon
, wxDateTime::Jun
, 1927 },
4832 { { 2, wxDateTime::Aug
, 2000 }, 1, wxDateTime::Wed
, wxDateTime::Aug
, 2000 },
4833 { { 20, wxDateTime::Apr
, 2044 }, 3, wxDateTime::Wed
, wxDateTime::Apr
, 2044 },
4834 { { 20, wxDateTime::Feb
, 1932 }, -2, wxDateTime::Sat
, wxDateTime::Feb
, 1932 },
4835 { { 25, wxDateTime::Jul
, 2069 }, 4, wxDateTime::Thu
, wxDateTime::Jul
, 2069 },
4836 { { 3, wxDateTime::Apr
, 1925 }, 1, wxDateTime::Fri
, wxDateTime::Apr
, 1925 },
4837 { { 21, wxDateTime::Mar
, 2093 }, 3, wxDateTime::Sat
, wxDateTime::Mar
, 2093 },
4838 { { 3, wxDateTime::Dec
, 2074 }, -5, wxDateTime::Mon
, wxDateTime::Dec
, 2074 },
4841 static const wxChar
*fmt
= _T("%d-%b-%Y");
4844 for ( n
= 0; n
< WXSIZEOF(weekDatesTestData
); n
++ )
4846 const WeekDateTestData
& wd
= weekDatesTestData
[n
];
4848 dt
.SetToWeekDay(wd
.wday
, wd
.nWeek
, wd
.month
, wd
.year
);
4850 wxPrintf(_T("%s is %s"), wd
.Format().c_str(), dt
.Format(fmt
).c_str());
4852 const Date
& d
= wd
.date
;
4853 if ( d
.SameDay(dt
.GetTm()) )
4855 wxPuts(_T(" (ok)"));
4859 dt
.Set(d
.day
, d
.month
, d
.year
);
4861 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.Format(fmt
).c_str());
4866 // test the computation of (ISO) week numbers
4867 static void TestTimeWNumber()
4869 wxPuts(_T("\n*** wxDateTime week number test ***"));
4871 struct WeekNumberTestData
4873 Date date
; // the date
4874 wxDateTime::wxDateTime_t week
; // the week number in the year
4875 wxDateTime::wxDateTime_t wmon
; // the week number in the month
4876 wxDateTime::wxDateTime_t wmon2
; // same but week starts with Sun
4877 wxDateTime::wxDateTime_t dnum
; // day number in the year
4880 // data generated with the following python script:
4882 from DateTime import *
4883 from whrandom import *
4884 from string import *
4886 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4887 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4889 def GetMonthWeek(dt):
4890 weekNumMonth = dt.iso_week[1] - DateTime(dt.year, dt.month, 1).iso_week[1] + 1
4891 if weekNumMonth < 0:
4892 weekNumMonth = weekNumMonth + 53
4895 def GetLastSundayBefore(dt):
4896 if dt.iso_week[2] == 7:
4899 return dt - DateTimeDelta(dt.iso_week[2])
4902 year = randint(1900, 2100)
4903 month = randint(1, 12)
4904 day = randint(1, 28)
4905 dt = DateTime(year, month, day)
4906 dayNum = dt.day_of_year
4907 weekNum = dt.iso_week[1]
4908 weekNumMonth = GetMonthWeek(dt)
4911 dtSunday = GetLastSundayBefore(dt)
4913 while dtSunday >= GetLastSundayBefore(DateTime(dt.year, dt.month, 1)):
4914 weekNumMonth2 = weekNumMonth2 + 1
4915 dtSunday = dtSunday - DateTimeDelta(7)
4917 data = { 'day': rjust(`day`, 2), \
4918 'month': monthNames[month - 1], \
4920 'weekNum': rjust(`weekNum`, 2), \
4921 'weekNumMonth': weekNumMonth, \
4922 'weekNumMonth2': weekNumMonth2, \
4923 'dayNum': rjust(`dayNum`, 3) }
4925 print " { { %(day)s, "\
4926 "wxDateTime::%(month)s, "\
4929 "%(weekNumMonth)s, "\
4930 "%(weekNumMonth2)s, "\
4931 "%(dayNum)s }," % data
4934 static const WeekNumberTestData weekNumberTestDates
[] =
4936 { { 27, wxDateTime::Dec
, 1966 }, 52, 5, 5, 361 },
4937 { { 22, wxDateTime::Jul
, 1926 }, 29, 4, 4, 203 },
4938 { { 22, wxDateTime::Oct
, 2076 }, 43, 4, 4, 296 },
4939 { { 1, wxDateTime::Jul
, 1967 }, 26, 1, 1, 182 },
4940 { { 8, wxDateTime::Nov
, 2004 }, 46, 2, 2, 313 },
4941 { { 21, wxDateTime::Mar
, 1920 }, 12, 3, 4, 81 },
4942 { { 7, wxDateTime::Jan
, 1965 }, 1, 2, 2, 7 },
4943 { { 19, wxDateTime::Oct
, 1999 }, 42, 4, 4, 292 },
4944 { { 13, wxDateTime::Aug
, 1955 }, 32, 2, 2, 225 },
4945 { { 18, wxDateTime::Jul
, 2087 }, 29, 3, 3, 199 },
4946 { { 2, wxDateTime::Sep
, 2028 }, 35, 1, 1, 246 },
4947 { { 28, wxDateTime::Jul
, 1945 }, 30, 5, 4, 209 },
4948 { { 15, wxDateTime::Jun
, 1901 }, 24, 3, 3, 166 },
4949 { { 10, wxDateTime::Oct
, 1939 }, 41, 3, 2, 283 },
4950 { { 3, wxDateTime::Dec
, 1965 }, 48, 1, 1, 337 },
4951 { { 23, wxDateTime::Feb
, 1940 }, 8, 4, 4, 54 },
4952 { { 2, wxDateTime::Jan
, 1987 }, 1, 1, 1, 2 },
4953 { { 11, wxDateTime::Aug
, 2079 }, 32, 2, 2, 223 },
4954 { { 2, wxDateTime::Feb
, 2063 }, 5, 1, 1, 33 },
4955 { { 16, wxDateTime::Oct
, 1942 }, 42, 3, 3, 289 },
4958 for ( size_t n
= 0; n
< WXSIZEOF(weekNumberTestDates
); n
++ )
4960 const WeekNumberTestData
& wn
= weekNumberTestDates
[n
];
4961 const Date
& d
= wn
.date
;
4963 wxDateTime dt
= d
.DT();
4965 wxDateTime::wxDateTime_t
4966 week
= dt
.GetWeekOfYear(wxDateTime::Monday_First
),
4967 wmon
= dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4968 wmon2
= dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4969 dnum
= dt
.GetDayOfYear();
4971 wxPrintf(_T("%s: the day number is %d"), d
.FormatDate().c_str(), dnum
);
4972 if ( dnum
== wn
.dnum
)
4974 wxPrintf(_T(" (ok)"));
4978 wxPrintf(_T(" (ERROR: should be %d)"), wn
.dnum
);
4981 wxPrintf(_T(", week in month = %d"), wmon
);
4982 if ( wmon
!= wn
.wmon
)
4984 wxPrintf(_T(" (ERROR: should be %d)"), wn
.wmon
);
4987 wxPrintf(_T(" or %d"), wmon2
);
4988 if ( wmon2
== wn
.wmon2
)
4990 wxPrintf(_T(" (ok)"));
4994 wxPrintf(_T(" (ERROR: should be %d)"), wn
.wmon2
);
4997 wxPrintf(_T(", week in year = %d"), week
);
4998 if ( week
!= wn
.week
)
5000 wxPrintf(_T(" (ERROR: should be %d)"), wn
.week
);
5003 wxPutchar(_T('\n'));
5005 wxDateTime
dt2(1, wxDateTime::Jan
, d
.year
);
5006 dt2
.SetToTheWeek(wn
.week
, dt
.GetWeekDay());
5010 d2
.Init(dt2
.GetTm());
5011 wxPrintf(_T("ERROR: SetToTheWeek() returned %s\n"),
5012 d2
.FormatDate().c_str());
5017 // test DST calculations
5018 static void TestTimeDST()
5020 wxPuts(_T("\n*** wxDateTime DST test ***"));
5022 wxPrintf(_T("DST is%s in effect now.\n\n"),
5023 wxDateTime::Now().IsDST() ? _T("") : _T(" not"));
5025 // taken from http://www.energy.ca.gov/daylightsaving.html
5026 static const Date datesDST
[2][2004 - 1900 + 1] =
5029 { 1, wxDateTime::Apr
, 1990 },
5030 { 7, wxDateTime::Apr
, 1991 },
5031 { 5, wxDateTime::Apr
, 1992 },
5032 { 4, wxDateTime::Apr
, 1993 },
5033 { 3, wxDateTime::Apr
, 1994 },
5034 { 2, wxDateTime::Apr
, 1995 },
5035 { 7, wxDateTime::Apr
, 1996 },
5036 { 6, wxDateTime::Apr
, 1997 },
5037 { 5, wxDateTime::Apr
, 1998 },
5038 { 4, wxDateTime::Apr
, 1999 },
5039 { 2, wxDateTime::Apr
, 2000 },
5040 { 1, wxDateTime::Apr
, 2001 },
5041 { 7, wxDateTime::Apr
, 2002 },
5042 { 6, wxDateTime::Apr
, 2003 },
5043 { 4, wxDateTime::Apr
, 2004 },
5046 { 28, wxDateTime::Oct
, 1990 },
5047 { 27, wxDateTime::Oct
, 1991 },
5048 { 25, wxDateTime::Oct
, 1992 },
5049 { 31, wxDateTime::Oct
, 1993 },
5050 { 30, wxDateTime::Oct
, 1994 },
5051 { 29, wxDateTime::Oct
, 1995 },
5052 { 27, wxDateTime::Oct
, 1996 },
5053 { 26, wxDateTime::Oct
, 1997 },
5054 { 25, wxDateTime::Oct
, 1998 },
5055 { 31, wxDateTime::Oct
, 1999 },
5056 { 29, wxDateTime::Oct
, 2000 },
5057 { 28, wxDateTime::Oct
, 2001 },
5058 { 27, wxDateTime::Oct
, 2002 },
5059 { 26, wxDateTime::Oct
, 2003 },
5060 { 31, wxDateTime::Oct
, 2004 },
5065 for ( year
= 1990; year
< 2005; year
++ )
5067 wxDateTime dtBegin
= wxDateTime::GetBeginDST(year
, wxDateTime::USA
),
5068 dtEnd
= wxDateTime::GetEndDST(year
, wxDateTime::USA
);
5070 wxPrintf(_T("DST period in the US for year %d: from %s to %s"),
5071 year
, dtBegin
.Format().c_str(), dtEnd
.Format().c_str());
5073 size_t n
= year
- 1990;
5074 const Date
& dBegin
= datesDST
[0][n
];
5075 const Date
& dEnd
= datesDST
[1][n
];
5077 if ( dBegin
.SameDay(dtBegin
.GetTm()) && dEnd
.SameDay(dtEnd
.GetTm()) )
5079 wxPuts(_T(" (ok)"));
5083 wxPrintf(_T(" (ERROR: should be %s %d to %s %d)\n"),
5084 wxDateTime::GetMonthName(dBegin
.month
).c_str(), dBegin
.day
,
5085 wxDateTime::GetMonthName(dEnd
.month
).c_str(), dEnd
.day
);
5091 for ( year
= 1990; year
< 2005; year
++ )
5093 wxPrintf(_T("DST period in Europe for year %d: from %s to %s\n"),
5095 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
5096 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
5100 // test wxDateTime -> text conversion
5101 static void TestTimeFormat()
5103 wxPuts(_T("\n*** wxDateTime formatting test ***"));
5105 // some information may be lost during conversion, so store what kind
5106 // of info should we recover after a round trip
5109 CompareNone
, // don't try comparing
5110 CompareBoth
, // dates and times should be identical
5111 CompareDate
, // dates only
5112 CompareTime
// time only
5117 CompareKind compareKind
;
5118 const wxChar
*format
;
5119 } formatTestFormats
[] =
5121 { CompareBoth
, _T("---> %c") },
5122 { CompareDate
, _T("Date is %A, %d of %B, in year %Y") },
5123 { CompareBoth
, _T("Date is %x, time is %X") },
5124 { CompareTime
, _T("Time is %H:%M:%S or %I:%M:%S %p") },
5125 { CompareNone
, _T("The day of year: %j, the week of year: %W") },
5126 { CompareDate
, _T("ISO date without separators: %Y%m%d") },
5129 static const Date formatTestDates
[] =
5131 { 29, wxDateTime::May
, 1976, 18, 30, 00 },
5132 { 31, wxDateTime::Dec
, 1999, 23, 30, 00 },
5134 // this test can't work for other centuries because it uses two digit
5135 // years in formats, so don't even try it
5136 { 29, wxDateTime::May
, 2076, 18, 30, 00 },
5137 { 29, wxDateTime::Feb
, 2400, 02, 15, 25 },
5138 { 01, wxDateTime::Jan
, -52, 03, 16, 47 },
5142 // an extra test (as it doesn't depend on date, don't do it in the loop)
5143 wxPrintf(_T("%s\n"), wxDateTime::Now().Format(_T("Our timezone is %Z")).c_str());
5145 for ( size_t d
= 0; d
< WXSIZEOF(formatTestDates
) + 1; d
++ )
5149 wxDateTime dt
= d
== 0 ? wxDateTime::Now() : formatTestDates
[d
- 1].DT();
5150 for ( size_t n
= 0; n
< WXSIZEOF(formatTestFormats
); n
++ )
5152 wxString s
= dt
.Format(formatTestFormats
[n
].format
);
5153 wxPrintf(_T("%s"), s
.c_str());
5155 // what can we recover?
5156 int kind
= formatTestFormats
[n
].compareKind
;
5160 const wxChar
*result
= dt2
.ParseFormat(s
, formatTestFormats
[n
].format
);
5163 // converion failed - should it have?
5164 if ( kind
== CompareNone
)
5165 wxPuts(_T(" (ok)"));
5167 wxPuts(_T(" (ERROR: conversion back failed)"));
5171 // should have parsed the entire string
5172 wxPuts(_T(" (ERROR: conversion back stopped too soon)"));
5176 bool equal
= false; // suppress compilaer warning
5184 equal
= dt
.IsSameDate(dt2
);
5188 equal
= dt
.IsSameTime(dt2
);
5194 wxPrintf(_T(" (ERROR: got back '%s' instead of '%s')\n"),
5195 dt2
.Format().c_str(), dt
.Format().c_str());
5199 wxPuts(_T(" (ok)"));
5206 // test text -> wxDateTime conversion
5207 static void TestTimeParse()
5209 wxPuts(_T("\n*** wxDateTime parse test ***"));
5211 struct ParseTestData
5213 const wxChar
*format
;
5218 static const ParseTestData parseTestDates
[] =
5220 { _T("Sat, 18 Dec 1999 00:46:40 +0100"), { 18, wxDateTime::Dec
, 1999, 00, 46, 40 }, true },
5221 { _T("Wed, 1 Dec 1999 05:17:20 +0300"), { 1, wxDateTime::Dec
, 1999, 03, 17, 20 }, true },
5224 for ( size_t n
= 0; n
< WXSIZEOF(parseTestDates
); n
++ )
5226 const wxChar
*format
= parseTestDates
[n
].format
;
5228 wxPrintf(_T("%s => "), format
);
5231 if ( dt
.ParseRfc822Date(format
) )
5233 wxPrintf(_T("%s "), dt
.Format().c_str());
5235 if ( parseTestDates
[n
].good
)
5237 wxDateTime dtReal
= parseTestDates
[n
].date
.DT();
5244 wxPrintf(_T("(ERROR: should be %s)\n"), dtReal
.Format().c_str());
5249 wxPuts(_T("(ERROR: bad format)"));
5254 wxPrintf(_T("bad format (%s)\n"),
5255 parseTestDates
[n
].good
? "ERROR" : "ok");
5260 static void TestDateTimeInteractive()
5262 wxPuts(_T("\n*** interactive wxDateTime tests ***"));
5268 wxPrintf(_T("Enter a date: "));
5269 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
5272 // kill the last '\n'
5273 buf
[wxStrlen(buf
) - 1] = 0;
5276 const wxChar
*p
= dt
.ParseDate(buf
);
5279 wxPrintf(_T("ERROR: failed to parse the date '%s'.\n"), buf
);
5285 wxPrintf(_T("WARNING: parsed only first %u characters.\n"), p
- buf
);
5288 wxPrintf(_T("%s: day %u, week of month %u/%u, week of year %u\n"),
5289 dt
.Format(_T("%b %d, %Y")).c_str(),
5291 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
5292 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
5293 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
5296 wxPuts(_T("\n*** done ***"));
5299 static void TestTimeMS()
5301 wxPuts(_T("*** testing millisecond-resolution support in wxDateTime ***"));
5303 wxDateTime dt1
= wxDateTime::Now(),
5304 dt2
= wxDateTime::UNow();
5306 wxPrintf(_T("Now = %s\n"), dt1
.Format(_T("%H:%M:%S:%l")).c_str());
5307 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
5308 wxPrintf(_T("Dummy loop: "));
5309 for ( int i
= 0; i
< 6000; i
++ )
5311 //for ( int j = 0; j < 10; j++ )
5314 s
.Printf(_T("%g"), sqrt(i
));
5320 wxPuts(_T(", done"));
5323 dt2
= wxDateTime::UNow();
5324 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
5326 wxPrintf(_T("Loop executed in %s ms\n"), (dt2
- dt1
).Format(_T("%l")).c_str());
5328 wxPuts(_T("\n*** done ***"));
5331 static void TestTimeArithmetics()
5333 wxPuts(_T("\n*** testing arithmetic operations on wxDateTime ***"));
5335 static const struct ArithmData
5337 ArithmData(const wxDateSpan
& sp
, const wxChar
*nam
)
5338 : span(sp
), name(nam
) { }
5342 } testArithmData
[] =
5344 ArithmData(wxDateSpan::Day(), _T("day")),
5345 ArithmData(wxDateSpan::Week(), _T("week")),
5346 ArithmData(wxDateSpan::Month(), _T("month")),
5347 ArithmData(wxDateSpan::Year(), _T("year")),
5348 ArithmData(wxDateSpan(1, 2, 3, 4), _T("year, 2 months, 3 weeks, 4 days")),
5351 wxDateTime
dt(29, wxDateTime::Dec
, 1999), dt1
, dt2
;
5353 for ( size_t n
= 0; n
< WXSIZEOF(testArithmData
); n
++ )
5355 wxDateSpan span
= testArithmData
[n
].span
;
5359 const wxChar
*name
= testArithmData
[n
].name
;
5360 wxPrintf(_T("%s + %s = %s, %s - %s = %s\n"),
5361 dt
.FormatISODate().c_str(), name
, dt1
.FormatISODate().c_str(),
5362 dt
.FormatISODate().c_str(), name
, dt2
.FormatISODate().c_str());
5364 wxPrintf(_T("Going back: %s"), (dt1
- span
).FormatISODate().c_str());
5365 if ( dt1
- span
== dt
)
5367 wxPuts(_T(" (ok)"));
5371 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.FormatISODate().c_str());
5374 wxPrintf(_T("Going forward: %s"), (dt2
+ span
).FormatISODate().c_str());
5375 if ( dt2
+ span
== dt
)
5377 wxPuts(_T(" (ok)"));
5381 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.FormatISODate().c_str());
5384 wxPrintf(_T("Double increment: %s"), (dt2
+ 2*span
).FormatISODate().c_str());
5385 if ( dt2
+ 2*span
== dt1
)
5387 wxPuts(_T(" (ok)"));
5391 wxPrintf(_T(" (ERROR: should be %s)\n"), dt2
.FormatISODate().c_str());
5398 static void TestTimeHolidays()
5400 wxPuts(_T("\n*** testing wxDateTimeHolidayAuthority ***\n"));
5402 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
5403 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
5404 dtEnd
= dtStart
.GetLastMonthDay();
5406 wxDateTimeArray hol
;
5407 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
5409 const wxChar
*format
= _T("%d-%b-%Y (%a)");
5411 wxPrintf(_T("All holidays between %s and %s:\n"),
5412 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
5414 size_t count
= hol
.GetCount();
5415 for ( size_t n
= 0; n
< count
; n
++ )
5417 wxPrintf(_T("\t%s\n"), hol
[n
].Format(format
).c_str());
5423 static void TestTimeZoneBug()
5425 wxPuts(_T("\n*** testing for DST/timezone bug ***\n"));
5427 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
5428 for ( int i
= 0; i
< 31; i
++ )
5430 wxPrintf(_T("Date %s: week day %s.\n"),
5431 date
.Format(_T("%d-%m-%Y")).c_str(),
5432 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
5434 date
+= wxDateSpan::Day();
5440 static void TestTimeSpanFormat()
5442 wxPuts(_T("\n*** wxTimeSpan tests ***"));
5444 static const wxChar
*formats
[] =
5446 _T("(default) %H:%M:%S"),
5447 _T("%E weeks and %D days"),
5448 _T("%l milliseconds"),
5449 _T("(with ms) %H:%M:%S:%l"),
5450 _T("100%% of minutes is %M"), // test "%%"
5451 _T("%D days and %H hours"),
5452 _T("or also %S seconds"),
5455 wxTimeSpan
ts1(1, 2, 3, 4),
5457 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
5459 wxPrintf(_T("ts1 = %s\tts2 = %s\n"),
5460 ts1
.Format(formats
[n
]).c_str(),
5461 ts2
.Format(formats
[n
]).c_str());
5467 #endif // TEST_DATETIME
5469 // ----------------------------------------------------------------------------
5470 // wxTextInput/OutputStream
5471 // ----------------------------------------------------------------------------
5473 #ifdef TEST_TEXTSTREAM
5475 #include "wx/txtstrm.h"
5476 #include "wx/wfstream.h"
5478 static void TestTextInputStream()
5480 wxPuts(_T("\n*** wxTextInputStream test ***"));
5482 wxFileInputStream
fsIn(_T("testdata.fc"));
5485 wxPuts(_T("ERROR: couldn't open file."));
5489 wxTextInputStream
tis(fsIn
);
5494 const wxString s
= tis
.ReadLine();
5496 // line could be non empty if the last line of the file isn't
5497 // terminated with EOL
5498 if ( fsIn
.Eof() && s
.empty() )
5501 wxPrintf(_T("Line %d: %s\n"), line
++, s
.c_str());
5506 #endif // TEST_TEXTSTREAM
5508 // ----------------------------------------------------------------------------
5510 // ----------------------------------------------------------------------------
5514 #include "wx/thread.h"
5516 static size_t gs_counter
= (size_t)-1;
5517 static wxCriticalSection gs_critsect
;
5518 static wxSemaphore gs_cond
;
5520 class MyJoinableThread
: public wxThread
5523 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
5524 { m_n
= n
; Create(); }
5526 // thread execution starts here
5527 virtual ExitCode
Entry();
5533 wxThread::ExitCode
MyJoinableThread::Entry()
5535 unsigned long res
= 1;
5536 for ( size_t n
= 1; n
< m_n
; n
++ )
5540 // it's a loooong calculation :-)
5544 return (ExitCode
)res
;
5547 class MyDetachedThread
: public wxThread
5550 MyDetachedThread(size_t n
, wxChar ch
)
5554 m_cancelled
= false;
5559 // thread execution starts here
5560 virtual ExitCode
Entry();
5563 virtual void OnExit();
5566 size_t m_n
; // number of characters to write
5567 wxChar m_ch
; // character to write
5569 bool m_cancelled
; // false if we exit normally
5572 wxThread::ExitCode
MyDetachedThread::Entry()
5575 wxCriticalSectionLocker
lock(gs_critsect
);
5576 if ( gs_counter
== (size_t)-1 )
5582 for ( size_t n
= 0; n
< m_n
; n
++ )
5584 if ( TestDestroy() )
5594 wxThread::Sleep(100);
5600 void MyDetachedThread::OnExit()
5602 wxLogTrace(_T("thread"), _T("Thread %ld is in OnExit"), GetId());
5604 wxCriticalSectionLocker
lock(gs_critsect
);
5605 if ( !--gs_counter
&& !m_cancelled
)
5609 static void TestDetachedThreads()
5611 wxPuts(_T("\n*** Testing detached threads ***"));
5613 static const size_t nThreads
= 3;
5614 MyDetachedThread
*threads
[nThreads
];
5616 for ( n
= 0; n
< nThreads
; n
++ )
5618 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
5621 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
5622 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
5624 for ( n
= 0; n
< nThreads
; n
++ )
5629 // wait until all threads terminate
5635 static void TestJoinableThreads()
5637 wxPuts(_T("\n*** Testing a joinable thread (a loooong calculation...) ***"));
5639 // calc 10! in the background
5640 MyJoinableThread
thread(10);
5643 wxPrintf(_T("\nThread terminated with exit code %lu.\n"),
5644 (unsigned long)thread
.Wait());
5647 static void TestThreadSuspend()
5649 wxPuts(_T("\n*** Testing thread suspend/resume functions ***"));
5651 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
5655 // this is for this demo only, in a real life program we'd use another
5656 // condition variable which would be signaled from wxThread::Entry() to
5657 // tell us that the thread really started running - but here just wait a
5658 // bit and hope that it will be enough (the problem is, of course, that
5659 // the thread might still not run when we call Pause() which will result
5661 wxThread::Sleep(300);
5663 for ( size_t n
= 0; n
< 3; n
++ )
5667 wxPuts(_T("\nThread suspended"));
5670 // don't sleep but resume immediately the first time
5671 wxThread::Sleep(300);
5673 wxPuts(_T("Going to resume the thread"));
5678 wxPuts(_T("Waiting until it terminates now"));
5680 // wait until the thread terminates
5686 static void TestThreadDelete()
5688 // As above, using Sleep() is only for testing here - we must use some
5689 // synchronisation object instead to ensure that the thread is still
5690 // running when we delete it - deleting a detached thread which already
5691 // terminated will lead to a crash!
5693 wxPuts(_T("\n*** Testing thread delete function ***"));
5695 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
5699 wxPuts(_T("\nDeleted a thread which didn't start to run yet."));
5701 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
5705 wxThread::Sleep(300);
5709 wxPuts(_T("\nDeleted a running thread."));
5711 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
5715 wxThread::Sleep(300);
5721 wxPuts(_T("\nDeleted a sleeping thread."));
5723 MyJoinableThread
thread3(20);
5728 wxPuts(_T("\nDeleted a joinable thread."));
5730 MyJoinableThread
thread4(2);
5733 wxThread::Sleep(300);
5737 wxPuts(_T("\nDeleted a joinable thread which already terminated."));
5742 class MyWaitingThread
: public wxThread
5745 MyWaitingThread( wxMutex
*mutex
, wxCondition
*condition
)
5748 m_condition
= condition
;
5753 virtual ExitCode
Entry()
5755 wxPrintf(_T("Thread %lu has started running.\n"), GetId());
5760 wxPrintf(_T("Thread %lu starts to wait...\n"), GetId());
5764 m_condition
->Wait();
5767 wxPrintf(_T("Thread %lu finished to wait, exiting.\n"), GetId());
5775 wxCondition
*m_condition
;
5778 static void TestThreadConditions()
5781 wxCondition
condition(mutex
);
5783 // otherwise its difficult to understand which log messages pertain to
5785 //wxLogTrace(_T("thread"), _T("Local condition var is %08x, gs_cond = %08x"),
5786 // condition.GetId(), gs_cond.GetId());
5788 // create and launch threads
5789 MyWaitingThread
*threads
[10];
5792 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5794 threads
[n
] = new MyWaitingThread( &mutex
, &condition
);
5797 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5802 // wait until all threads run
5803 wxPuts(_T("Main thread is waiting for the other threads to start"));
5806 size_t nRunning
= 0;
5807 while ( nRunning
< WXSIZEOF(threads
) )
5813 wxPrintf(_T("Main thread: %u already running\n"), nRunning
);
5817 wxPuts(_T("Main thread: all threads started up."));
5820 wxThread::Sleep(500);
5823 // now wake one of them up
5824 wxPrintf(_T("Main thread: about to signal the condition.\n"));
5829 wxThread::Sleep(200);
5831 // wake all the (remaining) threads up, so that they can exit
5832 wxPrintf(_T("Main thread: about to broadcast the condition.\n"));
5834 condition
.Broadcast();
5836 // give them time to terminate (dirty!)
5837 wxThread::Sleep(500);
5840 #include "wx/utils.h"
5842 class MyExecThread
: public wxThread
5845 MyExecThread(const wxString
& command
) : wxThread(wxTHREAD_JOINABLE
),
5851 virtual ExitCode
Entry()
5853 return (ExitCode
)wxExecute(m_command
, wxEXEC_SYNC
);
5860 static void TestThreadExec()
5862 wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
5864 MyExecThread
thread(_T("true"));
5867 wxPrintf(_T("Main program exit code: %ld.\n"),
5868 wxExecute(_T("false"), wxEXEC_SYNC
));
5870 wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread
.Wait());
5874 #include "wx/datetime.h"
5876 class MySemaphoreThread
: public wxThread
5879 MySemaphoreThread(int i
, wxSemaphore
*sem
)
5880 : wxThread(wxTHREAD_JOINABLE
),
5887 virtual ExitCode
Entry()
5889 wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
5890 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5894 wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
5895 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5899 wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
5900 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5912 WX_DEFINE_ARRAY(wxThread
*, ArrayThreads
);
5914 static void TestSemaphore()
5916 wxPuts(_T("*** Testing wxSemaphore class. ***"));
5918 static const int SEM_LIMIT
= 3;
5920 wxSemaphore
sem(SEM_LIMIT
, SEM_LIMIT
);
5921 ArrayThreads threads
;
5923 for ( int i
= 0; i
< 3*SEM_LIMIT
; i
++ )
5925 threads
.Add(new MySemaphoreThread(i
, &sem
));
5926 threads
.Last()->Run();
5929 for ( size_t n
= 0; n
< threads
.GetCount(); n
++ )
5936 #endif // TEST_THREADS
5938 // ----------------------------------------------------------------------------
5940 // ----------------------------------------------------------------------------
5944 #include "wx/dynarray.h"
5946 typedef unsigned short ushort
;
5948 #define DefineCompare(name, T) \
5950 int wxCMPFUNC_CONV name ## CompareValues(T first, T second) \
5952 return first - second; \
5955 int wxCMPFUNC_CONV name ## Compare(T* first, T* second) \
5957 return *first - *second; \
5960 int wxCMPFUNC_CONV name ## RevCompare(T* first, T* second) \
5962 return *second - *first; \
5965 DefineCompare(UShort, ushort);
5966 DefineCompare(Int
, int);
5968 // test compilation of all macros
5969 WX_DEFINE_ARRAY_SHORT(ushort
, wxArrayUShort
);
5970 WX_DEFINE_SORTED_ARRAY_SHORT(ushort
, wxSortedArrayUShortNoCmp
);
5971 WX_DEFINE_SORTED_ARRAY_CMP_SHORT(ushort
, UShortCompareValues
, wxSortedArrayUShort
);
5972 WX_DEFINE_SORTED_ARRAY_CMP_INT(int, IntCompareValues
, wxSortedArrayInt
);
5974 WX_DECLARE_OBJARRAY(Bar
, ArrayBars
);
5975 #include "wx/arrimpl.cpp"
5976 WX_DEFINE_OBJARRAY(ArrayBars
);
5978 static void PrintArray(const wxChar
* name
, const wxArrayString
& array
)
5980 wxPrintf(_T("Dump of the array '%s'\n"), name
);
5982 size_t nCount
= array
.GetCount();
5983 for ( size_t n
= 0; n
< nCount
; n
++ )
5985 wxPrintf(_T("\t%s[%u] = '%s'\n"), name
, n
, array
[n
].c_str());
5989 static void PrintArray(const wxChar
* name
, const wxSortedArrayString
& array
)
5991 wxPrintf(_T("Dump of the array '%s'\n"), name
);
5993 size_t nCount
= array
.GetCount();
5994 for ( size_t n
= 0; n
< nCount
; n
++ )
5996 wxPrintf(_T("\t%s[%u] = '%s'\n"), name
, n
, array
[n
].c_str());
6000 int wxCMPFUNC_CONV
StringLenCompare(const wxString
& first
,
6001 const wxString
& second
)
6003 return first
.length() - second
.length();
6006 #define TestArrayOf(name) \
6008 static void PrintArray(const wxChar* name, const wxSortedArray##name & array) \
6010 wxPrintf(_T("Dump of the array '%s'\n"), name); \
6012 size_t nCount = array.GetCount(); \
6013 for ( size_t n = 0; n < nCount; n++ ) \
6015 wxPrintf(_T("\t%s[%u] = %d\n"), name, n, array[n]); \
6019 static void PrintArray(const wxChar* name, const wxArray##name & array) \
6021 wxPrintf(_T("Dump of the array '%s'\n"), name); \
6023 size_t nCount = array.GetCount(); \
6024 for ( size_t n = 0; n < nCount; n++ ) \
6026 wxPrintf(_T("\t%s[%u] = %d\n"), name, n, array[n]); \
6030 static void TestArrayOf ## name ## s() \
6032 wxPrintf(_T("*** Testing wxArray%s ***\n"), #name); \
6040 wxPuts(_T("Initially:")); \
6041 PrintArray(_T("a"), a); \
6043 wxPuts(_T("After sort:")); \
6044 a.Sort(name ## Compare); \
6045 PrintArray(_T("a"), a); \
6047 wxPuts(_T("After reverse sort:")); \
6048 a.Sort(name ## RevCompare); \
6049 PrintArray(_T("a"), a); \
6051 wxSortedArray##name b; \
6057 wxPuts(_T("Sorted array initially:")); \
6058 PrintArray(_T("b"), b); \
6061 TestArrayOf(UShort
);
6064 static void TestStlArray()
6066 wxPuts(_T("*** Testing std::vector operations ***\n"));
6070 wxArrayInt::iterator it
, en
;
6071 wxArrayInt::reverse_iterator rit
, ren
;
6073 for ( i
= 0; i
< 5; ++i
)
6076 for ( it
= list1
.begin(), en
= list1
.end(), i
= 0;
6077 it
!= en
; ++it
, ++i
)
6079 wxPuts(_T("Error in iterator\n"));
6081 for ( rit
= list1
.rbegin(), ren
= list1
.rend(), i
= 4;
6082 rit
!= ren
; ++rit
, --i
)
6084 wxPuts(_T("Error in reverse_iterator\n"));
6086 if ( *list1
.rbegin() != *(list1
.end()-1) ||
6087 *list1
.begin() != *(list1
.rend()-1) )
6088 wxPuts(_T("Error in iterator/reverse_iterator\n"));
6090 it
= list1
.begin()+1;
6091 rit
= list1
.rbegin()+1;
6092 if ( *list1
.begin() != *(it
-1) ||
6093 *list1
.rbegin() != *(rit
-1) )
6094 wxPuts(_T("Error in iterator/reverse_iterator\n"));
6096 if ( list1
.front() != 0 || list1
.back() != 4 )
6097 wxPuts(_T("Error in front()/back()\n"));
6099 list1
.erase(list1
.begin());
6100 list1
.erase(list1
.end()-1);
6102 for ( it
= list1
.begin(), en
= list1
.end(), i
= 1;
6103 it
!= en
; ++it
, ++i
)
6105 wxPuts(_T("Error in erase()\n"));
6108 wxPuts(_T("*** Testing std::vector operations finished ***\n"));
6111 static void TestArrayOfObjects()
6113 wxPuts(_T("*** Testing wxObjArray ***\n"));
6117 Bar
bar(_T("second bar (two copies!)"));
6119 wxPrintf(_T("Initially: %u objects in the array, %u objects total.\n"),
6120 bars
.GetCount(), Bar::GetNumber());
6122 bars
.Add(new Bar(_T("first bar")));
6125 wxPrintf(_T("Now: %u objects in the array, %u objects total.\n"),
6126 bars
.GetCount(), Bar::GetNumber());
6128 bars
.RemoveAt(1, bars
.GetCount() - 1);
6130 wxPrintf(_T("After removing all but first element: %u objects in the ")
6131 _T("array, %u objects total.\n"),
6132 bars
.GetCount(), Bar::GetNumber());
6136 wxPrintf(_T("After Empty(): %u objects in the array, %u objects total.\n"),
6137 bars
.GetCount(), Bar::GetNumber());
6140 wxPrintf(_T("Finally: no more objects in the array, %u objects total.\n"),
6144 #endif // TEST_ARRAYS
6146 // ----------------------------------------------------------------------------
6148 // ----------------------------------------------------------------------------
6152 #include "wx/timer.h"
6153 #include "wx/tokenzr.h"
6155 static void TestStringConstruction()
6157 wxPuts(_T("*** Testing wxString constructores ***"));
6159 #define TEST_CTOR(args, res) \
6162 wxPrintf(_T("wxString%s = %s "), #args, s.c_str()); \
6165 wxPuts(_T("(ok)")); \
6169 wxPrintf(_T("(ERROR: should be %s)\n"), res); \
6173 TEST_CTOR((_T('Z'), 4), _T("ZZZZ"));
6174 TEST_CTOR((_T("Hello"), 4), _T("Hell"));
6175 TEST_CTOR((_T("Hello"), 5), _T("Hello"));
6176 // TEST_CTOR((_T("Hello"), 6), _T("Hello")); -- should give assert failure
6178 static const wxChar
*s
= _T("?really!");
6179 const wxChar
*start
= wxStrchr(s
, _T('r'));
6180 const wxChar
*end
= wxStrchr(s
, _T('!'));
6181 TEST_CTOR((start
, end
), _T("really"));
6186 static void TestString()
6196 for (int i
= 0; i
< 1000000; ++i
)
6200 c
= _T("! How'ya doin'?");
6203 c
= _T("Hello world! What's up?");
6208 wxPrintf(_T("TestString elapsed time: %ld\n"), sw
.Time());
6211 static void TestPChar()
6219 for (int i
= 0; i
< 1000000; ++i
)
6221 wxStrcpy (a
, _T("Hello"));
6222 wxStrcpy (b
, _T(" world"));
6223 wxStrcpy (c
, _T("! How'ya doin'?"));
6226 wxStrcpy (c
, _T("Hello world! What's up?"));
6227 if (wxStrcmp (c
, a
) == 0)
6228 wxStrcpy (c
, _T("Doh!"));
6231 wxPrintf(_T("TestPChar elapsed time: %ld\n"), sw
.Time());
6234 static void TestStringSub()
6236 wxString
s(_T("Hello, world!"));
6238 wxPuts(_T("*** Testing wxString substring extraction ***"));
6240 wxPrintf(_T("String = '%s'\n"), s
.c_str());
6241 wxPrintf(_T("Left(5) = '%s'\n"), s
.Left(5).c_str());
6242 wxPrintf(_T("Right(6) = '%s'\n"), s
.Right(6).c_str());
6243 wxPrintf(_T("Mid(3, 5) = '%s'\n"), s(3, 5).c_str());
6244 wxPrintf(_T("Mid(3) = '%s'\n"), s
.Mid(3).c_str());
6245 wxPrintf(_T("substr(3, 5) = '%s'\n"), s
.substr(3, 5).c_str());
6246 wxPrintf(_T("substr(3) = '%s'\n"), s
.substr(3).c_str());
6248 static const wxChar
*prefixes
[] =
6252 _T("Hello, world!"),
6253 _T("Hello, world!!!"),
6259 for ( size_t n
= 0; n
< WXSIZEOF(prefixes
); n
++ )
6261 wxString prefix
= prefixes
[n
], rest
;
6262 bool rc
= s
.StartsWith(prefix
, &rest
);
6263 wxPrintf(_T("StartsWith('%s') = %s"), prefix
.c_str(), rc
? _T("true") : _T("false"));
6266 wxPrintf(_T(" (the rest is '%s')\n"), rest
.c_str());
6277 static void TestStringFormat()
6279 wxPuts(_T("*** Testing wxString formatting ***"));
6282 s
.Printf(_T("%03d"), 18);
6284 wxPrintf(_T("Number 18: %s\n"), wxString::Format(_T("%03d"), 18).c_str());
6285 wxPrintf(_T("Number 18: %s\n"), s
.c_str());
6290 // returns "not found" for npos, value for all others
6291 static wxString
PosToString(size_t res
)
6293 wxString s
= res
== wxString::npos
? wxString(_T("not found"))
6294 : wxString::Format(_T("%u"), res
);
6298 static void TestStringFind()
6300 wxPuts(_T("*** Testing wxString find() functions ***"));
6302 static const wxChar
*strToFind
= _T("ell");
6303 static const struct StringFindTest
6307 result
; // of searching "ell" in str
6310 { _T("Well, hello world"), 0, 1 },
6311 { _T("Well, hello world"), 6, 7 },
6312 { _T("Well, hello world"), 9, wxString::npos
},
6315 for ( size_t n
= 0; n
< WXSIZEOF(findTestData
); n
++ )
6317 const StringFindTest
& ft
= findTestData
[n
];
6318 size_t res
= wxString(ft
.str
).find(strToFind
, ft
.start
);
6320 wxPrintf(_T("Index of '%s' in '%s' starting from %u is %s "),
6321 strToFind
, ft
.str
, ft
.start
, PosToString(res
).c_str());
6323 size_t resTrue
= ft
.result
;
6324 if ( res
== resTrue
)
6330 wxPrintf(_T("(ERROR: should be %s)\n"),
6331 PosToString(resTrue
).c_str());
6338 static void TestStringTokenizer()
6340 wxPuts(_T("*** Testing wxStringTokenizer ***"));
6342 static const wxChar
*modeNames
[] =
6346 _T("return all empty"),
6351 static const struct StringTokenizerTest
6353 const wxChar
*str
; // string to tokenize
6354 const wxChar
*delims
; // delimiters to use
6355 size_t count
; // count of token
6356 wxStringTokenizerMode mode
; // how should we tokenize it
6357 } tokenizerTestData
[] =
6359 { _T(""), _T(" "), 0 },
6360 { _T("Hello, world"), _T(" "), 2 },
6361 { _T("Hello, world "), _T(" "), 2 },
6362 { _T("Hello, world"), _T(","), 2 },
6363 { _T("Hello, world!"), _T(",!"), 2 },
6364 { _T("Hello,, world!"), _T(",!"), 3 },
6365 { _T("Hello, world!"), _T(",!"), 3, wxTOKEN_RET_EMPTY_ALL
},
6366 { _T("username:password:uid:gid:gecos:home:shell"), _T(":"), 7 },
6367 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 4 },
6368 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 6, wxTOKEN_RET_EMPTY
},
6369 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 9, wxTOKEN_RET_EMPTY_ALL
},
6370 { _T("01/02/99"), _T("/-"), 3 },
6371 { _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS
},
6374 for ( size_t n
= 0; n
< WXSIZEOF(tokenizerTestData
); n
++ )
6376 const StringTokenizerTest
& tt
= tokenizerTestData
[n
];
6377 wxStringTokenizer
tkz(tt
.str
, tt
.delims
, tt
.mode
);
6379 size_t count
= tkz
.CountTokens();
6380 wxPrintf(_T("String '%s' has %u tokens delimited by '%s' (mode = %s) "),
6381 MakePrintable(tt
.str
).c_str(),
6383 MakePrintable(tt
.delims
).c_str(),
6384 modeNames
[tkz
.GetMode()]);
6385 if ( count
== tt
.count
)
6391 wxPrintf(_T("(ERROR: should be %u)\n"), tt
.count
);
6396 // if we emulate strtok(), check that we do it correctly
6397 wxChar
*buf
, *s
= NULL
, *last
;
6399 if ( tkz
.GetMode() == wxTOKEN_STRTOK
)
6401 buf
= new wxChar
[wxStrlen(tt
.str
) + 1];
6402 wxStrcpy(buf
, tt
.str
);
6404 s
= wxStrtok(buf
, tt
.delims
, &last
);
6411 // now show the tokens themselves
6413 while ( tkz
.HasMoreTokens() )
6415 wxString token
= tkz
.GetNextToken();
6417 wxPrintf(_T("\ttoken %u: '%s'"),
6419 MakePrintable(token
).c_str());
6425 wxPuts(_T(" (ok)"));
6429 wxPrintf(_T(" (ERROR: should be %s)\n"), s
);
6432 s
= wxStrtok(NULL
, tt
.delims
, &last
);
6436 // nothing to compare with
6441 if ( count2
!= count
)
6443 wxPuts(_T("\tERROR: token count mismatch"));
6452 static void TestStringReplace()
6454 wxPuts(_T("*** Testing wxString::replace ***"));
6456 static const struct StringReplaceTestData
6458 const wxChar
*original
; // original test string
6459 size_t start
, len
; // the part to replace
6460 const wxChar
*replacement
; // the replacement string
6461 const wxChar
*result
; // and the expected result
6462 } stringReplaceTestData
[] =
6464 { _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") },
6465 { _T("increase"), 0, 2, _T("de"), _T("decrease") },
6466 { _T("wxWindow"), 8, 0, _T("s"), _T("wxWindows") },
6467 { _T("foobar"), 3, 0, _T("-"), _T("foo-bar") },
6468 { _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") },
6471 for ( size_t n
= 0; n
< WXSIZEOF(stringReplaceTestData
); n
++ )
6473 const StringReplaceTestData data
= stringReplaceTestData
[n
];
6475 wxString original
= data
.original
;
6476 original
.replace(data
.start
, data
.len
, data
.replacement
);
6478 wxPrintf(_T("wxString(\"%s\").replace(%u, %u, %s) = %s "),
6479 data
.original
, data
.start
, data
.len
, data
.replacement
,
6482 if ( original
== data
.result
)
6488 wxPrintf(_T("(ERROR: should be '%s')\n"), data
.result
);
6495 static void TestStringMatch()
6497 wxPuts(_T("*** Testing wxString::Matches() ***"));
6499 static const struct StringMatchTestData
6502 const wxChar
*wildcard
;
6504 } stringMatchTestData
[] =
6506 { _T("foobar"), _T("foo*"), 1 },
6507 { _T("foobar"), _T("*oo*"), 1 },
6508 { _T("foobar"), _T("*bar"), 1 },
6509 { _T("foobar"), _T("??????"), 1 },
6510 { _T("foobar"), _T("f??b*"), 1 },
6511 { _T("foobar"), _T("f?b*"), 0 },
6512 { _T("foobar"), _T("*goo*"), 0 },
6513 { _T("foobar"), _T("*foo"), 0 },
6514 { _T("foobarfoo"), _T("*foo"), 1 },
6515 { _T(""), _T("*"), 1 },
6516 { _T(""), _T("?"), 0 },
6519 for ( size_t n
= 0; n
< WXSIZEOF(stringMatchTestData
); n
++ )
6521 const StringMatchTestData
& data
= stringMatchTestData
[n
];
6522 bool matches
= wxString(data
.text
).Matches(data
.wildcard
);
6523 wxPrintf(_T("'%s' %s '%s' (%s)\n"),
6525 matches
? _T("matches") : _T("doesn't match"),
6527 matches
== data
.matches
? _T("ok") : _T("ERROR"));
6533 // Sigh, I want Test::Simple, Test::More and Test::Harness...
6534 void ok(int line
, bool ok
, const wxString
& msg
= wxEmptyString
)
6537 wxPuts(_T("NOT OK: (") + wxString::Format(_T("%d"), line
) +
6541 void is(int line
, const wxString
& got
, const wxString
& expected
,
6542 const wxString
& msg
= wxEmptyString
)
6544 bool isOk
= got
== expected
;
6545 ok(line
, isOk
, msg
);
6548 wxPuts(_T("Got: ") + got
);
6549 wxPuts(_T("Expected: ") + expected
);
6554 void is(int line
, const wxChar
* got
, const wxChar
* expected
,
6555 const wxString
& msg
= wxEmptyString
)
6557 bool isOk
= wxStrcmp( got
, expected
) == 0;
6558 ok(line
, isOk
, msg
);
6561 wxPuts(_T("Got: ") + wxString(got
));
6562 wxPuts(_T("Expected: ") + wxString(expected
));
6567 void is(int line
, const wxChar
& got
, const wxChar
& expected
,
6568 const wxString
& msg
= wxEmptyString
)
6570 bool isOk
= got
== expected
;
6571 ok(line
, isOk
, msg
);
6574 wxPuts(_T("Got: ") + got
);
6575 wxPuts(_T("Expected: ") + expected
);
6579 void is(int line
, size_t got
, size_t expected
,
6580 const wxString
& msg
= wxEmptyString
)
6582 bool isOk
= got
== expected
;
6583 ok(line
, isOk
, msg
);
6586 wxPuts(wxString::Format(_T("Got: %ld"), got
));
6587 wxPuts(wxString::Format(_T("Expected: %ld"), expected
));
6591 #define is_m( got, expected, message ) is( __LINE__, (got), (expected), (message) )
6592 #define is_nom( got, expected ) is( __LINE__, (got), (expected), wxEmptyString )
6594 void TestStdString()
6596 wxPuts(_T("*** Testing std::string operations ***\n"));
6599 wxString
s1(_T("abcdefgh")),
6600 s2(_T("abcdefghijklm"), 8),
6601 s3(_T("abcdefghijklm")),
6605 s7(s3
.begin(), s3
.begin() + 8);
6606 wxString
s8(s1
, 4, 8), s9
, s10
, s11
;
6608 is( __LINE__
, s1
, _T("abcdefgh") );
6609 is( __LINE__
, s2
, s1
);
6610 is( __LINE__
, s4
, _T("aaaaaaaa") );
6611 is( __LINE__
, s5
, _T("abcdefgh") );
6612 is( __LINE__
, s6
, s1
);
6613 is( __LINE__
, s7
, s1
);
6614 is( __LINE__
, s8
, _T("efgh") );
6617 s1
= s2
= s3
= s4
= s5
= s6
= s7
= s8
= _T("abc");
6618 s1
.append(_T("def"));
6619 s2
.append(_T("defgh"), 3);
6620 s3
.append(wxString(_T("abcdef")), 3, 6);
6622 s5
.append(3, _T('a'));
6623 s6
.append(s1
.begin() + 3, s1
.end());
6625 is( __LINE__
, s1
, _T("abcdef") );
6626 is( __LINE__
, s2
, _T("abcdef") );
6627 is( __LINE__
, s3
, _T("abcdef") );
6628 is( __LINE__
, s4
, _T("abcabcdef") );
6629 is( __LINE__
, s5
, _T("abcaaa") );
6630 is( __LINE__
, s6
, _T("abcdef") );
6633 s1
= s2
= s3
= s4
= s5
= s6
= s7
= s8
= _T("abc");
6634 s1
.assign(_T("def"));
6635 s2
.assign(_T("defgh"), 3);
6636 s3
.assign(wxString(_T("abcdef")), 3, 6);
6638 s5
.assign(3, _T('a'));
6639 s6
.assign(s1
.begin() + 1, s1
.end());
6641 is( __LINE__
, s1
, _T("def") );
6642 is( __LINE__
, s2
, _T("def") );
6643 is( __LINE__
, s3
, _T("def") );
6644 is( __LINE__
, s4
, _T("def") );
6645 is( __LINE__
, s5
, _T("aaa") );
6646 is( __LINE__
, s6
, _T("ef") );
6649 s1
= _T("abcdefgh");
6650 s2
= _T("abcdefgh");
6652 s4
= _T("abcdefghi");
6655 s7
= _T("zabcdefg");
6657 ok( __LINE__
, s1
.compare(s2
) == 0 );
6658 ok( __LINE__
, s1
.compare(s3
) > 0 );
6659 ok( __LINE__
, s1
.compare(s4
) < 0 );
6660 ok( __LINE__
, s1
.compare(s5
) > 0 );
6661 ok( __LINE__
, s1
.compare(s6
) < 0 );
6662 ok( __LINE__
, s1
.compare(1, 12, s1
) > 0);
6663 ok( __LINE__
, s1
.compare(_T("abcdefgh")) == 0);
6664 ok( __LINE__
, s1
.compare(1, 7, _T("bcdefgh")) == 0);
6665 ok( __LINE__
, s1
.compare(1, 7, _T("bcdefgh"), 7) == 0);
6670 wxString::iterator it
= s3
.erase(s3
.begin() + 1);
6671 wxString::iterator it2
= s4
.erase(s4
.begin() + 4, s4
.begin() + 6);
6672 wxString::iterator it3
= s7
.erase(s7
.begin() + 4, s7
.begin() + 8);
6674 is( __LINE__
, s1
, _T("acdefgh") );
6675 is( __LINE__
, s2
, _T("abcd") );
6676 is( __LINE__
, s3
, _T("ac") );
6677 is( __LINE__
, s4
, _T("abcdghi") );
6678 is( __LINE__
, s7
, _T("zabc") );
6679 is( __LINE__
, *it
, _T('c') );
6680 is( __LINE__
, *it2
, _T('g') );
6681 ok( __LINE__
, it3
== s7
.end() );
6685 // 01234567890123456789012345
6686 s1
= _T("abcdefgABCDEFGabcABCabcABC");
6689 is_nom( s1
.find(_T('A')), 7u );
6690 is_nom( s1
.find(_T('A'), 7), 7u );
6691 is_nom( s1
.find(_T('Z')), wxString::npos
);
6692 is_nom( s1
.find(_T('C'), 22), 25u );
6694 is_nom( s1
.find(_T("gAB")), 6u );
6695 is_nom( s1
.find(_T("gAB"), 7), wxString::npos
);
6696 is_nom( s1
.find(_T("gAB"), 6), 6u );
6698 is_nom( s1
.find(_T("gABZZZ"), 2, 3), 6u );
6699 is_nom( s1
.find(_T("gABZZZ"), 7, 3), wxString::npos
);
6701 is_nom( s1
.find(s2
), 6u );
6702 is_nom( s1
.find(s2
, 7), wxString::npos
);
6703 is_nom( s1
.find(s2
, 6), 6u );
6705 // find_first_not_of
6707 // 01234567890123456789012345678901234
6708 s1
= _T("aaaaaabcdefghlkjiaaaaaabcdbcdbcdbcd");
6711 is_nom( s1
.find_first_not_of(_T('a')), 6u );
6712 is_nom( s1
.find_first_not_of(_T('a'), 7), 7u );
6713 is_nom( s2
.find_first_not_of(_T('a')), wxString::npos
);
6715 is_nom( s1
.find_first_not_of(_T("abde"), 4), 7u );
6716 is_nom( s1
.find_first_not_of(_T("abde"), 7), 7u );
6717 is_nom( s1
.find_first_not_of(_T("abcdefghijkl")), wxString::npos
);
6719 is_nom( s1
.find_first_not_of(_T("abcdefghi"), 0, 4), 9u );
6722 is_nom( s1
.find_first_of(_T('c')), 7u );
6723 is_nom( s1
.find_first_of(_T('v')), wxString::npos
);
6724 is_nom( s1
.find_first_of(_T('c'), 10), 24u );
6726 is_nom( s1
.find_first_of(_T("ijkl")), 13u );
6727 is_nom( s1
.find_first_of(_T("ddcfg"), 17), 24u );
6728 is_nom( s1
.find_first_of(_T("ddcfga"), 17, 5), 24u );
6732 // 01234567890123456789012345678901234
6733 s1
= _T("aaaaaabcdefghlkjiaaaaaabcdbcdbcdbcd");
6736 is_nom( s2
.find_last_not_of(_T('a')), wxString::npos
);
6737 is_nom( s1
.find_last_not_of(_T('d')), 33u );
6738 is_nom( s1
.find_last_not_of(_T('d'), 25), 24u );
6740 is_nom( s1
.find_last_not_of(_T("bcd")), 22u );
6741 is_nom( s1
.find_last_not_of(_T("abc"), 24), 16u );
6743 is_nom( s1
.find_last_not_of(_T("abcdefghijklmnopqrstuv"), 24, 3), 16u );
6746 is_nom( s2
.find_last_of(_T('c')), wxString::npos
);
6747 is_nom( s1
.find_last_of(_T('a')), 22u );
6748 is_nom( s1
.find_last_of(_T('b'), 24), 23u );
6750 is_nom( s1
.find_last_of(_T("ijklm")), 16u );
6751 is_nom( s1
.find_last_of(_T("ijklma"), 33, 4), 16u );
6752 is_nom( s1
.find_last_of(_T("a"), 17), 17u );
6755 s1
= s2
= s3
= s4
= s5
= s6
= s7
= s8
= _T("aaaa");
6756 s9
= s10
= _T("cdefg");
6758 s1
.insert(1, _T("cc") );
6759 s2
.insert(2, _T("cdef"), 3);
6761 s4
.insert(2, s10
, 3, 7);
6762 s5
.insert(1, 2, _T('c'));
6763 it
= s6
.insert(s6
.begin() + 3, _T('X'));
6764 s7
.insert(s7
.begin(), s9
.begin(), s9
.end() - 1);
6765 s8
.insert(s8
.begin(), 2, _T('c'));
6767 is( __LINE__
, s1
, _T("accaaa") );
6768 is( __LINE__
, s2
, _T("aacdeaa") );
6769 is( __LINE__
, s3
, _T("aacdefgaa") );
6770 is( __LINE__
, s4
, _T("aafgaa") );
6771 is( __LINE__
, s5
, _T("accaaa") );
6772 is( __LINE__
, s6
, _T("aaaXa") );
6773 is( __LINE__
, s7
, _T("cdefaaaa") );
6774 is( __LINE__
, s8
, _T("ccaaaa") );
6776 s1
= s2
= s3
= _T("aaaa");
6777 s1
.insert(0, _T("ccc"), 2);
6778 s2
.insert(4, _T("ccc"), 2);
6780 is( __LINE__
, s1
, _T("ccaaaa") );
6781 is( __LINE__
, s2
, _T("aaaacc") );
6784 s1
= s2
= s3
= s4
= s5
= s6
= s7
= s8
= _T("QWERTYUIOP");
6785 s9
= s10
= _T("werty");
6787 s1
.replace(3, 4, _T("rtyu"));
6788 s1
.replace(8, 7, _T("opopop"));
6789 s2
.replace(10, 12, _T("WWWW"));
6790 s3
.replace(1, 5, s9
);
6791 s4
.replace(1, 4, s9
, 0, 4);
6792 s5
.replace(1, 2, s9
, 1, 12);
6793 s6
.replace(0, 123, s9
, 0, 123);
6794 s7
.replace(2, 7, s9
);
6796 is( __LINE__
, s1
, _T("QWErtyuIopopop") );
6797 is( __LINE__
, s2
, _T("QWERTYUIOPWWWW") );
6798 is( __LINE__
, s3
, _T("QwertyUIOP") );
6799 is( __LINE__
, s4
, _T("QwertYUIOP") );
6800 is( __LINE__
, s5
, _T("QertyRTYUIOP") );
6801 is( __LINE__
, s6
, s9
);
6802 is( __LINE__
, s7
, _T("QWwertyP") );
6806 // 01234567890123456789012345
6807 s1
= _T("abcdefgABCDEFGabcABCabcABC");
6811 is_nom( s1
.rfind(_T('A')), 23u );
6812 is_nom( s1
.rfind(_T('A'), 7), 7u );
6813 is_nom( s1
.rfind(_T('Z')), wxString::npos
);
6814 is_nom( s1
.rfind(_T('C'), 22), 19u );
6816 is_nom( s1
.rfind(_T("cAB")), 22u );
6817 is_nom( s1
.rfind(_T("cAB"), 15), wxString::npos
);
6818 is_nom( s1
.rfind(_T("cAB"), 21), 16u );
6820 is_nom( s1
.rfind(_T("gABZZZ"), 7, 3), 6u );
6821 is_nom( s1
.rfind(_T("gABZZZ"), 5, 3), wxString::npos
);
6823 is_nom( s1
.rfind(s2
), 6u );
6824 is_nom( s1
.rfind(s2
, 5), wxString::npos
);
6825 is_nom( s1
.rfind(s2
, 6), 6u );
6826 is_nom( s1
.rfind(s3
, 1), 0u );
6829 s1
= s2
= s3
= s4
= _T("abcABCdefDEF");
6833 s3
.resize( 14, _T(' ') );
6834 s4
.resize( 14, _T('W') );
6836 is_nom( s1
, _T("abcABCdefDEF") );
6837 is_nom( s2
, _T("abcABCdefD") );
6838 is_nom( s3
, _T("abcABCdefDEF ") );
6839 is_nom( s4
, _T("abcABCdefDEFWW") );
6842 s1
= _T("abcdefgABCDEFG");
6844 is_nom( s1
.substr( 0, 14 ), s1
);
6845 is_nom( s1
.substr( 1, 13 ), _T("bcdefgABCDEFG") );
6846 is_nom( s1
.substr( 1, 20 ), _T("bcdefgABCDEFG") );
6847 is_nom( s1
.substr( 14, 30 ), _T("") );
6849 wxPuts(_T("*** Testing std::string operations finished ***\n"));
6852 #endif // TEST_STRINGS
6854 // ----------------------------------------------------------------------------
6856 // ----------------------------------------------------------------------------
6858 #ifdef TEST_SNGLINST
6859 #include "wx/snglinst.h"
6860 #endif // TEST_SNGLINST
6862 int main(int argc
, char **argv
)
6864 wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE
, "program");
6866 wxInitializer initializer
;
6869 fprintf(stderr
, "Failed to initialize the wxWindows library, aborting.");
6874 #ifdef TEST_SNGLINST
6875 wxSingleInstanceChecker checker
;
6876 if ( checker
.Create(_T(".wxconsole.lock")) )
6878 if ( checker
.IsAnotherRunning() )
6880 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
6885 // wait some time to give time to launch another instance
6886 wxPrintf(_T("Press \"Enter\" to continue..."));
6889 else // failed to create
6891 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
6893 #endif // TEST_SNGLINST
6897 #endif // TEST_CHARSET
6900 TestCmdLineConvert();
6902 #if wxUSE_CMDLINE_PARSER
6903 static const wxCmdLineEntryDesc cmdLineDesc
[] =
6905 { wxCMD_LINE_SWITCH
, _T("h"), _T("help"), _T("show this help message"),
6906 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
6907 { wxCMD_LINE_SWITCH
, _T("v"), _T("verbose"), _T("be verbose") },
6908 { wxCMD_LINE_SWITCH
, _T("q"), _T("quiet"), _T("be quiet") },
6910 { wxCMD_LINE_OPTION
, _T("o"), _T("output"), _T("output file") },
6911 { wxCMD_LINE_OPTION
, _T("i"), _T("input"), _T("input dir") },
6912 { wxCMD_LINE_OPTION
, _T("s"), _T("size"), _T("output block size"),
6913 wxCMD_LINE_VAL_NUMBER
},
6914 { wxCMD_LINE_OPTION
, _T("d"), _T("date"), _T("output file date"),
6915 wxCMD_LINE_VAL_DATE
},
6917 { wxCMD_LINE_PARAM
, NULL
, NULL
, _T("input file"),
6918 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
6924 wxChar
**wargv
= new wxChar
*[argc
+ 1];
6929 for (n
= 0; n
< argc
; n
++ )
6931 wxMB2WXbuf warg
= wxConvertMB2WX(argv
[n
]);
6932 wargv
[n
] = wxStrdup(warg
);
6939 #endif // wxUSE_UNICODE
6941 wxCmdLineParser
parser(cmdLineDesc
, argc
, argv
);
6945 for ( int n
= 0; n
< argc
; n
++ )
6950 #endif // wxUSE_UNICODE
6952 parser
.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
6953 wxCMD_LINE_VAL_STRING
,
6954 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
6956 switch ( parser
.Parse() )
6959 wxLogMessage(_T("Help was given, terminating."));
6963 ShowCmdLine(parser
);
6967 wxLogMessage(_T("Syntax error detected, aborting."));
6970 #endif // wxUSE_CMDLINE_PARSER
6972 #endif // TEST_CMDLINE
6980 TestStringConstruction();
6983 TestStringTokenizer();
6984 TestStringReplace();
6992 #endif // TEST_STRINGS
6995 if ( 1 || TEST_ALL
)
6998 a1
.Add(_T("tiger"));
7000 a1
.Add(_T("lion"), 3);
7002 a1
.Add(_T("human"));
7005 wxPuts(_T("*** Initially:"));
7007 PrintArray(_T("a1"), a1
);
7009 wxArrayString
a2(a1
);
7010 PrintArray(_T("a2"), a2
);
7013 wxSortedArrayString
a3(a1
);
7015 wxSortedArrayString a3
;
7016 for (wxArrayString::iterator it
= a1
.begin(), en
= a1
.end();
7020 PrintArray(_T("a3"), a3
);
7022 wxPuts(_T("*** After deleting three strings from a1"));
7025 PrintArray(_T("a1"), a1
);
7026 PrintArray(_T("a2"), a2
);
7027 PrintArray(_T("a3"), a3
);
7030 wxPuts(_T("*** After reassigning a1 to a2 and a3"));
7032 PrintArray(_T("a2"), a2
);
7033 PrintArray(_T("a3"), a3
);
7036 wxPuts(_T("*** After sorting a1"));
7038 PrintArray(_T("a1"), a1
);
7040 wxPuts(_T("*** After sorting a1 in reverse order"));
7042 PrintArray(_T("a1"), a1
);
7045 wxPuts(_T("*** After sorting a1 by the string length"));
7046 a1
.Sort(&StringLenCompare
);
7047 PrintArray(_T("a1"), a1
);
7050 TestArrayOfObjects();
7051 TestArrayOfUShorts();
7056 #endif // TEST_ARRAYS
7067 #ifdef TEST_DLLLOADER
7069 #endif // TEST_DLLLOADER
7073 #endif // TEST_ENVIRON
7077 #endif // TEST_EXECUTE
7079 #ifdef TEST_FILECONF
7081 #endif // TEST_FILECONF
7090 #endif // TEST_LOCALE
7093 wxPuts(_T("*** Testing wxLog ***"));
7096 for ( size_t n
= 0; n
< 8000; n
++ )
7098 s
<< (wxChar
)(_T('A') + (n
% 26));
7101 wxLogWarning(_T("The length of the string is %lu"),
7102 (unsigned long)s
.length());
7105 msg
.Printf(_T("A very very long message: '%s', the end!\n"), s
.c_str());
7107 // this one shouldn't be truncated
7110 // but this one will because log functions use fixed size buffer
7111 // (note that it doesn't need '\n' at the end neither - will be added
7113 wxLogMessage(_T("A very very long message 2: '%s', the end!"), s
.c_str());
7125 #ifdef TEST_FILENAME
7129 fn
.Assign(_T("c:\\foo"), _T("bar.baz"));
7130 fn
.Assign(_T("/u/os9-port/Viewer/tvision/WEI2HZ-3B3-14_05-04-00MSC1.asc"));
7135 TestFileNameConstruction();
7138 TestFileNameConstruction();
7139 TestFileNameMakeRelative();
7140 TestFileNameMakeAbsolute();
7141 TestFileNameSplit();
7144 TestFileNameComparison();
7145 TestFileNameOperations();
7147 #endif // TEST_FILENAME
7149 #ifdef TEST_FILETIME
7153 #endif // TEST_FILETIME
7156 wxLog::AddTraceMask(FTP_TRACE_MASK
);
7157 if ( TestFtpConnect() )
7168 if ( TEST_INTERACTIVE
)
7169 TestFtpInteractive();
7171 //else: connecting to the FTP server failed
7177 #ifdef TEST_LONGLONG
7178 // seed pseudo random generator
7179 srand((unsigned)time(NULL
));
7188 TestMultiplication();
7191 TestLongLongConversion();
7192 TestBitOperations();
7193 TestLongLongComparison();
7194 TestLongLongToString();
7195 TestLongLongPrintf();
7197 #endif // TEST_LONGLONG
7205 #endif // TEST_HASHMAP
7209 #endif // TEST_HASHSET
7212 wxLog::AddTraceMask(_T("mime"));
7217 TestMimeAssociate();
7222 #ifdef TEST_INFO_FUNCTIONS
7228 if ( TEST_INTERACTIVE
)
7231 #endif // TEST_INFO_FUNCTIONS
7233 #ifdef TEST_PATHLIST
7235 #endif // TEST_PATHLIST
7243 #endif // TEST_PRINTF
7247 #endif // TEST_REGCONF
7250 // TODO: write a real test using src/regex/tests file
7255 TestRegExSubmatch();
7256 TestRegExReplacement();
7258 if ( TEST_INTERACTIVE
)
7259 TestRegExInteractive();
7261 #endif // TEST_REGEX
7263 #ifdef TEST_REGISTRY
7265 TestRegistryAssociation();
7266 #endif // TEST_REGISTRY
7271 #endif // TEST_SOCKETS
7279 #endif // TEST_STREAMS
7281 #ifdef TEST_TEXTSTREAM
7282 TestTextInputStream();
7283 #endif // TEST_TEXTSTREAM
7286 int nCPUs
= wxThread::GetCPUCount();
7287 wxPrintf(_T("This system has %d CPUs\n"), nCPUs
);
7289 wxThread::SetConcurrency(nCPUs
);
7291 TestDetachedThreads();
7294 TestJoinableThreads();
7295 TestThreadSuspend();
7297 TestThreadConditions();
7301 #endif // TEST_THREADS
7305 #endif // TEST_TIMER
7307 #ifdef TEST_DATETIME
7320 TestTimeArithmetics();
7323 TestTimeSpanFormat();
7331 if ( TEST_INTERACTIVE
)
7332 TestDateTimeInteractive();
7333 #endif // TEST_DATETIME
7335 #ifdef TEST_SCOPEGUARD
7340 wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
7342 #endif // TEST_USLEEP
7347 #endif // TEST_VCARD
7351 #endif // TEST_VOLUME
7354 TestUnicodeToFromAscii();
7355 #endif // TEST_UNICODE
7359 TestEncodingConverter();
7360 #endif // TEST_WCHAR
7363 TestZipStreamRead();
7364 TestZipFileSystem();
7368 TestZlibStreamWrite();
7369 TestZlibStreamRead();