1 /////////////////////////////////////////////////////////////////////////////
2 // Name: samples/console/console.cpp
3 // Purpose: a sample console (as opposed to GUI) progam using wxWindows
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
23 #error "This sample can't be compiled in GUI mode."
28 #include "wx/string.h"
33 // without this pragma, the stupid compiler precompiles #defines below so that
34 // changing them doesn't "take place" later!
39 // ----------------------------------------------------------------------------
40 // conditional compilation
41 // ----------------------------------------------------------------------------
44 A note about all these conditional compilation macros: this file is used
45 both as a test suite for various non-GUI wxWindows classes and as a
46 scratchpad for quick tests. So there are two compilation modes: if you
47 define TEST_ALL all tests are run, otherwise you may enable the individual
48 tests individually in the "#else" branch below.
51 // what to test (in alphabetic order)? uncomment the line below to do all tests
59 #define TEST_DLLLOADER
70 #define TEST_INFO_FUNCTIONS
82 #define TEST_SCOPEGUARD
87 #define TEST_TEXTSTREAM
91 // #define TEST_VCARD -- don't enable this (VZ)
98 static const bool TEST_ALL
= true;
102 static const bool TEST_ALL
= false;
105 // some tests are interactive, define this to run them
106 #ifdef TEST_INTERACTIVE
107 #undef TEST_INTERACTIVE
109 static const bool TEST_INTERACTIVE
= true;
111 static const bool TEST_INTERACTIVE
= false;
114 // ----------------------------------------------------------------------------
115 // test class for container objects
116 // ----------------------------------------------------------------------------
118 #if defined(TEST_ARRAYS) || defined(TEST_LIST)
120 class Bar
// Foo is already taken in the hash test
123 Bar(const wxString
& name
) : m_name(name
) { ms_bars
++; }
124 Bar(const Bar
& bar
) : m_name(bar
.m_name
) { ms_bars
++; }
125 ~Bar() { ms_bars
--; }
127 static size_t GetNumber() { return ms_bars
; }
129 const wxChar
*GetName() const { return m_name
; }
134 static size_t ms_bars
;
137 size_t Bar::ms_bars
= 0;
139 #endif // defined(TEST_ARRAYS) || defined(TEST_LIST)
141 // ============================================================================
143 // ============================================================================
145 // ----------------------------------------------------------------------------
147 // ----------------------------------------------------------------------------
149 #if defined(TEST_STRINGS) || defined(TEST_SOCKETS)
151 // replace TABs with \t and CRs with \n
152 static wxString
MakePrintable(const wxChar
*s
)
155 (void)str
.Replace(_T("\t"), _T("\\t"));
156 (void)str
.Replace(_T("\n"), _T("\\n"));
157 (void)str
.Replace(_T("\r"), _T("\\r"));
162 #endif // MakePrintable() is used
164 // ----------------------------------------------------------------------------
165 // wxFontMapper::CharsetToEncoding
166 // ----------------------------------------------------------------------------
170 #include "wx/fontmap.h"
172 static void TestCharset()
174 static const wxChar
*charsets
[] =
176 // some vali charsets
185 // and now some bogus ones
192 for ( size_t n
= 0; n
< WXSIZEOF(charsets
); n
++ )
194 wxFontEncoding enc
= wxFontMapper::Get()->CharsetToEncoding(charsets
[n
]);
195 wxPrintf(_T("Charset: %s\tEncoding: %s (%s)\n"),
197 wxFontMapper::Get()->GetEncodingName(enc
).c_str(),
198 wxFontMapper::Get()->GetEncodingDescription(enc
).c_str());
202 #endif // TEST_CHARSET
204 // ----------------------------------------------------------------------------
206 // ----------------------------------------------------------------------------
210 #include "wx/cmdline.h"
211 #include "wx/datetime.h"
213 #if wxUSE_CMDLINE_PARSER
215 static void ShowCmdLine(const wxCmdLineParser
& parser
)
217 wxString s
= _T("Input files: ");
219 size_t count
= parser
.GetParamCount();
220 for ( size_t param
= 0; param
< count
; param
++ )
222 s
<< parser
.GetParam(param
) << ' ';
226 << _T("Verbose:\t") << (parser
.Found(_T("v")) ? _T("yes") : _T("no")) << '\n'
227 << _T("Quiet:\t") << (parser
.Found(_T("q")) ? _T("yes") : _T("no")) << '\n';
232 if ( parser
.Found(_T("o"), &strVal
) )
233 s
<< _T("Output file:\t") << strVal
<< '\n';
234 if ( parser
.Found(_T("i"), &strVal
) )
235 s
<< _T("Input dir:\t") << strVal
<< '\n';
236 if ( parser
.Found(_T("s"), &lVal
) )
237 s
<< _T("Size:\t") << lVal
<< '\n';
238 if ( parser
.Found(_T("d"), &dt
) )
239 s
<< _T("Date:\t") << dt
.FormatISODate() << '\n';
240 if ( parser
.Found(_T("project_name"), &strVal
) )
241 s
<< _T("Project:\t") << strVal
<< '\n';
246 #endif // wxUSE_CMDLINE_PARSER
248 static void TestCmdLineConvert()
250 static const wxChar
*cmdlines
[] =
253 _T("-a \"-bstring 1\" -c\"string 2\" \"string 3\""),
254 _T("literal \\\" and \"\""),
257 for ( size_t n
= 0; n
< WXSIZEOF(cmdlines
); n
++ )
259 const wxChar
*cmdline
= cmdlines
[n
];
260 wxPrintf(_T("Parsing: %s\n"), cmdline
);
261 wxArrayString args
= wxCmdLineParser::ConvertStringToArgs(cmdline
);
263 size_t count
= args
.GetCount();
264 wxPrintf(_T("\targc = %u\n"), count
);
265 for ( size_t arg
= 0; arg
< count
; arg
++ )
267 wxPrintf(_T("\targv[%u] = %s\n"), arg
, args
[arg
].c_str());
272 #endif // TEST_CMDLINE
274 // ----------------------------------------------------------------------------
276 // ----------------------------------------------------------------------------
283 static const wxChar
*ROOTDIR
= _T("/");
284 static const wxChar
*TESTDIR
= _T("/usr/local/share");
285 #elif defined(__WXMSW__)
286 static const wxChar
*ROOTDIR
= _T("c:\\");
287 static const wxChar
*TESTDIR
= _T("d:\\");
289 #error "don't know where the root directory is"
292 static void TestDirEnumHelper(wxDir
& dir
,
293 int flags
= wxDIR_DEFAULT
,
294 const wxString
& filespec
= wxEmptyString
)
298 if ( !dir
.IsOpened() )
301 bool cont
= dir
.GetFirst(&filename
, filespec
, flags
);
304 wxPrintf(_T("\t%s\n"), filename
.c_str());
306 cont
= dir
.GetNext(&filename
);
312 static void TestDirEnum()
314 wxPuts(_T("*** Testing wxDir::GetFirst/GetNext ***"));
316 wxString cwd
= wxGetCwd();
317 if ( !wxDir::Exists(cwd
) )
319 wxPrintf(_T("ERROR: current directory '%s' doesn't exist?\n"), cwd
.c_str());
324 if ( !dir
.IsOpened() )
326 wxPrintf(_T("ERROR: failed to open current directory '%s'.\n"), cwd
.c_str());
330 wxPuts(_T("Enumerating everything in current directory:"));
331 TestDirEnumHelper(dir
);
333 wxPuts(_T("Enumerating really everything in current directory:"));
334 TestDirEnumHelper(dir
, wxDIR_DEFAULT
| wxDIR_DOTDOT
);
336 wxPuts(_T("Enumerating object files in current directory:"));
337 TestDirEnumHelper(dir
, wxDIR_DEFAULT
, "*.o*");
339 wxPuts(_T("Enumerating directories in current directory:"));
340 TestDirEnumHelper(dir
, wxDIR_DIRS
);
342 wxPuts(_T("Enumerating files in current directory:"));
343 TestDirEnumHelper(dir
, wxDIR_FILES
);
345 wxPuts(_T("Enumerating files including hidden in current directory:"));
346 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
350 wxPuts(_T("Enumerating everything in root directory:"));
351 TestDirEnumHelper(dir
, wxDIR_DEFAULT
);
353 wxPuts(_T("Enumerating directories in root directory:"));
354 TestDirEnumHelper(dir
, wxDIR_DIRS
);
356 wxPuts(_T("Enumerating files in root directory:"));
357 TestDirEnumHelper(dir
, wxDIR_FILES
);
359 wxPuts(_T("Enumerating files including hidden in root directory:"));
360 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
362 wxPuts(_T("Enumerating files in non existing directory:"));
363 wxDir
dirNo("nosuchdir");
364 TestDirEnumHelper(dirNo
);
367 class DirPrintTraverser
: public wxDirTraverser
370 virtual wxDirTraverseResult
OnFile(const wxString
& filename
)
372 return wxDIR_CONTINUE
;
375 virtual wxDirTraverseResult
OnDir(const wxString
& dirname
)
377 wxString path
, name
, ext
;
378 wxSplitPath(dirname
, &path
, &name
, &ext
);
381 name
<< _T('.') << ext
;
384 for ( const wxChar
*p
= path
.c_str(); *p
; p
++ )
386 if ( wxIsPathSeparator(*p
) )
390 wxPrintf(_T("%s%s\n"), indent
.c_str(), name
.c_str());
392 return wxDIR_CONTINUE
;
396 static void TestDirTraverse()
398 wxPuts(_T("*** Testing wxDir::Traverse() ***"));
402 size_t n
= wxDir::GetAllFiles(TESTDIR
, &files
);
403 wxPrintf(_T("There are %u files under '%s'\n"), n
, TESTDIR
);
406 wxPrintf(_T("First one is '%s'\n"), files
[0u].c_str());
407 wxPrintf(_T(" last one is '%s'\n"), files
[n
- 1].c_str());
410 // enum again with custom traverser
411 wxPuts(_T("Now enumerating directories:"));
413 DirPrintTraverser traverser
;
414 dir
.Traverse(traverser
, _T(""), wxDIR_DIRS
| wxDIR_HIDDEN
);
417 static void TestDirExists()
419 wxPuts(_T("*** Testing wxDir::Exists() ***"));
421 static const wxChar
*dirnames
[] =
424 #if defined(__WXMSW__)
427 _T("\\\\share\\file"),
431 _T("c:\\autoexec.bat"),
432 #elif defined(__UNIX__)
441 for ( size_t n
= 0; n
< WXSIZEOF(dirnames
); n
++ )
443 wxPrintf(_T("%-40s: %s\n"),
445 wxDir::Exists(dirnames
[n
]) ? _T("exists")
446 : _T("doesn't exist"));
452 // ----------------------------------------------------------------------------
454 // ----------------------------------------------------------------------------
456 #ifdef TEST_DLLLOADER
458 #include "wx/dynlib.h"
460 static void TestDllLoad()
462 #if defined(__WXMSW__)
463 static const wxChar
*LIB_NAME
= _T("kernel32.dll");
464 static const wxChar
*FUNC_NAME
= _T("lstrlenA");
465 #elif defined(__UNIX__)
466 // weird: using just libc.so does *not* work!
467 static const wxChar
*LIB_NAME
= _T("/lib/libc-2.0.7.so");
468 static const wxChar
*FUNC_NAME
= _T("strlen");
470 #error "don't know how to test wxDllLoader on this platform"
473 wxPuts(_T("*** testing wxDllLoader ***\n"));
475 wxDynamicLibrary
lib(LIB_NAME
);
476 if ( !lib
.IsLoaded() )
478 wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME
);
482 typedef int (*wxStrlenType
)(const char *);
483 wxStrlenType pfnStrlen
= (wxStrlenType
)lib
.GetSymbol(FUNC_NAME
);
486 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
487 FUNC_NAME
, LIB_NAME
);
491 if ( pfnStrlen("foo") != 3 )
493 wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
497 wxPuts(_T("... ok"));
503 #endif // TEST_DLLLOADER
505 // ----------------------------------------------------------------------------
507 // ----------------------------------------------------------------------------
511 #include "wx/utils.h"
513 static wxString
MyGetEnv(const wxString
& var
)
516 if ( !wxGetEnv(var
, &val
) )
519 val
= wxString(_T('\'')) + val
+ _T('\'');
524 static void TestEnvironment()
526 const wxChar
*var
= _T("wxTestVar");
528 wxPuts(_T("*** testing environment access functions ***"));
530 wxPrintf(_T("Initially getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
531 wxSetEnv(var
, _T("value for wxTestVar"));
532 wxPrintf(_T("After wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
533 wxSetEnv(var
, _T("another value"));
534 wxPrintf(_T("After 2nd wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
536 wxPrintf(_T("After wxUnsetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
537 wxPrintf(_T("PATH = %s\n"), MyGetEnv(_T("PATH")).c_str());
540 #endif // TEST_ENVIRON
542 // ----------------------------------------------------------------------------
544 // ----------------------------------------------------------------------------
548 #include "wx/utils.h"
550 static void TestExecute()
552 wxPuts(_T("*** testing wxExecute ***"));
555 #define COMMAND "cat -n ../../Makefile" // "echo hi"
556 #define SHELL_COMMAND "echo hi from shell"
557 #define REDIRECT_COMMAND COMMAND // "date"
558 #elif defined(__WXMSW__)
559 #define COMMAND "command.com /c echo hi"
560 #define SHELL_COMMAND "echo hi"
561 #define REDIRECT_COMMAND COMMAND
563 #error "no command to exec"
566 wxPrintf(_T("Testing wxShell: "));
568 if ( wxShell(SHELL_COMMAND
) )
571 wxPuts(_T("ERROR."));
573 wxPrintf(_T("Testing wxExecute: "));
575 if ( wxExecute(COMMAND
, true /* sync */) == 0 )
578 wxPuts(_T("ERROR."));
580 #if 0 // no, it doesn't work (yet?)
581 wxPrintf(_T("Testing async wxExecute: "));
583 if ( wxExecute(COMMAND
) != 0 )
584 wxPuts(_T("Ok (command launched)."));
586 wxPuts(_T("ERROR."));
589 wxPrintf(_T("Testing wxExecute with redirection:\n"));
590 wxArrayString output
;
591 if ( wxExecute(REDIRECT_COMMAND
, output
) != 0 )
593 wxPuts(_T("ERROR."));
597 size_t count
= output
.GetCount();
598 for ( size_t n
= 0; n
< count
; n
++ )
600 wxPrintf(_T("\t%s\n"), output
[n
].c_str());
607 #endif // TEST_EXECUTE
609 // ----------------------------------------------------------------------------
611 // ----------------------------------------------------------------------------
616 #include "wx/ffile.h"
617 #include "wx/textfile.h"
619 static void TestFileRead()
621 wxPuts(_T("*** wxFile read test ***"));
623 wxFile
file(_T("testdata.fc"));
624 if ( file
.IsOpened() )
626 wxPrintf(_T("File length: %lu\n"), file
.Length());
628 wxPuts(_T("File dump:\n----------"));
630 static const off_t len
= 1024;
634 off_t nRead
= file
.Read(buf
, len
);
635 if ( nRead
== wxInvalidOffset
)
637 wxPrintf(_T("Failed to read the file."));
641 fwrite(buf
, nRead
, 1, stdout
);
647 wxPuts(_T("----------"));
651 wxPrintf(_T("ERROR: can't open test file.\n"));
657 static void TestTextFileRead()
659 wxPuts(_T("*** wxTextFile read test ***"));
661 wxTextFile
file(_T("testdata.fc"));
664 wxPrintf(_T("Number of lines: %u\n"), file
.GetLineCount());
665 wxPrintf(_T("Last line: '%s'\n"), file
.GetLastLine().c_str());
669 wxPuts(_T("\nDumping the entire file:"));
670 for ( s
= file
.GetFirstLine(); !file
.Eof(); s
= file
.GetNextLine() )
672 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
674 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
676 wxPuts(_T("\nAnd now backwards:"));
677 for ( s
= file
.GetLastLine();
678 file
.GetCurrentLine() != 0;
679 s
= file
.GetPrevLine() )
681 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
683 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
687 wxPrintf(_T("ERROR: can't open '%s'\n"), file
.GetName());
693 static void TestFileCopy()
695 wxPuts(_T("*** Testing wxCopyFile ***"));
697 static const wxChar
*filename1
= _T("testdata.fc");
698 static const wxChar
*filename2
= _T("test2");
699 if ( !wxCopyFile(filename1
, filename2
) )
701 wxPuts(_T("ERROR: failed to copy file"));
705 wxFFile
f1(filename1
, "rb"),
708 if ( !f1
.IsOpened() || !f2
.IsOpened() )
710 wxPuts(_T("ERROR: failed to open file(s)"));
715 if ( !f1
.ReadAll(&s1
) || !f2
.ReadAll(&s2
) )
717 wxPuts(_T("ERROR: failed to read file(s)"));
721 if ( (s1
.length() != s2
.length()) ||
722 (memcmp(s1
.c_str(), s2
.c_str(), s1
.length()) != 0) )
724 wxPuts(_T("ERROR: copy error!"));
728 wxPuts(_T("File was copied ok."));
734 if ( !wxRemoveFile(filename2
) )
736 wxPuts(_T("ERROR: failed to remove the file"));
744 // ----------------------------------------------------------------------------
746 // ----------------------------------------------------------------------------
750 #include "wx/confbase.h"
751 #include "wx/fileconf.h"
753 static const struct FileConfTestData
755 const wxChar
*name
; // value name
756 const wxChar
*value
; // the value from the file
759 { _T("value1"), _T("one") },
760 { _T("value2"), _T("two") },
761 { _T("novalue"), _T("default") },
764 static void TestFileConfRead()
766 wxPuts(_T("*** testing wxFileConfig loading/reading ***"));
768 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
769 _T("testdata.fc"), wxEmptyString
,
770 wxCONFIG_USE_RELATIVE_PATH
);
772 // test simple reading
773 wxPuts(_T("\nReading config file:"));
774 wxString
defValue(_T("default")), value
;
775 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
777 const FileConfTestData
& data
= fcTestData
[n
];
778 value
= fileconf
.Read(data
.name
, defValue
);
779 wxPrintf(_T("\t%s = %s "), data
.name
, value
.c_str());
780 if ( value
== data
.value
)
786 wxPrintf(_T("(ERROR: should be %s)\n"), data
.value
);
790 // test enumerating the entries
791 wxPuts(_T("\nEnumerating all root entries:"));
794 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
797 wxPrintf(_T("\t%s = %s\n"),
799 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
801 cont
= fileconf
.GetNextEntry(name
, dummy
);
804 static const wxChar
*testEntry
= _T("TestEntry");
805 wxPrintf(_T("\nTesting deletion of newly created \"Test\" entry: "));
806 fileconf
.Write(testEntry
, _T("A value"));
807 fileconf
.DeleteEntry(testEntry
);
808 wxPrintf(fileconf
.HasEntry(testEntry
) ? _T("ERROR\n") : _T("ok\n"));
811 #endif // TEST_FILECONF
813 // ----------------------------------------------------------------------------
815 // ----------------------------------------------------------------------------
819 #include "wx/filename.h"
821 static void DumpFileName(const wxFileName
& fn
)
823 wxString full
= fn
.GetFullPath();
825 wxString vol
, path
, name
, ext
;
826 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
828 wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
829 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
831 wxFileName::SplitPath(full
, &path
, &name
, &ext
);
832 wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
833 path
.c_str(), name
.c_str(), ext
.c_str());
835 wxPrintf(_T("path is also:\t'%s'\n"), fn
.GetPath().c_str());
836 wxPrintf(_T("with volume: \t'%s'\n"),
837 fn
.GetPath(wxPATH_GET_VOLUME
).c_str());
838 wxPrintf(_T("with separator:\t'%s'\n"),
839 fn
.GetPath(wxPATH_GET_SEPARATOR
).c_str());
840 wxPrintf(_T("with both: \t'%s'\n"),
841 fn
.GetPath(wxPATH_GET_SEPARATOR
| wxPATH_GET_VOLUME
).c_str());
843 wxPuts(_T("The directories in the path are:"));
844 wxArrayString dirs
= fn
.GetDirs();
845 size_t count
= dirs
.GetCount();
846 for ( size_t n
= 0; n
< count
; n
++ )
848 wxPrintf(_T("\t%u: %s\n"), n
, dirs
[n
].c_str());
852 static struct FileNameInfo
854 const wxChar
*fullname
;
855 const wxChar
*volume
;
864 { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), true, wxPATH_UNIX
},
865 { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), true, wxPATH_UNIX
},
866 { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), true, wxPATH_UNIX
},
867 { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), false, wxPATH_UNIX
},
868 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), false, wxPATH_UNIX
},
869 { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), true, wxPATH_UNIX
},
870 { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), true, wxPATH_UNIX
},
871 { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), false, wxPATH_UNIX
},
872 { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), true, wxPATH_UNIX
},
874 // Windows file names
875 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), false, wxPATH_DOS
},
876 { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), false, wxPATH_DOS
},
877 { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), false, wxPATH_DOS
},
878 { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS
},
879 { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), true, wxPATH_DOS
},
880 { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS
},
881 { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), true, wxPATH_DOS
},
883 // wxFileName support for Mac file names is broken currently
886 { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), true, wxPATH_MAC
},
887 { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), true, wxPATH_MAC
},
888 { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), true, wxPATH_MAC
},
889 { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), false, wxPATH_MAC
},
890 { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC
},
891 { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC
},
895 { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), true, wxPATH_VMS
},
896 { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), false, wxPATH_VMS
},
899 static void TestFileNameConstruction()
901 wxPuts(_T("*** testing wxFileName construction ***"));
903 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
905 const FileNameInfo
& fni
= filenames
[n
];
907 wxFileName
fn(fni
.fullname
, fni
.format
);
909 wxString fullname
= fn
.GetFullPath(fni
.format
);
910 if ( fullname
!= fni
.fullname
)
912 wxPrintf(_T("ERROR: fullname should be '%s'\n"), fni
.fullname
);
915 bool isAbsolute
= fn
.IsAbsolute(fni
.format
);
916 wxPrintf(_T("'%s' is %s (%s)\n\t"),
918 isAbsolute
? "absolute" : "relative",
919 isAbsolute
== fni
.isAbsolute
? "ok" : "ERROR");
921 if ( !fn
.Normalize(wxPATH_NORM_ALL
, _T(""), fni
.format
) )
923 wxPuts(_T("ERROR (couldn't be normalized)"));
927 wxPrintf(_T("normalized: '%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
934 static void TestFileNameSplit()
936 wxPuts(_T("*** testing wxFileName splitting ***"));
938 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
940 const FileNameInfo
& fni
= filenames
[n
];
941 wxString volume
, path
, name
, ext
;
942 wxFileName::SplitPath(fni
.fullname
,
943 &volume
, &path
, &name
, &ext
, fni
.format
);
945 wxPrintf(_T("%s -> volume = '%s', path = '%s', name = '%s', ext = '%s'"),
947 volume
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
949 if ( volume
!= fni
.volume
)
950 wxPrintf(_T(" (ERROR: volume = '%s')"), fni
.volume
);
951 if ( path
!= fni
.path
)
952 wxPrintf(_T(" (ERROR: path = '%s')"), fni
.path
);
953 if ( name
!= fni
.name
)
954 wxPrintf(_T(" (ERROR: name = '%s')"), fni
.name
);
955 if ( ext
!= fni
.ext
)
956 wxPrintf(_T(" (ERROR: ext = '%s')"), fni
.ext
);
962 static void TestFileNameTemp()
964 wxPuts(_T("*** testing wxFileName temp file creation ***"));
966 static const wxChar
*tmpprefixes
[] =
974 _T("/tmp/foo/bar"), // this one must be an error
978 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
980 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
983 // "error" is not in upper case because it may be ok
984 wxPrintf(_T("Prefix '%s'\t-> error\n"), tmpprefixes
[n
]);
988 wxPrintf(_T("Prefix '%s'\t-> temp file '%s'\n"),
989 tmpprefixes
[n
], path
.c_str());
991 if ( !wxRemoveFile(path
) )
993 wxLogWarning(_T("Failed to remove temp file '%s'"),
1000 static void TestFileNameMakeRelative()
1002 wxPuts(_T("*** testing wxFileName::MakeRelativeTo() ***"));
1004 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1006 const FileNameInfo
& fni
= filenames
[n
];
1008 wxFileName
fn(fni
.fullname
, fni
.format
);
1010 // choose the base dir of the same format
1012 switch ( fni
.format
)
1024 // TODO: I don't know how this is supposed to work there
1027 case wxPATH_NATIVE
: // make gcc happy
1029 wxFAIL_MSG( "unexpected path format" );
1032 wxPrintf(_T("'%s' relative to '%s': "),
1033 fn
.GetFullPath(fni
.format
).c_str(), base
.c_str());
1035 if ( !fn
.MakeRelativeTo(base
, fni
.format
) )
1037 wxPuts(_T("unchanged"));
1041 wxPrintf(_T("'%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
1046 static void TestFileNameMakeAbsolute()
1048 wxPuts(_T("*** testing wxFileName::MakeAbsolute() ***"));
1050 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1052 const FileNameInfo
& fni
= filenames
[n
];
1053 wxFileName
fn(fni
.fullname
, fni
.format
);
1055 wxPrintf(_T("'%s' absolutized: "),
1056 fn
.GetFullPath(fni
.format
).c_str());
1058 wxPrintf(_T("'%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
1064 static void TestFileNameComparison()
1069 static void TestFileNameOperations()
1074 static void TestFileNameCwd()
1079 #endif // TEST_FILENAME
1081 // ----------------------------------------------------------------------------
1082 // wxFileName time functions
1083 // ----------------------------------------------------------------------------
1085 #ifdef TEST_FILETIME
1087 #include <wx/filename.h>
1088 #include <wx/datetime.h>
1090 static void TestFileGetTimes()
1092 wxFileName
fn(_T("testdata.fc"));
1094 wxDateTime dtAccess
, dtMod
, dtCreate
;
1095 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtCreate
) )
1097 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
1101 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
1103 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
1104 wxPrintf(_T("Creation: \t%s\n"), dtCreate
.Format(fmt
).c_str());
1105 wxPrintf(_T("Last read: \t%s\n"), dtAccess
.Format(fmt
).c_str());
1106 wxPrintf(_T("Last write: \t%s\n"), dtMod
.Format(fmt
).c_str());
1110 static void TestFileSetTimes()
1112 wxFileName
fn(_T("testdata.fc"));
1116 wxPrintf(_T("ERROR: Touch() failed.\n"));
1120 #endif // TEST_FILETIME
1122 // ----------------------------------------------------------------------------
1124 // ----------------------------------------------------------------------------
1128 #include "wx/hash.h"
1132 Foo(int n_
) { n
= n_
; count
++; }
1137 static size_t count
;
1140 size_t Foo::count
= 0;
1142 WX_DECLARE_LIST(Foo
, wxListFoos
);
1143 WX_DECLARE_HASH(Foo
, wxListFoos
, wxHashFoos
);
1145 #include "wx/listimpl.cpp"
1147 WX_DEFINE_LIST(wxListFoos
);
1149 static void TestHash()
1151 wxPuts(_T("*** Testing wxHashTable ***\n"));
1154 wxHashTable
hash(wxKEY_INTEGER
, 10), hash2(wxKEY_STRING
);
1158 for ( i
= 0; i
< 100; ++i
)
1159 hash
.Put(i
, &o
+ i
);
1162 wxHashTable::compatibility_iterator it
= hash
.Next();
1172 wxPuts(_T("Error in wxHashTable::compatibility_iterator\n"));
1174 for ( i
= 99; i
>= 0; --i
)
1175 if( hash
.Get(i
) != &o
+ i
)
1176 wxPuts(_T("Error in wxHashTable::Get/Put\n"));
1178 for ( i
= 0; i
< 100; ++i
)
1179 hash
.Put(i
, &o
+ i
+ 20);
1181 for ( i
= 99; i
>= 0; --i
)
1182 if( hash
.Get(i
) != &o
+ i
)
1183 wxPuts(_T("Error (2) in wxHashTable::Get/Put\n"));
1185 for ( i
= 0; i
< 50; ++i
)
1186 if( hash
.Delete(i
) != &o
+ i
)
1187 wxPuts(_T("Error in wxHashTable::Delete\n"));
1189 for ( i
= 50; i
< 100; ++i
)
1190 if( hash
.Get(i
) != &o
+ i
)
1191 wxPuts(_T("Error (3) in wxHashTable::Get/Put\n"));
1193 for ( i
= 0; i
< 50; ++i
)
1194 if( hash
.Get(i
) != &o
+ i
+ 20)
1195 wxPuts(_T("Error (4) in wxHashTable::Put/Delete\n"));
1197 for ( i
= 0; i
< 50; ++i
)
1198 if( hash
.Delete(i
) != &o
+ i
+ 20)
1199 wxPuts(_T("Error (2) in wxHashTable::Delete\n"));
1201 for ( i
= 0; i
< 50; ++i
)
1202 if( hash
.Get(i
) != NULL
)
1203 wxPuts(_T("Error (5) in wxHashTable::Put/Delete\n"));
1205 hash2
.Put(_T("foo"), &o
+ 1);
1206 hash2
.Put(_T("bar"), &o
+ 2);
1207 hash2
.Put(_T("baz"), &o
+ 3);
1209 if (hash2
.Get(_T("moo")) != NULL
)
1210 wxPuts(_T("Error in wxHashTable::Get\n"));
1212 if (hash2
.Get(_T("bar")) != &o
+ 2)
1213 wxPuts(_T("Error in wxHashTable::Get/Put\n"));
1215 hash2
.Put(_T("bar"), &o
+ 0);
1217 if (hash2
.Get(_T("bar")) != &o
+ 2)
1218 wxPuts(_T("Error (2) in wxHashTable::Get/Put\n"));
1223 hash
.DeleteContents(true);
1225 wxPrintf(_T("Hash created: %u foos in hash, %u foos totally\n"),
1226 hash
.GetCount(), Foo::count
);
1228 static const int hashTestData
[] =
1230 0, 1, 17, -2, 2, 4, -4, 345, 3, 3, 2, 1,
1234 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1236 hash
.Put(hashTestData
[n
], n
, new Foo(n
));
1239 wxPrintf(_T("Hash filled: %u foos in hash, %u foos totally\n"),
1240 hash
.GetCount(), Foo::count
);
1242 wxPuts(_T("Hash access test:"));
1243 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1245 wxPrintf(_T("\tGetting element with key %d, value %d: "),
1246 hashTestData
[n
], n
);
1247 Foo
*foo
= hash
.Get(hashTestData
[n
], n
);
1250 wxPrintf(_T("ERROR, not found.\n"));
1254 wxPrintf(_T("%d (%s)\n"), foo
->n
,
1255 (size_t)foo
->n
== n
? "ok" : "ERROR");
1259 wxPrintf(_T("\nTrying to get an element not in hash: "));
1261 if ( hash
.Get(1234) || hash
.Get(1, 0) )
1263 wxPuts(_T("ERROR: found!"));
1267 wxPuts(_T("ok (not found)"));
1272 wxPrintf(_T("Hash destroyed: %u foos left\n"), Foo::count
);
1273 wxPuts(_T("*** Testing wxHashTable finished ***\n"));
1278 // ----------------------------------------------------------------------------
1280 // ----------------------------------------------------------------------------
1284 #include "wx/hashmap.h"
1286 // test compilation of basic map types
1287 WX_DECLARE_HASH_MAP( int*, int*, wxPointerHash
, wxPointerEqual
, myPtrHashMap
);
1288 WX_DECLARE_HASH_MAP( long, long, wxIntegerHash
, wxIntegerEqual
, myLongHashMap
);
1289 WX_DECLARE_HASH_MAP( unsigned long, unsigned, wxIntegerHash
, wxIntegerEqual
,
1290 myUnsignedHashMap
);
1291 WX_DECLARE_HASH_MAP( unsigned int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1293 WX_DECLARE_HASH_MAP( int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1295 WX_DECLARE_HASH_MAP( short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1297 WX_DECLARE_HASH_MAP( unsigned short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1301 // WX_DECLARE_HASH_MAP( wxString, wxString, wxStringHash, wxStringEqual,
1302 // myStringHashMap );
1303 WX_DECLARE_STRING_HASH_MAP(wxString
, myStringHashMap
);
1305 typedef myStringHashMap::iterator Itor
;
1307 static void TestHashMap()
1309 wxPuts(_T("*** Testing wxHashMap ***\n"));
1310 myStringHashMap
sh(0); // as small as possible
1313 const size_t count
= 10000;
1315 // init with some data
1316 for( i
= 0; i
< count
; ++i
)
1318 buf
.Printf(wxT("%d"), i
);
1319 sh
[buf
] = wxT("A") + buf
+ wxT("C");
1322 // test that insertion worked
1323 if( sh
.size() != count
)
1325 wxPrintf(_T("*** ERROR: %u ELEMENTS, SHOULD BE %u ***\n"), sh
.size(), count
);
1328 for( i
= 0; i
< count
; ++i
)
1330 buf
.Printf(wxT("%d"), i
);
1331 if( sh
[buf
] != wxT("A") + buf
+ wxT("C") )
1333 wxPrintf(_T("*** ERROR INSERTION BROKEN! STOPPING NOW! ***\n"));
1338 // check that iterators work
1340 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1344 wxPrintf(_T("*** ERROR ITERATORS DO NOT TERMINATE! STOPPING NOW! ***\n"));
1348 if( it
->second
!= sh
[it
->first
] )
1350 wxPrintf(_T("*** ERROR ITERATORS BROKEN! STOPPING NOW! ***\n"));
1355 if( sh
.size() != i
)
1357 wxPrintf(_T("*** ERROR: %u ELEMENTS ITERATED, SHOULD BE %u ***\n"), i
, count
);
1360 // test copy ctor, assignment operator
1361 myStringHashMap
h1( sh
), h2( 0 );
1364 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1366 if( h1
[it
->first
] != it
->second
)
1368 wxPrintf(_T("*** ERROR: COPY CTOR BROKEN %s ***\n"), it
->first
.c_str());
1371 if( h2
[it
->first
] != it
->second
)
1373 wxPrintf(_T("*** ERROR: OPERATOR= BROKEN %s ***\n"), it
->first
.c_str());
1378 for( i
= 0; i
< count
; ++i
)
1380 buf
.Printf(wxT("%d"), i
);
1381 size_t sz
= sh
.size();
1383 // test find() and erase(it)
1386 it
= sh
.find( buf
);
1387 if( it
!= sh
.end() )
1391 if( sh
.find( buf
) != sh
.end() )
1393 wxPrintf(_T("*** ERROR: FOUND DELETED ELEMENT %u ***\n"), i
);
1397 wxPrintf(_T("*** ERROR: CANT FIND ELEMENT %u ***\n"), i
);
1402 size_t c
= sh
.erase( buf
);
1404 wxPrintf(_T("*** ERROR: SHOULD RETURN 1 ***\n"));
1406 if( sh
.find( buf
) != sh
.end() )
1408 wxPrintf(_T("*** ERROR: FOUND DELETED ELEMENT %u ***\n"), i
);
1412 // count should decrease
1413 if( sh
.size() != sz
- 1 )
1415 wxPrintf(_T("*** ERROR: COUNT DID NOT DECREASE ***\n"));
1419 wxPrintf(_T("*** Finished testing wxHashMap ***\n"));
1422 #endif // TEST_HASHMAP
1424 // ----------------------------------------------------------------------------
1426 // ----------------------------------------------------------------------------
1430 #include "wx/hashset.h"
1432 // test compilation of basic map types
1433 WX_DECLARE_HASH_SET( int*, wxPointerHash
, wxPointerEqual
, myPtrHashSet
);
1434 WX_DECLARE_HASH_SET( long, wxIntegerHash
, wxIntegerEqual
, myLongHashSet
);
1435 WX_DECLARE_HASH_SET( unsigned long, wxIntegerHash
, wxIntegerEqual
,
1436 myUnsignedHashSet
);
1437 WX_DECLARE_HASH_SET( unsigned int, wxIntegerHash
, wxIntegerEqual
,
1439 WX_DECLARE_HASH_SET( int, wxIntegerHash
, wxIntegerEqual
,
1441 WX_DECLARE_HASH_SET( short, wxIntegerHash
, wxIntegerEqual
,
1443 WX_DECLARE_HASH_SET( unsigned short, wxIntegerHash
, wxIntegerEqual
,
1445 WX_DECLARE_HASH_SET( wxString
, wxStringHash
, wxStringEqual
,
1457 unsigned long operator()(const MyStruct
& s
) const
1458 { return m_dummy(s
.ptr
); }
1459 MyHash
& operator=(const MyHash
&) { return *this; }
1461 wxPointerHash m_dummy
;
1467 bool operator()(const MyStruct
& s1
, const MyStruct
& s2
) const
1468 { return s1
.ptr
== s2
.ptr
; }
1469 MyEqual
& operator=(const MyEqual
&) { return *this; }
1472 WX_DECLARE_HASH_SET( MyStruct
, MyHash
, MyEqual
, mySet
);
1474 typedef myTestHashSet5 wxStringHashSet
;
1476 static void TestHashSet()
1478 wxPrintf(_T("*** Testing wxHashSet ***\n"));
1480 wxStringHashSet set1
;
1482 set1
.insert( _T("abc") );
1483 set1
.insert( _T("bbc") );
1484 set1
.insert( _T("cbc") );
1485 set1
.insert( _T("abc") );
1487 if( set1
.size() != 3 )
1488 wxPrintf(_T("*** ERROR IN INSERT ***\n"));
1494 tmp
.ptr
= &dummy
; tmp
.str
= _T("ABC");
1496 tmp
.ptr
= &dummy
+ 1;
1498 tmp
.ptr
= &dummy
; tmp
.str
= _T("CDE");
1501 if( set2
.size() != 2 )
1502 wxPrintf(_T("*** ERROR IN INSERT - 2 ***\n"));
1504 mySet::iterator it
= set2
.find( tmp
);
1506 if( it
== set2
.end() )
1507 wxPrintf(_T("*** ERROR IN FIND - 1 ***\n"));
1508 if( it
->ptr
!= &dummy
)
1509 wxPrintf(_T("*** ERROR IN FIND - 2 ***\n"));
1510 if( it
->str
!= _T("ABC") )
1511 wxPrintf(_T("*** ERROR IN INSERT - 3 ***\n"));
1513 wxPrintf(_T("*** Finished testing wxHashSet ***\n"));
1516 #endif // TEST_HASHSET
1518 // ----------------------------------------------------------------------------
1520 // ----------------------------------------------------------------------------
1524 #include "wx/list.h"
1526 WX_DECLARE_LIST(Bar
, wxListBars
);
1527 #include "wx/listimpl.cpp"
1528 WX_DEFINE_LIST(wxListBars
);
1530 WX_DECLARE_LIST(int, wxListInt
);
1531 WX_DEFINE_LIST(wxListInt
);
1533 static void TestList()
1535 wxPuts(_T("*** Testing wxList operations ***\n"));
1541 for ( i
= 0; i
< 5; ++i
)
1542 list1
.Append(dummy
+ i
);
1544 if ( list1
.GetCount() != 5 )
1545 wxPuts(_T("Wrong number of items in list\n"));
1547 if ( list1
.Item(3)->GetData() != dummy
+ 3 )
1548 wxPuts(_T("Error in Item()\n"));
1550 if ( !list1
.Find(dummy
+ 4) )
1551 wxPuts(_T("Error in Find()\n"));
1553 wxListInt::compatibility_iterator node
= list1
.GetFirst();
1558 if ( node
->GetData() != dummy
+ i
)
1559 wxPuts(_T("Error in compatibility_iterator\n"));
1560 node
= node
->GetNext();
1564 if ( size_t(i
) != list1
.GetCount() )
1565 wxPuts(_T("Error in compatibility_iterator\n"));
1567 list1
.Insert(dummy
+ 0);
1568 list1
.Insert(1, dummy
+ 1);
1569 list1
.Insert(list1
.GetFirst()->GetNext()->GetNext(), dummy
+ 2);
1571 node
= list1
.GetFirst();
1576 int* t
= node
->GetData();
1577 if ( t
!= dummy
+ i
)
1578 wxPuts(_T("Error in Insert\n"));
1579 node
= node
->GetNext();
1584 wxPuts(_T("*** Testing wxList operations finished ***\n"));
1586 wxPuts(_T("*** Testing std::list operations ***\n"));
1590 wxListInt::iterator it
, en
;
1591 wxListInt::reverse_iterator rit
, ren
;
1593 for ( i
= 0; i
< 5; ++i
)
1594 list1
.push_back(i
+ &i
);
1596 for ( it
= list1
.begin(), en
= list1
.end(), i
= 0;
1597 it
!= en
; ++it
, ++i
)
1598 if ( *it
!= i
+ &i
)
1599 wxPuts(_T("Error in iterator\n"));
1601 for ( rit
= list1
.rbegin(), ren
= list1
.rend(), i
= 4;
1602 rit
!= ren
; ++rit
, --i
)
1603 if ( *rit
!= i
+ &i
)
1604 wxPuts(_T("Error in reverse_iterator\n"));
1606 if ( *list1
.rbegin() != *--list1
.end() ||
1607 *list1
.begin() != *--list1
.rend() )
1608 wxPuts(_T("Error in iterator/reverse_iterator\n"));
1609 if ( *list1
.begin() != *--++list1
.begin() ||
1610 *list1
.rbegin() != *--++list1
.rbegin() )
1611 wxPuts(_T("Error in iterator/reverse_iterator\n"));
1613 if ( list1
.front() != &i
|| list1
.back() != &i
+ 4 )
1614 wxPuts(_T("Error in front()/back()\n"));
1616 list1
.erase(list1
.begin());
1617 list1
.erase(--list1
.end());
1619 for ( it
= list1
.begin(), en
= list1
.end(), i
= 1;
1620 it
!= en
; ++it
, ++i
)
1621 if ( *it
!= i
+ &i
)
1622 wxPuts(_T("Error in erase()\n"));
1625 wxPuts(_T("*** Testing std::list operations finished ***\n"));
1628 static void TestListCtor()
1630 wxPuts(_T("*** Testing wxList construction ***\n"));
1634 list1
.Append(new Bar(_T("first")));
1635 list1
.Append(new Bar(_T("second")));
1637 wxPrintf(_T("After 1st list creation: %u objects in the list, %u objects total.\n"),
1638 list1
.GetCount(), Bar::GetNumber());
1643 wxPrintf(_T("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n"),
1644 list1
.GetCount(), list2
.GetCount(), Bar::GetNumber());
1647 list1
.DeleteContents(true);
1649 WX_CLEAR_LIST(wxListBars
, list1
);
1653 wxPrintf(_T("After list destruction: %u objects left.\n"), Bar::GetNumber());
1658 // ----------------------------------------------------------------------------
1660 // ----------------------------------------------------------------------------
1664 #include "wx/intl.h"
1665 #include "wx/utils.h" // for wxSetEnv
1667 static wxLocale
gs_localeDefault(wxLANGUAGE_ENGLISH
);
1669 // find the name of the language from its value
1670 static const wxChar
*GetLangName(int lang
)
1672 static const wxChar
*languageNames
[] =
1682 _T("ARABIC_ALGERIA"),
1683 _T("ARABIC_BAHRAIN"),
1686 _T("ARABIC_JORDAN"),
1687 _T("ARABIC_KUWAIT"),
1688 _T("ARABIC_LEBANON"),
1690 _T("ARABIC_MOROCCO"),
1693 _T("ARABIC_SAUDI_ARABIA"),
1696 _T("ARABIC_TUNISIA"),
1703 _T("AZERI_CYRILLIC"),
1718 _T("CHINESE_SIMPLIFIED"),
1719 _T("CHINESE_TRADITIONAL"),
1720 _T("CHINESE_HONGKONG"),
1721 _T("CHINESE_MACAU"),
1722 _T("CHINESE_SINGAPORE"),
1723 _T("CHINESE_TAIWAN"),
1729 _T("DUTCH_BELGIAN"),
1733 _T("ENGLISH_AUSTRALIA"),
1734 _T("ENGLISH_BELIZE"),
1735 _T("ENGLISH_BOTSWANA"),
1736 _T("ENGLISH_CANADA"),
1737 _T("ENGLISH_CARIBBEAN"),
1738 _T("ENGLISH_DENMARK"),
1740 _T("ENGLISH_JAMAICA"),
1741 _T("ENGLISH_NEW_ZEALAND"),
1742 _T("ENGLISH_PHILIPPINES"),
1743 _T("ENGLISH_SOUTH_AFRICA"),
1744 _T("ENGLISH_TRINIDAD"),
1745 _T("ENGLISH_ZIMBABWE"),
1753 _T("FRENCH_BELGIAN"),
1754 _T("FRENCH_CANADIAN"),
1755 _T("FRENCH_LUXEMBOURG"),
1756 _T("FRENCH_MONACO"),
1762 _T("GERMAN_AUSTRIAN"),
1763 _T("GERMAN_BELGIUM"),
1764 _T("GERMAN_LIECHTENSTEIN"),
1765 _T("GERMAN_LUXEMBOURG"),
1783 _T("ITALIAN_SWISS"),
1788 _T("KASHMIRI_INDIA"),
1806 _T("MALAY_BRUNEI_DARUSSALAM"),
1807 _T("MALAY_MALAYSIA"),
1817 _T("NORWEGIAN_BOKMAL"),
1818 _T("NORWEGIAN_NYNORSK"),
1825 _T("PORTUGUESE_BRAZILIAN"),
1828 _T("RHAETO_ROMANCE"),
1831 _T("RUSSIAN_UKRAINE"),
1837 _T("SERBIAN_CYRILLIC"),
1838 _T("SERBIAN_LATIN"),
1839 _T("SERBO_CROATIAN"),
1850 _T("SPANISH_ARGENTINA"),
1851 _T("SPANISH_BOLIVIA"),
1852 _T("SPANISH_CHILE"),
1853 _T("SPANISH_COLOMBIA"),
1854 _T("SPANISH_COSTA_RICA"),
1855 _T("SPANISH_DOMINICAN_REPUBLIC"),
1856 _T("SPANISH_ECUADOR"),
1857 _T("SPANISH_EL_SALVADOR"),
1858 _T("SPANISH_GUATEMALA"),
1859 _T("SPANISH_HONDURAS"),
1860 _T("SPANISH_MEXICAN"),
1861 _T("SPANISH_MODERN"),
1862 _T("SPANISH_NICARAGUA"),
1863 _T("SPANISH_PANAMA"),
1864 _T("SPANISH_PARAGUAY"),
1866 _T("SPANISH_PUERTO_RICO"),
1867 _T("SPANISH_URUGUAY"),
1869 _T("SPANISH_VENEZUELA"),
1873 _T("SWEDISH_FINLAND"),
1891 _T("URDU_PAKISTAN"),
1893 _T("UZBEK_CYRILLIC"),
1906 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1907 return languageNames
[lang
];
1909 return _T("INVALID");
1912 static void TestDefaultLang()
1914 wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
1916 static const wxChar
*langStrings
[] =
1918 NULL
, // system default
1925 _T("de_DE.iso88591"),
1927 _T("?"), // invalid lang spec
1928 _T("klingonese"), // I bet on some systems it does exist...
1931 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1932 wxLocale::GetSystemEncodingName().c_str(),
1933 wxLocale::GetSystemEncoding());
1935 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1937 const wxChar
*langStr
= langStrings
[n
];
1940 // FIXME: this doesn't do anything at all under Windows, we need
1941 // to create a new wxLocale!
1942 wxSetEnv(_T("LC_ALL"), langStr
);
1945 int lang
= gs_localeDefault
.GetSystemLanguage();
1946 wxPrintf(_T("Locale for '%s' is %s.\n"),
1947 langStr
? langStr
: _T("system default"), GetLangName(lang
));
1951 #endif // TEST_LOCALE
1953 // ----------------------------------------------------------------------------
1955 // ----------------------------------------------------------------------------
1959 #include "wx/mimetype.h"
1961 static void TestMimeEnum()
1963 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1965 wxArrayString mimetypes
;
1967 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1969 wxPrintf(_T("*** All %u known filetypes: ***\n"), count
);
1974 for ( size_t n
= 0; n
< count
; n
++ )
1976 wxFileType
*filetype
=
1977 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1980 wxPrintf(_T("nothing known about the filetype '%s'!\n"),
1981 mimetypes
[n
].c_str());
1985 filetype
->GetDescription(&desc
);
1986 filetype
->GetExtensions(exts
);
1988 filetype
->GetIcon(NULL
);
1991 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1994 extsAll
<< _T(", ");
1998 wxPrintf(_T("\t%s: %s (%s)\n"),
1999 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
2005 static void TestMimeOverride()
2007 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
2009 static const wxChar
*mailcap
= _T("/tmp/mailcap");
2010 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
2012 if ( wxFile::Exists(mailcap
) )
2013 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
2015 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
2017 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
2020 if ( wxFile::Exists(mimetypes
) )
2021 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
2023 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
2025 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
2031 static void TestMimeFilename()
2033 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
2035 static const wxChar
*filenames
[] =
2043 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
2045 const wxString fname
= filenames
[n
];
2046 wxString ext
= fname
.AfterLast(_T('.'));
2047 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
2050 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
2055 if ( !ft
->GetDescription(&desc
) )
2056 desc
= _T("<no description>");
2059 if ( !ft
->GetOpenCommand(&cmd
,
2060 wxFileType::MessageParameters(fname
, _T(""))) )
2061 cmd
= _T("<no command available>");
2063 cmd
= wxString(_T('"')) + cmd
+ _T('"');
2065 wxPrintf(_T("To open %s (%s) do %s.\n"),
2066 fname
.c_str(), desc
.c_str(), cmd
.c_str());
2075 static void TestMimeAssociate()
2077 wxPuts(_T("*** Testing creation of filetype association ***\n"));
2079 wxFileTypeInfo
ftInfo(
2080 _T("application/x-xyz"),
2081 _T("xyzview '%s'"), // open cmd
2082 _T(""), // print cmd
2083 _T("XYZ File"), // description
2084 _T(".xyz"), // extensions
2085 NULL
// end of extensions
2087 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
2089 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
2092 wxPuts(_T("ERROR: failed to create association!"));
2096 // TODO: read it back
2105 // ----------------------------------------------------------------------------
2106 // misc information functions
2107 // ----------------------------------------------------------------------------
2109 #ifdef TEST_INFO_FUNCTIONS
2111 #include "wx/utils.h"
2113 static void TestDiskInfo()
2115 wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
2119 wxChar pathname
[128];
2120 wxPrintf(_T("\nEnter a directory name: "));
2121 if ( !wxFgets(pathname
, WXSIZEOF(pathname
), stdin
) )
2124 // kill the last '\n'
2125 pathname
[wxStrlen(pathname
) - 1] = 0;
2127 wxLongLong total
, free
;
2128 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
2130 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
2134 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
2135 (total
/ 1024).ToString().c_str(),
2136 (free
/ 1024).ToString().c_str(),
2142 static void TestOsInfo()
2144 wxPuts(_T("*** Testing OS info functions ***\n"));
2147 wxGetOsVersion(&major
, &minor
);
2148 wxPrintf(_T("Running under: %s, version %d.%d\n"),
2149 wxGetOsDescription().c_str(), major
, minor
);
2151 wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory());
2153 wxPrintf(_T("Host name is %s (%s).\n"),
2154 wxGetHostName().c_str(), wxGetFullHostName().c_str());
2159 static void TestUserInfo()
2161 wxPuts(_T("*** Testing user info functions ***\n"));
2163 wxPrintf(_T("User id is:\t%s\n"), wxGetUserId().c_str());
2164 wxPrintf(_T("User name is:\t%s\n"), wxGetUserName().c_str());
2165 wxPrintf(_T("Home dir is:\t%s\n"), wxGetHomeDir().c_str());
2166 wxPrintf(_T("Email address:\t%s\n"), wxGetEmailAddress().c_str());
2171 #endif // TEST_INFO_FUNCTIONS
2173 // ----------------------------------------------------------------------------
2175 // ----------------------------------------------------------------------------
2177 #ifdef TEST_LONGLONG
2179 #include "wx/longlong.h"
2180 #include "wx/timer.h"
2182 // make a 64 bit number from 4 16 bit ones
2183 #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3)
2185 // get a random 64 bit number
2186 #define RAND_LL() MAKE_LL(rand(), rand(), rand(), rand())
2188 static const long testLongs
[] =
2199 #if wxUSE_LONGLONG_WX
2200 inline bool operator==(const wxLongLongWx
& a
, const wxLongLongNative
& b
)
2201 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
2202 inline bool operator==(const wxLongLongNative
& a
, const wxLongLongWx
& b
)
2203 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
2204 #endif // wxUSE_LONGLONG_WX
2206 static void TestSpeed()
2208 static const long max
= 100000000;
2215 for ( n
= 0; n
< max
; n
++ )
2220 wxPrintf(_T("Summing longs took %ld milliseconds.\n"), sw
.Time());
2223 #if wxUSE_LONGLONG_NATIVE
2228 for ( n
= 0; n
< max
; n
++ )
2233 wxPrintf(_T("Summing wxLongLong_t took %ld milliseconds.\n"), sw
.Time());
2235 #endif // wxUSE_LONGLONG_NATIVE
2241 for ( n
= 0; n
< max
; n
++ )
2246 wxPrintf(_T("Summing wxLongLongs took %ld milliseconds.\n"), sw
.Time());
2250 static void TestLongLongConversion()
2252 wxPuts(_T("*** Testing wxLongLong conversions ***\n"));
2256 for ( size_t n
= 0; n
< 100000; n
++ )
2260 #if wxUSE_LONGLONG_NATIVE
2261 wxLongLongNative
b(a
.GetHi(), a
.GetLo());
2263 wxASSERT_MSG( a
== b
, "conversions failure" );
2265 wxPuts(_T("Can't do it without native long long type, test skipped."));
2268 #endif // wxUSE_LONGLONG_NATIVE
2270 if ( !(nTested
% 1000) )
2279 wxPuts(_T(" done!"));
2282 static void TestMultiplication()
2284 wxPuts(_T("*** Testing wxLongLong multiplication ***\n"));
2288 for ( size_t n
= 0; n
< 100000; n
++ )
2293 #if wxUSE_LONGLONG_NATIVE
2294 wxLongLongNative
aa(a
.GetHi(), a
.GetLo());
2295 wxLongLongNative
bb(b
.GetHi(), b
.GetLo());
2297 wxASSERT_MSG( a
*b
== aa
*bb
, "multiplication failure" );
2298 #else // !wxUSE_LONGLONG_NATIVE
2299 wxPuts(_T("Can't do it without native long long type, test skipped."));
2302 #endif // wxUSE_LONGLONG_NATIVE
2304 if ( !(nTested
% 1000) )
2313 wxPuts(_T(" done!"));
2316 static void TestDivision()
2318 wxPuts(_T("*** Testing wxLongLong division ***\n"));
2322 for ( size_t n
= 0; n
< 100000; n
++ )
2324 // get a random wxLongLong (shifting by 12 the MSB ensures that the
2325 // multiplication will not overflow)
2326 wxLongLong ll
= MAKE_LL((rand() >> 12), rand(), rand(), rand());
2328 // get a random (but non null) long (not wxLongLong for now) to divide
2340 #if wxUSE_LONGLONG_NATIVE
2341 wxLongLongNative
m(ll
.GetHi(), ll
.GetLo());
2343 wxLongLongNative p
= m
/ l
, s
= m
% l
;
2344 wxASSERT_MSG( q
== p
&& r
== s
, "division failure" );
2345 #else // !wxUSE_LONGLONG_NATIVE
2346 // verify the result
2347 wxASSERT_MSG( ll
== q
*l
+ r
, "division failure" );
2348 #endif // wxUSE_LONGLONG_NATIVE
2350 if ( !(nTested
% 1000) )
2359 wxPuts(_T(" done!"));
2362 static void TestAddition()
2364 wxPuts(_T("*** Testing wxLongLong addition ***\n"));
2368 for ( size_t n
= 0; n
< 100000; n
++ )
2374 #if wxUSE_LONGLONG_NATIVE
2375 wxASSERT_MSG( c
== wxLongLongNative(a
.GetHi(), a
.GetLo()) +
2376 wxLongLongNative(b
.GetHi(), b
.GetLo()),
2377 "addition failure" );
2378 #else // !wxUSE_LONGLONG_NATIVE
2379 wxASSERT_MSG( c
- b
== a
, "addition failure" );
2380 #endif // wxUSE_LONGLONG_NATIVE
2382 if ( !(nTested
% 1000) )
2391 wxPuts(_T(" done!"));
2394 static void TestBitOperations()
2396 wxPuts(_T("*** Testing wxLongLong bit operation ***\n"));
2400 for ( size_t n
= 0; n
< 100000; n
++ )
2404 #if wxUSE_LONGLONG_NATIVE
2405 for ( size_t n
= 0; n
< 33; n
++ )
2408 #else // !wxUSE_LONGLONG_NATIVE
2409 wxPuts(_T("Can't do it without native long long type, test skipped."));
2412 #endif // wxUSE_LONGLONG_NATIVE
2414 if ( !(nTested
% 1000) )
2423 wxPuts(_T(" done!"));
2426 static void TestLongLongComparison()
2428 #if wxUSE_LONGLONG_WX
2429 wxPuts(_T("*** Testing wxLongLong comparison ***\n"));
2431 static const long ls
[2] =
2437 wxLongLongWx lls
[2];
2441 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2445 for ( size_t m
= 0; m
< WXSIZEOF(lls
); m
++ )
2447 res
= lls
[m
] > testLongs
[n
];
2448 wxPrintf(_T("0x%lx > 0x%lx is %s (%s)\n"),
2449 ls
[m
], testLongs
[n
], res
? "true" : "false",
2450 res
== (ls
[m
] > testLongs
[n
]) ? "ok" : "ERROR");
2452 res
= lls
[m
] < testLongs
[n
];
2453 wxPrintf(_T("0x%lx < 0x%lx is %s (%s)\n"),
2454 ls
[m
], testLongs
[n
], res
? "true" : "false",
2455 res
== (ls
[m
] < testLongs
[n
]) ? "ok" : "ERROR");
2457 res
= lls
[m
] == testLongs
[n
];
2458 wxPrintf(_T("0x%lx == 0x%lx is %s (%s)\n"),
2459 ls
[m
], testLongs
[n
], res
? "true" : "false",
2460 res
== (ls
[m
] == testLongs
[n
]) ? "ok" : "ERROR");
2463 #endif // wxUSE_LONGLONG_WX
2466 static void TestLongLongToString()
2468 wxPuts(_T("*** Testing wxLongLong::ToString() ***\n"));
2470 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2472 wxLongLong ll
= testLongs
[n
];
2473 wxPrintf(_T("%ld == %s\n"), testLongs
[n
], ll
.ToString().c_str());
2476 wxLongLong
ll(0x12345678, 0x87654321);
2477 wxPrintf(_T("0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2480 wxPrintf(_T("-0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2483 static void TestLongLongPrintf()
2485 wxPuts(_T("*** Testing wxLongLong printing ***\n"));
2487 #ifdef wxLongLongFmtSpec
2488 wxLongLong ll
= wxLL(0x1234567890abcdef);
2489 wxString s
= wxString::Format(_T("%") wxLongLongFmtSpec
_T("x"), ll
);
2490 wxPrintf(_T("0x1234567890abcdef -> %s (%s)\n"),
2491 s
.c_str(), s
== _T("1234567890abcdef") ? _T("ok") : _T("ERROR"));
2492 #else // !wxLongLongFmtSpec
2493 #error "wxLongLongFmtSpec not defined for this compiler/platform"
2500 #endif // TEST_LONGLONG
2502 // ----------------------------------------------------------------------------
2504 // ----------------------------------------------------------------------------
2506 #ifdef TEST_PATHLIST
2509 #define CMD_IN_PATH _T("ls")
2511 #define CMD_IN_PATH _T("command.com")
2514 static void TestPathList()
2516 wxPuts(_T("*** Testing wxPathList ***\n"));
2518 wxPathList pathlist
;
2519 pathlist
.AddEnvList(_T("PATH"));
2520 wxString path
= pathlist
.FindValidPath(CMD_IN_PATH
);
2523 wxPrintf(_T("ERROR: command not found in the path.\n"));
2527 wxPrintf(_T("Command found in the path as '%s'.\n"), path
.c_str());
2531 #endif // TEST_PATHLIST
2533 // ----------------------------------------------------------------------------
2534 // regular expressions
2535 // ----------------------------------------------------------------------------
2539 #include "wx/regex.h"
2541 static void TestRegExCompile()
2543 wxPuts(_T("*** Testing RE compilation ***\n"));
2545 static struct RegExCompTestData
2547 const wxChar
*pattern
;
2549 } regExCompTestData
[] =
2551 { _T("foo"), true },
2552 { _T("foo("), false },
2553 { _T("foo(bar"), false },
2554 { _T("foo(bar)"), true },
2555 { _T("foo["), false },
2556 { _T("foo[bar"), false },
2557 { _T("foo[bar]"), true },
2558 { _T("foo{"), true },
2559 { _T("foo{1"), false },
2560 { _T("foo{bar"), true },
2561 { _T("foo{1}"), true },
2562 { _T("foo{1,2}"), true },
2563 { _T("foo{bar}"), true },
2564 { _T("foo*"), true },
2565 { _T("foo**"), false },
2566 { _T("foo+"), true },
2567 { _T("foo++"), false },
2568 { _T("foo?"), true },
2569 { _T("foo??"), false },
2570 { _T("foo?+"), false },
2574 for ( size_t n
= 0; n
< WXSIZEOF(regExCompTestData
); n
++ )
2576 const RegExCompTestData
& data
= regExCompTestData
[n
];
2577 bool ok
= re
.Compile(data
.pattern
);
2579 wxPrintf(_T("'%s' is %sa valid RE (%s)\n"),
2581 ok
? _T("") : _T("not "),
2582 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2586 static void TestRegExMatch()
2588 wxPuts(_T("*** Testing RE matching ***\n"));
2590 static struct RegExMatchTestData
2592 const wxChar
*pattern
;
2595 } regExMatchTestData
[] =
2597 { _T("foo"), _T("bar"), false },
2598 { _T("foo"), _T("foobar"), true },
2599 { _T("^foo"), _T("foobar"), true },
2600 { _T("^foo"), _T("barfoo"), false },
2601 { _T("bar$"), _T("barbar"), true },
2602 { _T("bar$"), _T("barbar "), false },
2605 for ( size_t n
= 0; n
< WXSIZEOF(regExMatchTestData
); n
++ )
2607 const RegExMatchTestData
& data
= regExMatchTestData
[n
];
2609 wxRegEx
re(data
.pattern
);
2610 bool ok
= re
.Matches(data
.text
);
2612 wxPrintf(_T("'%s' %s %s (%s)\n"),
2614 ok
? _T("matches") : _T("doesn't match"),
2616 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2620 static void TestRegExSubmatch()
2622 wxPuts(_T("*** Testing RE subexpressions ***\n"));
2624 wxRegEx
re(_T("([[:alpha:]]+) ([[:alpha:]]+) ([[:digit:]]+).*([[:digit:]]+)$"));
2625 if ( !re
.IsValid() )
2627 wxPuts(_T("ERROR: compilation failed."));
2631 wxString text
= _T("Fri Jul 13 18:37:52 CEST 2001");
2633 if ( !re
.Matches(text
) )
2635 wxPuts(_T("ERROR: match expected."));
2639 wxPrintf(_T("Entire match: %s\n"), re
.GetMatch(text
).c_str());
2641 wxPrintf(_T("Date: %s/%s/%s, wday: %s\n"),
2642 re
.GetMatch(text
, 3).c_str(),
2643 re
.GetMatch(text
, 2).c_str(),
2644 re
.GetMatch(text
, 4).c_str(),
2645 re
.GetMatch(text
, 1).c_str());
2649 static void TestRegExReplacement()
2651 wxPuts(_T("*** Testing RE replacement ***"));
2653 static struct RegExReplTestData
2657 const wxChar
*result
;
2659 } regExReplTestData
[] =
2661 { _T("foo123"), _T("bar"), _T("bar"), 1 },
2662 { _T("foo123"), _T("\\2\\1"), _T("123foo"), 1 },
2663 { _T("foo_123"), _T("\\2\\1"), _T("123foo"), 1 },
2664 { _T("123foo"), _T("bar"), _T("123foo"), 0 },
2665 { _T("123foo456foo"), _T("&&"), _T("123foo456foo456foo"), 1 },
2666 { _T("foo123foo123"), _T("bar"), _T("barbar"), 2 },
2667 { _T("foo123_foo456_foo789"), _T("bar"), _T("bar_bar_bar"), 3 },
2670 const wxChar
*pattern
= _T("([a-z]+)[^0-9]*([0-9]+)");
2671 wxRegEx
re(pattern
);
2673 wxPrintf(_T("Using pattern '%s' for replacement.\n"), pattern
);
2675 for ( size_t n
= 0; n
< WXSIZEOF(regExReplTestData
); n
++ )
2677 const RegExReplTestData
& data
= regExReplTestData
[n
];
2679 wxString text
= data
.text
;
2680 size_t nRepl
= re
.Replace(&text
, data
.repl
);
2682 wxPrintf(_T("%s =~ s/RE/%s/g: %u match%s, result = '%s' ("),
2683 data
.text
, data
.repl
,
2684 nRepl
, nRepl
== 1 ? _T("") : _T("es"),
2686 if ( text
== data
.result
&& nRepl
== data
.count
)
2692 wxPrintf(_T("ERROR: should be %u and '%s')\n"),
2693 data
.count
, data
.result
);
2698 static void TestRegExInteractive()
2700 wxPuts(_T("*** Testing RE interactively ***"));
2704 wxChar pattern
[128];
2705 wxPrintf(_T("\nEnter a pattern: "));
2706 if ( !wxFgets(pattern
, WXSIZEOF(pattern
), stdin
) )
2709 // kill the last '\n'
2710 pattern
[wxStrlen(pattern
) - 1] = 0;
2713 if ( !re
.Compile(pattern
) )
2721 wxPrintf(_T("Enter text to match: "));
2722 if ( !wxFgets(text
, WXSIZEOF(text
), stdin
) )
2725 // kill the last '\n'
2726 text
[wxStrlen(text
) - 1] = 0;
2728 if ( !re
.Matches(text
) )
2730 wxPrintf(_T("No match.\n"));
2734 wxPrintf(_T("Pattern matches at '%s'\n"), re
.GetMatch(text
).c_str());
2737 for ( size_t n
= 1; ; n
++ )
2739 if ( !re
.GetMatch(&start
, &len
, n
) )
2744 wxPrintf(_T("Subexpr %u matched '%s'\n"),
2745 n
, wxString(text
+ start
, len
).c_str());
2752 #endif // TEST_REGEX
2754 // ----------------------------------------------------------------------------
2756 // ----------------------------------------------------------------------------
2766 static void TestDbOpen()
2774 // ----------------------------------------------------------------------------
2776 // ----------------------------------------------------------------------------
2779 NB: this stuff was taken from the glibc test suite and modified to build
2780 in wxWindows: if I read the copyright below properly, this shouldn't
2786 #ifdef wxTEST_PRINTF
2787 // use our functions from wxchar.cpp
2791 // NB: do _not_ use ATTRIBUTE_PRINTF here, we have some invalid formats
2792 // in the tests below
2793 int wxPrintf( const wxChar
*format
, ... );
2794 int wxSprintf( wxChar
*str
, const wxChar
*format
, ... );
2797 #include "wx/longlong.h"
2801 static void rfg1 (void);
2802 static void rfg2 (void);
2806 fmtchk (const wxChar
*fmt
)
2808 (void) wxPrintf(_T("%s:\t`"), fmt
);
2809 (void) wxPrintf(fmt
, 0x12);
2810 (void) wxPrintf(_T("'\n"));
2814 fmtst1chk (const wxChar
*fmt
)
2816 (void) wxPrintf(_T("%s:\t`"), fmt
);
2817 (void) wxPrintf(fmt
, 4, 0x12);
2818 (void) wxPrintf(_T("'\n"));
2822 fmtst2chk (const wxChar
*fmt
)
2824 (void) wxPrintf(_T("%s:\t`"), fmt
);
2825 (void) wxPrintf(fmt
, 4, 4, 0x12);
2826 (void) wxPrintf(_T("'\n"));
2829 /* This page is covered by the following copyright: */
2831 /* (C) Copyright C E Chew
2833 * Feel free to copy, use and distribute this software provided:
2835 * 1. you do not pretend that you wrote it
2836 * 2. you leave this copyright notice intact.
2840 * Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans.
2847 /* Formatted Output Test
2849 * This exercises the output formatting code.
2857 wxChar
*prefix
= buf
;
2860 wxPuts(_T("\nFormatted output test"));
2861 wxPrintf(_T("prefix 6d 6o 6x 6X 6u\n"));
2862 wxStrcpy(prefix
, _T("%"));
2863 for (i
= 0; i
< 2; i
++) {
2864 for (j
= 0; j
< 2; j
++) {
2865 for (k
= 0; k
< 2; k
++) {
2866 for (l
= 0; l
< 2; l
++) {
2867 wxStrcpy(prefix
, _T("%"));
2868 if (i
== 0) wxStrcat(prefix
, _T("-"));
2869 if (j
== 0) wxStrcat(prefix
, _T("+"));
2870 if (k
== 0) wxStrcat(prefix
, _T("#"));
2871 if (l
== 0) wxStrcat(prefix
, _T("0"));
2872 wxPrintf(_T("%5s |"), prefix
);
2873 wxStrcpy(tp
, prefix
);
2874 wxStrcat(tp
, _T("6d |"));
2876 wxStrcpy(tp
, prefix
);
2877 wxStrcat(tp
, _T("6o |"));
2879 wxStrcpy(tp
, prefix
);
2880 wxStrcat(tp
, _T("6x |"));
2882 wxStrcpy(tp
, prefix
);
2883 wxStrcat(tp
, _T("6X |"));
2885 wxStrcpy(tp
, prefix
);
2886 wxStrcat(tp
, _T("6u |"));
2893 wxPrintf(_T("%10s\n"), (wxChar
*) NULL
);
2894 wxPrintf(_T("%-10s\n"), (wxChar
*) NULL
);
2897 static void TestPrintf()
2899 static wxChar shortstr
[] = _T("Hi, Z.");
2900 static wxChar longstr
[] = _T("Good morning, Doctor Chandra. This is Hal. \
2901 I am ready for my first lesson today.");
2906 fmtchk(_T("%4.4x"));
2907 fmtchk(_T("%04.4x"));
2908 fmtchk(_T("%4.3x"));
2909 fmtchk(_T("%04.3x"));
2911 fmtst1chk(_T("%.*x"));
2912 fmtst1chk(_T("%0*x"));
2913 fmtst2chk(_T("%*.*x"));
2914 fmtst2chk(_T("%0*.*x"));
2916 wxPrintf(_T("bad format:\t\"%b\"\n"));
2917 wxPrintf(_T("nil pointer (padded):\t\"%10p\"\n"), (void *) NULL
);
2919 wxPrintf(_T("decimal negative:\t\"%d\"\n"), -2345);
2920 wxPrintf(_T("octal negative:\t\"%o\"\n"), -2345);
2921 wxPrintf(_T("hex negative:\t\"%x\"\n"), -2345);
2922 wxPrintf(_T("long decimal number:\t\"%ld\"\n"), -123456L);
2923 wxPrintf(_T("long octal negative:\t\"%lo\"\n"), -2345L);
2924 wxPrintf(_T("long unsigned decimal number:\t\"%lu\"\n"), -123456L);
2925 wxPrintf(_T("zero-padded LDN:\t\"%010ld\"\n"), -123456L);
2926 wxPrintf(_T("left-adjusted ZLDN:\t\"%-010ld\"\n"), -123456);
2927 wxPrintf(_T("space-padded LDN:\t\"%10ld\"\n"), -123456L);
2928 wxPrintf(_T("left-adjusted SLDN:\t\"%-10ld\"\n"), -123456L);
2930 wxPrintf(_T("zero-padded string:\t\"%010s\"\n"), shortstr
);
2931 wxPrintf(_T("left-adjusted Z string:\t\"%-010s\"\n"), shortstr
);
2932 wxPrintf(_T("space-padded string:\t\"%10s\"\n"), shortstr
);
2933 wxPrintf(_T("left-adjusted S string:\t\"%-10s\"\n"), shortstr
);
2934 wxPrintf(_T("null string:\t\"%s\"\n"), (wxChar
*)NULL
);
2935 wxPrintf(_T("limited string:\t\"%.22s\"\n"), longstr
);
2937 wxPrintf(_T("e-style >= 1:\t\"%e\"\n"), 12.34);
2938 wxPrintf(_T("e-style >= .1:\t\"%e\"\n"), 0.1234);
2939 wxPrintf(_T("e-style < .1:\t\"%e\"\n"), 0.001234);
2940 wxPrintf(_T("e-style big:\t\"%.60e\"\n"), 1e20
);
2941 wxPrintf(_T("e-style == .1:\t\"%e\"\n"), 0.1);
2942 wxPrintf(_T("f-style >= 1:\t\"%f\"\n"), 12.34);
2943 wxPrintf(_T("f-style >= .1:\t\"%f\"\n"), 0.1234);
2944 wxPrintf(_T("f-style < .1:\t\"%f\"\n"), 0.001234);
2945 wxPrintf(_T("g-style >= 1:\t\"%g\"\n"), 12.34);
2946 wxPrintf(_T("g-style >= .1:\t\"%g\"\n"), 0.1234);
2947 wxPrintf(_T("g-style < .1:\t\"%g\"\n"), 0.001234);
2948 wxPrintf(_T("g-style big:\t\"%.60g\"\n"), 1e20
);
2950 wxPrintf (_T(" %6.5f\n"), .099999999860301614);
2951 wxPrintf (_T(" %6.5f\n"), .1);
2952 wxPrintf (_T("x%5.4fx\n"), .5);
2954 wxPrintf (_T("%#03x\n"), 1);
2956 //wxPrintf (_T("something really insane: %.10000f\n"), 1.0);
2962 while (niter
-- != 0)
2963 wxPrintf (_T("%.17e\n"), d
/ 2);
2967 wxPrintf (_T("%15.5e\n"), 4.9406564584124654e-324);
2969 #define FORMAT _T("|%12.4f|%12.4e|%12.4g|\n")
2970 wxPrintf (FORMAT
, 0.0, 0.0, 0.0);
2971 wxPrintf (FORMAT
, 1.0, 1.0, 1.0);
2972 wxPrintf (FORMAT
, -1.0, -1.0, -1.0);
2973 wxPrintf (FORMAT
, 100.0, 100.0, 100.0);
2974 wxPrintf (FORMAT
, 1000.0, 1000.0, 1000.0);
2975 wxPrintf (FORMAT
, 10000.0, 10000.0, 10000.0);
2976 wxPrintf (FORMAT
, 12345.0, 12345.0, 12345.0);
2977 wxPrintf (FORMAT
, 100000.0, 100000.0, 100000.0);
2978 wxPrintf (FORMAT
, 123456.0, 123456.0, 123456.0);
2983 int rc
= wxSnprintf (buf
, WXSIZEOF(buf
), _T("%30s"), _T("foo"));
2985 wxPrintf(_T("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n"),
2986 rc
, WXSIZEOF(buf
), buf
);
2989 wxPrintf ("snprintf (\"%%.999999u\", 10)\n",
2990 wxSnprintf(buf2
, WXSIZEOFbuf2
), "%.999999u", 10));
2996 wxPrintf (_T("%e should be 1.234568e+06\n"), 1234567.8);
2997 wxPrintf (_T("%f should be 1234567.800000\n"), 1234567.8);
2998 wxPrintf (_T("%g should be 1.23457e+06\n"), 1234567.8);
2999 wxPrintf (_T("%g should be 123.456\n"), 123.456);
3000 wxPrintf (_T("%g should be 1e+06\n"), 1000000.0);
3001 wxPrintf (_T("%g should be 10\n"), 10.0);
3002 wxPrintf (_T("%g should be 0.02\n"), 0.02);
3006 wxPrintf(_T("%.17f\n"),(1.0/x
/10.0+1.0)*x
-x
);
3012 wxSprintf(buf
,_T("%*s%*s%*s"),-1,_T("one"),-20,_T("two"),-30,_T("three"));
3014 result
|= wxStrcmp (buf
,
3015 _T("onetwo three "));
3017 wxPuts (result
!= 0 ? _T("Test failed!") : _T("Test ok."));
3024 wxSprintf(buf
, _T("%07") wxLongLongFmtSpec
_T("o"), wxLL(040000000000));
3025 wxPrintf (_T("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf
);
3027 if (wxStrcmp (buf
, _T("40000000000")) != 0)
3030 wxPuts (_T("\tFAILED"));
3034 #endif // wxLongLong_t
3036 wxPrintf (_T("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX
+ 2, UCHAR_MAX
+ 2);
3037 wxPrintf (_T("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX
+ 2, USHRT_MAX
+ 2);
3039 wxPuts (_T("--- Should be no further output. ---"));
3048 memset (bytes
, '\xff', sizeof bytes
);
3049 wxSprintf (buf
, _T("foo%hhn\n"), &bytes
[3]);
3050 if (bytes
[0] != '\xff' || bytes
[1] != '\xff' || bytes
[2] != '\xff'
3051 || bytes
[4] != '\xff' || bytes
[5] != '\xff' || bytes
[6] != '\xff')
3053 wxPuts (_T("%hhn overwrite more bytes"));
3058 wxPuts (_T("%hhn wrote incorrect value"));
3070 wxSprintf (buf
, _T("%5.s"), _T("xyz"));
3071 if (wxStrcmp (buf
, _T(" ")) != 0)
3072 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" "));
3073 wxSprintf (buf
, _T("%5.f"), 33.3);
3074 if (wxStrcmp (buf
, _T(" 33")) != 0)
3075 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 33"));
3076 wxSprintf (buf
, _T("%8.e"), 33.3e7
);
3077 if (wxStrcmp (buf
, _T(" 3e+08")) != 0)
3078 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3e+08"));
3079 wxSprintf (buf
, _T("%8.E"), 33.3e7
);
3080 if (wxStrcmp (buf
, _T(" 3E+08")) != 0)
3081 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3E+08"));
3082 wxSprintf (buf
, _T("%.g"), 33.3);
3083 if (wxStrcmp (buf
, _T("3e+01")) != 0)
3084 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3e+01"));
3085 wxSprintf (buf
, _T("%.G"), 33.3);
3086 if (wxStrcmp (buf
, _T("3E+01")) != 0)
3087 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3E+01"));
3097 wxSprintf (buf
, _T("%.*g"), prec
, 3.3);
3098 if (wxStrcmp (buf
, _T("3")) != 0)
3099 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
3101 wxSprintf (buf
, _T("%.*G"), prec
, 3.3);
3102 if (wxStrcmp (buf
, _T("3")) != 0)
3103 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
3105 wxSprintf (buf
, _T("%7.*G"), prec
, 3.33);
3106 if (wxStrcmp (buf
, _T(" 3")) != 0)
3107 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3"));
3109 wxSprintf (buf
, _T("%04.*o"), prec
, 33);
3110 if (wxStrcmp (buf
, _T(" 041")) != 0)
3111 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 041"));
3113 wxSprintf (buf
, _T("%09.*u"), prec
, 33);
3114 if (wxStrcmp (buf
, _T(" 0000033")) != 0)
3115 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 0000033"));
3117 wxSprintf (buf
, _T("%04.*x"), prec
, 33);
3118 if (wxStrcmp (buf
, _T(" 021")) != 0)
3119 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
3121 wxSprintf (buf
, _T("%04.*X"), prec
, 33);
3122 if (wxStrcmp (buf
, _T(" 021")) != 0)
3123 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
3126 #endif // TEST_PRINTF
3128 // ----------------------------------------------------------------------------
3129 // registry and related stuff
3130 // ----------------------------------------------------------------------------
3132 // this is for MSW only
3135 #undef TEST_REGISTRY
3140 #include "wx/confbase.h"
3141 #include "wx/msw/regconf.h"
3143 static void TestRegConfWrite()
3145 wxRegConfig
regconf(_T("console"), _T("wxwindows"));
3146 regconf
.Write(_T("Hello"), wxString(_T("world")));
3149 #endif // TEST_REGCONF
3151 #ifdef TEST_REGISTRY
3153 #include "wx/msw/registry.h"
3155 // I chose this one because I liked its name, but it probably only exists under
3157 static const wxChar
*TESTKEY
=
3158 _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
3160 static void TestRegistryRead()
3162 wxPuts(_T("*** testing registry reading ***"));
3164 wxRegKey
key(TESTKEY
);
3165 wxPrintf(_T("The test key name is '%s'.\n"), key
.GetName().c_str());
3168 wxPuts(_T("ERROR: test key can't be opened, aborting test."));
3173 size_t nSubKeys
, nValues
;
3174 if ( key
.GetKeyInfo(&nSubKeys
, NULL
, &nValues
, NULL
) )
3176 wxPrintf(_T("It has %u subkeys and %u values.\n"), nSubKeys
, nValues
);
3179 wxPrintf(_T("Enumerating values:\n"));
3183 bool cont
= key
.GetFirstValue(value
, dummy
);
3186 wxPrintf(_T("Value '%s': type "), value
.c_str());
3187 switch ( key
.GetValueType(value
) )
3189 case wxRegKey::Type_None
: wxPrintf(_T("ERROR (none)")); break;
3190 case wxRegKey::Type_String
: wxPrintf(_T("SZ")); break;
3191 case wxRegKey::Type_Expand_String
: wxPrintf(_T("EXPAND_SZ")); break;
3192 case wxRegKey::Type_Binary
: wxPrintf(_T("BINARY")); break;
3193 case wxRegKey::Type_Dword
: wxPrintf(_T("DWORD")); break;
3194 case wxRegKey::Type_Multi_String
: wxPrintf(_T("MULTI_SZ")); break;
3195 default: wxPrintf(_T("other (unknown)")); break;
3198 wxPrintf(_T(", value = "));
3199 if ( key
.IsNumericValue(value
) )
3202 key
.QueryValue(value
, &val
);
3203 wxPrintf(_T("%ld"), val
);
3208 key
.QueryValue(value
, val
);
3209 wxPrintf(_T("'%s'"), val
.c_str());
3211 key
.QueryRawValue(value
, val
);
3212 wxPrintf(_T(" (raw value '%s')"), val
.c_str());
3217 cont
= key
.GetNextValue(value
, dummy
);
3221 static void TestRegistryAssociation()
3224 The second call to deleteself genertaes an error message, with a
3225 messagebox saying .flo is crucial to system operation, while the .ddf
3226 call also fails, but with no error message
3231 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
3233 key
= "ddxf_auto_file" ;
3234 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
3236 key
= "ddxf_auto_file" ;
3237 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
3240 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
3242 key
= "program \"%1\"" ;
3244 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
3246 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
3248 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
3250 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
3254 #endif // TEST_REGISTRY
3256 // ----------------------------------------------------------------------------
3258 // ----------------------------------------------------------------------------
3260 #ifdef TEST_SCOPEGUARD
3262 #include "wx/scopeguard.h"
3264 static void function0() { puts("function0()"); }
3265 static void function1(int n
) { printf("function1(%d)\n", n
); }
3266 static void function2(double x
, char c
) { printf("function2(%g, %c)\n", x
, c
); }
3270 void method0() { printf("method0()\n"); }
3271 void method1(int n
) { printf("method1(%d)\n", n
); }
3272 void method2(double x
, char c
) { printf("method2(%g, %c)\n", x
, c
); }
3275 static void TestScopeGuard()
3277 ON_BLOCK_EXIT0(function0
);
3278 ON_BLOCK_EXIT1(function1
, 17);
3279 ON_BLOCK_EXIT2(function2
, 3.14, 'p');
3282 ON_BLOCK_EXIT_OBJ0(obj
, &Object::method0
);
3283 ON_BLOCK_EXIT_OBJ1(obj
, &Object::method1
, 7);
3284 ON_BLOCK_EXIT_OBJ2(obj
, &Object::method2
, 2.71, 'e');
3286 wxScopeGuard dismissed
= wxMakeGuard(function0
);
3287 dismissed
.Dismiss();
3292 // ----------------------------------------------------------------------------
3294 // ----------------------------------------------------------------------------
3298 #include "wx/socket.h"
3299 #include "wx/protocol/protocol.h"
3300 #include "wx/protocol/http.h"
3302 static void TestSocketServer()
3304 wxPuts(_T("*** Testing wxSocketServer ***\n"));
3306 static const int PORT
= 3000;
3311 wxSocketServer
*server
= new wxSocketServer(addr
);
3312 if ( !server
->Ok() )
3314 wxPuts(_T("ERROR: failed to bind"));
3322 wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT
);
3324 wxSocketBase
*socket
= server
->Accept();
3327 wxPuts(_T("ERROR: wxSocketServer::Accept() failed."));
3331 wxPuts(_T("Server: got a client."));
3333 server
->SetTimeout(60); // 1 min
3336 while ( !close
&& socket
->IsConnected() )
3339 wxChar ch
= _T('\0');
3342 if ( socket
->Read(&ch
, sizeof(ch
)).Error() )
3344 // don't log error if the client just close the connection
3345 if ( socket
->IsConnected() )
3347 wxPuts(_T("ERROR: in wxSocket::Read."));
3367 wxPrintf(_T("Server: got '%s'.\n"), s
.c_str());
3368 if ( s
== _T("close") )
3370 wxPuts(_T("Closing connection"));
3374 else if ( s
== _T("quit") )
3379 wxPuts(_T("Shutting down the server"));
3381 else // not a special command
3383 socket
->Write(s
.MakeUpper().c_str(), s
.length());
3384 socket
->Write("\r\n", 2);
3385 wxPrintf(_T("Server: wrote '%s'.\n"), s
.c_str());
3391 wxPuts(_T("Server: lost a client unexpectedly."));
3397 // same as "delete server" but is consistent with GUI programs
3401 static void TestSocketClient()
3403 wxPuts(_T("*** Testing wxSocketClient ***\n"));
3405 static const wxChar
*hostname
= _T("www.wxwindows.org");
3408 addr
.Hostname(hostname
);
3411 wxPrintf(_T("--- Attempting to connect to %s:80...\n"), hostname
);
3413 wxSocketClient client
;
3414 if ( !client
.Connect(addr
) )
3416 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3420 wxPrintf(_T("--- Connected to %s:%u...\n"),
3421 addr
.Hostname().c_str(), addr
.Service());
3425 // could use simply "GET" here I suppose
3427 wxString::Format(_T("GET http://%s/\r\n"), hostname
);
3428 client
.Write(cmdGet
, cmdGet
.length());
3429 wxPrintf(_T("--- Sent command '%s' to the server\n"),
3430 MakePrintable(cmdGet
).c_str());
3431 client
.Read(buf
, WXSIZEOF(buf
));
3432 wxPrintf(_T("--- Server replied:\n%s"), buf
);
3436 #endif // TEST_SOCKETS
3438 // ----------------------------------------------------------------------------
3440 // ----------------------------------------------------------------------------
3444 #include "wx/protocol/ftp.h"
3448 #define FTP_ANONYMOUS
3450 #ifdef FTP_ANONYMOUS
3451 static const wxChar
*directory
= _T("/pub");
3452 static const wxChar
*filename
= _T("welcome.msg");
3454 static const wxChar
*directory
= _T("/etc");
3455 static const wxChar
*filename
= _T("issue");
3458 static bool TestFtpConnect()
3460 wxPuts(_T("*** Testing FTP connect ***"));
3462 #ifdef FTP_ANONYMOUS
3463 static const wxChar
*hostname
= _T("ftp.wxwindows.org");
3465 wxPrintf(_T("--- Attempting to connect to %s:21 anonymously...\n"), hostname
);
3466 #else // !FTP_ANONYMOUS
3467 static const wxChar
*hostname
= "localhost";
3470 wxFgets(user
, WXSIZEOF(user
), stdin
);
3471 user
[wxStrlen(user
) - 1] = '\0'; // chop off '\n'
3474 wxChar password
[256];
3475 wxPrintf(_T("Password for %s: "), password
);
3476 wxFgets(password
, WXSIZEOF(password
), stdin
);
3477 password
[wxStrlen(password
) - 1] = '\0'; // chop off '\n'
3478 ftp
.SetPassword(password
);
3480 wxPrintf(_T("--- Attempting to connect to %s:21 as %s...\n"), hostname
, user
);
3481 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
3483 if ( !ftp
.Connect(hostname
) )
3485 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3491 wxPrintf(_T("--- Connected to %s, current directory is '%s'\n"),
3492 hostname
, ftp
.Pwd().c_str());
3498 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
3499 static void TestFtpWuFtpd()
3502 static const wxChar
*hostname
= _T("ftp.eudora.com");
3503 if ( !ftp
.Connect(hostname
) )
3505 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3509 static const wxChar
*filename
= _T("eudora/pubs/draft-gellens-submit-09.txt");
3510 wxInputStream
*in
= ftp
.GetInputStream(filename
);
3513 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
3517 size_t size
= in
->GetSize();
3518 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
3520 wxChar
*data
= new wxChar
[size
];
3521 if ( !in
->Read(data
, size
) )
3523 wxPuts(_T("ERROR: read error"));
3527 wxPrintf(_T("Successfully retrieved the file.\n"));
3536 static void TestFtpList()
3538 wxPuts(_T("*** Testing wxFTP file listing ***\n"));
3541 if ( !ftp
.ChDir(directory
) )
3543 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
3546 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3548 // test NLIST and LIST
3549 wxArrayString files
;
3550 if ( !ftp
.GetFilesList(files
) )
3552 wxPuts(_T("ERROR: failed to get NLIST of files"));
3556 wxPrintf(_T("Brief list of files under '%s':\n"), ftp
.Pwd().c_str());
3557 size_t count
= files
.GetCount();
3558 for ( size_t n
= 0; n
< count
; n
++ )
3560 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3562 wxPuts(_T("End of the file list"));
3565 if ( !ftp
.GetDirList(files
) )
3567 wxPuts(_T("ERROR: failed to get LIST of files"));
3571 wxPrintf(_T("Detailed list of files under '%s':\n"), ftp
.Pwd().c_str());
3572 size_t count
= files
.GetCount();
3573 for ( size_t n
= 0; n
< count
; n
++ )
3575 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3577 wxPuts(_T("End of the file list"));
3580 if ( !ftp
.ChDir(_T("..")) )
3582 wxPuts(_T("ERROR: failed to cd to .."));
3585 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3588 static void TestFtpDownload()
3590 wxPuts(_T("*** Testing wxFTP download ***\n"));
3593 wxInputStream
*in
= ftp
.GetInputStream(filename
);
3596 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
3600 size_t size
= in
->GetSize();
3601 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
3604 wxChar
*data
= new wxChar
[size
];
3605 if ( !in
->Read(data
, size
) )
3607 wxPuts(_T("ERROR: read error"));
3611 wxPrintf(_T("\nContents of %s:\n%s\n"), filename
, data
);
3619 static void TestFtpFileSize()
3621 wxPuts(_T("*** Testing FTP SIZE command ***"));
3623 if ( !ftp
.ChDir(directory
) )
3625 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
3628 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3630 if ( ftp
.FileExists(filename
) )
3632 int size
= ftp
.GetFileSize(filename
);
3634 wxPrintf(_T("ERROR: couldn't get size of '%s'\n"), filename
);
3636 wxPrintf(_T("Size of '%s' is %d bytes.\n"), filename
, size
);
3640 wxPrintf(_T("ERROR: '%s' doesn't exist\n"), filename
);
3644 static void TestFtpMisc()
3646 wxPuts(_T("*** Testing miscellaneous wxFTP functions ***"));
3648 if ( ftp
.SendCommand("STAT") != '2' )
3650 wxPuts(_T("ERROR: STAT failed"));
3654 wxPrintf(_T("STAT returned:\n\n%s\n"), ftp
.GetLastResult().c_str());
3657 if ( ftp
.SendCommand("HELP SITE") != '2' )
3659 wxPuts(_T("ERROR: HELP SITE failed"));
3663 wxPrintf(_T("The list of site-specific commands:\n\n%s\n"),
3664 ftp
.GetLastResult().c_str());
3668 static void TestFtpInteractive()
3670 wxPuts(_T("\n*** Interactive wxFTP test ***"));
3676 wxPrintf(_T("Enter FTP command: "));
3677 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
3680 // kill the last '\n'
3681 buf
[wxStrlen(buf
) - 1] = 0;
3683 // special handling of LIST and NLST as they require data connection
3684 wxString
start(buf
, 4);
3686 if ( start
== "LIST" || start
== "NLST" )
3689 if ( wxStrlen(buf
) > 4 )
3692 wxArrayString files
;
3693 if ( !ftp
.GetList(files
, wildcard
, start
== "LIST") )
3695 wxPrintf(_T("ERROR: failed to get %s of files\n"), start
.c_str());
3699 wxPrintf(_T("--- %s of '%s' under '%s':\n"),
3700 start
.c_str(), wildcard
.c_str(), ftp
.Pwd().c_str());
3701 size_t count
= files
.GetCount();
3702 for ( size_t n
= 0; n
< count
; n
++ )
3704 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3706 wxPuts(_T("--- End of the file list"));
3711 wxChar ch
= ftp
.SendCommand(buf
);
3712 wxPrintf(_T("Command %s"), ch
? _T("succeeded") : _T("failed"));
3715 wxPrintf(_T(" (return code %c)"), ch
);
3718 wxPrintf(_T(", server reply:\n%s\n\n"), ftp
.GetLastResult().c_str());
3722 wxPuts(_T("\n*** done ***"));
3725 static void TestFtpUpload()
3727 wxPuts(_T("*** Testing wxFTP uploading ***\n"));
3730 static const wxChar
*file1
= _T("test1");
3731 static const wxChar
*file2
= _T("test2");
3732 wxOutputStream
*out
= ftp
.GetOutputStream(file1
);
3735 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
3736 out
->Write("First hello", 11);
3740 // send a command to check the remote file
3741 if ( ftp
.SendCommand(wxString("STAT ") + file1
) != '2' )
3743 wxPrintf(_T("ERROR: STAT %s failed\n"), file1
);
3747 wxPrintf(_T("STAT %s returned:\n\n%s\n"),
3748 file1
, ftp
.GetLastResult().c_str());
3751 out
= ftp
.GetOutputStream(file2
);
3754 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
3755 out
->Write("Second hello", 12);
3762 // ----------------------------------------------------------------------------
3764 // ----------------------------------------------------------------------------
3768 #include "wx/wfstream.h"
3769 #include "wx/mstream.h"
3771 static void TestFileStream()
3773 wxPuts(_T("*** Testing wxFileInputStream ***"));
3775 static const wxChar
*filename
= _T("testdata.fs");
3777 wxFileOutputStream
fsOut(filename
);
3778 fsOut
.Write("foo", 3);
3781 wxFileInputStream
fsIn(filename
);
3782 wxPrintf(_T("File stream size: %u\n"), fsIn
.GetSize());
3783 while ( !fsIn
.Eof() )
3785 putchar(fsIn
.GetC());
3788 if ( !wxRemoveFile(filename
) )
3790 wxPrintf(_T("ERROR: failed to remove the file '%s'.\n"), filename
);
3793 wxPuts(_T("\n*** wxFileInputStream test done ***"));
3796 static void TestMemoryStream()
3798 wxPuts(_T("*** Testing wxMemoryOutputStream ***"));
3800 wxMemoryOutputStream memOutStream
;
3801 wxPrintf(_T("Initially out stream offset: %lu\n"),
3802 (unsigned long)memOutStream
.TellO());
3804 for ( const wxChar
*p
= _T("Hello, stream!"); *p
; p
++ )
3806 memOutStream
.PutC(*p
);
3809 wxPrintf(_T("Final out stream offset: %lu\n"),
3810 (unsigned long)memOutStream
.TellO());
3812 wxPuts(_T("*** Testing wxMemoryInputStream ***"));
3815 size_t len
= memOutStream
.CopyTo(buf
, WXSIZEOF(buf
));
3817 wxMemoryInputStream
memInpStream(buf
, len
);
3818 wxPrintf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
3819 while ( !memInpStream
.Eof() )
3821 putchar(memInpStream
.GetC());
3824 wxPuts(_T("\n*** wxMemoryInputStream test done ***"));
3827 #endif // TEST_STREAMS
3829 // ----------------------------------------------------------------------------
3831 // ----------------------------------------------------------------------------
3835 #include "wx/timer.h"
3836 #include "wx/utils.h"
3838 static void TestStopWatch()
3840 wxPuts(_T("*** Testing wxStopWatch ***\n"));
3844 wxPrintf(_T("Initially paused, after 2 seconds time is..."));
3847 wxPrintf(_T("\t%ldms\n"), sw
.Time());
3849 wxPrintf(_T("Resuming stopwatch and sleeping 3 seconds..."));
3853 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3856 wxPrintf(_T("Pausing agan and sleeping 2 more seconds..."));
3859 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3862 wxPrintf(_T("Finally resuming and sleeping 2 more seconds..."));
3865 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3868 wxPuts(_T("\nChecking for 'backwards clock' bug..."));
3869 for ( size_t n
= 0; n
< 70; n
++ )
3873 for ( size_t m
= 0; m
< 100000; m
++ )
3875 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
3877 wxPuts(_T("\ntime is negative - ERROR!"));
3885 wxPuts(_T(", ok."));
3888 #endif // TEST_TIMER
3890 // ----------------------------------------------------------------------------
3892 // ----------------------------------------------------------------------------
3896 #include "wx/vcard.h"
3898 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
3901 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
3904 wxPrintf(_T("%s%s"),
3905 wxString(_T('\t'), level
).c_str(),
3906 vcObj
->GetName().c_str());
3909 switch ( vcObj
->GetType() )
3911 case wxVCardObject::String
:
3912 case wxVCardObject::UString
:
3915 vcObj
->GetValue(&val
);
3916 value
<< _T('"') << val
<< _T('"');
3920 case wxVCardObject::Int
:
3923 vcObj
->GetValue(&i
);
3924 value
.Printf(_T("%u"), i
);
3928 case wxVCardObject::Long
:
3931 vcObj
->GetValue(&l
);
3932 value
.Printf(_T("%lu"), l
);
3936 case wxVCardObject::None
:
3939 case wxVCardObject::Object
:
3940 value
= _T("<node>");
3944 value
= _T("<unknown value type>");
3948 wxPrintf(_T(" = %s"), value
.c_str());
3951 DumpVObject(level
+ 1, *vcObj
);
3954 vcObj
= vcard
.GetNextProp(&cookie
);
3958 static void DumpVCardAddresses(const wxVCard
& vcard
)
3960 wxPuts(_T("\nShowing all addresses from vCard:\n"));
3964 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3968 int flags
= addr
->GetFlags();
3969 if ( flags
& wxVCardAddress::Domestic
)
3971 flagsStr
<< _T("domestic ");
3973 if ( flags
& wxVCardAddress::Intl
)
3975 flagsStr
<< _T("international ");
3977 if ( flags
& wxVCardAddress::Postal
)
3979 flagsStr
<< _T("postal ");
3981 if ( flags
& wxVCardAddress::Parcel
)
3983 flagsStr
<< _T("parcel ");
3985 if ( flags
& wxVCardAddress::Home
)
3987 flagsStr
<< _T("home ");
3989 if ( flags
& wxVCardAddress::Work
)
3991 flagsStr
<< _T("work ");
3994 wxPrintf(_T("Address %u:\n")
3996 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3999 addr
->GetPostOffice().c_str(),
4000 addr
->GetExtAddress().c_str(),
4001 addr
->GetStreet().c_str(),
4002 addr
->GetLocality().c_str(),
4003 addr
->GetRegion().c_str(),
4004 addr
->GetPostalCode().c_str(),
4005 addr
->GetCountry().c_str()
4009 addr
= vcard
.GetNextAddress(&cookie
);
4013 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
4015 wxPuts(_T("\nShowing all phone numbers from vCard:\n"));
4019 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
4023 int flags
= phone
->GetFlags();
4024 if ( flags
& wxVCardPhoneNumber::Voice
)
4026 flagsStr
<< _T("voice ");
4028 if ( flags
& wxVCardPhoneNumber::Fax
)
4030 flagsStr
<< _T("fax ");
4032 if ( flags
& wxVCardPhoneNumber::Cellular
)
4034 flagsStr
<< _T("cellular ");
4036 if ( flags
& wxVCardPhoneNumber::Modem
)
4038 flagsStr
<< _T("modem ");
4040 if ( flags
& wxVCardPhoneNumber::Home
)
4042 flagsStr
<< _T("home ");
4044 if ( flags
& wxVCardPhoneNumber::Work
)
4046 flagsStr
<< _T("work ");
4049 wxPrintf(_T("Phone number %u:\n")
4054 phone
->GetNumber().c_str()
4058 phone
= vcard
.GetNextPhoneNumber(&cookie
);
4062 static void TestVCardRead()
4064 wxPuts(_T("*** Testing wxVCard reading ***\n"));
4066 wxVCard
vcard(_T("vcard.vcf"));
4067 if ( !vcard
.IsOk() )
4069 wxPuts(_T("ERROR: couldn't load vCard."));
4073 // read individual vCard properties
4074 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
4078 vcObj
->GetValue(&value
);
4083 value
= _T("<none>");
4086 wxPrintf(_T("Full name retrieved directly: %s\n"), value
.c_str());
4089 if ( !vcard
.GetFullName(&value
) )
4091 value
= _T("<none>");
4094 wxPrintf(_T("Full name from wxVCard API: %s\n"), value
.c_str());
4096 // now show how to deal with multiply occuring properties
4097 DumpVCardAddresses(vcard
);
4098 DumpVCardPhoneNumbers(vcard
);
4100 // and finally show all
4101 wxPuts(_T("\nNow dumping the entire vCard:\n")
4102 "-----------------------------\n");
4104 DumpVObject(0, vcard
);
4108 static void TestVCardWrite()
4110 wxPuts(_T("*** Testing wxVCard writing ***\n"));
4113 if ( !vcard
.IsOk() )
4115 wxPuts(_T("ERROR: couldn't create vCard."));
4120 vcard
.SetName("Zeitlin", "Vadim");
4121 vcard
.SetFullName("Vadim Zeitlin");
4122 vcard
.SetOrganization("wxWindows", "R&D");
4124 // just dump the vCard back
4125 wxPuts(_T("Entire vCard follows:\n"));
4126 wxPuts(vcard
.Write());
4130 #endif // TEST_VCARD
4132 // ----------------------------------------------------------------------------
4134 // ----------------------------------------------------------------------------
4136 #if !defined(__WIN32__) || !wxUSE_FSVOLUME
4142 #include "wx/volume.h"
4144 static const wxChar
*volumeKinds
[] =
4150 _T("network volume"),
4154 static void TestFSVolume()
4156 wxPuts(_T("*** Testing wxFSVolume class ***"));
4158 wxArrayString volumes
= wxFSVolume::GetVolumes();
4159 size_t count
= volumes
.GetCount();
4163 wxPuts(_T("ERROR: no mounted volumes?"));
4167 wxPrintf(_T("%u mounted volumes found:\n"), count
);
4169 for ( size_t n
= 0; n
< count
; n
++ )
4171 wxFSVolume
vol(volumes
[n
]);
4174 wxPuts(_T("ERROR: couldn't create volume"));
4178 wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
4180 vol
.GetDisplayName().c_str(),
4181 vol
.GetName().c_str(),
4182 volumeKinds
[vol
.GetKind()],
4183 vol
.IsWritable() ? _T("rw") : _T("ro"),
4184 vol
.GetFlags() & wxFS_VOL_REMOVABLE
? _T("removable")
4189 #endif // TEST_VOLUME
4191 // ----------------------------------------------------------------------------
4192 // wide char and Unicode support
4193 // ----------------------------------------------------------------------------
4197 static void TestUnicodeToFromAscii()
4199 wxPuts(_T("Testing wxString::To/FromAscii()\n"));
4201 static const char *msg
= "Hello, world!";
4202 wxString s
= wxString::FromAscii(msg
);
4204 wxPrintf(_T("Message in Unicode: %s\n"), s
.c_str());
4205 printf("Message in ASCII: %s\n", (const char *)s
.ToAscii());
4207 wxPutchar(_T('\n'));
4210 #endif // TEST_UNICODE
4214 #include "wx/strconv.h"
4215 #include "wx/fontenc.h"
4216 #include "wx/encconv.h"
4217 #include "wx/buffer.h"
4219 static const unsigned char utf8koi8r
[] =
4221 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
4222 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
4223 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
4224 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
4225 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
4226 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
4227 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
4230 static const unsigned char utf8iso8859_1
[] =
4232 0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e,
4233 0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65,
4234 0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65,
4235 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65,
4236 0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0
4239 static const unsigned char utf8Invalid
[] =
4241 0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30,
4242 0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6,
4243 0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88,
4244 0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70,
4248 static const struct Utf8Data
4250 const unsigned char *text
;
4252 const wxChar
*charset
;
4253 wxFontEncoding encoding
;
4256 { utf8Invalid
, WXSIZEOF(utf8Invalid
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
4257 { utf8koi8r
, WXSIZEOF(utf8koi8r
), _T("koi8-r"), wxFONTENCODING_KOI8
},
4258 { utf8iso8859_1
, WXSIZEOF(utf8iso8859_1
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
4261 static void TestUtf8()
4263 wxPuts(_T("*** Testing UTF8 support ***\n"));
4268 for ( size_t n
= 0; n
< WXSIZEOF(utf8data
); n
++ )
4270 const Utf8Data
& u8d
= utf8data
[n
];
4271 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)u8d
.text
,
4272 WXSIZEOF(wbuf
)) == (size_t)-1 )
4274 wxPuts(_T("ERROR: UTF-8 decoding failed."));
4278 wxCSConv
conv(u8d
.charset
);
4279 if ( conv
.WC2MB(buf
, wbuf
, WXSIZEOF(buf
)) == (size_t)-1 )
4281 wxPrintf(_T("ERROR: conversion to %s failed.\n"), u8d
.charset
);
4285 wxPrintf(_T("String in %s: %s\n"), u8d
.charset
, buf
);
4289 wxString
s(wxConvUTF8
.cMB2WC((const char *)u8d
.text
), *wxConvCurrent
);
4291 s
= _T("<< conversion failed >>");
4292 wxPrintf(_T("String in current cset: %s\n"), s
.c_str());
4299 static void TestEncodingConverter()
4301 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
4303 // using wxEncodingConverter should give the same result as above
4306 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)utf8koi8r
,
4307 WXSIZEOF(utf8koi8r
)) == (size_t)-1 )
4309 wxPuts(_T("ERROR: UTF-8 decoding failed."));
4313 wxEncodingConverter ec
;
4314 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
4315 ec
.Convert(wbuf
, buf
);
4316 wxPrintf(_T("The same KOI8-R string using wxEC: %s\n"), buf
);
4322 #endif // TEST_WCHAR
4324 // ----------------------------------------------------------------------------
4326 // ----------------------------------------------------------------------------
4330 #include "wx/filesys.h"
4331 #include "wx/fs_zip.h"
4332 #include "wx/zipstrm.h"
4334 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
4336 static void TestZipStreamRead()
4338 wxPuts(_T("*** Testing ZIP reading ***\n"));
4340 static const wxChar
*filename
= _T("foo");
4341 wxZipInputStream
istr(TESTFILE_ZIP
, filename
);
4342 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
4344 wxPrintf(_T("Dumping the file '%s':\n"), filename
);
4345 while ( !istr
.Eof() )
4347 putchar(istr
.GetC());
4351 wxPuts(_T("\n----- done ------"));
4354 static void DumpZipDirectory(wxFileSystem
& fs
,
4355 const wxString
& dir
,
4356 const wxString
& indent
)
4358 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
4359 TESTFILE_ZIP
, dir
.c_str());
4360 wxString wildcard
= prefix
+ _T("/*");
4362 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
4363 while ( !dirname
.empty() )
4365 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
4367 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
4372 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
4374 DumpZipDirectory(fs
, dirname
,
4375 indent
+ wxString(_T(' '), 4));
4377 dirname
= fs
.FindNext();
4380 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
4381 while ( !filename
.empty() )
4383 if ( !filename
.StartsWith(prefix
, &filename
) )
4385 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
4390 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
4392 filename
= fs
.FindNext();
4396 static void TestZipFileSystem()
4398 wxPuts(_T("*** Testing ZIP file system ***\n"));
4400 wxFileSystem::AddHandler(new wxZipFSHandler
);
4402 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
4404 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
4409 // ----------------------------------------------------------------------------
4411 // ----------------------------------------------------------------------------
4415 #include "wx/zstream.h"
4416 #include "wx/wfstream.h"
4418 static const wxChar
*FILENAME_GZ
= _T("test.gz");
4419 static const wxChar
*TEST_DATA
= _T("hello and hello and hello and hello and hello");
4421 static void TestZlibStreamWrite()
4423 wxPuts(_T("*** Testing Zlib stream reading ***\n"));
4425 wxFileOutputStream
fileOutStream(FILENAME_GZ
);
4426 wxZlibOutputStream
ostr(fileOutStream
);
4427 wxPrintf(_T("Compressing the test string... "));
4428 ostr
.Write(TEST_DATA
, wxStrlen(TEST_DATA
) + 1);
4431 wxPuts(_T("(ERROR: failed)"));
4438 wxPuts(_T("\n----- done ------"));
4441 static void TestZlibStreamRead()
4443 wxPuts(_T("*** Testing Zlib stream reading ***\n"));
4445 wxFileInputStream
fileInStream(FILENAME_GZ
);
4446 wxZlibInputStream
istr(fileInStream
);
4447 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
4449 wxPuts(_T("Dumping the file:"));
4450 while ( !istr
.Eof() )
4452 putchar(istr
.GetC());
4456 wxPuts(_T("\n----- done ------"));
4461 // ----------------------------------------------------------------------------
4463 // ----------------------------------------------------------------------------
4465 #ifdef TEST_DATETIME
4469 #include "wx/datetime.h"
4474 wxDateTime::wxDateTime_t day
;
4475 wxDateTime::Month month
;
4477 wxDateTime::wxDateTime_t hour
, min
, sec
;
4479 wxDateTime::WeekDay wday
;
4480 time_t gmticks
, ticks
;
4482 void Init(const wxDateTime::Tm
& tm
)
4491 gmticks
= ticks
= -1;
4494 wxDateTime
DT() const
4495 { return wxDateTime(day
, month
, year
, hour
, min
, sec
); }
4497 bool SameDay(const wxDateTime::Tm
& tm
) const
4499 return day
== tm
.mday
&& month
== tm
.mon
&& year
== tm
.year
;
4502 wxString
Format() const
4505 s
.Printf(_T("%02d:%02d:%02d %10s %02d, %4d%s"),
4507 wxDateTime::GetMonthName(month
).c_str(),
4509 abs(wxDateTime::ConvertYearToBC(year
)),
4510 year
> 0 ? _T("AD") : _T("BC"));
4514 wxString
FormatDate() const
4517 s
.Printf(_T("%02d-%s-%4d%s"),
4519 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
4520 abs(wxDateTime::ConvertYearToBC(year
)),
4521 year
> 0 ? _T("AD") : _T("BC"));
4526 static const Date testDates
[] =
4528 { 1, wxDateTime::Jan
, 1970, 00, 00, 00, 2440587.5, wxDateTime::Thu
, 0, -3600 },
4529 { 7, wxDateTime::Feb
, 2036, 00, 00, 00, 2464730.5, wxDateTime::Thu
, -1, -1 },
4530 { 8, wxDateTime::Feb
, 2036, 00, 00, 00, 2464731.5, wxDateTime::Fri
, -1, -1 },
4531 { 1, wxDateTime::Jan
, 2037, 00, 00, 00, 2465059.5, wxDateTime::Thu
, -1, -1 },
4532 { 1, wxDateTime::Jan
, 2038, 00, 00, 00, 2465424.5, wxDateTime::Fri
, -1, -1 },
4533 { 21, wxDateTime::Jan
, 2222, 00, 00, 00, 2532648.5, wxDateTime::Mon
, -1, -1 },
4534 { 29, wxDateTime::May
, 1976, 12, 00, 00, 2442928.0, wxDateTime::Sat
, 202219200, 202212000 },
4535 { 29, wxDateTime::Feb
, 1976, 00, 00, 00, 2442837.5, wxDateTime::Sun
, 194400000, 194396400 },
4536 { 1, wxDateTime::Jan
, 1900, 12, 00, 00, 2415021.0, wxDateTime::Mon
, -1, -1 },
4537 { 1, wxDateTime::Jan
, 1900, 00, 00, 00, 2415020.5, wxDateTime::Mon
, -1, -1 },
4538 { 15, wxDateTime::Oct
, 1582, 00, 00, 00, 2299160.5, wxDateTime::Fri
, -1, -1 },
4539 { 4, wxDateTime::Oct
, 1582, 00, 00, 00, 2299149.5, wxDateTime::Mon
, -1, -1 },
4540 { 1, wxDateTime::Mar
, 1, 00, 00, 00, 1721484.5, wxDateTime::Thu
, -1, -1 },
4541 { 1, wxDateTime::Jan
, 1, 00, 00, 00, 1721425.5, wxDateTime::Mon
, -1, -1 },
4542 { 31, wxDateTime::Dec
, 0, 00, 00, 00, 1721424.5, wxDateTime::Sun
, -1, -1 },
4543 { 1, wxDateTime::Jan
, 0, 00, 00, 00, 1721059.5, wxDateTime::Sat
, -1, -1 },
4544 { 12, wxDateTime::Aug
, -1234, 00, 00, 00, 1270573.5, wxDateTime::Fri
, -1, -1 },
4545 { 12, wxDateTime::Aug
, -4000, 00, 00, 00, 260313.5, wxDateTime::Sat
, -1, -1 },
4546 { 24, wxDateTime::Nov
, -4713, 00, 00, 00, -0.5, wxDateTime::Mon
, -1, -1 },
4549 // this test miscellaneous static wxDateTime functions
4550 static void TestTimeStatic()
4552 wxPuts(_T("\n*** wxDateTime static methods test ***"));
4554 // some info about the current date
4555 int year
= wxDateTime::GetCurrentYear();
4556 wxPrintf(_T("Current year %d is %sa leap one and has %d days.\n"),
4558 wxDateTime::IsLeapYear(year
) ? "" : "not ",
4559 wxDateTime::GetNumberOfDays(year
));
4561 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
4562 wxPrintf(_T("Current month is '%s' ('%s') and it has %d days\n"),
4563 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
4564 wxDateTime::GetMonthName(month
).c_str(),
4565 wxDateTime::GetNumberOfDays(month
));
4568 static const size_t nYears
= 5;
4569 static const size_t years
[2][nYears
] =
4571 // first line: the years to test
4572 { 1990, 1976, 2000, 2030, 1984, },
4574 // second line: true if leap, false otherwise
4575 { false, true, true, false, true }
4578 for ( size_t n
= 0; n
< nYears
; n
++ )
4580 int year
= years
[0][n
];
4581 bool should
= years
[1][n
] != 0,
4582 is
= wxDateTime::IsLeapYear(year
);
4584 wxPrintf(_T("Year %d is %sa leap year (%s)\n"),
4587 should
== is
? "ok" : "ERROR");
4589 wxASSERT( should
== wxDateTime::IsLeapYear(year
) );
4593 // test constructing wxDateTime objects
4594 static void TestTimeSet()
4596 wxPuts(_T("\n*** wxDateTime construction test ***"));
4598 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4600 const Date
& d1
= testDates
[n
];
4601 wxDateTime dt
= d1
.DT();
4604 d2
.Init(dt
.GetTm());
4606 wxString s1
= d1
.Format(),
4609 wxPrintf(_T("Date: %s == %s (%s)\n"),
4610 s1
.c_str(), s2
.c_str(),
4611 s1
== s2
? _T("ok") : _T("ERROR"));
4615 // test time zones stuff
4616 static void TestTimeZones()
4618 wxPuts(_T("\n*** wxDateTime timezone test ***"));
4620 wxDateTime now
= wxDateTime::Now();
4622 wxPrintf(_T("Current GMT time:\t%s\n"), now
.Format(_T("%c"), wxDateTime::GMT0
).c_str());
4623 wxPrintf(_T("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::GMT0
).c_str());
4624 wxPrintf(_T("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::EST
).c_str());
4625 wxPrintf(_T("Current time in Paris:\t%s\n"), now
.Format(_T("%c"), wxDateTime::CET
).c_str());
4626 wxPrintf(_T(" Moscow:\t%s\n"), now
.Format(_T("%c"), wxDateTime::MSK
).c_str());
4627 wxPrintf(_T(" New York:\t%s\n"), now
.Format(_T("%c"), wxDateTime::EST
).c_str());
4629 wxDateTime::Tm tm
= now
.GetTm();
4630 if ( wxDateTime(tm
) != now
)
4632 wxPrintf(_T("ERROR: got %s instead of %s\n"),
4633 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
4637 // test some minimal support for the dates outside the standard range
4638 static void TestTimeRange()
4640 wxPuts(_T("\n*** wxDateTime out-of-standard-range dates test ***"));
4642 static const wxChar
*fmt
= _T("%d-%b-%Y %H:%M:%S");
4644 wxPrintf(_T("Unix epoch:\t%s\n"),
4645 wxDateTime(2440587.5).Format(fmt
).c_str());
4646 wxPrintf(_T("Feb 29, 0: \t%s\n"),
4647 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
4648 wxPrintf(_T("JDN 0: \t%s\n"),
4649 wxDateTime(0.0).Format(fmt
).c_str());
4650 wxPrintf(_T("Jan 1, 1AD:\t%s\n"),
4651 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
4652 wxPrintf(_T("May 29, 2099:\t%s\n"),
4653 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
4656 static void TestTimeTicks()
4658 wxPuts(_T("\n*** wxDateTime ticks test ***"));
4660 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4662 const Date
& d
= testDates
[n
];
4663 if ( d
.ticks
== -1 )
4666 wxDateTime dt
= d
.DT();
4667 long ticks
= (dt
.GetValue() / 1000).ToLong();
4668 wxPrintf(_T("Ticks of %s:\t% 10ld"), d
.Format().c_str(), ticks
);
4669 if ( ticks
== d
.ticks
)
4671 wxPuts(_T(" (ok)"));
4675 wxPrintf(_T(" (ERROR: should be %ld, delta = %ld)\n"),
4676 (long)d
.ticks
, (long)(ticks
- d
.ticks
));
4679 dt
= d
.DT().ToTimezone(wxDateTime::GMT0
);
4680 ticks
= (dt
.GetValue() / 1000).ToLong();
4681 wxPrintf(_T("GMtks of %s:\t% 10ld"), d
.Format().c_str(), ticks
);
4682 if ( ticks
== d
.gmticks
)
4684 wxPuts(_T(" (ok)"));
4688 wxPrintf(_T(" (ERROR: should be %ld, delta = %ld)\n"),
4689 (long)d
.gmticks
, (long)(ticks
- d
.gmticks
));
4696 // test conversions to JDN &c
4697 static void TestTimeJDN()
4699 wxPuts(_T("\n*** wxDateTime to JDN test ***"));
4701 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4703 const Date
& d
= testDates
[n
];
4704 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
4705 double jdn
= dt
.GetJulianDayNumber();
4707 wxPrintf(_T("JDN of %s is:\t% 15.6f"), d
.Format().c_str(), jdn
);
4710 wxPuts(_T(" (ok)"));
4714 wxPrintf(_T(" (ERROR: should be %f, delta = %f)\n"),
4715 d
.jdn
, jdn
- d
.jdn
);
4720 // test week days computation
4721 static void TestTimeWDays()
4723 wxPuts(_T("\n*** wxDateTime weekday test ***"));
4725 // test GetWeekDay()
4727 for ( n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4729 const Date
& d
= testDates
[n
];
4730 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
4732 wxDateTime::WeekDay wday
= dt
.GetWeekDay();
4733 wxPrintf(_T("%s is: %s"),
4735 wxDateTime::GetWeekDayName(wday
).c_str());
4736 if ( wday
== d
.wday
)
4738 wxPuts(_T(" (ok)"));
4742 wxPrintf(_T(" (ERROR: should be %s)\n"),
4743 wxDateTime::GetWeekDayName(d
.wday
).c_str());
4749 // test SetToWeekDay()
4750 struct WeekDateTestData
4752 Date date
; // the real date (precomputed)
4753 int nWeek
; // its week index in the month
4754 wxDateTime::WeekDay wday
; // the weekday
4755 wxDateTime::Month month
; // the month
4756 int year
; // and the year
4758 wxString
Format() const
4761 switch ( nWeek
< -1 ? -nWeek
: nWeek
)
4763 case 1: which
= _T("first"); break;
4764 case 2: which
= _T("second"); break;
4765 case 3: which
= _T("third"); break;
4766 case 4: which
= _T("fourth"); break;
4767 case 5: which
= _T("fifth"); break;
4769 case -1: which
= _T("last"); break;
4774 which
+= _T(" from end");
4777 s
.Printf(_T("The %s %s of %s in %d"),
4779 wxDateTime::GetWeekDayName(wday
).c_str(),
4780 wxDateTime::GetMonthName(month
).c_str(),
4787 // the array data was generated by the following python program
4789 from DateTime import *
4790 from whrandom import *
4791 from string import *
4793 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4794 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4796 week = DateTimeDelta(7)
4799 year = randint(1900, 2100)
4800 month = randint(1, 12)
4801 day = randint(1, 28)
4802 dt = DateTime(year, month, day)
4803 wday = dt.day_of_week
4805 countFromEnd = choice([-1, 1])
4808 while dt.month is month:
4809 dt = dt - countFromEnd * week
4810 weekNum = weekNum + countFromEnd
4812 data = { 'day': rjust(`day`, 2), 'month': monthNames[month - 1], 'year': year, 'weekNum': rjust(`weekNum`, 2), 'wday': wdayNames[wday] }
4814 print "{ { %(day)s, wxDateTime::%(month)s, %(year)d }, %(weekNum)d, "\
4815 "wxDateTime::%(wday)s, wxDateTime::%(month)s, %(year)d }," % data
4818 static const WeekDateTestData weekDatesTestData
[] =
4820 { { 20, wxDateTime::Mar
, 2045 }, 3, wxDateTime::Mon
, wxDateTime::Mar
, 2045 },
4821 { { 5, wxDateTime::Jun
, 1985 }, -4, wxDateTime::Wed
, wxDateTime::Jun
, 1985 },
4822 { { 12, wxDateTime::Nov
, 1961 }, -3, wxDateTime::Sun
, wxDateTime::Nov
, 1961 },
4823 { { 27, wxDateTime::Feb
, 2093 }, -1, wxDateTime::Fri
, wxDateTime::Feb
, 2093 },
4824 { { 4, wxDateTime::Jul
, 2070 }, -4, wxDateTime::Fri
, wxDateTime::Jul
, 2070 },
4825 { { 2, wxDateTime::Apr
, 1906 }, -5, wxDateTime::Mon
, wxDateTime::Apr
, 1906 },
4826 { { 19, wxDateTime::Jul
, 2023 }, -2, wxDateTime::Wed
, wxDateTime::Jul
, 2023 },
4827 { { 5, wxDateTime::May
, 1958 }, -4, wxDateTime::Mon
, wxDateTime::May
, 1958 },
4828 { { 11, wxDateTime::Aug
, 1900 }, 2, wxDateTime::Sat
, wxDateTime::Aug
, 1900 },
4829 { { 14, wxDateTime::Feb
, 1945 }, 2, wxDateTime::Wed
, wxDateTime::Feb
, 1945 },
4830 { { 25, wxDateTime::Jul
, 1967 }, -1, wxDateTime::Tue
, wxDateTime::Jul
, 1967 },
4831 { { 9, wxDateTime::May
, 1916 }, -4, wxDateTime::Tue
, wxDateTime::May
, 1916 },
4832 { { 20, wxDateTime::Jun
, 1927 }, 3, wxDateTime::Mon
, wxDateTime::Jun
, 1927 },
4833 { { 2, wxDateTime::Aug
, 2000 }, 1, wxDateTime::Wed
, wxDateTime::Aug
, 2000 },
4834 { { 20, wxDateTime::Apr
, 2044 }, 3, wxDateTime::Wed
, wxDateTime::Apr
, 2044 },
4835 { { 20, wxDateTime::Feb
, 1932 }, -2, wxDateTime::Sat
, wxDateTime::Feb
, 1932 },
4836 { { 25, wxDateTime::Jul
, 2069 }, 4, wxDateTime::Thu
, wxDateTime::Jul
, 2069 },
4837 { { 3, wxDateTime::Apr
, 1925 }, 1, wxDateTime::Fri
, wxDateTime::Apr
, 1925 },
4838 { { 21, wxDateTime::Mar
, 2093 }, 3, wxDateTime::Sat
, wxDateTime::Mar
, 2093 },
4839 { { 3, wxDateTime::Dec
, 2074 }, -5, wxDateTime::Mon
, wxDateTime::Dec
, 2074 },
4842 static const wxChar
*fmt
= _T("%d-%b-%Y");
4845 for ( n
= 0; n
< WXSIZEOF(weekDatesTestData
); n
++ )
4847 const WeekDateTestData
& wd
= weekDatesTestData
[n
];
4849 dt
.SetToWeekDay(wd
.wday
, wd
.nWeek
, wd
.month
, wd
.year
);
4851 wxPrintf(_T("%s is %s"), wd
.Format().c_str(), dt
.Format(fmt
).c_str());
4853 const Date
& d
= wd
.date
;
4854 if ( d
.SameDay(dt
.GetTm()) )
4856 wxPuts(_T(" (ok)"));
4860 dt
.Set(d
.day
, d
.month
, d
.year
);
4862 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.Format(fmt
).c_str());
4867 // test the computation of (ISO) week numbers
4868 static void TestTimeWNumber()
4870 wxPuts(_T("\n*** wxDateTime week number test ***"));
4872 struct WeekNumberTestData
4874 Date date
; // the date
4875 wxDateTime::wxDateTime_t week
; // the week number in the year
4876 wxDateTime::wxDateTime_t wmon
; // the week number in the month
4877 wxDateTime::wxDateTime_t wmon2
; // same but week starts with Sun
4878 wxDateTime::wxDateTime_t dnum
; // day number in the year
4881 // data generated with the following python script:
4883 from DateTime import *
4884 from whrandom import *
4885 from string import *
4887 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4888 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4890 def GetMonthWeek(dt):
4891 weekNumMonth = dt.iso_week[1] - DateTime(dt.year, dt.month, 1).iso_week[1] + 1
4892 if weekNumMonth < 0:
4893 weekNumMonth = weekNumMonth + 53
4896 def GetLastSundayBefore(dt):
4897 if dt.iso_week[2] == 7:
4900 return dt - DateTimeDelta(dt.iso_week[2])
4903 year = randint(1900, 2100)
4904 month = randint(1, 12)
4905 day = randint(1, 28)
4906 dt = DateTime(year, month, day)
4907 dayNum = dt.day_of_year
4908 weekNum = dt.iso_week[1]
4909 weekNumMonth = GetMonthWeek(dt)
4912 dtSunday = GetLastSundayBefore(dt)
4914 while dtSunday >= GetLastSundayBefore(DateTime(dt.year, dt.month, 1)):
4915 weekNumMonth2 = weekNumMonth2 + 1
4916 dtSunday = dtSunday - DateTimeDelta(7)
4918 data = { 'day': rjust(`day`, 2), \
4919 'month': monthNames[month - 1], \
4921 'weekNum': rjust(`weekNum`, 2), \
4922 'weekNumMonth': weekNumMonth, \
4923 'weekNumMonth2': weekNumMonth2, \
4924 'dayNum': rjust(`dayNum`, 3) }
4926 print " { { %(day)s, "\
4927 "wxDateTime::%(month)s, "\
4930 "%(weekNumMonth)s, "\
4931 "%(weekNumMonth2)s, "\
4932 "%(dayNum)s }," % data
4935 static const WeekNumberTestData weekNumberTestDates
[] =
4937 { { 27, wxDateTime::Dec
, 1966 }, 52, 5, 5, 361 },
4938 { { 22, wxDateTime::Jul
, 1926 }, 29, 4, 4, 203 },
4939 { { 22, wxDateTime::Oct
, 2076 }, 43, 4, 4, 296 },
4940 { { 1, wxDateTime::Jul
, 1967 }, 26, 1, 1, 182 },
4941 { { 8, wxDateTime::Nov
, 2004 }, 46, 2, 2, 313 },
4942 { { 21, wxDateTime::Mar
, 1920 }, 12, 3, 4, 81 },
4943 { { 7, wxDateTime::Jan
, 1965 }, 1, 2, 2, 7 },
4944 { { 19, wxDateTime::Oct
, 1999 }, 42, 4, 4, 292 },
4945 { { 13, wxDateTime::Aug
, 1955 }, 32, 2, 2, 225 },
4946 { { 18, wxDateTime::Jul
, 2087 }, 29, 3, 3, 199 },
4947 { { 2, wxDateTime::Sep
, 2028 }, 35, 1, 1, 246 },
4948 { { 28, wxDateTime::Jul
, 1945 }, 30, 5, 4, 209 },
4949 { { 15, wxDateTime::Jun
, 1901 }, 24, 3, 3, 166 },
4950 { { 10, wxDateTime::Oct
, 1939 }, 41, 3, 2, 283 },
4951 { { 3, wxDateTime::Dec
, 1965 }, 48, 1, 1, 337 },
4952 { { 23, wxDateTime::Feb
, 1940 }, 8, 4, 4, 54 },
4953 { { 2, wxDateTime::Jan
, 1987 }, 1, 1, 1, 2 },
4954 { { 11, wxDateTime::Aug
, 2079 }, 32, 2, 2, 223 },
4955 { { 2, wxDateTime::Feb
, 2063 }, 5, 1, 1, 33 },
4956 { { 16, wxDateTime::Oct
, 1942 }, 42, 3, 3, 289 },
4959 for ( size_t n
= 0; n
< WXSIZEOF(weekNumberTestDates
); n
++ )
4961 const WeekNumberTestData
& wn
= weekNumberTestDates
[n
];
4962 const Date
& d
= wn
.date
;
4964 wxDateTime dt
= d
.DT();
4966 wxDateTime::wxDateTime_t
4967 week
= dt
.GetWeekOfYear(wxDateTime::Monday_First
),
4968 wmon
= dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4969 wmon2
= dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4970 dnum
= dt
.GetDayOfYear();
4972 wxPrintf(_T("%s: the day number is %d"), d
.FormatDate().c_str(), dnum
);
4973 if ( dnum
== wn
.dnum
)
4975 wxPrintf(_T(" (ok)"));
4979 wxPrintf(_T(" (ERROR: should be %d)"), wn
.dnum
);
4982 wxPrintf(_T(", week in month = %d"), wmon
);
4983 if ( wmon
!= wn
.wmon
)
4985 wxPrintf(_T(" (ERROR: should be %d)"), wn
.wmon
);
4988 wxPrintf(_T(" or %d"), wmon2
);
4989 if ( wmon2
== wn
.wmon2
)
4991 wxPrintf(_T(" (ok)"));
4995 wxPrintf(_T(" (ERROR: should be %d)"), wn
.wmon2
);
4998 wxPrintf(_T(", week in year = %d"), week
);
4999 if ( week
!= wn
.week
)
5001 wxPrintf(_T(" (ERROR: should be %d)"), wn
.week
);
5004 wxPutchar(_T('\n'));
5006 wxDateTime
dt2(1, wxDateTime::Jan
, d
.year
);
5007 dt2
.SetToTheWeek(wn
.week
, dt
.GetWeekDay());
5011 d2
.Init(dt2
.GetTm());
5012 wxPrintf(_T("ERROR: SetToTheWeek() returned %s\n"),
5013 d2
.FormatDate().c_str());
5018 // test DST calculations
5019 static void TestTimeDST()
5021 wxPuts(_T("\n*** wxDateTime DST test ***"));
5023 wxPrintf(_T("DST is%s in effect now.\n\n"),
5024 wxDateTime::Now().IsDST() ? _T("") : _T(" not"));
5026 // taken from http://www.energy.ca.gov/daylightsaving.html
5027 static const Date datesDST
[2][2004 - 1900 + 1] =
5030 { 1, wxDateTime::Apr
, 1990 },
5031 { 7, wxDateTime::Apr
, 1991 },
5032 { 5, wxDateTime::Apr
, 1992 },
5033 { 4, wxDateTime::Apr
, 1993 },
5034 { 3, wxDateTime::Apr
, 1994 },
5035 { 2, wxDateTime::Apr
, 1995 },
5036 { 7, wxDateTime::Apr
, 1996 },
5037 { 6, wxDateTime::Apr
, 1997 },
5038 { 5, wxDateTime::Apr
, 1998 },
5039 { 4, wxDateTime::Apr
, 1999 },
5040 { 2, wxDateTime::Apr
, 2000 },
5041 { 1, wxDateTime::Apr
, 2001 },
5042 { 7, wxDateTime::Apr
, 2002 },
5043 { 6, wxDateTime::Apr
, 2003 },
5044 { 4, wxDateTime::Apr
, 2004 },
5047 { 28, wxDateTime::Oct
, 1990 },
5048 { 27, wxDateTime::Oct
, 1991 },
5049 { 25, wxDateTime::Oct
, 1992 },
5050 { 31, wxDateTime::Oct
, 1993 },
5051 { 30, wxDateTime::Oct
, 1994 },
5052 { 29, wxDateTime::Oct
, 1995 },
5053 { 27, wxDateTime::Oct
, 1996 },
5054 { 26, wxDateTime::Oct
, 1997 },
5055 { 25, wxDateTime::Oct
, 1998 },
5056 { 31, wxDateTime::Oct
, 1999 },
5057 { 29, wxDateTime::Oct
, 2000 },
5058 { 28, wxDateTime::Oct
, 2001 },
5059 { 27, wxDateTime::Oct
, 2002 },
5060 { 26, wxDateTime::Oct
, 2003 },
5061 { 31, wxDateTime::Oct
, 2004 },
5066 for ( year
= 1990; year
< 2005; year
++ )
5068 wxDateTime dtBegin
= wxDateTime::GetBeginDST(year
, wxDateTime::USA
),
5069 dtEnd
= wxDateTime::GetEndDST(year
, wxDateTime::USA
);
5071 wxPrintf(_T("DST period in the US for year %d: from %s to %s"),
5072 year
, dtBegin
.Format().c_str(), dtEnd
.Format().c_str());
5074 size_t n
= year
- 1990;
5075 const Date
& dBegin
= datesDST
[0][n
];
5076 const Date
& dEnd
= datesDST
[1][n
];
5078 if ( dBegin
.SameDay(dtBegin
.GetTm()) && dEnd
.SameDay(dtEnd
.GetTm()) )
5080 wxPuts(_T(" (ok)"));
5084 wxPrintf(_T(" (ERROR: should be %s %d to %s %d)\n"),
5085 wxDateTime::GetMonthName(dBegin
.month
).c_str(), dBegin
.day
,
5086 wxDateTime::GetMonthName(dEnd
.month
).c_str(), dEnd
.day
);
5092 for ( year
= 1990; year
< 2005; year
++ )
5094 wxPrintf(_T("DST period in Europe for year %d: from %s to %s\n"),
5096 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
5097 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
5101 // test wxDateTime -> text conversion
5102 static void TestTimeFormat()
5104 wxPuts(_T("\n*** wxDateTime formatting test ***"));
5106 // some information may be lost during conversion, so store what kind
5107 // of info should we recover after a round trip
5110 CompareNone
, // don't try comparing
5111 CompareBoth
, // dates and times should be identical
5112 CompareDate
, // dates only
5113 CompareTime
// time only
5118 CompareKind compareKind
;
5119 const wxChar
*format
;
5120 } formatTestFormats
[] =
5122 { CompareBoth
, _T("---> %c") },
5123 { CompareDate
, _T("Date is %A, %d of %B, in year %Y") },
5124 { CompareBoth
, _T("Date is %x, time is %X") },
5125 { CompareTime
, _T("Time is %H:%M:%S or %I:%M:%S %p") },
5126 { CompareNone
, _T("The day of year: %j, the week of year: %W") },
5127 { CompareDate
, _T("ISO date without separators: %Y%m%d") },
5130 static const Date formatTestDates
[] =
5132 { 29, wxDateTime::May
, 1976, 18, 30, 00 },
5133 { 31, wxDateTime::Dec
, 1999, 23, 30, 00 },
5135 // this test can't work for other centuries because it uses two digit
5136 // years in formats, so don't even try it
5137 { 29, wxDateTime::May
, 2076, 18, 30, 00 },
5138 { 29, wxDateTime::Feb
, 2400, 02, 15, 25 },
5139 { 01, wxDateTime::Jan
, -52, 03, 16, 47 },
5143 // an extra test (as it doesn't depend on date, don't do it in the loop)
5144 wxPrintf(_T("%s\n"), wxDateTime::Now().Format(_T("Our timezone is %Z")).c_str());
5146 for ( size_t d
= 0; d
< WXSIZEOF(formatTestDates
) + 1; d
++ )
5150 wxDateTime dt
= d
== 0 ? wxDateTime::Now() : formatTestDates
[d
- 1].DT();
5151 for ( size_t n
= 0; n
< WXSIZEOF(formatTestFormats
); n
++ )
5153 wxString s
= dt
.Format(formatTestFormats
[n
].format
);
5154 wxPrintf(_T("%s"), s
.c_str());
5156 // what can we recover?
5157 int kind
= formatTestFormats
[n
].compareKind
;
5161 const wxChar
*result
= dt2
.ParseFormat(s
, formatTestFormats
[n
].format
);
5164 // converion failed - should it have?
5165 if ( kind
== CompareNone
)
5166 wxPuts(_T(" (ok)"));
5168 wxPuts(_T(" (ERROR: conversion back failed)"));
5172 // should have parsed the entire string
5173 wxPuts(_T(" (ERROR: conversion back stopped too soon)"));
5177 bool equal
= false; // suppress compilaer warning
5185 equal
= dt
.IsSameDate(dt2
);
5189 equal
= dt
.IsSameTime(dt2
);
5195 wxPrintf(_T(" (ERROR: got back '%s' instead of '%s')\n"),
5196 dt2
.Format().c_str(), dt
.Format().c_str());
5200 wxPuts(_T(" (ok)"));
5207 // test text -> wxDateTime conversion
5208 static void TestTimeParse()
5210 wxPuts(_T("\n*** wxDateTime parse test ***"));
5212 struct ParseTestData
5214 const wxChar
*format
;
5219 static const ParseTestData parseTestDates
[] =
5221 { _T("Sat, 18 Dec 1999 00:46:40 +0100"), { 18, wxDateTime::Dec
, 1999, 00, 46, 40 }, true },
5222 { _T("Wed, 1 Dec 1999 05:17:20 +0300"), { 1, wxDateTime::Dec
, 1999, 03, 17, 20 }, true },
5225 for ( size_t n
= 0; n
< WXSIZEOF(parseTestDates
); n
++ )
5227 const wxChar
*format
= parseTestDates
[n
].format
;
5229 wxPrintf(_T("%s => "), format
);
5232 if ( dt
.ParseRfc822Date(format
) )
5234 wxPrintf(_T("%s "), dt
.Format().c_str());
5236 if ( parseTestDates
[n
].good
)
5238 wxDateTime dtReal
= parseTestDates
[n
].date
.DT();
5245 wxPrintf(_T("(ERROR: should be %s)\n"), dtReal
.Format().c_str());
5250 wxPuts(_T("(ERROR: bad format)"));
5255 wxPrintf(_T("bad format (%s)\n"),
5256 parseTestDates
[n
].good
? "ERROR" : "ok");
5261 static void TestDateTimeInteractive()
5263 wxPuts(_T("\n*** interactive wxDateTime tests ***"));
5269 wxPrintf(_T("Enter a date: "));
5270 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
5273 // kill the last '\n'
5274 buf
[wxStrlen(buf
) - 1] = 0;
5277 const wxChar
*p
= dt
.ParseDate(buf
);
5280 wxPrintf(_T("ERROR: failed to parse the date '%s'.\n"), buf
);
5286 wxPrintf(_T("WARNING: parsed only first %u characters.\n"), p
- buf
);
5289 wxPrintf(_T("%s: day %u, week of month %u/%u, week of year %u\n"),
5290 dt
.Format(_T("%b %d, %Y")).c_str(),
5292 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
5293 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
5294 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
5297 wxPuts(_T("\n*** done ***"));
5300 static void TestTimeMS()
5302 wxPuts(_T("*** testing millisecond-resolution support in wxDateTime ***"));
5304 wxDateTime dt1
= wxDateTime::Now(),
5305 dt2
= wxDateTime::UNow();
5307 wxPrintf(_T("Now = %s\n"), dt1
.Format(_T("%H:%M:%S:%l")).c_str());
5308 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
5309 wxPrintf(_T("Dummy loop: "));
5310 for ( int i
= 0; i
< 6000; i
++ )
5312 //for ( int j = 0; j < 10; j++ )
5315 s
.Printf(_T("%g"), sqrt(i
));
5321 wxPuts(_T(", done"));
5324 dt2
= wxDateTime::UNow();
5325 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
5327 wxPrintf(_T("Loop executed in %s ms\n"), (dt2
- dt1
).Format(_T("%l")).c_str());
5329 wxPuts(_T("\n*** done ***"));
5332 static void TestTimeArithmetics()
5334 wxPuts(_T("\n*** testing arithmetic operations on wxDateTime ***"));
5336 static const struct ArithmData
5338 ArithmData(const wxDateSpan
& sp
, const wxChar
*nam
)
5339 : span(sp
), name(nam
) { }
5343 } testArithmData
[] =
5345 ArithmData(wxDateSpan::Day(), _T("day")),
5346 ArithmData(wxDateSpan::Week(), _T("week")),
5347 ArithmData(wxDateSpan::Month(), _T("month")),
5348 ArithmData(wxDateSpan::Year(), _T("year")),
5349 ArithmData(wxDateSpan(1, 2, 3, 4), _T("year, 2 months, 3 weeks, 4 days")),
5352 wxDateTime
dt(29, wxDateTime::Dec
, 1999), dt1
, dt2
;
5354 for ( size_t n
= 0; n
< WXSIZEOF(testArithmData
); n
++ )
5356 wxDateSpan span
= testArithmData
[n
].span
;
5360 const wxChar
*name
= testArithmData
[n
].name
;
5361 wxPrintf(_T("%s + %s = %s, %s - %s = %s\n"),
5362 dt
.FormatISODate().c_str(), name
, dt1
.FormatISODate().c_str(),
5363 dt
.FormatISODate().c_str(), name
, dt2
.FormatISODate().c_str());
5365 wxPrintf(_T("Going back: %s"), (dt1
- span
).FormatISODate().c_str());
5366 if ( dt1
- span
== dt
)
5368 wxPuts(_T(" (ok)"));
5372 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.FormatISODate().c_str());
5375 wxPrintf(_T("Going forward: %s"), (dt2
+ span
).FormatISODate().c_str());
5376 if ( dt2
+ span
== dt
)
5378 wxPuts(_T(" (ok)"));
5382 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.FormatISODate().c_str());
5385 wxPrintf(_T("Double increment: %s"), (dt2
+ 2*span
).FormatISODate().c_str());
5386 if ( dt2
+ 2*span
== dt1
)
5388 wxPuts(_T(" (ok)"));
5392 wxPrintf(_T(" (ERROR: should be %s)\n"), dt2
.FormatISODate().c_str());
5399 static void TestTimeHolidays()
5401 wxPuts(_T("\n*** testing wxDateTimeHolidayAuthority ***\n"));
5403 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
5404 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
5405 dtEnd
= dtStart
.GetLastMonthDay();
5407 wxDateTimeArray hol
;
5408 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
5410 const wxChar
*format
= _T("%d-%b-%Y (%a)");
5412 wxPrintf(_T("All holidays between %s and %s:\n"),
5413 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
5415 size_t count
= hol
.GetCount();
5416 for ( size_t n
= 0; n
< count
; n
++ )
5418 wxPrintf(_T("\t%s\n"), hol
[n
].Format(format
).c_str());
5424 static void TestTimeZoneBug()
5426 wxPuts(_T("\n*** testing for DST/timezone bug ***\n"));
5428 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
5429 for ( int i
= 0; i
< 31; i
++ )
5431 wxPrintf(_T("Date %s: week day %s.\n"),
5432 date
.Format(_T("%d-%m-%Y")).c_str(),
5433 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
5435 date
+= wxDateSpan::Day();
5441 static void TestTimeSpanFormat()
5443 wxPuts(_T("\n*** wxTimeSpan tests ***"));
5445 static const wxChar
*formats
[] =
5447 _T("(default) %H:%M:%S"),
5448 _T("%E weeks and %D days"),
5449 _T("%l milliseconds"),
5450 _T("(with ms) %H:%M:%S:%l"),
5451 _T("100%% of minutes is %M"), // test "%%"
5452 _T("%D days and %H hours"),
5453 _T("or also %S seconds"),
5456 wxTimeSpan
ts1(1, 2, 3, 4),
5458 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
5460 wxPrintf(_T("ts1 = %s\tts2 = %s\n"),
5461 ts1
.Format(formats
[n
]).c_str(),
5462 ts2
.Format(formats
[n
]).c_str());
5468 #endif // TEST_DATETIME
5470 // ----------------------------------------------------------------------------
5471 // wxTextInput/OutputStream
5472 // ----------------------------------------------------------------------------
5474 #ifdef TEST_TEXTSTREAM
5476 #include "wx/txtstrm.h"
5477 #include "wx/wfstream.h"
5479 static void TestTextInputStream()
5481 wxPuts(_T("\n*** wxTextInputStream test ***"));
5483 wxFileInputStream
fsIn(_T("testdata.fc"));
5486 wxPuts(_T("ERROR: couldn't open file."));
5490 wxTextInputStream
tis(fsIn
);
5495 const wxString s
= tis
.ReadLine();
5497 // line could be non empty if the last line of the file isn't
5498 // terminated with EOL
5499 if ( fsIn
.Eof() && s
.empty() )
5502 wxPrintf(_T("Line %d: %s\n"), line
++, s
.c_str());
5507 #endif // TEST_TEXTSTREAM
5509 // ----------------------------------------------------------------------------
5511 // ----------------------------------------------------------------------------
5515 #include "wx/thread.h"
5517 static size_t gs_counter
= (size_t)-1;
5518 static wxCriticalSection gs_critsect
;
5519 static wxSemaphore gs_cond
;
5521 class MyJoinableThread
: public wxThread
5524 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
5525 { m_n
= n
; Create(); }
5527 // thread execution starts here
5528 virtual ExitCode
Entry();
5534 wxThread::ExitCode
MyJoinableThread::Entry()
5536 unsigned long res
= 1;
5537 for ( size_t n
= 1; n
< m_n
; n
++ )
5541 // it's a loooong calculation :-)
5545 return (ExitCode
)res
;
5548 class MyDetachedThread
: public wxThread
5551 MyDetachedThread(size_t n
, wxChar ch
)
5555 m_cancelled
= false;
5560 // thread execution starts here
5561 virtual ExitCode
Entry();
5564 virtual void OnExit();
5567 size_t m_n
; // number of characters to write
5568 wxChar m_ch
; // character to write
5570 bool m_cancelled
; // false if we exit normally
5573 wxThread::ExitCode
MyDetachedThread::Entry()
5576 wxCriticalSectionLocker
lock(gs_critsect
);
5577 if ( gs_counter
== (size_t)-1 )
5583 for ( size_t n
= 0; n
< m_n
; n
++ )
5585 if ( TestDestroy() )
5595 wxThread::Sleep(100);
5601 void MyDetachedThread::OnExit()
5603 wxLogTrace(_T("thread"), _T("Thread %ld is in OnExit"), GetId());
5605 wxCriticalSectionLocker
lock(gs_critsect
);
5606 if ( !--gs_counter
&& !m_cancelled
)
5610 static void TestDetachedThreads()
5612 wxPuts(_T("\n*** Testing detached threads ***"));
5614 static const size_t nThreads
= 3;
5615 MyDetachedThread
*threads
[nThreads
];
5617 for ( n
= 0; n
< nThreads
; n
++ )
5619 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
5622 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
5623 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
5625 for ( n
= 0; n
< nThreads
; n
++ )
5630 // wait until all threads terminate
5636 static void TestJoinableThreads()
5638 wxPuts(_T("\n*** Testing a joinable thread (a loooong calculation...) ***"));
5640 // calc 10! in the background
5641 MyJoinableThread
thread(10);
5644 wxPrintf(_T("\nThread terminated with exit code %lu.\n"),
5645 (unsigned long)thread
.Wait());
5648 static void TestThreadSuspend()
5650 wxPuts(_T("\n*** Testing thread suspend/resume functions ***"));
5652 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
5656 // this is for this demo only, in a real life program we'd use another
5657 // condition variable which would be signaled from wxThread::Entry() to
5658 // tell us that the thread really started running - but here just wait a
5659 // bit and hope that it will be enough (the problem is, of course, that
5660 // the thread might still not run when we call Pause() which will result
5662 wxThread::Sleep(300);
5664 for ( size_t n
= 0; n
< 3; n
++ )
5668 wxPuts(_T("\nThread suspended"));
5671 // don't sleep but resume immediately the first time
5672 wxThread::Sleep(300);
5674 wxPuts(_T("Going to resume the thread"));
5679 wxPuts(_T("Waiting until it terminates now"));
5681 // wait until the thread terminates
5687 static void TestThreadDelete()
5689 // As above, using Sleep() is only for testing here - we must use some
5690 // synchronisation object instead to ensure that the thread is still
5691 // running when we delete it - deleting a detached thread which already
5692 // terminated will lead to a crash!
5694 wxPuts(_T("\n*** Testing thread delete function ***"));
5696 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
5700 wxPuts(_T("\nDeleted a thread which didn't start to run yet."));
5702 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
5706 wxThread::Sleep(300);
5710 wxPuts(_T("\nDeleted a running thread."));
5712 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
5716 wxThread::Sleep(300);
5722 wxPuts(_T("\nDeleted a sleeping thread."));
5724 MyJoinableThread
thread3(20);
5729 wxPuts(_T("\nDeleted a joinable thread."));
5731 MyJoinableThread
thread4(2);
5734 wxThread::Sleep(300);
5738 wxPuts(_T("\nDeleted a joinable thread which already terminated."));
5743 class MyWaitingThread
: public wxThread
5746 MyWaitingThread( wxMutex
*mutex
, wxCondition
*condition
)
5749 m_condition
= condition
;
5754 virtual ExitCode
Entry()
5756 wxPrintf(_T("Thread %lu has started running.\n"), GetId());
5761 wxPrintf(_T("Thread %lu starts to wait...\n"), GetId());
5765 m_condition
->Wait();
5768 wxPrintf(_T("Thread %lu finished to wait, exiting.\n"), GetId());
5776 wxCondition
*m_condition
;
5779 static void TestThreadConditions()
5782 wxCondition
condition(mutex
);
5784 // otherwise its difficult to understand which log messages pertain to
5786 //wxLogTrace(_T("thread"), _T("Local condition var is %08x, gs_cond = %08x"),
5787 // condition.GetId(), gs_cond.GetId());
5789 // create and launch threads
5790 MyWaitingThread
*threads
[10];
5793 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5795 threads
[n
] = new MyWaitingThread( &mutex
, &condition
);
5798 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5803 // wait until all threads run
5804 wxPuts(_T("Main thread is waiting for the other threads to start"));
5807 size_t nRunning
= 0;
5808 while ( nRunning
< WXSIZEOF(threads
) )
5814 wxPrintf(_T("Main thread: %u already running\n"), nRunning
);
5818 wxPuts(_T("Main thread: all threads started up."));
5821 wxThread::Sleep(500);
5824 // now wake one of them up
5825 wxPrintf(_T("Main thread: about to signal the condition.\n"));
5830 wxThread::Sleep(200);
5832 // wake all the (remaining) threads up, so that they can exit
5833 wxPrintf(_T("Main thread: about to broadcast the condition.\n"));
5835 condition
.Broadcast();
5837 // give them time to terminate (dirty!)
5838 wxThread::Sleep(500);
5841 #include "wx/utils.h"
5843 class MyExecThread
: public wxThread
5846 MyExecThread(const wxString
& command
) : wxThread(wxTHREAD_JOINABLE
),
5852 virtual ExitCode
Entry()
5854 return (ExitCode
)wxExecute(m_command
, wxEXEC_SYNC
);
5861 static void TestThreadExec()
5863 wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
5865 MyExecThread
thread(_T("true"));
5868 wxPrintf(_T("Main program exit code: %ld.\n"),
5869 wxExecute(_T("false"), wxEXEC_SYNC
));
5871 wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread
.Wait());
5875 #include "wx/datetime.h"
5877 class MySemaphoreThread
: public wxThread
5880 MySemaphoreThread(int i
, wxSemaphore
*sem
)
5881 : wxThread(wxTHREAD_JOINABLE
),
5888 virtual ExitCode
Entry()
5890 wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
5891 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5895 wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
5896 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5900 wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
5901 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5913 WX_DEFINE_ARRAY(wxThread
*, ArrayThreads
);
5915 static void TestSemaphore()
5917 wxPuts(_T("*** Testing wxSemaphore class. ***"));
5919 static const int SEM_LIMIT
= 3;
5921 wxSemaphore
sem(SEM_LIMIT
, SEM_LIMIT
);
5922 ArrayThreads threads
;
5924 for ( int i
= 0; i
< 3*SEM_LIMIT
; i
++ )
5926 threads
.Add(new MySemaphoreThread(i
, &sem
));
5927 threads
.Last()->Run();
5930 for ( size_t n
= 0; n
< threads
.GetCount(); n
++ )
5937 #endif // TEST_THREADS
5939 // ----------------------------------------------------------------------------
5941 // ----------------------------------------------------------------------------
5945 #include "wx/dynarray.h"
5947 typedef unsigned short ushort
;
5949 #define DefineCompare(name, T) \
5951 int wxCMPFUNC_CONV name ## CompareValues(T first, T second) \
5953 return first - second; \
5956 int wxCMPFUNC_CONV name ## Compare(T* first, T* second) \
5958 return *first - *second; \
5961 int wxCMPFUNC_CONV name ## RevCompare(T* first, T* second) \
5963 return *second - *first; \
5966 DefineCompare(UShort, ushort);
5967 DefineCompare(Int
, int);
5969 // test compilation of all macros
5970 WX_DEFINE_ARRAY_SHORT(ushort
, wxArrayUShort
);
5971 WX_DEFINE_SORTED_ARRAY_SHORT(ushort
, wxSortedArrayUShortNoCmp
);
5972 WX_DEFINE_SORTED_ARRAY_CMP_SHORT(ushort
, UShortCompareValues
, wxSortedArrayUShort
);
5973 WX_DEFINE_SORTED_ARRAY_CMP_INT(int, IntCompareValues
, wxSortedArrayInt
);
5975 WX_DECLARE_OBJARRAY(Bar
, ArrayBars
);
5976 #include "wx/arrimpl.cpp"
5977 WX_DEFINE_OBJARRAY(ArrayBars
);
5979 static void PrintArray(const wxChar
* name
, const wxArrayString
& array
)
5981 wxPrintf(_T("Dump of the array '%s'\n"), name
);
5983 size_t nCount
= array
.GetCount();
5984 for ( size_t n
= 0; n
< nCount
; n
++ )
5986 wxPrintf(_T("\t%s[%u] = '%s'\n"), name
, n
, array
[n
].c_str());
5990 static void PrintArray(const wxChar
* name
, const wxSortedArrayString
& array
)
5992 wxPrintf(_T("Dump of the array '%s'\n"), name
);
5994 size_t nCount
= array
.GetCount();
5995 for ( size_t n
= 0; n
< nCount
; n
++ )
5997 wxPrintf(_T("\t%s[%u] = '%s'\n"), name
, n
, array
[n
].c_str());
6001 int wxCMPFUNC_CONV
StringLenCompare(const wxString
& first
,
6002 const wxString
& second
)
6004 return first
.length() - second
.length();
6007 #define TestArrayOf(name) \
6009 static void PrintArray(const wxChar* name, const wxSortedArray##name & array) \
6011 wxPrintf(_T("Dump of the array '%s'\n"), name); \
6013 size_t nCount = array.GetCount(); \
6014 for ( size_t n = 0; n < nCount; n++ ) \
6016 wxPrintf(_T("\t%s[%u] = %d\n"), name, n, array[n]); \
6020 static void PrintArray(const wxChar* name, const wxArray##name & array) \
6022 wxPrintf(_T("Dump of the array '%s'\n"), name); \
6024 size_t nCount = array.GetCount(); \
6025 for ( size_t n = 0; n < nCount; n++ ) \
6027 wxPrintf(_T("\t%s[%u] = %d\n"), name, n, array[n]); \
6031 static void TestArrayOf ## name ## s() \
6033 wxPrintf(_T("*** Testing wxArray%s ***\n"), #name); \
6041 wxPuts(_T("Initially:")); \
6042 PrintArray(_T("a"), a); \
6044 wxPuts(_T("After sort:")); \
6045 a.Sort(name ## Compare); \
6046 PrintArray(_T("a"), a); \
6048 wxPuts(_T("After reverse sort:")); \
6049 a.Sort(name ## RevCompare); \
6050 PrintArray(_T("a"), a); \
6052 wxSortedArray##name b; \
6058 wxPuts(_T("Sorted array initially:")); \
6059 PrintArray(_T("b"), b); \
6062 TestArrayOf(UShort
);
6065 static void TestStlArray()
6067 wxPuts(_T("*** Testing std::vector operations ***\n"));
6071 wxArrayInt::iterator it
, en
;
6072 wxArrayInt::reverse_iterator rit
, ren
;
6074 for ( i
= 0; i
< 5; ++i
)
6077 for ( it
= list1
.begin(), en
= list1
.end(), i
= 0;
6078 it
!= en
; ++it
, ++i
)
6080 wxPuts(_T("Error in iterator\n"));
6082 for ( rit
= list1
.rbegin(), ren
= list1
.rend(), i
= 4;
6083 rit
!= ren
; ++rit
, --i
)
6085 wxPuts(_T("Error in reverse_iterator\n"));
6087 if ( *list1
.rbegin() != *(list1
.end()-1) ||
6088 *list1
.begin() != *(list1
.rend()-1) )
6089 wxPuts(_T("Error in iterator/reverse_iterator\n"));
6091 it
= list1
.begin()+1;
6092 rit
= list1
.rbegin()+1;
6093 if ( *list1
.begin() != *(it
-1) ||
6094 *list1
.rbegin() != *(rit
-1) )
6095 wxPuts(_T("Error in iterator/reverse_iterator\n"));
6097 if ( list1
.front() != 0 || list1
.back() != 4 )
6098 wxPuts(_T("Error in front()/back()\n"));
6100 list1
.erase(list1
.begin());
6101 list1
.erase(list1
.end()-1);
6103 for ( it
= list1
.begin(), en
= list1
.end(), i
= 1;
6104 it
!= en
; ++it
, ++i
)
6106 wxPuts(_T("Error in erase()\n"));
6109 wxPuts(_T("*** Testing std::vector operations finished ***\n"));
6112 static void TestArrayOfObjects()
6114 wxPuts(_T("*** Testing wxObjArray ***\n"));
6118 Bar
bar("second bar (two copies!)");
6120 wxPrintf(_T("Initially: %u objects in the array, %u objects total.\n"),
6121 bars
.GetCount(), Bar::GetNumber());
6123 bars
.Add(new Bar("first bar"));
6126 wxPrintf(_T("Now: %u objects in the array, %u objects total.\n"),
6127 bars
.GetCount(), Bar::GetNumber());
6129 bars
.RemoveAt(1, bars
.GetCount() - 1);
6131 wxPrintf(_T("After removing all but first element: %u objects in the ")
6132 _T("array, %u objects total.\n"),
6133 bars
.GetCount(), Bar::GetNumber());
6137 wxPrintf(_T("After Empty(): %u objects in the array, %u objects total.\n"),
6138 bars
.GetCount(), Bar::GetNumber());
6141 wxPrintf(_T("Finally: no more objects in the array, %u objects total.\n"),
6145 #endif // TEST_ARRAYS
6147 // ----------------------------------------------------------------------------
6149 // ----------------------------------------------------------------------------
6153 #include "wx/timer.h"
6154 #include "wx/tokenzr.h"
6156 static void TestStringConstruction()
6158 wxPuts(_T("*** Testing wxString constructores ***"));
6160 #define TEST_CTOR(args, res) \
6163 wxPrintf(_T("wxString%s = %s "), #args, s.c_str()); \
6166 wxPuts(_T("(ok)")); \
6170 wxPrintf(_T("(ERROR: should be %s)\n"), res); \
6174 TEST_CTOR((_T('Z'), 4), _T("ZZZZ"));
6175 TEST_CTOR((_T("Hello"), 4), _T("Hell"));
6176 TEST_CTOR((_T("Hello"), 5), _T("Hello"));
6177 // TEST_CTOR((_T("Hello"), 6), _T("Hello")); -- should give assert failure
6179 static const wxChar
*s
= _T("?really!");
6180 const wxChar
*start
= wxStrchr(s
, _T('r'));
6181 const wxChar
*end
= wxStrchr(s
, _T('!'));
6182 TEST_CTOR((start
, end
), _T("really"));
6187 static void TestString()
6197 for (int i
= 0; i
< 1000000; ++i
)
6201 c
= _T("! How'ya doin'?");
6204 c
= _T("Hello world! What's up?");
6209 wxPrintf(_T("TestString elapsed time: %ld\n"), sw
.Time());
6212 static void TestPChar()
6220 for (int i
= 0; i
< 1000000; ++i
)
6222 wxStrcpy (a
, _T("Hello"));
6223 wxStrcpy (b
, _T(" world"));
6224 wxStrcpy (c
, _T("! How'ya doin'?"));
6227 wxStrcpy (c
, _T("Hello world! What's up?"));
6228 if (wxStrcmp (c
, a
) == 0)
6229 wxStrcpy (c
, _T("Doh!"));
6232 wxPrintf(_T("TestPChar elapsed time: %ld\n"), sw
.Time());
6235 static void TestStringSub()
6237 wxString
s(_T("Hello, world!"));
6239 wxPuts(_T("*** Testing wxString substring extraction ***"));
6241 wxPrintf(_T("String = '%s'\n"), s
.c_str());
6242 wxPrintf(_T("Left(5) = '%s'\n"), s
.Left(5).c_str());
6243 wxPrintf(_T("Right(6) = '%s'\n"), s
.Right(6).c_str());
6244 wxPrintf(_T("Mid(3, 5) = '%s'\n"), s(3, 5).c_str());
6245 wxPrintf(_T("Mid(3) = '%s'\n"), s
.Mid(3).c_str());
6246 wxPrintf(_T("substr(3, 5) = '%s'\n"), s
.substr(3, 5).c_str());
6247 wxPrintf(_T("substr(3) = '%s'\n"), s
.substr(3).c_str());
6249 static const wxChar
*prefixes
[] =
6253 _T("Hello, world!"),
6254 _T("Hello, world!!!"),
6260 for ( size_t n
= 0; n
< WXSIZEOF(prefixes
); n
++ )
6262 wxString prefix
= prefixes
[n
], rest
;
6263 bool rc
= s
.StartsWith(prefix
, &rest
);
6264 wxPrintf(_T("StartsWith('%s') = %s"), prefix
.c_str(), rc
? _T("true") : _T("false"));
6267 wxPrintf(_T(" (the rest is '%s')\n"), rest
.c_str());
6278 static void TestStringFormat()
6280 wxPuts(_T("*** Testing wxString formatting ***"));
6283 s
.Printf(_T("%03d"), 18);
6285 wxPrintf(_T("Number 18: %s\n"), wxString::Format(_T("%03d"), 18).c_str());
6286 wxPrintf(_T("Number 18: %s\n"), s
.c_str());
6291 // returns "not found" for npos, value for all others
6292 static wxString
PosToString(size_t res
)
6294 wxString s
= res
== wxString::npos
? wxString(_T("not found"))
6295 : wxString::Format(_T("%u"), res
);
6299 static void TestStringFind()
6301 wxPuts(_T("*** Testing wxString find() functions ***"));
6303 static const wxChar
*strToFind
= _T("ell");
6304 static const struct StringFindTest
6308 result
; // of searching "ell" in str
6311 { _T("Well, hello world"), 0, 1 },
6312 { _T("Well, hello world"), 6, 7 },
6313 { _T("Well, hello world"), 9, wxString::npos
},
6316 for ( size_t n
= 0; n
< WXSIZEOF(findTestData
); n
++ )
6318 const StringFindTest
& ft
= findTestData
[n
];
6319 size_t res
= wxString(ft
.str
).find(strToFind
, ft
.start
);
6321 wxPrintf(_T("Index of '%s' in '%s' starting from %u is %s "),
6322 strToFind
, ft
.str
, ft
.start
, PosToString(res
).c_str());
6324 size_t resTrue
= ft
.result
;
6325 if ( res
== resTrue
)
6331 wxPrintf(_T("(ERROR: should be %s)\n"),
6332 PosToString(resTrue
).c_str());
6339 static void TestStringTokenizer()
6341 wxPuts(_T("*** Testing wxStringTokenizer ***"));
6343 static const wxChar
*modeNames
[] =
6347 _T("return all empty"),
6352 static const struct StringTokenizerTest
6354 const wxChar
*str
; // string to tokenize
6355 const wxChar
*delims
; // delimiters to use
6356 size_t count
; // count of token
6357 wxStringTokenizerMode mode
; // how should we tokenize it
6358 } tokenizerTestData
[] =
6360 { _T(""), _T(" "), 0 },
6361 { _T("Hello, world"), _T(" "), 2 },
6362 { _T("Hello, world "), _T(" "), 2 },
6363 { _T("Hello, world"), _T(","), 2 },
6364 { _T("Hello, world!"), _T(",!"), 2 },
6365 { _T("Hello,, world!"), _T(",!"), 3 },
6366 { _T("Hello, world!"), _T(",!"), 3, wxTOKEN_RET_EMPTY_ALL
},
6367 { _T("username:password:uid:gid:gecos:home:shell"), _T(":"), 7 },
6368 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 4 },
6369 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 6, wxTOKEN_RET_EMPTY
},
6370 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 9, wxTOKEN_RET_EMPTY_ALL
},
6371 { _T("01/02/99"), _T("/-"), 3 },
6372 { _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS
},
6375 for ( size_t n
= 0; n
< WXSIZEOF(tokenizerTestData
); n
++ )
6377 const StringTokenizerTest
& tt
= tokenizerTestData
[n
];
6378 wxStringTokenizer
tkz(tt
.str
, tt
.delims
, tt
.mode
);
6380 size_t count
= tkz
.CountTokens();
6381 wxPrintf(_T("String '%s' has %u tokens delimited by '%s' (mode = %s) "),
6382 MakePrintable(tt
.str
).c_str(),
6384 MakePrintable(tt
.delims
).c_str(),
6385 modeNames
[tkz
.GetMode()]);
6386 if ( count
== tt
.count
)
6392 wxPrintf(_T("(ERROR: should be %u)\n"), tt
.count
);
6397 // if we emulate strtok(), check that we do it correctly
6398 wxChar
*buf
, *s
= NULL
, *last
;
6400 if ( tkz
.GetMode() == wxTOKEN_STRTOK
)
6402 buf
= new wxChar
[wxStrlen(tt
.str
) + 1];
6403 wxStrcpy(buf
, tt
.str
);
6405 s
= wxStrtok(buf
, tt
.delims
, &last
);
6412 // now show the tokens themselves
6414 while ( tkz
.HasMoreTokens() )
6416 wxString token
= tkz
.GetNextToken();
6418 wxPrintf(_T("\ttoken %u: '%s'"),
6420 MakePrintable(token
).c_str());
6426 wxPuts(_T(" (ok)"));
6430 wxPrintf(_T(" (ERROR: should be %s)\n"), s
);
6433 s
= wxStrtok(NULL
, tt
.delims
, &last
);
6437 // nothing to compare with
6442 if ( count2
!= count
)
6444 wxPuts(_T("\tERROR: token count mismatch"));
6453 static void TestStringReplace()
6455 wxPuts(_T("*** Testing wxString::replace ***"));
6457 static const struct StringReplaceTestData
6459 const wxChar
*original
; // original test string
6460 size_t start
, len
; // the part to replace
6461 const wxChar
*replacement
; // the replacement string
6462 const wxChar
*result
; // and the expected result
6463 } stringReplaceTestData
[] =
6465 { _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") },
6466 { _T("increase"), 0, 2, _T("de"), _T("decrease") },
6467 { _T("wxWindow"), 8, 0, _T("s"), _T("wxWindows") },
6468 { _T("foobar"), 3, 0, _T("-"), _T("foo-bar") },
6469 { _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") },
6472 for ( size_t n
= 0; n
< WXSIZEOF(stringReplaceTestData
); n
++ )
6474 const StringReplaceTestData data
= stringReplaceTestData
[n
];
6476 wxString original
= data
.original
;
6477 original
.replace(data
.start
, data
.len
, data
.replacement
);
6479 wxPrintf(_T("wxString(\"%s\").replace(%u, %u, %s) = %s "),
6480 data
.original
, data
.start
, data
.len
, data
.replacement
,
6483 if ( original
== data
.result
)
6489 wxPrintf(_T("(ERROR: should be '%s')\n"), data
.result
);
6496 static void TestStringMatch()
6498 wxPuts(_T("*** Testing wxString::Matches() ***"));
6500 static const struct StringMatchTestData
6503 const wxChar
*wildcard
;
6505 } stringMatchTestData
[] =
6507 { _T("foobar"), _T("foo*"), 1 },
6508 { _T("foobar"), _T("*oo*"), 1 },
6509 { _T("foobar"), _T("*bar"), 1 },
6510 { _T("foobar"), _T("??????"), 1 },
6511 { _T("foobar"), _T("f??b*"), 1 },
6512 { _T("foobar"), _T("f?b*"), 0 },
6513 { _T("foobar"), _T("*goo*"), 0 },
6514 { _T("foobar"), _T("*foo"), 0 },
6515 { _T("foobarfoo"), _T("*foo"), 1 },
6516 { _T(""), _T("*"), 1 },
6517 { _T(""), _T("?"), 0 },
6520 for ( size_t n
= 0; n
< WXSIZEOF(stringMatchTestData
); n
++ )
6522 const StringMatchTestData
& data
= stringMatchTestData
[n
];
6523 bool matches
= wxString(data
.text
).Matches(data
.wildcard
);
6524 wxPrintf(_T("'%s' %s '%s' (%s)\n"),
6526 matches
? _T("matches") : _T("doesn't match"),
6528 matches
== data
.matches
? _T("ok") : _T("ERROR"));
6534 // Sigh, I want Test::Simple, Test::More and Test::Harness...
6535 void ok(int line
, bool ok
, const wxString
& msg
= wxEmptyString
)
6538 wxPuts(_T("NOT OK: (") + wxString::Format(_T("%d"), line
) +
6542 void is(int line
, const wxString
& got
, const wxString
& expected
,
6543 const wxString
& msg
= wxEmptyString
)
6545 bool isOk
= got
== expected
;
6546 ok(line
, isOk
, msg
);
6549 wxPuts(_T("Got: ") + got
);
6550 wxPuts(_T("Expected: ") + expected
);
6555 void is(int line
, const wxChar
* got
, const wxChar
* expected
,
6556 const wxString
& msg
= wxEmptyString
)
6558 bool isOk
= wxStrcmp( got
, expected
) == 0;
6559 ok(line
, isOk
, msg
);
6562 wxPuts(_T("Got: ") + wxString(got
));
6563 wxPuts(_T("Expected: ") + wxString(expected
));
6568 void is(int line
, const wxChar
& got
, const wxChar
& expected
,
6569 const wxString
& msg
= wxEmptyString
)
6571 bool isOk
= got
== expected
;
6572 ok(line
, isOk
, msg
);
6575 wxPuts(_T("Got: ") + got
);
6576 wxPuts(_T("Expected: ") + expected
);
6580 void is(int line
, size_t got
, size_t expected
,
6581 const wxString
& msg
= wxEmptyString
)
6583 bool isOk
= got
== expected
;
6584 ok(line
, isOk
, msg
);
6587 wxPuts(wxString::Format(_T("Got: %ld"), got
));
6588 wxPuts(wxString::Format(_T("Expected: %ld"), expected
));
6592 #define is_m( got, expected, message ) is( __LINE__, (got), (expected), (message) )
6593 #define is_nom( got, expected ) is( __LINE__, (got), (expected), wxEmptyString )
6595 void TestStdString()
6597 wxPuts(_T("*** Testing std::string operations ***\n"));
6600 wxString
s1(_T("abcdefgh")),
6601 s2(_T("abcdefghijklm"), 8),
6602 s3(_T("abcdefghijklm")),
6606 s7(s3
.begin(), s3
.begin() + 8);
6607 wxString
s8(s1
, 4, 8), s9
, s10
, s11
;
6609 is( __LINE__
, s1
, _T("abcdefgh") );
6610 is( __LINE__
, s2
, s1
);
6611 is( __LINE__
, s4
, _T("aaaaaaaa") );
6612 is( __LINE__
, s5
, _T("abcdefgh") );
6613 is( __LINE__
, s6
, s1
);
6614 is( __LINE__
, s7
, s1
);
6615 is( __LINE__
, s8
, _T("efgh") );
6618 s1
= s2
= s3
= s4
= s5
= s6
= s7
= s8
= _T("abc");
6619 s1
.append(_T("def"));
6620 s2
.append(_T("defgh"), 3);
6621 s3
.append(wxString(_T("abcdef")), 3, 6);
6623 s5
.append(3, _T('a'));
6624 s6
.append(s1
.begin() + 3, s1
.end());
6626 is( __LINE__
, s1
, _T("abcdef") );
6627 is( __LINE__
, s2
, _T("abcdef") );
6628 is( __LINE__
, s3
, _T("abcdef") );
6629 is( __LINE__
, s4
, _T("abcabcdef") );
6630 is( __LINE__
, s5
, _T("abcaaa") );
6631 is( __LINE__
, s6
, _T("abcdef") );
6634 s1
= s2
= s3
= s4
= s5
= s6
= s7
= s8
= _T("abc");
6635 s1
.assign(_T("def"));
6636 s2
.assign(_T("defgh"), 3);
6637 s3
.assign(wxString(_T("abcdef")), 3, 6);
6639 s5
.assign(3, _T('a'));
6640 s6
.assign(s1
.begin() + 1, s1
.end());
6642 is( __LINE__
, s1
, _T("def") );
6643 is( __LINE__
, s2
, _T("def") );
6644 is( __LINE__
, s3
, _T("def") );
6645 is( __LINE__
, s4
, _T("def") );
6646 is( __LINE__
, s5
, _T("aaa") );
6647 is( __LINE__
, s6
, _T("ef") );
6650 s1
= _T("abcdefgh");
6651 s2
= _T("abcdefgh");
6653 s4
= _T("abcdefghi");
6656 s7
= _T("zabcdefg");
6658 ok( __LINE__
, s1
.compare(s2
) == 0 );
6659 ok( __LINE__
, s1
.compare(s3
) > 0 );
6660 ok( __LINE__
, s1
.compare(s4
) < 0 );
6661 ok( __LINE__
, s1
.compare(s5
) > 0 );
6662 ok( __LINE__
, s1
.compare(s6
) < 0 );
6663 ok( __LINE__
, s1
.compare(1, 12, s1
) > 0);
6664 ok( __LINE__
, s1
.compare(_T("abcdefgh")) == 0);
6665 ok( __LINE__
, s1
.compare(1, 7, _T("bcdefgh")) == 0);
6666 ok( __LINE__
, s1
.compare(1, 7, _T("bcdefgh"), 7) == 0);
6671 wxString::iterator it
= s3
.erase(s3
.begin() + 1);
6672 wxString::iterator it2
= s4
.erase(s4
.begin() + 4, s4
.begin() + 6);
6673 wxString::iterator it3
= s7
.erase(s7
.begin() + 4, s7
.begin() + 8);
6675 is( __LINE__
, s1
, _T("acdefgh") );
6676 is( __LINE__
, s2
, _T("abcd") );
6677 is( __LINE__
, s3
, _T("ac") );
6678 is( __LINE__
, s4
, _T("abcdghi") );
6679 is( __LINE__
, s7
, _T("zabc") );
6680 is( __LINE__
, *it
, _T('c') );
6681 is( __LINE__
, *it2
, _T('g') );
6682 ok( __LINE__
, it3
== s7
.end() );
6686 // 01234567890123456789012345
6687 s1
= _T("abcdefgABCDEFGabcABCabcABC");
6690 is_nom( s1
.find(_T('A')), 7u );
6691 is_nom( s1
.find(_T('A'), 7), 7u );
6692 is_nom( s1
.find(_T('Z')), wxString::npos
);
6693 is_nom( s1
.find(_T('C'), 22), 25u );
6695 is_nom( s1
.find(_T("gAB")), 6u );
6696 is_nom( s1
.find(_T("gAB"), 7), wxString::npos
);
6697 is_nom( s1
.find(_T("gAB"), 6), 6u );
6699 is_nom( s1
.find(_T("gABZZZ"), 2, 3), 6u );
6700 is_nom( s1
.find(_T("gABZZZ"), 7, 3), wxString::npos
);
6702 is_nom( s1
.find(s2
), 6u );
6703 is_nom( s1
.find(s2
, 7), wxString::npos
);
6704 is_nom( s1
.find(s2
, 6), 6u );
6706 // find_first_not_of
6708 // 01234567890123456789012345678901234
6709 s1
= _T("aaaaaabcdefghlkjiaaaaaabcdbcdbcdbcd");
6712 is_nom( s1
.find_first_not_of(_T('a')), 6u );
6713 is_nom( s1
.find_first_not_of(_T('a'), 7), 7u );
6714 is_nom( s2
.find_first_not_of(_T('a')), wxString::npos
);
6716 is_nom( s1
.find_first_not_of(_T("abde"), 4), 7u );
6717 is_nom( s1
.find_first_not_of(_T("abde"), 7), 7u );
6718 is_nom( s1
.find_first_not_of(_T("abcdefghijkl")), wxString::npos
);
6720 is_nom( s1
.find_first_not_of(_T("abcdefghi"), 0, 4), 9u );
6723 is_nom( s1
.find_first_of(_T('c')), 7u );
6724 is_nom( s1
.find_first_of(_T('v')), wxString::npos
);
6725 is_nom( s1
.find_first_of(_T('c'), 10), 24u );
6727 is_nom( s1
.find_first_of(_T("ijkl")), 13u );
6728 is_nom( s1
.find_first_of(_T("ddcfg"), 17), 24u );
6729 is_nom( s1
.find_first_of(_T("ddcfga"), 17, 5), 24u );
6733 // 01234567890123456789012345678901234
6734 s1
= _T("aaaaaabcdefghlkjiaaaaaabcdbcdbcdbcd");
6737 is_nom( s2
.find_last_not_of(_T('a')), wxString::npos
);
6738 is_nom( s1
.find_last_not_of(_T('d')), 33u );
6739 is_nom( s1
.find_last_not_of(_T('d'), 25), 24u );
6741 is_nom( s1
.find_last_not_of(_T("bcd")), 22u );
6742 is_nom( s1
.find_last_not_of(_T("abc"), 24), 16u );
6744 is_nom( s1
.find_last_not_of(_T("abcdefghijklmnopqrstuv"), 24, 3), 16u );
6747 is_nom( s2
.find_last_of(_T('c')), wxString::npos
);
6748 is_nom( s1
.find_last_of(_T('a')), 22u );
6749 is_nom( s1
.find_last_of(_T('b'), 24), 23u );
6751 is_nom( s1
.find_last_of(_T("ijklm")), 16u );
6752 is_nom( s1
.find_last_of(_T("ijklma"), 33, 4), 16u );
6753 is_nom( s1
.find_last_of(_T("a"), 17), 17u );
6756 s1
= s2
= s3
= s4
= s5
= s6
= s7
= s8
= _T("aaaa");
6757 s9
= s10
= _T("cdefg");
6759 s1
.insert(1, _T("cc") );
6760 s2
.insert(2, _T("cdef"), 3);
6762 s4
.insert(2, s10
, 3, 7);
6763 s5
.insert(1, 2, _T('c'));
6764 it
= s6
.insert(s6
.begin() + 3, _T('X'));
6765 s7
.insert(s7
.begin(), s9
.begin(), s9
.end() - 1);
6766 s8
.insert(s8
.begin(), 2, _T('c'));
6768 is( __LINE__
, s1
, _T("accaaa") );
6769 is( __LINE__
, s2
, _T("aacdeaa") );
6770 is( __LINE__
, s3
, _T("aacdefgaa") );
6771 is( __LINE__
, s4
, _T("aafgaa") );
6772 is( __LINE__
, s5
, _T("accaaa") );
6773 is( __LINE__
, s6
, _T("aaaXa") );
6774 is( __LINE__
, s7
, _T("cdefaaaa") );
6775 is( __LINE__
, s8
, _T("ccaaaa") );
6777 s1
= s2
= s3
= _T("aaaa");
6778 s1
.insert(0, _T("ccc"), 2);
6779 s2
.insert(4, _T("ccc"), 2);
6781 is( __LINE__
, s1
, _T("ccaaaa") );
6782 is( __LINE__
, s2
, _T("aaaacc") );
6785 s1
= s2
= s3
= s4
= s5
= s6
= s7
= s8
= _T("QWERTYUIOP");
6786 s9
= s10
= _T("werty");
6788 s1
.replace(3, 4, _T("rtyu"));
6789 s1
.replace(8, 7, _T("opopop"));
6790 s2
.replace(10, 12, _T("WWWW"));
6791 s3
.replace(1, 5, s9
);
6792 s4
.replace(1, 4, s9
, 0, 4);
6793 s5
.replace(1, 2, s9
, 1, 12);
6794 s6
.replace(0, 123, s9
, 0, 123);
6795 s7
.replace(2, 7, s9
);
6797 is( __LINE__
, s1
, _T("QWErtyuIopopop") );
6798 is( __LINE__
, s2
, _T("QWERTYUIOPWWWW") );
6799 is( __LINE__
, s3
, _T("QwertyUIOP") );
6800 is( __LINE__
, s4
, _T("QwertYUIOP") );
6801 is( __LINE__
, s5
, _T("QertyRTYUIOP") );
6802 is( __LINE__
, s6
, s9
);
6803 is( __LINE__
, s7
, _T("QWwertyP") );
6807 // 01234567890123456789012345
6808 s1
= _T("abcdefgABCDEFGabcABCabcABC");
6812 is_nom( s1
.rfind(_T('A')), 23u );
6813 is_nom( s1
.rfind(_T('A'), 7), 7u );
6814 is_nom( s1
.rfind(_T('Z')), wxString::npos
);
6815 is_nom( s1
.rfind(_T('C'), 22), 19u );
6817 is_nom( s1
.rfind(_T("cAB")), 22u );
6818 is_nom( s1
.rfind(_T("cAB"), 15), wxString::npos
);
6819 is_nom( s1
.rfind(_T("cAB"), 21), 16u );
6821 is_nom( s1
.rfind(_T("gABZZZ"), 7, 3), 6u );
6822 is_nom( s1
.rfind(_T("gABZZZ"), 5, 3), wxString::npos
);
6824 is_nom( s1
.rfind(s2
), 6u );
6825 is_nom( s1
.rfind(s2
, 5), wxString::npos
);
6826 is_nom( s1
.rfind(s2
, 6), 6u );
6827 is_nom( s1
.rfind(s3
, 1), 0u );
6830 s1
= s2
= s3
= s4
= _T("abcABCdefDEF");
6834 s3
.resize( 14, _T(' ') );
6835 s4
.resize( 14, _T('W') );
6837 is_nom( s1
, _T("abcABCdefDEF") );
6838 is_nom( s2
, _T("abcABCdefD") );
6839 is_nom( s3
, _T("abcABCdefDEF ") );
6840 is_nom( s4
, _T("abcABCdefDEFWW") );
6843 s1
= _T("abcdefgABCDEFG");
6845 is_nom( s1
.substr( 0, 14 ), s1
);
6846 is_nom( s1
.substr( 1, 13 ), _T("bcdefgABCDEFG") );
6847 is_nom( s1
.substr( 1, 20 ), _T("bcdefgABCDEFG") );
6848 is_nom( s1
.substr( 14, 30 ), _T("") );
6850 wxPuts(_T("*** Testing std::string operations finished ***\n"));
6853 #endif // TEST_STRINGS
6855 // ----------------------------------------------------------------------------
6857 // ----------------------------------------------------------------------------
6859 #ifdef TEST_SNGLINST
6860 #include "wx/snglinst.h"
6861 #endif // TEST_SNGLINST
6863 int main(int argc
, char **argv
)
6865 wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE
, "program");
6867 wxInitializer initializer
;
6870 fprintf(stderr
, "Failed to initialize the wxWindows library, aborting.");
6875 #ifdef TEST_SNGLINST
6876 wxSingleInstanceChecker checker
;
6877 if ( checker
.Create(_T(".wxconsole.lock")) )
6879 if ( checker
.IsAnotherRunning() )
6881 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
6886 // wait some time to give time to launch another instance
6887 wxPrintf(_T("Press \"Enter\" to continue..."));
6890 else // failed to create
6892 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
6894 #endif // TEST_SNGLINST
6898 #endif // TEST_CHARSET
6901 TestCmdLineConvert();
6903 #if wxUSE_CMDLINE_PARSER
6904 static const wxCmdLineEntryDesc cmdLineDesc
[] =
6906 { wxCMD_LINE_SWITCH
, _T("h"), _T("help"), _T("show this help message"),
6907 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
6908 { wxCMD_LINE_SWITCH
, _T("v"), _T("verbose"), _T("be verbose") },
6909 { wxCMD_LINE_SWITCH
, _T("q"), _T("quiet"), _T("be quiet") },
6911 { wxCMD_LINE_OPTION
, _T("o"), _T("output"), _T("output file") },
6912 { wxCMD_LINE_OPTION
, _T("i"), _T("input"), _T("input dir") },
6913 { wxCMD_LINE_OPTION
, _T("s"), _T("size"), _T("output block size"),
6914 wxCMD_LINE_VAL_NUMBER
},
6915 { wxCMD_LINE_OPTION
, _T("d"), _T("date"), _T("output file date"),
6916 wxCMD_LINE_VAL_DATE
},
6918 { wxCMD_LINE_PARAM
, NULL
, NULL
, _T("input file"),
6919 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
6925 wxChar
**wargv
= new wxChar
*[argc
+ 1];
6928 for ( int n
= 0; n
< argc
; n
++ )
6930 wxMB2WXbuf warg
= wxConvertMB2WX(argv
[n
]);
6931 wargv
[n
] = wxStrdup(warg
);
6938 #endif // wxUSE_UNICODE
6940 wxCmdLineParser
parser(cmdLineDesc
, argc
, argv
);
6944 for ( int n
= 0; n
< argc
; n
++ )
6949 #endif // wxUSE_UNICODE
6951 parser
.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
6952 wxCMD_LINE_VAL_STRING
,
6953 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
6955 switch ( parser
.Parse() )
6958 wxLogMessage(_T("Help was given, terminating."));
6962 ShowCmdLine(parser
);
6966 wxLogMessage(_T("Syntax error detected, aborting."));
6969 #endif // wxUSE_CMDLINE_PARSER
6971 #endif // TEST_CMDLINE
6979 TestStringConstruction();
6982 TestStringTokenizer();
6983 TestStringReplace();
6991 #endif // TEST_STRINGS
6994 if ( 1 || TEST_ALL
)
6997 a1
.Add(_T("tiger"));
6999 a1
.Add(_T("lion"), 3);
7001 a1
.Add(_T("human"));
7004 wxPuts(_T("*** Initially:"));
7006 PrintArray(_T("a1"), a1
);
7008 wxArrayString
a2(a1
);
7009 PrintArray(_T("a2"), a2
);
7012 wxSortedArrayString
a3(a1
);
7014 wxSortedArrayString a3
;
7015 for (wxArrayString::iterator it
= a1
.begin(), en
= a1
.end();
7019 PrintArray(_T("a3"), a3
);
7021 wxPuts(_T("*** After deleting three strings from a1"));
7024 PrintArray(_T("a1"), a1
);
7025 PrintArray(_T("a2"), a2
);
7026 PrintArray(_T("a3"), a3
);
7029 wxPuts(_T("*** After reassigning a1 to a2 and a3"));
7031 PrintArray(_T("a2"), a2
);
7032 PrintArray(_T("a3"), a3
);
7035 wxPuts(_T("*** After sorting a1"));
7036 a1
.Sort(wxStringCompareAscending
);
7037 PrintArray(_T("a1"), a1
);
7039 wxPuts(_T("*** After sorting a1 in reverse order"));
7040 a1
.Sort(wxStringCompareDescending
);
7041 PrintArray(_T("a1"), a1
);
7044 wxPuts(_T("*** After sorting a1 by the string length"));
7045 a1
.Sort(&StringLenCompare
);
7046 PrintArray(_T("a1"), a1
);
7049 TestArrayOfObjects();
7050 TestArrayOfUShorts();
7055 #endif // TEST_ARRAYS
7066 #ifdef TEST_DLLLOADER
7068 #endif // TEST_DLLLOADER
7072 #endif // TEST_ENVIRON
7076 #endif // TEST_EXECUTE
7078 #ifdef TEST_FILECONF
7080 #endif // TEST_FILECONF
7089 #endif // TEST_LOCALE
7092 wxPuts(_T("*** Testing wxLog ***"));
7095 for ( size_t n
= 0; n
< 8000; n
++ )
7097 s
<< (wxChar
)(_T('A') + (n
% 26));
7100 wxLogWarning(_T("The length of the string is %lu"),
7101 (unsigned long)s
.length());
7104 msg
.Printf(_T("A very very long message: '%s', the end!\n"), s
.c_str());
7106 // this one shouldn't be truncated
7109 // but this one will because log functions use fixed size buffer
7110 // (note that it doesn't need '\n' at the end neither - will be added
7112 wxLogMessage(_T("A very very long message 2: '%s', the end!"), s
.c_str());
7124 #ifdef TEST_FILENAME
7128 fn
.Assign(_T("c:\\foo"), _T("bar.baz"));
7129 fn
.Assign(_T("/u/os9-port/Viewer/tvision/WEI2HZ-3B3-14_05-04-00MSC1.asc"));
7134 TestFileNameConstruction();
7137 TestFileNameConstruction();
7138 TestFileNameMakeRelative();
7139 TestFileNameMakeAbsolute();
7140 TestFileNameSplit();
7143 TestFileNameComparison();
7144 TestFileNameOperations();
7146 #endif // TEST_FILENAME
7148 #ifdef TEST_FILETIME
7152 #endif // TEST_FILETIME
7155 wxLog::AddTraceMask(FTP_TRACE_MASK
);
7156 if ( TestFtpConnect() )
7167 if ( TEST_INTERACTIVE
)
7168 TestFtpInteractive();
7170 //else: connecting to the FTP server failed
7176 #ifdef TEST_LONGLONG
7177 // seed pseudo random generator
7178 srand((unsigned)time(NULL
));
7187 TestMultiplication();
7190 TestLongLongConversion();
7191 TestBitOperations();
7192 TestLongLongComparison();
7193 TestLongLongToString();
7194 TestLongLongPrintf();
7196 #endif // TEST_LONGLONG
7204 #endif // TEST_HASHMAP
7208 #endif // TEST_HASHSET
7211 wxLog::AddTraceMask(_T("mime"));
7216 TestMimeAssociate();
7221 #ifdef TEST_INFO_FUNCTIONS
7227 if ( TEST_INTERACTIVE
)
7230 #endif // TEST_INFO_FUNCTIONS
7232 #ifdef TEST_PATHLIST
7234 #endif // TEST_PATHLIST
7242 #endif // TEST_PRINTF
7246 #endif // TEST_REGCONF
7249 // TODO: write a real test using src/regex/tests file
7254 TestRegExSubmatch();
7255 TestRegExReplacement();
7257 if ( TEST_INTERACTIVE
)
7258 TestRegExInteractive();
7260 #endif // TEST_REGEX
7262 #ifdef TEST_REGISTRY
7264 TestRegistryAssociation();
7265 #endif // TEST_REGISTRY
7270 #endif // TEST_SOCKETS
7278 #endif // TEST_STREAMS
7280 #ifdef TEST_TEXTSTREAM
7281 TestTextInputStream();
7282 #endif // TEST_TEXTSTREAM
7285 int nCPUs
= wxThread::GetCPUCount();
7286 wxPrintf(_T("This system has %d CPUs\n"), nCPUs
);
7288 wxThread::SetConcurrency(nCPUs
);
7290 TestDetachedThreads();
7293 TestJoinableThreads();
7294 TestThreadSuspend();
7296 TestThreadConditions();
7300 #endif // TEST_THREADS
7304 #endif // TEST_TIMER
7306 #ifdef TEST_DATETIME
7319 TestTimeArithmetics();
7322 TestTimeSpanFormat();
7330 if ( TEST_INTERACTIVE
)
7331 TestDateTimeInteractive();
7332 #endif // TEST_DATETIME
7334 #ifdef TEST_SCOPEGUARD
7339 wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
7341 #endif // TEST_USLEEP
7346 #endif // TEST_VCARD
7350 #endif // TEST_VOLUME
7353 TestUnicodeToFromAscii();
7354 #endif // TEST_UNICODE
7358 TestEncodingConverter();
7359 #endif // TEST_WCHAR
7362 TestZipStreamRead();
7363 TestZipFileSystem();
7367 TestZlibStreamWrite();
7368 TestZlibStreamRead();