1 /////////////////////////////////////////////////////////////////////////////
2 // Name: samples/console/console.cpp
3 // Purpose: a sample console (as opposed to GUI) progam using wxWindows
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
23 #error "This sample can't be compiled in GUI mode."
28 #include "wx/string.h"
32 // without this pragma, the stupid compiler precompiles #defines below so that
33 // changing them doesn't "take place" later!
38 // ----------------------------------------------------------------------------
39 // conditional compilation
40 // ----------------------------------------------------------------------------
43 A note about all these conditional compilation macros: this file is used
44 both as a test suite for various non-GUI wxWindows classes and as a
45 scratchpad for quick tests. So there are two compilation modes: if you
46 define TEST_ALL all tests are run, otherwise you may enable the individual
47 tests individually in the "#else" branch below.
50 // what to test (in alphabetic order)? uncomment the line below to do all tests
58 #define TEST_DLLLOADER
68 #define TEST_INFO_FUNCTIONS
84 #define TEST_TEXTSTREAM
88 // #define TEST_VCARD -- don't enable this (VZ)
95 static const bool TEST_ALL
= TRUE
;
97 #define TEST_TEXTSTREAM
99 static const bool TEST_ALL
= FALSE
;
102 // some tests are interactive, define this to run them
103 #ifdef TEST_INTERACTIVE
104 #undef TEST_INTERACTIVE
106 static const bool TEST_INTERACTIVE
= TRUE
;
108 static const bool TEST_INTERACTIVE
= FALSE
;
111 // ----------------------------------------------------------------------------
112 // test class for container objects
113 // ----------------------------------------------------------------------------
115 #if defined(TEST_ARRAYS) || defined(TEST_LIST)
117 class Bar
// Foo is already taken in the hash test
120 Bar(const wxString
& name
) : m_name(name
) { ms_bars
++; }
121 Bar(const Bar
& bar
) : m_name(bar
.m_name
) { ms_bars
++; }
122 ~Bar() { ms_bars
--; }
124 static size_t GetNumber() { return ms_bars
; }
126 const wxChar
*GetName() const { return m_name
; }
131 static size_t ms_bars
;
134 size_t Bar::ms_bars
= 0;
136 #endif // defined(TEST_ARRAYS) || defined(TEST_LIST)
138 // ============================================================================
140 // ============================================================================
142 // ----------------------------------------------------------------------------
144 // ----------------------------------------------------------------------------
146 #if defined(TEST_STRINGS) || defined(TEST_SOCKETS)
148 // replace TABs with \t and CRs with \n
149 static wxString
MakePrintable(const wxChar
*s
)
152 (void)str
.Replace(_T("\t"), _T("\\t"));
153 (void)str
.Replace(_T("\n"), _T("\\n"));
154 (void)str
.Replace(_T("\r"), _T("\\r"));
159 #endif // MakePrintable() is used
161 // ----------------------------------------------------------------------------
162 // wxFontMapper::CharsetToEncoding
163 // ----------------------------------------------------------------------------
167 #include "wx/fontmap.h"
169 static void TestCharset()
171 static const wxChar
*charsets
[] =
173 // some vali charsets
182 // and now some bogus ones
189 for ( size_t n
= 0; n
< WXSIZEOF(charsets
); n
++ )
191 wxFontEncoding enc
= wxFontMapper::Get()->CharsetToEncoding(charsets
[n
]);
192 wxPrintf(_T("Charset: %s\tEncoding: %s (%s)\n"),
194 wxFontMapper::Get()->GetEncodingName(enc
).c_str(),
195 wxFontMapper::Get()->GetEncodingDescription(enc
).c_str());
199 #endif // TEST_CHARSET
201 // ----------------------------------------------------------------------------
203 // ----------------------------------------------------------------------------
207 #include "wx/cmdline.h"
208 #include "wx/datetime.h"
211 #if wxUSE_CMDLINE_PARSER
213 static void ShowCmdLine(const wxCmdLineParser
& parser
)
215 wxString s
= _T("Input files: ");
217 size_t count
= parser
.GetParamCount();
218 for ( size_t param
= 0; param
< count
; param
++ )
220 s
<< parser
.GetParam(param
) << ' ';
224 << _T("Verbose:\t") << (parser
.Found(_T("v")) ? _T("yes") : _T("no")) << '\n'
225 << _T("Quiet:\t") << (parser
.Found(_T("q")) ? _T("yes") : _T("no")) << '\n';
230 if ( parser
.Found(_T("o"), &strVal
) )
231 s
<< _T("Output file:\t") << strVal
<< '\n';
232 if ( parser
.Found(_T("i"), &strVal
) )
233 s
<< _T("Input dir:\t") << strVal
<< '\n';
234 if ( parser
.Found(_T("s"), &lVal
) )
235 s
<< _T("Size:\t") << lVal
<< '\n';
236 if ( parser
.Found(_T("d"), &dt
) )
237 s
<< _T("Date:\t") << dt
.FormatISODate() << '\n';
238 if ( parser
.Found(_T("project_name"), &strVal
) )
239 s
<< _T("Project:\t") << strVal
<< '\n';
244 #endif // wxUSE_CMDLINE_PARSER
246 static void TestCmdLineConvert()
248 static const wxChar
*cmdlines
[] =
251 _T("-a \"-bstring 1\" -c\"string 2\" \"string 3\""),
252 _T("literal \\\" and \"\""),
255 for ( size_t n
= 0; n
< WXSIZEOF(cmdlines
); n
++ )
257 const wxChar
*cmdline
= cmdlines
[n
];
258 wxPrintf(_T("Parsing: %s\n"), cmdline
);
259 wxArrayString args
= wxCmdLineParser::ConvertStringToArgs(cmdline
);
261 size_t count
= args
.GetCount();
262 wxPrintf(_T("\targc = %u\n"), count
);
263 for ( size_t arg
= 0; arg
< count
; arg
++ )
265 wxPrintf(_T("\targv[%u] = %s\n"), arg
, args
[arg
].c_str());
270 #endif // TEST_CMDLINE
272 // ----------------------------------------------------------------------------
274 // ----------------------------------------------------------------------------
281 static const wxChar
*ROOTDIR
= _T("/");
282 static const wxChar
*TESTDIR
= _T("/usr");
283 #elif defined(__WXMSW__)
284 static const wxChar
*ROOTDIR
= _T("c:\\");
285 static const wxChar
*TESTDIR
= _T("d:\\");
287 #error "don't know where the root directory is"
290 static void TestDirEnumHelper(wxDir
& dir
,
291 int flags
= wxDIR_DEFAULT
,
292 const wxString
& filespec
= wxEmptyString
)
296 if ( !dir
.IsOpened() )
299 bool cont
= dir
.GetFirst(&filename
, filespec
, flags
);
302 wxPrintf(_T("\t%s\n"), filename
.c_str());
304 cont
= dir
.GetNext(&filename
);
310 static void TestDirEnum()
312 wxPuts(_T("*** Testing wxDir::GetFirst/GetNext ***"));
314 wxString cwd
= wxGetCwd();
315 if ( !wxDir::Exists(cwd
) )
317 wxPrintf(_T("ERROR: current directory '%s' doesn't exist?\n"), cwd
.c_str());
322 if ( !dir
.IsOpened() )
324 wxPrintf(_T("ERROR: failed to open current directory '%s'.\n"), cwd
.c_str());
328 wxPuts(_T("Enumerating everything in current directory:"));
329 TestDirEnumHelper(dir
);
331 wxPuts(_T("Enumerating really everything in current directory:"));
332 TestDirEnumHelper(dir
, wxDIR_DEFAULT
| wxDIR_DOTDOT
);
334 wxPuts(_T("Enumerating object files in current directory:"));
335 TestDirEnumHelper(dir
, wxDIR_DEFAULT
, "*.o*");
337 wxPuts(_T("Enumerating directories in current directory:"));
338 TestDirEnumHelper(dir
, wxDIR_DIRS
);
340 wxPuts(_T("Enumerating files in current directory:"));
341 TestDirEnumHelper(dir
, wxDIR_FILES
);
343 wxPuts(_T("Enumerating files including hidden in current directory:"));
344 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
348 wxPuts(_T("Enumerating everything in root directory:"));
349 TestDirEnumHelper(dir
, wxDIR_DEFAULT
);
351 wxPuts(_T("Enumerating directories in root directory:"));
352 TestDirEnumHelper(dir
, wxDIR_DIRS
);
354 wxPuts(_T("Enumerating files in root directory:"));
355 TestDirEnumHelper(dir
, wxDIR_FILES
);
357 wxPuts(_T("Enumerating files including hidden in root directory:"));
358 TestDirEnumHelper(dir
, wxDIR_FILES
| wxDIR_HIDDEN
);
360 wxPuts(_T("Enumerating files in non existing directory:"));
361 wxDir
dirNo("nosuchdir");
362 TestDirEnumHelper(dirNo
);
365 class DirPrintTraverser
: public wxDirTraverser
368 virtual wxDirTraverseResult
OnFile(const wxString
& filename
)
370 return wxDIR_CONTINUE
;
373 virtual wxDirTraverseResult
OnDir(const wxString
& dirname
)
375 wxString path
, name
, ext
;
376 wxSplitPath(dirname
, &path
, &name
, &ext
);
379 name
<< _T('.') << ext
;
382 for ( const wxChar
*p
= path
.c_str(); *p
; p
++ )
384 if ( wxIsPathSeparator(*p
) )
388 wxPrintf(_T("%s%s\n"), indent
.c_str(), name
.c_str());
390 return wxDIR_CONTINUE
;
394 static void TestDirTraverse()
396 wxPuts(_T("*** Testing wxDir::Traverse() ***"));
400 size_t n
= wxDir::GetAllFiles(TESTDIR
, &files
);
401 wxPrintf(_T("There are %u files under '%s'\n"), n
, TESTDIR
);
404 wxPrintf(_T("First one is '%s'\n"), files
[0u].c_str());
405 wxPrintf(_T(" last one is '%s'\n"), files
[n
- 1].c_str());
408 // enum again with custom traverser
410 DirPrintTraverser traverser
;
411 dir
.Traverse(traverser
, _T(""), wxDIR_DIRS
| wxDIR_HIDDEN
);
414 static void TestDirExists()
416 wxPuts(_T("*** Testing wxDir::Exists() ***"));
418 static const wxChar
*dirnames
[] =
421 #if defined(__WXMSW__)
424 _T("\\\\share\\file"),
428 _T("c:\\autoexec.bat"),
429 #elif defined(__UNIX__)
438 for ( size_t n
= 0; n
< WXSIZEOF(dirnames
); n
++ )
440 wxPrintf(_T("%-40s: %s\n"),
442 wxDir::Exists(dirnames
[n
]) ? _T("exists")
443 : _T("doesn't exist"));
449 // ----------------------------------------------------------------------------
451 // ----------------------------------------------------------------------------
453 #ifdef TEST_DLLLOADER
455 #include "wx/dynlib.h"
457 static void TestDllLoad()
459 #if defined(__WXMSW__)
460 static const wxChar
*LIB_NAME
= _T("kernel32.dll");
461 static const wxChar
*FUNC_NAME
= _T("lstrlenA");
462 #elif defined(__UNIX__)
463 // weird: using just libc.so does *not* work!
464 static const wxChar
*LIB_NAME
= _T("/lib/libc-2.0.7.so");
465 static const wxChar
*FUNC_NAME
= _T("strlen");
467 #error "don't know how to test wxDllLoader on this platform"
470 wxPuts(_T("*** testing wxDllLoader ***\n"));
472 wxDynamicLibrary
lib(LIB_NAME
);
473 if ( !lib
.IsLoaded() )
475 wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME
);
479 typedef int (*wxStrlenType
)(const char *);
480 wxStrlenType pfnStrlen
= (wxStrlenType
)lib
.GetSymbol(FUNC_NAME
);
483 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
484 FUNC_NAME
, LIB_NAME
);
488 if ( pfnStrlen("foo") != 3 )
490 wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
494 wxPuts(_T("... ok"));
500 #endif // TEST_DLLLOADER
502 // ----------------------------------------------------------------------------
504 // ----------------------------------------------------------------------------
508 #include "wx/utils.h"
510 static wxString
MyGetEnv(const wxString
& var
)
513 if ( !wxGetEnv(var
, &val
) )
516 val
= wxString(_T('\'')) + val
+ _T('\'');
521 static void TestEnvironment()
523 const wxChar
*var
= _T("wxTestVar");
525 wxPuts(_T("*** testing environment access functions ***"));
527 wxPrintf(_T("Initially getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
528 wxSetEnv(var
, _T("value for wxTestVar"));
529 wxPrintf(_T("After wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
530 wxSetEnv(var
, _T("another value"));
531 wxPrintf(_T("After 2nd wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
533 wxPrintf(_T("After wxUnsetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
534 wxPrintf(_T("PATH = %s\n"), MyGetEnv(_T("PATH")).c_str());
537 #endif // TEST_ENVIRON
539 // ----------------------------------------------------------------------------
541 // ----------------------------------------------------------------------------
545 #include "wx/utils.h"
547 static void TestExecute()
549 wxPuts(_T("*** testing wxExecute ***"));
552 #define COMMAND "cat -n ../../Makefile" // "echo hi"
553 #define SHELL_COMMAND "echo hi from shell"
554 #define REDIRECT_COMMAND COMMAND // "date"
555 #elif defined(__WXMSW__)
556 #define COMMAND "command.com /c echo hi"
557 #define SHELL_COMMAND "echo hi"
558 #define REDIRECT_COMMAND COMMAND
560 #error "no command to exec"
563 wxPrintf(_T("Testing wxShell: "));
565 if ( wxShell(SHELL_COMMAND
) )
568 wxPuts(_T("ERROR."));
570 wxPrintf(_T("Testing wxExecute: "));
572 if ( wxExecute(COMMAND
, TRUE
/* sync */) == 0 )
575 wxPuts(_T("ERROR."));
577 #if 0 // no, it doesn't work (yet?)
578 wxPrintf(_T("Testing async wxExecute: "));
580 if ( wxExecute(COMMAND
) != 0 )
581 wxPuts(_T("Ok (command launched)."));
583 wxPuts(_T("ERROR."));
586 wxPrintf(_T("Testing wxExecute with redirection:\n"));
587 wxArrayString output
;
588 if ( wxExecute(REDIRECT_COMMAND
, output
) != 0 )
590 wxPuts(_T("ERROR."));
594 size_t count
= output
.GetCount();
595 for ( size_t n
= 0; n
< count
; n
++ )
597 wxPrintf(_T("\t%s\n"), output
[n
].c_str());
604 #endif // TEST_EXECUTE
606 // ----------------------------------------------------------------------------
608 // ----------------------------------------------------------------------------
613 #include "wx/ffile.h"
614 #include "wx/textfile.h"
616 static void TestFileRead()
618 wxPuts(_T("*** wxFile read test ***"));
620 wxFile
file(_T("testdata.fc"));
621 if ( file
.IsOpened() )
623 wxPrintf(_T("File length: %lu\n"), file
.Length());
625 wxPuts(_T("File dump:\n----------"));
627 static const off_t len
= 1024;
631 off_t nRead
= file
.Read(buf
, len
);
632 if ( nRead
== wxInvalidOffset
)
634 wxPrintf(_T("Failed to read the file."));
638 fwrite(buf
, nRead
, 1, stdout
);
644 wxPuts(_T("----------"));
648 wxPrintf(_T("ERROR: can't open test file.\n"));
654 static void TestTextFileRead()
656 wxPuts(_T("*** wxTextFile read test ***"));
658 wxTextFile
file(_T("testdata.fc"));
661 wxPrintf(_T("Number of lines: %u\n"), file
.GetLineCount());
662 wxPrintf(_T("Last line: '%s'\n"), file
.GetLastLine().c_str());
666 wxPuts(_T("\nDumping the entire file:"));
667 for ( s
= file
.GetFirstLine(); !file
.Eof(); s
= file
.GetNextLine() )
669 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
671 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
673 wxPuts(_T("\nAnd now backwards:"));
674 for ( s
= file
.GetLastLine();
675 file
.GetCurrentLine() != 0;
676 s
= file
.GetPrevLine() )
678 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
680 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
684 wxPrintf(_T("ERROR: can't open '%s'\n"), file
.GetName());
690 static void TestFileCopy()
692 wxPuts(_T("*** Testing wxCopyFile ***"));
694 static const wxChar
*filename1
= _T("testdata.fc");
695 static const wxChar
*filename2
= _T("test2");
696 if ( !wxCopyFile(filename1
, filename2
) )
698 wxPuts(_T("ERROR: failed to copy file"));
702 wxFFile
f1(filename1
, "rb"),
705 if ( !f1
.IsOpened() || !f2
.IsOpened() )
707 wxPuts(_T("ERROR: failed to open file(s)"));
712 if ( !f1
.ReadAll(&s1
) || !f2
.ReadAll(&s2
) )
714 wxPuts(_T("ERROR: failed to read file(s)"));
718 if ( (s1
.length() != s2
.length()) ||
719 (memcmp(s1
.c_str(), s2
.c_str(), s1
.length()) != 0) )
721 wxPuts(_T("ERROR: copy error!"));
725 wxPuts(_T("File was copied ok."));
731 if ( !wxRemoveFile(filename2
) )
733 wxPuts(_T("ERROR: failed to remove the file"));
741 // ----------------------------------------------------------------------------
743 // ----------------------------------------------------------------------------
747 #include "wx/confbase.h"
748 #include "wx/fileconf.h"
750 static const struct FileConfTestData
752 const wxChar
*name
; // value name
753 const wxChar
*value
; // the value from the file
756 { _T("value1"), _T("one") },
757 { _T("value2"), _T("two") },
758 { _T("novalue"), _T("default") },
761 static void TestFileConfRead()
763 wxPuts(_T("*** testing wxFileConfig loading/reading ***"));
765 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
766 _T("testdata.fc"), wxEmptyString
,
767 wxCONFIG_USE_RELATIVE_PATH
);
769 // test simple reading
770 wxPuts(_T("\nReading config file:"));
771 wxString
defValue(_T("default")), value
;
772 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
774 const FileConfTestData
& data
= fcTestData
[n
];
775 value
= fileconf
.Read(data
.name
, defValue
);
776 wxPrintf(_T("\t%s = %s "), data
.name
, value
.c_str());
777 if ( value
== data
.value
)
783 wxPrintf(_T("(ERROR: should be %s)\n"), data
.value
);
787 // test enumerating the entries
788 wxPuts(_T("\nEnumerating all root entries:"));
791 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
794 wxPrintf(_T("\t%s = %s\n"),
796 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
798 cont
= fileconf
.GetNextEntry(name
, dummy
);
802 #endif // TEST_FILECONF
804 // ----------------------------------------------------------------------------
806 // ----------------------------------------------------------------------------
810 #include "wx/filename.h"
812 static void DumpFileName(const wxFileName
& fn
)
814 wxString full
= fn
.GetFullPath();
816 wxString vol
, path
, name
, ext
;
817 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
819 wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
820 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
822 wxFileName::SplitPath(full
, &path
, &name
, &ext
);
823 wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
824 path
.c_str(), name
.c_str(), ext
.c_str());
826 wxPrintf(_T("path is also:\t'%s'\n"), fn
.GetPath().c_str());
827 wxPrintf(_T("with volume: \t'%s'\n"),
828 fn
.GetPath(wxPATH_GET_VOLUME
).c_str());
829 wxPrintf(_T("with separator:\t'%s'\n"),
830 fn
.GetPath(wxPATH_GET_SEPARATOR
).c_str());
831 wxPrintf(_T("with both: \t'%s'\n"),
832 fn
.GetPath(wxPATH_GET_SEPARATOR
| wxPATH_GET_VOLUME
).c_str());
834 wxPuts(_T("The directories in the path are:"));
835 wxArrayString dirs
= fn
.GetDirs();
836 size_t count
= dirs
.GetCount();
837 for ( size_t n
= 0; n
< count
; n
++ )
839 wxPrintf(_T("\t%u: %s\n"), n
, dirs
[n
].c_str());
843 static struct FileNameInfo
845 const wxChar
*fullname
;
846 const wxChar
*volume
;
855 { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), TRUE
, wxPATH_UNIX
},
856 { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), TRUE
, wxPATH_UNIX
},
857 { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), TRUE
, wxPATH_UNIX
},
858 { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), FALSE
, wxPATH_UNIX
},
859 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_UNIX
},
860 { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), TRUE
, wxPATH_UNIX
},
861 { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), TRUE
, wxPATH_UNIX
},
862 { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), FALSE
, wxPATH_UNIX
},
863 { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), TRUE
, wxPATH_UNIX
},
865 // Windows file names
866 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
867 { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
868 { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), FALSE
, wxPATH_DOS
},
869 { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
870 { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), TRUE
, wxPATH_DOS
},
871 { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
872 { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), TRUE
, wxPATH_DOS
},
874 // wxFileName support for Mac file names is broken currently
877 { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE
, wxPATH_MAC
},
878 { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), TRUE
, wxPATH_MAC
},
879 { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), TRUE
, wxPATH_MAC
},
880 { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), FALSE
, wxPATH_MAC
},
881 { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE
, wxPATH_MAC
},
882 { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE
, wxPATH_MAC
},
886 { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), TRUE
, wxPATH_VMS
},
887 { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), FALSE
, wxPATH_VMS
},
890 static void TestFileNameConstruction()
892 wxPuts(_T("*** testing wxFileName construction ***"));
894 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
896 const FileNameInfo
& fni
= filenames
[n
];
898 wxFileName
fn(fni
.fullname
, fni
.format
);
900 wxString fullname
= fn
.GetFullPath(fni
.format
);
901 if ( fullname
!= fni
.fullname
)
903 wxPrintf(_T("ERROR: fullname should be '%s'\n"), fni
.fullname
);
906 bool isAbsolute
= fn
.IsAbsolute(fni
.format
);
907 wxPrintf(_T("'%s' is %s (%s)\n\t"),
909 isAbsolute
? "absolute" : "relative",
910 isAbsolute
== fni
.isAbsolute
? "ok" : "ERROR");
912 if ( !fn
.Normalize(wxPATH_NORM_ALL
, _T(""), fni
.format
) )
914 wxPuts(_T("ERROR (couldn't be normalized)"));
918 wxPrintf(_T("normalized: '%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
925 static void TestFileNameSplit()
927 wxPuts(_T("*** testing wxFileName splitting ***"));
929 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
931 const FileNameInfo
& fni
= filenames
[n
];
932 wxString volume
, path
, name
, ext
;
933 wxFileName::SplitPath(fni
.fullname
,
934 &volume
, &path
, &name
, &ext
, fni
.format
);
936 wxPrintf(_T("%s -> volume = '%s', path = '%s', name = '%s', ext = '%s'"),
938 volume
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
940 if ( volume
!= fni
.volume
)
941 wxPrintf(_T(" (ERROR: volume = '%s')"), fni
.volume
);
942 if ( path
!= fni
.path
)
943 wxPrintf(_T(" (ERROR: path = '%s')"), fni
.path
);
944 if ( name
!= fni
.name
)
945 wxPrintf(_T(" (ERROR: name = '%s')"), fni
.name
);
946 if ( ext
!= fni
.ext
)
947 wxPrintf(_T(" (ERROR: ext = '%s')"), fni
.ext
);
953 static void TestFileNameTemp()
955 wxPuts(_T("*** testing wxFileName temp file creation ***"));
957 static const wxChar
*tmpprefixes
[] =
965 _T("/tmp/foo/bar"), // this one must be an error
969 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
971 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
974 // "error" is not in upper case because it may be ok
975 wxPrintf(_T("Prefix '%s'\t-> error\n"), tmpprefixes
[n
]);
979 wxPrintf(_T("Prefix '%s'\t-> temp file '%s'\n"),
980 tmpprefixes
[n
], path
.c_str());
982 if ( !wxRemoveFile(path
) )
984 wxLogWarning(_T("Failed to remove temp file '%s'"),
991 static void TestFileNameMakeRelative()
993 wxPuts(_T("*** testing wxFileName::MakeRelativeTo() ***"));
995 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
997 const FileNameInfo
& fni
= filenames
[n
];
999 wxFileName
fn(fni
.fullname
, fni
.format
);
1001 // choose the base dir of the same format
1003 switch ( fni
.format
)
1015 // TODO: I don't know how this is supposed to work there
1018 case wxPATH_NATIVE
: // make gcc happy
1020 wxFAIL_MSG( "unexpected path format" );
1023 wxPrintf(_T("'%s' relative to '%s': "),
1024 fn
.GetFullPath(fni
.format
).c_str(), base
.c_str());
1026 if ( !fn
.MakeRelativeTo(base
, fni
.format
) )
1028 wxPuts(_T("unchanged"));
1032 wxPrintf(_T("'%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
1037 static void TestFileNameMakeAbsolute()
1039 wxPuts(_T("*** testing wxFileName::MakeAbsolute() ***"));
1041 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1043 const FileNameInfo
& fni
= filenames
[n
];
1044 wxFileName
fn(fni
.fullname
, fni
.format
);
1046 wxPrintf(_T("'%s' absolutized: "),
1047 fn
.GetFullPath(fni
.format
).c_str());
1049 wxPrintf(_T("'%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
1055 static void TestFileNameComparison()
1060 static void TestFileNameOperations()
1065 static void TestFileNameCwd()
1070 #endif // TEST_FILENAME
1072 // ----------------------------------------------------------------------------
1073 // wxFileName time functions
1074 // ----------------------------------------------------------------------------
1076 #ifdef TEST_FILETIME
1078 #include <wx/filename.h>
1079 #include <wx/datetime.h>
1081 static void TestFileGetTimes()
1083 wxFileName
fn(_T("testdata.fc"));
1085 wxDateTime dtAccess
, dtMod
, dtCreate
;
1086 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtCreate
) )
1088 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
1092 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
1094 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
1095 wxPrintf(_T("Creation: \t%s\n"), dtCreate
.Format(fmt
).c_str());
1096 wxPrintf(_T("Last read: \t%s\n"), dtAccess
.Format(fmt
).c_str());
1097 wxPrintf(_T("Last write: \t%s\n"), dtMod
.Format(fmt
).c_str());
1101 static void TestFileSetTimes()
1103 wxFileName
fn(_T("testdata.fc"));
1107 wxPrintf(_T("ERROR: Touch() failed.\n"));
1111 #endif // TEST_FILETIME
1113 // ----------------------------------------------------------------------------
1115 // ----------------------------------------------------------------------------
1119 #include "wx/hash.h"
1123 Foo(int n_
) { n
= n_
; count
++; }
1128 static size_t count
;
1131 size_t Foo::count
= 0;
1133 WX_DECLARE_LIST(Foo
, wxListFoos
);
1134 WX_DECLARE_HASH(Foo
, wxListFoos
, wxHashFoos
);
1136 #include "wx/listimpl.cpp"
1138 WX_DEFINE_LIST(wxListFoos
);
1140 static void TestHash()
1142 wxPuts(_T("*** Testing wxHashTable ***\n"));
1146 hash
.DeleteContents(TRUE
);
1148 wxPrintf(_T("Hash created: %u foos in hash, %u foos totally\n"),
1149 hash
.GetCount(), Foo::count
);
1151 static const int hashTestData
[] =
1153 0, 1, 17, -2, 2, 4, -4, 345, 3, 3, 2, 1,
1157 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1159 hash
.Put(hashTestData
[n
], n
, new Foo(n
));
1162 wxPrintf(_T("Hash filled: %u foos in hash, %u foos totally\n"),
1163 hash
.GetCount(), Foo::count
);
1165 wxPuts(_T("Hash access test:"));
1166 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1168 wxPrintf(_T("\tGetting element with key %d, value %d: "),
1169 hashTestData
[n
], n
);
1170 Foo
*foo
= hash
.Get(hashTestData
[n
], n
);
1173 wxPrintf(_T("ERROR, not found.\n"));
1177 wxPrintf(_T("%d (%s)\n"), foo
->n
,
1178 (size_t)foo
->n
== n
? "ok" : "ERROR");
1182 wxPrintf(_T("\nTrying to get an element not in hash: "));
1184 if ( hash
.Get(1234) || hash
.Get(1, 0) )
1186 wxPuts(_T("ERROR: found!"));
1190 wxPuts(_T("ok (not found)"));
1194 wxPrintf(_T("Hash destroyed: %u foos left\n"), Foo::count
);
1199 // ----------------------------------------------------------------------------
1201 // ----------------------------------------------------------------------------
1205 #include "wx/hashmap.h"
1207 // test compilation of basic map types
1208 WX_DECLARE_HASH_MAP( int*, int*, wxPointerHash
, wxPointerEqual
, myPtrHashMap
);
1209 WX_DECLARE_HASH_MAP( long, long, wxIntegerHash
, wxIntegerEqual
, myLongHashMap
);
1210 WX_DECLARE_HASH_MAP( unsigned long, unsigned, wxIntegerHash
, wxIntegerEqual
,
1211 myUnsignedHashMap
);
1212 WX_DECLARE_HASH_MAP( unsigned int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1214 WX_DECLARE_HASH_MAP( int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1216 WX_DECLARE_HASH_MAP( short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1218 WX_DECLARE_HASH_MAP( unsigned short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1222 // WX_DECLARE_HASH_MAP( wxString, wxString, wxStringHash, wxStringEqual,
1223 // myStringHashMap );
1224 WX_DECLARE_STRING_HASH_MAP(wxString
, myStringHashMap
);
1226 typedef myStringHashMap::iterator Itor
;
1228 static void TestHashMap()
1230 wxPuts(_T("*** Testing wxHashMap ***\n"));
1231 myStringHashMap
sh(0); // as small as possible
1234 const size_t count
= 10000;
1236 // init with some data
1237 for( i
= 0; i
< count
; ++i
)
1239 buf
.Printf(wxT("%d"), i
);
1240 sh
[buf
] = wxT("A") + buf
+ wxT("C");
1243 // test that insertion worked
1244 if( sh
.size() != count
)
1246 wxPrintf(_T("*** ERROR: %u ELEMENTS, SHOULD BE %u ***\n"), sh
.size(), count
);
1249 for( i
= 0; i
< count
; ++i
)
1251 buf
.Printf(wxT("%d"), i
);
1252 if( sh
[buf
] != wxT("A") + buf
+ wxT("C") )
1254 wxPrintf(_T("*** ERROR INSERTION BROKEN! STOPPING NOW! ***\n"));
1259 // check that iterators work
1261 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1265 wxPrintf(_T("*** ERROR ITERATORS DO NOT TERMINATE! STOPPING NOW! ***\n"));
1269 if( it
->second
!= sh
[it
->first
] )
1271 wxPrintf(_T("*** ERROR ITERATORS BROKEN! STOPPING NOW! ***\n"));
1276 if( sh
.size() != i
)
1278 wxPrintf(_T("*** ERROR: %u ELEMENTS ITERATED, SHOULD BE %u ***\n"), i
, count
);
1281 // test copy ctor, assignment operator
1282 myStringHashMap
h1( sh
), h2( 0 );
1285 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1287 if( h1
[it
->first
] != it
->second
)
1289 wxPrintf(_T("*** ERROR: COPY CTOR BROKEN %s ***\n"), it
->first
.c_str());
1292 if( h2
[it
->first
] != it
->second
)
1294 wxPrintf(_T("*** ERROR: OPERATOR= BROKEN %s ***\n"), it
->first
.c_str());
1299 for( i
= 0; i
< count
; ++i
)
1301 buf
.Printf(wxT("%d"), i
);
1302 size_t sz
= sh
.size();
1304 // test find() and erase(it)
1307 it
= sh
.find( buf
);
1308 if( it
!= sh
.end() )
1312 if( sh
.find( buf
) != sh
.end() )
1314 wxPrintf(_T("*** ERROR: FOUND DELETED ELEMENT %u ***\n"), i
);
1318 wxPrintf(_T("*** ERROR: CANT FIND ELEMENT %u ***\n"), i
);
1323 size_t c
= sh
.erase( buf
);
1325 wxPrintf(_T("*** ERROR: SHOULD RETURN 1 ***\n"));
1327 if( sh
.find( buf
) != sh
.end() )
1329 wxPrintf(_T("*** ERROR: FOUND DELETED ELEMENT %u ***\n"), i
);
1333 // count should decrease
1334 if( sh
.size() != sz
- 1 )
1336 wxPrintf(_T("*** ERROR: COUNT DID NOT DECREASE ***\n"));
1340 wxPrintf(_T("*** Finished testing wxHashMap ***\n"));
1343 #endif // TEST_HASHMAP
1345 // ----------------------------------------------------------------------------
1347 // ----------------------------------------------------------------------------
1351 #include "wx/list.h"
1353 WX_DECLARE_LIST(Bar
, wxListBars
);
1354 #include "wx/listimpl.cpp"
1355 WX_DEFINE_LIST(wxListBars
);
1357 static void TestListCtor()
1359 wxPuts(_T("*** Testing wxList construction ***\n"));
1363 list1
.Append(new Bar(_T("first")));
1364 list1
.Append(new Bar(_T("second")));
1366 wxPrintf(_T("After 1st list creation: %u objects in the list, %u objects total.\n"),
1367 list1
.GetCount(), Bar::GetNumber());
1372 wxPrintf(_T("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n"),
1373 list1
.GetCount(), list2
.GetCount(), Bar::GetNumber());
1375 list1
.DeleteContents(TRUE
);
1378 wxPrintf(_T("After list destruction: %u objects left.\n"), Bar::GetNumber());
1383 // ----------------------------------------------------------------------------
1385 // ----------------------------------------------------------------------------
1389 #include "wx/intl.h"
1390 #include "wx/utils.h" // for wxSetEnv
1392 static wxLocale
gs_localeDefault(wxLANGUAGE_ENGLISH
);
1394 // find the name of the language from its value
1395 static const wxChar
*GetLangName(int lang
)
1397 static const wxChar
*languageNames
[] =
1407 _T("ARABIC_ALGERIA"),
1408 _T("ARABIC_BAHRAIN"),
1411 _T("ARABIC_JORDAN"),
1412 _T("ARABIC_KUWAIT"),
1413 _T("ARABIC_LEBANON"),
1415 _T("ARABIC_MOROCCO"),
1418 _T("ARABIC_SAUDI_ARABIA"),
1421 _T("ARABIC_TUNISIA"),
1428 _T("AZERI_CYRILLIC"),
1443 _T("CHINESE_SIMPLIFIED"),
1444 _T("CHINESE_TRADITIONAL"),
1445 _T("CHINESE_HONGKONG"),
1446 _T("CHINESE_MACAU"),
1447 _T("CHINESE_SINGAPORE"),
1448 _T("CHINESE_TAIWAN"),
1454 _T("DUTCH_BELGIAN"),
1458 _T("ENGLISH_AUSTRALIA"),
1459 _T("ENGLISH_BELIZE"),
1460 _T("ENGLISH_BOTSWANA"),
1461 _T("ENGLISH_CANADA"),
1462 _T("ENGLISH_CARIBBEAN"),
1463 _T("ENGLISH_DENMARK"),
1465 _T("ENGLISH_JAMAICA"),
1466 _T("ENGLISH_NEW_ZEALAND"),
1467 _T("ENGLISH_PHILIPPINES"),
1468 _T("ENGLISH_SOUTH_AFRICA"),
1469 _T("ENGLISH_TRINIDAD"),
1470 _T("ENGLISH_ZIMBABWE"),
1478 _T("FRENCH_BELGIAN"),
1479 _T("FRENCH_CANADIAN"),
1480 _T("FRENCH_LUXEMBOURG"),
1481 _T("FRENCH_MONACO"),
1487 _T("GERMAN_AUSTRIAN"),
1488 _T("GERMAN_BELGIUM"),
1489 _T("GERMAN_LIECHTENSTEIN"),
1490 _T("GERMAN_LUXEMBOURG"),
1508 _T("ITALIAN_SWISS"),
1513 _T("KASHMIRI_INDIA"),
1531 _T("MALAY_BRUNEI_DARUSSALAM"),
1532 _T("MALAY_MALAYSIA"),
1542 _T("NORWEGIAN_BOKMAL"),
1543 _T("NORWEGIAN_NYNORSK"),
1550 _T("PORTUGUESE_BRAZILIAN"),
1553 _T("RHAETO_ROMANCE"),
1556 _T("RUSSIAN_UKRAINE"),
1562 _T("SERBIAN_CYRILLIC"),
1563 _T("SERBIAN_LATIN"),
1564 _T("SERBO_CROATIAN"),
1575 _T("SPANISH_ARGENTINA"),
1576 _T("SPANISH_BOLIVIA"),
1577 _T("SPANISH_CHILE"),
1578 _T("SPANISH_COLOMBIA"),
1579 _T("SPANISH_COSTA_RICA"),
1580 _T("SPANISH_DOMINICAN_REPUBLIC"),
1581 _T("SPANISH_ECUADOR"),
1582 _T("SPANISH_EL_SALVADOR"),
1583 _T("SPANISH_GUATEMALA"),
1584 _T("SPANISH_HONDURAS"),
1585 _T("SPANISH_MEXICAN"),
1586 _T("SPANISH_MODERN"),
1587 _T("SPANISH_NICARAGUA"),
1588 _T("SPANISH_PANAMA"),
1589 _T("SPANISH_PARAGUAY"),
1591 _T("SPANISH_PUERTO_RICO"),
1592 _T("SPANISH_URUGUAY"),
1594 _T("SPANISH_VENEZUELA"),
1598 _T("SWEDISH_FINLAND"),
1616 _T("URDU_PAKISTAN"),
1618 _T("UZBEK_CYRILLIC"),
1631 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1632 return languageNames
[lang
];
1634 return _T("INVALID");
1637 static void TestDefaultLang()
1639 wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
1641 static const wxChar
*langStrings
[] =
1643 NULL
, // system default
1650 _T("de_DE.iso88591"),
1652 _T("?"), // invalid lang spec
1653 _T("klingonese"), // I bet on some systems it does exist...
1656 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1657 wxLocale::GetSystemEncodingName().c_str(),
1658 wxLocale::GetSystemEncoding());
1660 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1662 const wxChar
*langStr
= langStrings
[n
];
1665 // FIXME: this doesn't do anything at all under Windows, we need
1666 // to create a new wxLocale!
1667 wxSetEnv(_T("LC_ALL"), langStr
);
1670 int lang
= gs_localeDefault
.GetSystemLanguage();
1671 wxPrintf(_T("Locale for '%s' is %s.\n"),
1672 langStr
? langStr
: _T("system default"), GetLangName(lang
));
1676 #endif // TEST_LOCALE
1678 // ----------------------------------------------------------------------------
1680 // ----------------------------------------------------------------------------
1684 #include "wx/mimetype.h"
1686 static void TestMimeEnum()
1688 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1690 wxArrayString mimetypes
;
1692 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1694 wxPrintf(_T("*** All %u known filetypes: ***\n"), count
);
1699 for ( size_t n
= 0; n
< count
; n
++ )
1701 wxFileType
*filetype
=
1702 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1705 wxPrintf(_T("nothing known about the filetype '%s'!\n"),
1706 mimetypes
[n
].c_str());
1710 filetype
->GetDescription(&desc
);
1711 filetype
->GetExtensions(exts
);
1713 filetype
->GetIcon(NULL
);
1716 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1719 extsAll
<< _T(", ");
1723 wxPrintf(_T("\t%s: %s (%s)\n"),
1724 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
1730 static void TestMimeOverride()
1732 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
1734 static const wxChar
*mailcap
= _T("/tmp/mailcap");
1735 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
1737 if ( wxFile::Exists(mailcap
) )
1738 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
1740 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
1742 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
1745 if ( wxFile::Exists(mimetypes
) )
1746 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
1748 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
1750 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
1756 static void TestMimeFilename()
1758 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
1760 static const wxChar
*filenames
[] =
1768 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1770 const wxString fname
= filenames
[n
];
1771 wxString ext
= fname
.AfterLast(_T('.'));
1772 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
1775 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
1780 if ( !ft
->GetDescription(&desc
) )
1781 desc
= _T("<no description>");
1784 if ( !ft
->GetOpenCommand(&cmd
,
1785 wxFileType::MessageParameters(fname
, _T(""))) )
1786 cmd
= _T("<no command available>");
1788 cmd
= wxString(_T('"')) + cmd
+ _T('"');
1790 wxPrintf(_T("To open %s (%s) do %s.\n"),
1791 fname
.c_str(), desc
.c_str(), cmd
.c_str());
1800 static void TestMimeAssociate()
1802 wxPuts(_T("*** Testing creation of filetype association ***\n"));
1804 wxFileTypeInfo
ftInfo(
1805 _T("application/x-xyz"),
1806 _T("xyzview '%s'"), // open cmd
1807 _T(""), // print cmd
1808 _T("XYZ File"), // description
1809 _T(".xyz"), // extensions
1810 NULL
// end of extensions
1812 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
1814 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
1817 wxPuts(_T("ERROR: failed to create association!"));
1821 // TODO: read it back
1830 // ----------------------------------------------------------------------------
1831 // misc information functions
1832 // ----------------------------------------------------------------------------
1834 #ifdef TEST_INFO_FUNCTIONS
1836 #include "wx/utils.h"
1838 static void TestDiskInfo()
1840 wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
1844 wxChar pathname
[128];
1845 wxPrintf(_T("\nEnter a directory name: "));
1846 if ( !wxFgets(pathname
, WXSIZEOF(pathname
), stdin
) )
1849 // kill the last '\n'
1850 pathname
[wxStrlen(pathname
) - 1] = 0;
1852 wxLongLong total
, free
;
1853 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
1855 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
1859 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
1860 (total
/ 1024).ToString().c_str(),
1861 (free
/ 1024).ToString().c_str(),
1867 static void TestOsInfo()
1869 wxPuts(_T("*** Testing OS info functions ***\n"));
1872 wxGetOsVersion(&major
, &minor
);
1873 wxPrintf(_T("Running under: %s, version %d.%d\n"),
1874 wxGetOsDescription().c_str(), major
, minor
);
1876 wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory());
1878 wxPrintf(_T("Host name is %s (%s).\n"),
1879 wxGetHostName().c_str(), wxGetFullHostName().c_str());
1884 static void TestUserInfo()
1886 wxPuts(_T("*** Testing user info functions ***\n"));
1888 wxPrintf(_T("User id is:\t%s\n"), wxGetUserId().c_str());
1889 wxPrintf(_T("User name is:\t%s\n"), wxGetUserName().c_str());
1890 wxPrintf(_T("Home dir is:\t%s\n"), wxGetHomeDir().c_str());
1891 wxPrintf(_T("Email address:\t%s\n"), wxGetEmailAddress().c_str());
1896 #endif // TEST_INFO_FUNCTIONS
1898 // ----------------------------------------------------------------------------
1900 // ----------------------------------------------------------------------------
1902 #ifdef TEST_LONGLONG
1904 #include "wx/longlong.h"
1905 #include "wx/timer.h"
1907 // make a 64 bit number from 4 16 bit ones
1908 #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3)
1910 // get a random 64 bit number
1911 #define RAND_LL() MAKE_LL(rand(), rand(), rand(), rand())
1913 static const long testLongs
[] =
1924 #if wxUSE_LONGLONG_WX
1925 inline bool operator==(const wxLongLongWx
& a
, const wxLongLongNative
& b
)
1926 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1927 inline bool operator==(const wxLongLongNative
& a
, const wxLongLongWx
& b
)
1928 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1929 #endif // wxUSE_LONGLONG_WX
1931 static void TestSpeed()
1933 static const long max
= 100000000;
1940 for ( n
= 0; n
< max
; n
++ )
1945 wxPrintf(_T("Summing longs took %ld milliseconds.\n"), sw
.Time());
1948 #if wxUSE_LONGLONG_NATIVE
1953 for ( n
= 0; n
< max
; n
++ )
1958 wxPrintf(_T("Summing wxLongLong_t took %ld milliseconds.\n"), sw
.Time());
1960 #endif // wxUSE_LONGLONG_NATIVE
1966 for ( n
= 0; n
< max
; n
++ )
1971 wxPrintf(_T("Summing wxLongLongs took %ld milliseconds.\n"), sw
.Time());
1975 static void TestLongLongConversion()
1977 wxPuts(_T("*** Testing wxLongLong conversions ***\n"));
1981 for ( size_t n
= 0; n
< 100000; n
++ )
1985 #if wxUSE_LONGLONG_NATIVE
1986 wxLongLongNative
b(a
.GetHi(), a
.GetLo());
1988 wxASSERT_MSG( a
== b
, "conversions failure" );
1990 wxPuts(_T("Can't do it without native long long type, test skipped."));
1993 #endif // wxUSE_LONGLONG_NATIVE
1995 if ( !(nTested
% 1000) )
2004 wxPuts(_T(" done!"));
2007 static void TestMultiplication()
2009 wxPuts(_T("*** Testing wxLongLong multiplication ***\n"));
2013 for ( size_t n
= 0; n
< 100000; n
++ )
2018 #if wxUSE_LONGLONG_NATIVE
2019 wxLongLongNative
aa(a
.GetHi(), a
.GetLo());
2020 wxLongLongNative
bb(b
.GetHi(), b
.GetLo());
2022 wxASSERT_MSG( a
*b
== aa
*bb
, "multiplication failure" );
2023 #else // !wxUSE_LONGLONG_NATIVE
2024 wxPuts(_T("Can't do it without native long long type, test skipped."));
2027 #endif // wxUSE_LONGLONG_NATIVE
2029 if ( !(nTested
% 1000) )
2038 wxPuts(_T(" done!"));
2041 static void TestDivision()
2043 wxPuts(_T("*** Testing wxLongLong division ***\n"));
2047 for ( size_t n
= 0; n
< 100000; n
++ )
2049 // get a random wxLongLong (shifting by 12 the MSB ensures that the
2050 // multiplication will not overflow)
2051 wxLongLong ll
= MAKE_LL((rand() >> 12), rand(), rand(), rand());
2053 // get a random (but non null) long (not wxLongLong for now) to divide
2065 #if wxUSE_LONGLONG_NATIVE
2066 wxLongLongNative
m(ll
.GetHi(), ll
.GetLo());
2068 wxLongLongNative p
= m
/ l
, s
= m
% l
;
2069 wxASSERT_MSG( q
== p
&& r
== s
, "division failure" );
2070 #else // !wxUSE_LONGLONG_NATIVE
2071 // verify the result
2072 wxASSERT_MSG( ll
== q
*l
+ r
, "division failure" );
2073 #endif // wxUSE_LONGLONG_NATIVE
2075 if ( !(nTested
% 1000) )
2084 wxPuts(_T(" done!"));
2087 static void TestAddition()
2089 wxPuts(_T("*** Testing wxLongLong addition ***\n"));
2093 for ( size_t n
= 0; n
< 100000; n
++ )
2099 #if wxUSE_LONGLONG_NATIVE
2100 wxASSERT_MSG( c
== wxLongLongNative(a
.GetHi(), a
.GetLo()) +
2101 wxLongLongNative(b
.GetHi(), b
.GetLo()),
2102 "addition failure" );
2103 #else // !wxUSE_LONGLONG_NATIVE
2104 wxASSERT_MSG( c
- b
== a
, "addition failure" );
2105 #endif // wxUSE_LONGLONG_NATIVE
2107 if ( !(nTested
% 1000) )
2116 wxPuts(_T(" done!"));
2119 static void TestBitOperations()
2121 wxPuts(_T("*** Testing wxLongLong bit operation ***\n"));
2125 for ( size_t n
= 0; n
< 100000; n
++ )
2129 #if wxUSE_LONGLONG_NATIVE
2130 for ( size_t n
= 0; n
< 33; n
++ )
2133 #else // !wxUSE_LONGLONG_NATIVE
2134 wxPuts(_T("Can't do it without native long long type, test skipped."));
2137 #endif // wxUSE_LONGLONG_NATIVE
2139 if ( !(nTested
% 1000) )
2148 wxPuts(_T(" done!"));
2151 static void TestLongLongComparison()
2153 #if wxUSE_LONGLONG_WX
2154 wxPuts(_T("*** Testing wxLongLong comparison ***\n"));
2156 static const long ls
[2] =
2162 wxLongLongWx lls
[2];
2166 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2170 for ( size_t m
= 0; m
< WXSIZEOF(lls
); m
++ )
2172 res
= lls
[m
] > testLongs
[n
];
2173 wxPrintf(_T("0x%lx > 0x%lx is %s (%s)\n"),
2174 ls
[m
], testLongs
[n
], res
? "true" : "false",
2175 res
== (ls
[m
] > testLongs
[n
]) ? "ok" : "ERROR");
2177 res
= lls
[m
] < testLongs
[n
];
2178 wxPrintf(_T("0x%lx < 0x%lx is %s (%s)\n"),
2179 ls
[m
], testLongs
[n
], res
? "true" : "false",
2180 res
== (ls
[m
] < testLongs
[n
]) ? "ok" : "ERROR");
2182 res
= lls
[m
] == testLongs
[n
];
2183 wxPrintf(_T("0x%lx == 0x%lx is %s (%s)\n"),
2184 ls
[m
], testLongs
[n
], res
? "true" : "false",
2185 res
== (ls
[m
] == testLongs
[n
]) ? "ok" : "ERROR");
2188 #endif // wxUSE_LONGLONG_WX
2191 static void TestLongLongToString()
2193 wxPuts(_T("*** Testing wxLongLong::ToString() ***\n"));
2195 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2197 wxLongLong ll
= testLongs
[n
];
2198 wxPrintf(_T("%ld == %s\n"), testLongs
[n
], ll
.ToString().c_str());
2201 wxLongLong
ll(0x12345678, 0x87654321);
2202 wxPrintf(_T("0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2205 wxPrintf(_T("-0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2208 static void TestLongLongPrintf()
2210 wxPuts(_T("*** Testing wxLongLong printing ***\n"));
2212 #ifdef wxLongLongFmtSpec
2213 wxLongLong ll
= wxLL(0x1234567890abcdef);
2214 wxString s
= wxString::Format(_T("%") wxLongLongFmtSpec
_T("x"), ll
);
2215 wxPrintf(_T("0x1234567890abcdef -> %s (%s)\n"),
2216 s
.c_str(), s
== _T("1234567890abcdef") ? _T("ok") : _T("ERROR"));
2217 #else // !wxLongLongFmtSpec
2218 #error "wxLongLongFmtSpec not defined for this compiler/platform"
2225 #endif // TEST_LONGLONG
2227 // ----------------------------------------------------------------------------
2229 // ----------------------------------------------------------------------------
2231 #ifdef TEST_PATHLIST
2234 #define CMD_IN_PATH _T("ls")
2236 #define CMD_IN_PATH _T("command.com")
2239 static void TestPathList()
2241 wxPuts(_T("*** Testing wxPathList ***\n"));
2243 wxPathList pathlist
;
2244 pathlist
.AddEnvList(_T("PATH"));
2245 wxString path
= pathlist
.FindValidPath(CMD_IN_PATH
);
2248 wxPrintf(_T("ERROR: command not found in the path.\n"));
2252 wxPrintf(_T("Command found in the path as '%s'.\n"), path
.c_str());
2256 #endif // TEST_PATHLIST
2258 // ----------------------------------------------------------------------------
2259 // regular expressions
2260 // ----------------------------------------------------------------------------
2264 #include "wx/regex.h"
2266 static void TestRegExCompile()
2268 wxPuts(_T("*** Testing RE compilation ***\n"));
2270 static struct RegExCompTestData
2272 const wxChar
*pattern
;
2274 } regExCompTestData
[] =
2276 { _T("foo"), TRUE
},
2277 { _T("foo("), FALSE
},
2278 { _T("foo(bar"), FALSE
},
2279 { _T("foo(bar)"), TRUE
},
2280 { _T("foo["), FALSE
},
2281 { _T("foo[bar"), FALSE
},
2282 { _T("foo[bar]"), TRUE
},
2283 { _T("foo{"), TRUE
},
2284 { _T("foo{1"), FALSE
},
2285 { _T("foo{bar"), TRUE
},
2286 { _T("foo{1}"), TRUE
},
2287 { _T("foo{1,2}"), TRUE
},
2288 { _T("foo{bar}"), TRUE
},
2289 { _T("foo*"), TRUE
},
2290 { _T("foo**"), FALSE
},
2291 { _T("foo+"), TRUE
},
2292 { _T("foo++"), FALSE
},
2293 { _T("foo?"), TRUE
},
2294 { _T("foo??"), FALSE
},
2295 { _T("foo?+"), FALSE
},
2299 for ( size_t n
= 0; n
< WXSIZEOF(regExCompTestData
); n
++ )
2301 const RegExCompTestData
& data
= regExCompTestData
[n
];
2302 bool ok
= re
.Compile(data
.pattern
);
2304 wxPrintf(_T("'%s' is %sa valid RE (%s)\n"),
2306 ok
? _T("") : _T("not "),
2307 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2311 static void TestRegExMatch()
2313 wxPuts(_T("*** Testing RE matching ***\n"));
2315 static struct RegExMatchTestData
2317 const wxChar
*pattern
;
2320 } regExMatchTestData
[] =
2322 { _T("foo"), _T("bar"), FALSE
},
2323 { _T("foo"), _T("foobar"), TRUE
},
2324 { _T("^foo"), _T("foobar"), TRUE
},
2325 { _T("^foo"), _T("barfoo"), FALSE
},
2326 { _T("bar$"), _T("barbar"), TRUE
},
2327 { _T("bar$"), _T("barbar "), FALSE
},
2330 for ( size_t n
= 0; n
< WXSIZEOF(regExMatchTestData
); n
++ )
2332 const RegExMatchTestData
& data
= regExMatchTestData
[n
];
2334 wxRegEx
re(data
.pattern
);
2335 bool ok
= re
.Matches(data
.text
);
2337 wxPrintf(_T("'%s' %s %s (%s)\n"),
2339 ok
? _T("matches") : _T("doesn't match"),
2341 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2345 static void TestRegExSubmatch()
2347 wxPuts(_T("*** Testing RE subexpressions ***\n"));
2349 wxRegEx
re(_T("([[:alpha:]]+) ([[:alpha:]]+) ([[:digit:]]+).*([[:digit:]]+)$"));
2350 if ( !re
.IsValid() )
2352 wxPuts(_T("ERROR: compilation failed."));
2356 wxString text
= _T("Fri Jul 13 18:37:52 CEST 2001");
2358 if ( !re
.Matches(text
) )
2360 wxPuts(_T("ERROR: match expected."));
2364 wxPrintf(_T("Entire match: %s\n"), re
.GetMatch(text
).c_str());
2366 wxPrintf(_T("Date: %s/%s/%s, wday: %s\n"),
2367 re
.GetMatch(text
, 3).c_str(),
2368 re
.GetMatch(text
, 2).c_str(),
2369 re
.GetMatch(text
, 4).c_str(),
2370 re
.GetMatch(text
, 1).c_str());
2374 static void TestRegExReplacement()
2376 wxPuts(_T("*** Testing RE replacement ***"));
2378 static struct RegExReplTestData
2382 const wxChar
*result
;
2384 } regExReplTestData
[] =
2386 { _T("foo123"), _T("bar"), _T("bar"), 1 },
2387 { _T("foo123"), _T("\\2\\1"), _T("123foo"), 1 },
2388 { _T("foo_123"), _T("\\2\\1"), _T("123foo"), 1 },
2389 { _T("123foo"), _T("bar"), _T("123foo"), 0 },
2390 { _T("123foo456foo"), _T("&&"), _T("123foo456foo456foo"), 1 },
2391 { _T("foo123foo123"), _T("bar"), _T("barbar"), 2 },
2392 { _T("foo123_foo456_foo789"), _T("bar"), _T("bar_bar_bar"), 3 },
2395 const wxChar
*pattern
= _T("([a-z]+)[^0-9]*([0-9]+)");
2396 wxRegEx
re(pattern
);
2398 wxPrintf(_T("Using pattern '%s' for replacement.\n"), pattern
);
2400 for ( size_t n
= 0; n
< WXSIZEOF(regExReplTestData
); n
++ )
2402 const RegExReplTestData
& data
= regExReplTestData
[n
];
2404 wxString text
= data
.text
;
2405 size_t nRepl
= re
.Replace(&text
, data
.repl
);
2407 wxPrintf(_T("%s =~ s/RE/%s/g: %u match%s, result = '%s' ("),
2408 data
.text
, data
.repl
,
2409 nRepl
, nRepl
== 1 ? _T("") : _T("es"),
2411 if ( text
== data
.result
&& nRepl
== data
.count
)
2417 wxPrintf(_T("ERROR: should be %u and '%s')\n"),
2418 data
.count
, data
.result
);
2423 static void TestRegExInteractive()
2425 wxPuts(_T("*** Testing RE interactively ***"));
2429 wxChar pattern
[128];
2430 wxPrintf(_T("\nEnter a pattern: "));
2431 if ( !wxFgets(pattern
, WXSIZEOF(pattern
), stdin
) )
2434 // kill the last '\n'
2435 pattern
[wxStrlen(pattern
) - 1] = 0;
2438 if ( !re
.Compile(pattern
) )
2446 wxPrintf(_T("Enter text to match: "));
2447 if ( !wxFgets(text
, WXSIZEOF(text
), stdin
) )
2450 // kill the last '\n'
2451 text
[wxStrlen(text
) - 1] = 0;
2453 if ( !re
.Matches(text
) )
2455 wxPrintf(_T("No match.\n"));
2459 wxPrintf(_T("Pattern matches at '%s'\n"), re
.GetMatch(text
).c_str());
2462 for ( size_t n
= 1; ; n
++ )
2464 if ( !re
.GetMatch(&start
, &len
, n
) )
2469 wxPrintf(_T("Subexpr %u matched '%s'\n"),
2470 n
, wxString(text
+ start
, len
).c_str());
2477 #endif // TEST_REGEX
2479 // ----------------------------------------------------------------------------
2481 // ----------------------------------------------------------------------------
2491 static void TestDbOpen()
2499 // ----------------------------------------------------------------------------
2501 // ----------------------------------------------------------------------------
2504 NB: this stuff was taken from the glibc test suite and modified to build
2505 in wxWindows: if I read the copyright below properly, this shouldn't
2511 #ifdef wxTEST_PRINTF
2512 // use our functions from wxchar.cpp
2516 // NB: do _not_ use ATTRIBUTE_PRINTF here, we have some invalid formats
2517 // in the tests below
2518 int wxPrintf( const wxChar
*format
, ... );
2519 int wxSprintf( wxChar
*str
, const wxChar
*format
, ... );
2522 #include "wx/longlong.h"
2526 static void rfg1 (void);
2527 static void rfg2 (void);
2531 fmtchk (const wxChar
*fmt
)
2533 (void) wxPrintf(_T("%s:\t`"), fmt
);
2534 (void) wxPrintf(fmt
, 0x12);
2535 (void) wxPrintf(_T("'\n"));
2539 fmtst1chk (const wxChar
*fmt
)
2541 (void) wxPrintf(_T("%s:\t`"), fmt
);
2542 (void) wxPrintf(fmt
, 4, 0x12);
2543 (void) wxPrintf(_T("'\n"));
2547 fmtst2chk (const wxChar
*fmt
)
2549 (void) wxPrintf(_T("%s:\t`"), fmt
);
2550 (void) wxPrintf(fmt
, 4, 4, 0x12);
2551 (void) wxPrintf(_T("'\n"));
2554 /* This page is covered by the following copyright: */
2556 /* (C) Copyright C E Chew
2558 * Feel free to copy, use and distribute this software provided:
2560 * 1. you do not pretend that you wrote it
2561 * 2. you leave this copyright notice intact.
2565 * Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans.
2572 /* Formatted Output Test
2574 * This exercises the output formatting code.
2582 wxChar
*prefix
= buf
;
2585 wxPuts(_T("\nFormatted output test"));
2586 wxPrintf(_T("prefix 6d 6o 6x 6X 6u\n"));
2587 wxStrcpy(prefix
, _T("%"));
2588 for (i
= 0; i
< 2; i
++) {
2589 for (j
= 0; j
< 2; j
++) {
2590 for (k
= 0; k
< 2; k
++) {
2591 for (l
= 0; l
< 2; l
++) {
2592 wxStrcpy(prefix
, _T("%"));
2593 if (i
== 0) wxStrcat(prefix
, _T("-"));
2594 if (j
== 0) wxStrcat(prefix
, _T("+"));
2595 if (k
== 0) wxStrcat(prefix
, _T("#"));
2596 if (l
== 0) wxStrcat(prefix
, _T("0"));
2597 wxPrintf(_T("%5s |"), prefix
);
2598 wxStrcpy(tp
, prefix
);
2599 wxStrcat(tp
, _T("6d |"));
2601 wxStrcpy(tp
, prefix
);
2602 wxStrcat(tp
, _T("6o |"));
2604 wxStrcpy(tp
, prefix
);
2605 wxStrcat(tp
, _T("6x |"));
2607 wxStrcpy(tp
, prefix
);
2608 wxStrcat(tp
, _T("6X |"));
2610 wxStrcpy(tp
, prefix
);
2611 wxStrcat(tp
, _T("6u |"));
2618 wxPrintf(_T("%10s\n"), (wxChar
*) NULL
);
2619 wxPrintf(_T("%-10s\n"), (wxChar
*) NULL
);
2622 static void TestPrintf()
2624 static wxChar shortstr
[] = _T("Hi, Z.");
2625 static wxChar longstr
[] = _T("Good morning, Doctor Chandra. This is Hal. \
2626 I am ready for my first lesson today.");
2631 fmtchk(_T("%4.4x"));
2632 fmtchk(_T("%04.4x"));
2633 fmtchk(_T("%4.3x"));
2634 fmtchk(_T("%04.3x"));
2636 fmtst1chk(_T("%.*x"));
2637 fmtst1chk(_T("%0*x"));
2638 fmtst2chk(_T("%*.*x"));
2639 fmtst2chk(_T("%0*.*x"));
2641 wxPrintf(_T("bad format:\t\"%b\"\n"));
2642 wxPrintf(_T("nil pointer (padded):\t\"%10p\"\n"), (void *) NULL
);
2644 wxPrintf(_T("decimal negative:\t\"%d\"\n"), -2345);
2645 wxPrintf(_T("octal negative:\t\"%o\"\n"), -2345);
2646 wxPrintf(_T("hex negative:\t\"%x\"\n"), -2345);
2647 wxPrintf(_T("long decimal number:\t\"%ld\"\n"), -123456L);
2648 wxPrintf(_T("long octal negative:\t\"%lo\"\n"), -2345L);
2649 wxPrintf(_T("long unsigned decimal number:\t\"%lu\"\n"), -123456L);
2650 wxPrintf(_T("zero-padded LDN:\t\"%010ld\"\n"), -123456L);
2651 wxPrintf(_T("left-adjusted ZLDN:\t\"%-010ld\"\n"), -123456);
2652 wxPrintf(_T("space-padded LDN:\t\"%10ld\"\n"), -123456L);
2653 wxPrintf(_T("left-adjusted SLDN:\t\"%-10ld\"\n"), -123456L);
2655 wxPrintf(_T("zero-padded string:\t\"%010s\"\n"), shortstr
);
2656 wxPrintf(_T("left-adjusted Z string:\t\"%-010s\"\n"), shortstr
);
2657 wxPrintf(_T("space-padded string:\t\"%10s\"\n"), shortstr
);
2658 wxPrintf(_T("left-adjusted S string:\t\"%-10s\"\n"), shortstr
);
2659 wxPrintf(_T("null string:\t\"%s\"\n"), (wxChar
*)NULL
);
2660 wxPrintf(_T("limited string:\t\"%.22s\"\n"), longstr
);
2662 wxPrintf(_T("e-style >= 1:\t\"%e\"\n"), 12.34);
2663 wxPrintf(_T("e-style >= .1:\t\"%e\"\n"), 0.1234);
2664 wxPrintf(_T("e-style < .1:\t\"%e\"\n"), 0.001234);
2665 wxPrintf(_T("e-style big:\t\"%.60e\"\n"), 1e20
);
2666 wxPrintf(_T("e-style == .1:\t\"%e\"\n"), 0.1);
2667 wxPrintf(_T("f-style >= 1:\t\"%f\"\n"), 12.34);
2668 wxPrintf(_T("f-style >= .1:\t\"%f\"\n"), 0.1234);
2669 wxPrintf(_T("f-style < .1:\t\"%f\"\n"), 0.001234);
2670 wxPrintf(_T("g-style >= 1:\t\"%g\"\n"), 12.34);
2671 wxPrintf(_T("g-style >= .1:\t\"%g\"\n"), 0.1234);
2672 wxPrintf(_T("g-style < .1:\t\"%g\"\n"), 0.001234);
2673 wxPrintf(_T("g-style big:\t\"%.60g\"\n"), 1e20
);
2675 wxPrintf (_T(" %6.5f\n"), .099999999860301614);
2676 wxPrintf (_T(" %6.5f\n"), .1);
2677 wxPrintf (_T("x%5.4fx\n"), .5);
2679 wxPrintf (_T("%#03x\n"), 1);
2681 //wxPrintf (_T("something really insane: %.10000f\n"), 1.0);
2687 while (niter
-- != 0)
2688 wxPrintf (_T("%.17e\n"), d
/ 2);
2692 wxPrintf (_T("%15.5e\n"), 4.9406564584124654e-324);
2694 #define FORMAT _T("|%12.4f|%12.4e|%12.4g|\n")
2695 wxPrintf (FORMAT
, 0.0, 0.0, 0.0);
2696 wxPrintf (FORMAT
, 1.0, 1.0, 1.0);
2697 wxPrintf (FORMAT
, -1.0, -1.0, -1.0);
2698 wxPrintf (FORMAT
, 100.0, 100.0, 100.0);
2699 wxPrintf (FORMAT
, 1000.0, 1000.0, 1000.0);
2700 wxPrintf (FORMAT
, 10000.0, 10000.0, 10000.0);
2701 wxPrintf (FORMAT
, 12345.0, 12345.0, 12345.0);
2702 wxPrintf (FORMAT
, 100000.0, 100000.0, 100000.0);
2703 wxPrintf (FORMAT
, 123456.0, 123456.0, 123456.0);
2708 int rc
= wxSnprintf (buf
, WXSIZEOF(buf
), _T("%30s"), _T("foo"));
2710 wxPrintf(_T("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n"),
2711 rc
, WXSIZEOF(buf
), buf
);
2714 wxPrintf ("snprintf (\"%%.999999u\", 10)\n",
2715 wxSnprintf(buf2
, WXSIZEOFbuf2
), "%.999999u", 10));
2721 wxPrintf (_T("%e should be 1.234568e+06\n"), 1234567.8);
2722 wxPrintf (_T("%f should be 1234567.800000\n"), 1234567.8);
2723 wxPrintf (_T("%g should be 1.23457e+06\n"), 1234567.8);
2724 wxPrintf (_T("%g should be 123.456\n"), 123.456);
2725 wxPrintf (_T("%g should be 1e+06\n"), 1000000.0);
2726 wxPrintf (_T("%g should be 10\n"), 10.0);
2727 wxPrintf (_T("%g should be 0.02\n"), 0.02);
2731 wxPrintf(_T("%.17f\n"),(1.0/x
/10.0+1.0)*x
-x
);
2737 wxSprintf(buf
,_T("%*s%*s%*s"),-1,_T("one"),-20,_T("two"),-30,_T("three"));
2739 result
|= wxStrcmp (buf
,
2740 _T("onetwo three "));
2742 wxPuts (result
!= 0 ? _T("Test failed!") : _T("Test ok."));
2749 wxSprintf(buf
, _T("%07") wxLongLongFmtSpec
_T("o"), wxLL(040000000000));
2750 wxPrintf (_T("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf
);
2752 if (wxStrcmp (buf
, _T("40000000000")) != 0)
2755 wxPuts (_T("\tFAILED"));
2759 #endif // wxLongLong_t
2761 wxPrintf (_T("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX
+ 2, UCHAR_MAX
+ 2);
2762 wxPrintf (_T("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX
+ 2, USHRT_MAX
+ 2);
2764 wxPuts (_T("--- Should be no further output. ---"));
2773 memset (bytes
, '\xff', sizeof bytes
);
2774 wxSprintf (buf
, _T("foo%hhn\n"), &bytes
[3]);
2775 if (bytes
[0] != '\xff' || bytes
[1] != '\xff' || bytes
[2] != '\xff'
2776 || bytes
[4] != '\xff' || bytes
[5] != '\xff' || bytes
[6] != '\xff')
2778 wxPuts (_T("%hhn overwrite more bytes"));
2783 wxPuts (_T("%hhn wrote incorrect value"));
2795 wxSprintf (buf
, _T("%5.s"), _T("xyz"));
2796 if (wxStrcmp (buf
, _T(" ")) != 0)
2797 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" "));
2798 wxSprintf (buf
, _T("%5.f"), 33.3);
2799 if (wxStrcmp (buf
, _T(" 33")) != 0)
2800 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 33"));
2801 wxSprintf (buf
, _T("%8.e"), 33.3e7
);
2802 if (wxStrcmp (buf
, _T(" 3e+08")) != 0)
2803 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3e+08"));
2804 wxSprintf (buf
, _T("%8.E"), 33.3e7
);
2805 if (wxStrcmp (buf
, _T(" 3E+08")) != 0)
2806 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3E+08"));
2807 wxSprintf (buf
, _T("%.g"), 33.3);
2808 if (wxStrcmp (buf
, _T("3e+01")) != 0)
2809 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3e+01"));
2810 wxSprintf (buf
, _T("%.G"), 33.3);
2811 if (wxStrcmp (buf
, _T("3E+01")) != 0)
2812 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3E+01"));
2822 wxSprintf (buf
, _T("%.*g"), prec
, 3.3);
2823 if (wxStrcmp (buf
, _T("3")) != 0)
2824 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2826 wxSprintf (buf
, _T("%.*G"), prec
, 3.3);
2827 if (wxStrcmp (buf
, _T("3")) != 0)
2828 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2830 wxSprintf (buf
, _T("%7.*G"), prec
, 3.33);
2831 if (wxStrcmp (buf
, _T(" 3")) != 0)
2832 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3"));
2834 wxSprintf (buf
, _T("%04.*o"), prec
, 33);
2835 if (wxStrcmp (buf
, _T(" 041")) != 0)
2836 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 041"));
2838 wxSprintf (buf
, _T("%09.*u"), prec
, 33);
2839 if (wxStrcmp (buf
, _T(" 0000033")) != 0)
2840 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 0000033"));
2842 wxSprintf (buf
, _T("%04.*x"), prec
, 33);
2843 if (wxStrcmp (buf
, _T(" 021")) != 0)
2844 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2846 wxSprintf (buf
, _T("%04.*X"), prec
, 33);
2847 if (wxStrcmp (buf
, _T(" 021")) != 0)
2848 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2851 #endif // TEST_PRINTF
2853 // ----------------------------------------------------------------------------
2854 // registry and related stuff
2855 // ----------------------------------------------------------------------------
2857 // this is for MSW only
2860 #undef TEST_REGISTRY
2865 #include "wx/confbase.h"
2866 #include "wx/msw/regconf.h"
2868 static void TestRegConfWrite()
2870 wxRegConfig
regconf(_T("console"), _T("wxwindows"));
2871 regconf
.Write(_T("Hello"), wxString(_T("world")));
2874 #endif // TEST_REGCONF
2876 #ifdef TEST_REGISTRY
2878 #include "wx/msw/registry.h"
2880 // I chose this one because I liked its name, but it probably only exists under
2882 static const wxChar
*TESTKEY
=
2883 _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
2885 static void TestRegistryRead()
2887 wxPuts(_T("*** testing registry reading ***"));
2889 wxRegKey
key(TESTKEY
);
2890 wxPrintf(_T("The test key name is '%s'.\n"), key
.GetName().c_str());
2893 wxPuts(_T("ERROR: test key can't be opened, aborting test."));
2898 size_t nSubKeys
, nValues
;
2899 if ( key
.GetKeyInfo(&nSubKeys
, NULL
, &nValues
, NULL
) )
2901 wxPrintf(_T("It has %u subkeys and %u values.\n"), nSubKeys
, nValues
);
2904 wxPrintf(_T("Enumerating values:\n"));
2908 bool cont
= key
.GetFirstValue(value
, dummy
);
2911 wxPrintf(_T("Value '%s': type "), value
.c_str());
2912 switch ( key
.GetValueType(value
) )
2914 case wxRegKey::Type_None
: wxPrintf(_T("ERROR (none)")); break;
2915 case wxRegKey::Type_String
: wxPrintf(_T("SZ")); break;
2916 case wxRegKey::Type_Expand_String
: wxPrintf(_T("EXPAND_SZ")); break;
2917 case wxRegKey::Type_Binary
: wxPrintf(_T("BINARY")); break;
2918 case wxRegKey::Type_Dword
: wxPrintf(_T("DWORD")); break;
2919 case wxRegKey::Type_Multi_String
: wxPrintf(_T("MULTI_SZ")); break;
2920 default: wxPrintf(_T("other (unknown)")); break;
2923 wxPrintf(_T(", value = "));
2924 if ( key
.IsNumericValue(value
) )
2927 key
.QueryValue(value
, &val
);
2928 wxPrintf(_T("%ld"), val
);
2933 key
.QueryValue(value
, val
);
2934 wxPrintf(_T("'%s'"), val
.c_str());
2936 key
.QueryRawValue(value
, val
);
2937 wxPrintf(_T(" (raw value '%s')"), val
.c_str());
2942 cont
= key
.GetNextValue(value
, dummy
);
2946 static void TestRegistryAssociation()
2949 The second call to deleteself genertaes an error message, with a
2950 messagebox saying .flo is crucial to system operation, while the .ddf
2951 call also fails, but with no error message
2956 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
2958 key
= "ddxf_auto_file" ;
2959 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
2961 key
= "ddxf_auto_file" ;
2962 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
2965 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
2967 key
= "program \"%1\"" ;
2969 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
2971 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
2973 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
2975 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
2979 #endif // TEST_REGISTRY
2981 // ----------------------------------------------------------------------------
2983 // ----------------------------------------------------------------------------
2987 #include "wx/socket.h"
2988 #include "wx/protocol/protocol.h"
2989 #include "wx/protocol/http.h"
2991 static void TestSocketServer()
2993 wxPuts(_T("*** Testing wxSocketServer ***\n"));
2995 static const int PORT
= 3000;
3000 wxSocketServer
*server
= new wxSocketServer(addr
);
3001 if ( !server
->Ok() )
3003 wxPuts(_T("ERROR: failed to bind"));
3010 wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT
);
3012 wxSocketBase
*socket
= server
->Accept();
3015 wxPuts(_T("ERROR: wxSocketServer::Accept() failed."));
3019 wxPuts(_T("Server: got a client."));
3021 server
->SetTimeout(60); // 1 min
3023 while ( socket
->IsConnected() )
3026 wxChar ch
= _T('\0');
3029 if ( socket
->Read(&ch
, sizeof(ch
)).Error() )
3031 // don't log error if the client just close the connection
3032 if ( socket
->IsConnected() )
3034 wxPuts(_T("ERROR: in wxSocket::Read."));
3054 wxPrintf(_T("Server: got '%s'.\n"), s
.c_str());
3055 if ( s
== _T("bye") )
3062 socket
->Write(s
.MakeUpper().c_str(), s
.length());
3063 socket
->Write("\r\n", 2);
3064 wxPrintf(_T("Server: wrote '%s'.\n"), s
.c_str());
3067 wxPuts(_T("Server: lost a client."));
3072 // same as "delete server" but is consistent with GUI programs
3076 static void TestSocketClient()
3078 wxPuts(_T("*** Testing wxSocketClient ***\n"));
3080 static const wxChar
*hostname
= _T("www.wxwindows.org");
3083 addr
.Hostname(hostname
);
3086 wxPrintf(_T("--- Attempting to connect to %s:80...\n"), hostname
);
3088 wxSocketClient client
;
3089 if ( !client
.Connect(addr
) )
3091 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3095 wxPrintf(_T("--- Connected to %s:%u...\n"),
3096 addr
.Hostname().c_str(), addr
.Service());
3100 // could use simply "GET" here I suppose
3102 wxString::Format(_T("GET http://%s/\r\n"), hostname
);
3103 client
.Write(cmdGet
, cmdGet
.length());
3104 wxPrintf(_T("--- Sent command '%s' to the server\n"),
3105 MakePrintable(cmdGet
).c_str());
3106 client
.Read(buf
, WXSIZEOF(buf
));
3107 wxPrintf(_T("--- Server replied:\n%s"), buf
);
3111 #endif // TEST_SOCKETS
3113 // ----------------------------------------------------------------------------
3115 // ----------------------------------------------------------------------------
3119 #include "wx/protocol/ftp.h"
3123 #define FTP_ANONYMOUS
3125 #ifdef FTP_ANONYMOUS
3126 static const wxChar
*directory
= _T("/pub");
3127 static const wxChar
*filename
= _T("welcome.msg");
3129 static const wxChar
*directory
= _T("/etc");
3130 static const wxChar
*filename
= _T("issue");
3133 static bool TestFtpConnect()
3135 wxPuts(_T("*** Testing FTP connect ***"));
3137 #ifdef FTP_ANONYMOUS
3138 static const wxChar
*hostname
= _T("ftp.wxwindows.org");
3140 wxPrintf(_T("--- Attempting to connect to %s:21 anonymously...\n"), hostname
);
3141 #else // !FTP_ANONYMOUS
3142 static const wxChar
*hostname
= "localhost";
3145 wxFgets(user
, WXSIZEOF(user
), stdin
);
3146 user
[wxStrlen(user
) - 1] = '\0'; // chop off '\n'
3149 wxChar password
[256];
3150 wxPrintf(_T("Password for %s: "), password
);
3151 wxFgets(password
, WXSIZEOF(password
), stdin
);
3152 password
[wxStrlen(password
) - 1] = '\0'; // chop off '\n'
3153 ftp
.SetPassword(password
);
3155 wxPrintf(_T("--- Attempting to connect to %s:21 as %s...\n"), hostname
, user
);
3156 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
3158 if ( !ftp
.Connect(hostname
) )
3160 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3166 wxPrintf(_T("--- Connected to %s, current directory is '%s'\n"),
3167 hostname
, ftp
.Pwd().c_str());
3173 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
3174 static void TestFtpWuFtpd()
3177 static const wxChar
*hostname
= _T("ftp.eudora.com");
3178 if ( !ftp
.Connect(hostname
) )
3180 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3184 static const wxChar
*filename
= _T("eudora/pubs/draft-gellens-submit-09.txt");
3185 wxInputStream
*in
= ftp
.GetInputStream(filename
);
3188 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
3192 size_t size
= in
->GetSize();
3193 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
3195 wxChar
*data
= new wxChar
[size
];
3196 if ( !in
->Read(data
, size
) )
3198 wxPuts(_T("ERROR: read error"));
3202 wxPrintf(_T("Successfully retrieved the file.\n"));
3211 static void TestFtpList()
3213 wxPuts(_T("*** Testing wxFTP file listing ***\n"));
3216 if ( !ftp
.ChDir(directory
) )
3218 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
3221 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3223 // test NLIST and LIST
3224 wxArrayString files
;
3225 if ( !ftp
.GetFilesList(files
) )
3227 wxPuts(_T("ERROR: failed to get NLIST of files"));
3231 wxPrintf(_T("Brief list of files under '%s':\n"), ftp
.Pwd().c_str());
3232 size_t count
= files
.GetCount();
3233 for ( size_t n
= 0; n
< count
; n
++ )
3235 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3237 wxPuts(_T("End of the file list"));
3240 if ( !ftp
.GetDirList(files
) )
3242 wxPuts(_T("ERROR: failed to get LIST of files"));
3246 wxPrintf(_T("Detailed list of files under '%s':\n"), ftp
.Pwd().c_str());
3247 size_t count
= files
.GetCount();
3248 for ( size_t n
= 0; n
< count
; n
++ )
3250 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3252 wxPuts(_T("End of the file list"));
3255 if ( !ftp
.ChDir(_T("..")) )
3257 wxPuts(_T("ERROR: failed to cd to .."));
3260 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3263 static void TestFtpDownload()
3265 wxPuts(_T("*** Testing wxFTP download ***\n"));
3268 wxInputStream
*in
= ftp
.GetInputStream(filename
);
3271 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
3275 size_t size
= in
->GetSize();
3276 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
3279 wxChar
*data
= new wxChar
[size
];
3280 if ( !in
->Read(data
, size
) )
3282 wxPuts(_T("ERROR: read error"));
3286 wxPrintf(_T("\nContents of %s:\n%s\n"), filename
, data
);
3294 static void TestFtpFileSize()
3296 wxPuts(_T("*** Testing FTP SIZE command ***"));
3298 if ( !ftp
.ChDir(directory
) )
3300 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
3303 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3305 if ( ftp
.FileExists(filename
) )
3307 int size
= ftp
.GetFileSize(filename
);
3309 wxPrintf(_T("ERROR: couldn't get size of '%s'\n"), filename
);
3311 wxPrintf(_T("Size of '%s' is %d bytes.\n"), filename
, size
);
3315 wxPrintf(_T("ERROR: '%s' doesn't exist\n"), filename
);
3319 static void TestFtpMisc()
3321 wxPuts(_T("*** Testing miscellaneous wxFTP functions ***"));
3323 if ( ftp
.SendCommand("STAT") != '2' )
3325 wxPuts(_T("ERROR: STAT failed"));
3329 wxPrintf(_T("STAT returned:\n\n%s\n"), ftp
.GetLastResult().c_str());
3332 if ( ftp
.SendCommand("HELP SITE") != '2' )
3334 wxPuts(_T("ERROR: HELP SITE failed"));
3338 wxPrintf(_T("The list of site-specific commands:\n\n%s\n"),
3339 ftp
.GetLastResult().c_str());
3343 static void TestFtpInteractive()
3345 wxPuts(_T("\n*** Interactive wxFTP test ***"));
3351 wxPrintf(_T("Enter FTP command: "));
3352 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
3355 // kill the last '\n'
3356 buf
[wxStrlen(buf
) - 1] = 0;
3358 // special handling of LIST and NLST as they require data connection
3359 wxString
start(buf
, 4);
3361 if ( start
== "LIST" || start
== "NLST" )
3364 if ( wxStrlen(buf
) > 4 )
3367 wxArrayString files
;
3368 if ( !ftp
.GetList(files
, wildcard
, start
== "LIST") )
3370 wxPrintf(_T("ERROR: failed to get %s of files\n"), start
.c_str());
3374 wxPrintf(_T("--- %s of '%s' under '%s':\n"),
3375 start
.c_str(), wildcard
.c_str(), ftp
.Pwd().c_str());
3376 size_t count
= files
.GetCount();
3377 for ( size_t n
= 0; n
< count
; n
++ )
3379 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3381 wxPuts(_T("--- End of the file list"));
3386 wxChar ch
= ftp
.SendCommand(buf
);
3387 wxPrintf(_T("Command %s"), ch
? _T("succeeded") : _T("failed"));
3390 wxPrintf(_T(" (return code %c)"), ch
);
3393 wxPrintf(_T(", server reply:\n%s\n\n"), ftp
.GetLastResult().c_str());
3397 wxPuts(_T("\n*** done ***"));
3400 static void TestFtpUpload()
3402 wxPuts(_T("*** Testing wxFTP uploading ***\n"));
3405 static const wxChar
*file1
= _T("test1");
3406 static const wxChar
*file2
= _T("test2");
3407 wxOutputStream
*out
= ftp
.GetOutputStream(file1
);
3410 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
3411 out
->Write("First hello", 11);
3415 // send a command to check the remote file
3416 if ( ftp
.SendCommand(wxString("STAT ") + file1
) != '2' )
3418 wxPrintf(_T("ERROR: STAT %s failed\n"), file1
);
3422 wxPrintf(_T("STAT %s returned:\n\n%s\n"),
3423 file1
, ftp
.GetLastResult().c_str());
3426 out
= ftp
.GetOutputStream(file2
);
3429 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
3430 out
->Write("Second hello", 12);
3437 // ----------------------------------------------------------------------------
3439 // ----------------------------------------------------------------------------
3443 #include "wx/wfstream.h"
3444 #include "wx/mstream.h"
3446 static void TestFileStream()
3448 wxPuts(_T("*** Testing wxFileInputStream ***"));
3450 static const wxChar
*filename
= _T("testdata.fs");
3452 wxFileOutputStream
fsOut(filename
);
3453 fsOut
.Write("foo", 3);
3456 wxFileInputStream
fsIn(filename
);
3457 wxPrintf(_T("File stream size: %u\n"), fsIn
.GetSize());
3458 while ( !fsIn
.Eof() )
3460 putchar(fsIn
.GetC());
3463 if ( !wxRemoveFile(filename
) )
3465 wxPrintf(_T("ERROR: failed to remove the file '%s'.\n"), filename
);
3468 wxPuts(_T("\n*** wxFileInputStream test done ***"));
3471 static void TestMemoryStream()
3473 wxPuts(_T("*** Testing wxMemoryOutputStream ***"));
3475 wxMemoryOutputStream memOutStream
;
3476 wxPrintf(_T("Initially out stream offset: %lu\n"),
3477 (unsigned long)memOutStream
.TellO());
3479 for ( const wxChar
*p
= _T("Hello, stream!"); *p
; p
++ )
3481 memOutStream
.PutC(*p
);
3484 wxPrintf(_T("Final out stream offset: %lu\n"),
3485 (unsigned long)memOutStream
.TellO());
3487 wxPuts(_T("*** Testing wxMemoryInputStream ***"));
3490 size_t len
= memOutStream
.CopyTo(buf
, WXSIZEOF(buf
));
3492 wxMemoryInputStream
memInpStream(buf
, len
);
3493 wxPrintf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
3494 while ( !memInpStream
.Eof() )
3496 putchar(memInpStream
.GetC());
3499 wxPuts(_T("\n*** wxMemoryInputStream test done ***"));
3502 #endif // TEST_STREAMS
3504 // ----------------------------------------------------------------------------
3506 // ----------------------------------------------------------------------------
3510 #include "wx/timer.h"
3511 #include "wx/utils.h"
3513 static void TestStopWatch()
3515 wxPuts(_T("*** Testing wxStopWatch ***\n"));
3519 wxPrintf(_T("Initially paused, after 2 seconds time is..."));
3522 wxPrintf(_T("\t%ldms\n"), sw
.Time());
3524 wxPrintf(_T("Resuming stopwatch and sleeping 3 seconds..."));
3528 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3531 wxPrintf(_T("Pausing agan and sleeping 2 more seconds..."));
3534 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3537 wxPrintf(_T("Finally resuming and sleeping 2 more seconds..."));
3540 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3543 wxPuts(_T("\nChecking for 'backwards clock' bug..."));
3544 for ( size_t n
= 0; n
< 70; n
++ )
3548 for ( size_t m
= 0; m
< 100000; m
++ )
3550 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
3552 wxPuts(_T("\ntime is negative - ERROR!"));
3560 wxPuts(_T(", ok."));
3563 #endif // TEST_TIMER
3565 // ----------------------------------------------------------------------------
3567 // ----------------------------------------------------------------------------
3571 #include "wx/vcard.h"
3573 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
3576 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
3579 wxPrintf(_T("%s%s"),
3580 wxString(_T('\t'), level
).c_str(),
3581 vcObj
->GetName().c_str());
3584 switch ( vcObj
->GetType() )
3586 case wxVCardObject::String
:
3587 case wxVCardObject::UString
:
3590 vcObj
->GetValue(&val
);
3591 value
<< _T('"') << val
<< _T('"');
3595 case wxVCardObject::Int
:
3598 vcObj
->GetValue(&i
);
3599 value
.Printf(_T("%u"), i
);
3603 case wxVCardObject::Long
:
3606 vcObj
->GetValue(&l
);
3607 value
.Printf(_T("%lu"), l
);
3611 case wxVCardObject::None
:
3614 case wxVCardObject::Object
:
3615 value
= _T("<node>");
3619 value
= _T("<unknown value type>");
3623 wxPrintf(_T(" = %s"), value
.c_str());
3626 DumpVObject(level
+ 1, *vcObj
);
3629 vcObj
= vcard
.GetNextProp(&cookie
);
3633 static void DumpVCardAddresses(const wxVCard
& vcard
)
3635 wxPuts(_T("\nShowing all addresses from vCard:\n"));
3639 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3643 int flags
= addr
->GetFlags();
3644 if ( flags
& wxVCardAddress::Domestic
)
3646 flagsStr
<< _T("domestic ");
3648 if ( flags
& wxVCardAddress::Intl
)
3650 flagsStr
<< _T("international ");
3652 if ( flags
& wxVCardAddress::Postal
)
3654 flagsStr
<< _T("postal ");
3656 if ( flags
& wxVCardAddress::Parcel
)
3658 flagsStr
<< _T("parcel ");
3660 if ( flags
& wxVCardAddress::Home
)
3662 flagsStr
<< _T("home ");
3664 if ( flags
& wxVCardAddress::Work
)
3666 flagsStr
<< _T("work ");
3669 wxPrintf(_T("Address %u:\n")
3671 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3674 addr
->GetPostOffice().c_str(),
3675 addr
->GetExtAddress().c_str(),
3676 addr
->GetStreet().c_str(),
3677 addr
->GetLocality().c_str(),
3678 addr
->GetRegion().c_str(),
3679 addr
->GetPostalCode().c_str(),
3680 addr
->GetCountry().c_str()
3684 addr
= vcard
.GetNextAddress(&cookie
);
3688 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
3690 wxPuts(_T("\nShowing all phone numbers from vCard:\n"));
3694 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
3698 int flags
= phone
->GetFlags();
3699 if ( flags
& wxVCardPhoneNumber::Voice
)
3701 flagsStr
<< _T("voice ");
3703 if ( flags
& wxVCardPhoneNumber::Fax
)
3705 flagsStr
<< _T("fax ");
3707 if ( flags
& wxVCardPhoneNumber::Cellular
)
3709 flagsStr
<< _T("cellular ");
3711 if ( flags
& wxVCardPhoneNumber::Modem
)
3713 flagsStr
<< _T("modem ");
3715 if ( flags
& wxVCardPhoneNumber::Home
)
3717 flagsStr
<< _T("home ");
3719 if ( flags
& wxVCardPhoneNumber::Work
)
3721 flagsStr
<< _T("work ");
3724 wxPrintf(_T("Phone number %u:\n")
3729 phone
->GetNumber().c_str()
3733 phone
= vcard
.GetNextPhoneNumber(&cookie
);
3737 static void TestVCardRead()
3739 wxPuts(_T("*** Testing wxVCard reading ***\n"));
3741 wxVCard
vcard(_T("vcard.vcf"));
3742 if ( !vcard
.IsOk() )
3744 wxPuts(_T("ERROR: couldn't load vCard."));
3748 // read individual vCard properties
3749 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
3753 vcObj
->GetValue(&value
);
3758 value
= _T("<none>");
3761 wxPrintf(_T("Full name retrieved directly: %s\n"), value
.c_str());
3764 if ( !vcard
.GetFullName(&value
) )
3766 value
= _T("<none>");
3769 wxPrintf(_T("Full name from wxVCard API: %s\n"), value
.c_str());
3771 // now show how to deal with multiply occuring properties
3772 DumpVCardAddresses(vcard
);
3773 DumpVCardPhoneNumbers(vcard
);
3775 // and finally show all
3776 wxPuts(_T("\nNow dumping the entire vCard:\n")
3777 "-----------------------------\n");
3779 DumpVObject(0, vcard
);
3783 static void TestVCardWrite()
3785 wxPuts(_T("*** Testing wxVCard writing ***\n"));
3788 if ( !vcard
.IsOk() )
3790 wxPuts(_T("ERROR: couldn't create vCard."));
3795 vcard
.SetName("Zeitlin", "Vadim");
3796 vcard
.SetFullName("Vadim Zeitlin");
3797 vcard
.SetOrganization("wxWindows", "R&D");
3799 // just dump the vCard back
3800 wxPuts(_T("Entire vCard follows:\n"));
3801 wxPuts(vcard
.Write());
3805 #endif // TEST_VCARD
3807 // ----------------------------------------------------------------------------
3809 // ----------------------------------------------------------------------------
3811 #if !defined(__WIN32__) || !wxUSE_FSVOLUME
3817 #include "wx/volume.h"
3819 static const wxChar
*volumeKinds
[] =
3825 _T("network volume"),
3829 static void TestFSVolume()
3831 wxPuts(_T("*** Testing wxFSVolume class ***"));
3833 wxArrayString volumes
= wxFSVolume::GetVolumes();
3834 size_t count
= volumes
.GetCount();
3838 wxPuts(_T("ERROR: no mounted volumes?"));
3842 wxPrintf(_T("%u mounted volumes found:\n"), count
);
3844 for ( size_t n
= 0; n
< count
; n
++ )
3846 wxFSVolume
vol(volumes
[n
]);
3849 wxPuts(_T("ERROR: couldn't create volume"));
3853 wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
3855 vol
.GetDisplayName().c_str(),
3856 vol
.GetName().c_str(),
3857 volumeKinds
[vol
.GetKind()],
3858 vol
.IsWritable() ? _T("rw") : _T("ro"),
3859 vol
.GetFlags() & wxFS_VOL_REMOVABLE
? _T("removable")
3864 #endif // TEST_VOLUME
3866 // ----------------------------------------------------------------------------
3867 // wide char and Unicode support
3868 // ----------------------------------------------------------------------------
3872 static void TestUnicodeToFromAscii()
3874 wxPuts(_T("Testing wxString::To/FromAscii()\n"));
3876 static const char *msg
= "Hello, world!";
3877 wxString s
= wxString::FromAscii(msg
);
3879 wxPrintf(_T("Message in Unicode: %s\n"), s
.c_str());
3880 printf("Message in ASCII: %s\n", (const char *)s
.ToAscii());
3882 wxPutchar(_T('\n'));
3885 #endif // TEST_UNICODE
3889 #include "wx/strconv.h"
3890 #include "wx/fontenc.h"
3891 #include "wx/encconv.h"
3892 #include "wx/buffer.h"
3894 static const unsigned char utf8koi8r
[] =
3896 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
3897 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
3898 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
3899 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
3900 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
3901 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
3902 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
3905 static const unsigned char utf8iso8859_1
[] =
3907 0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e,
3908 0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65,
3909 0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65,
3910 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65,
3911 0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0
3914 static const unsigned char utf8Invalid
[] =
3916 0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30,
3917 0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6,
3918 0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88,
3919 0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70,
3923 static const struct Utf8Data
3925 const unsigned char *text
;
3927 const wxChar
*charset
;
3928 wxFontEncoding encoding
;
3931 { utf8Invalid
, WXSIZEOF(utf8Invalid
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3932 { utf8koi8r
, WXSIZEOF(utf8koi8r
), _T("koi8-r"), wxFONTENCODING_KOI8
},
3933 { utf8iso8859_1
, WXSIZEOF(utf8iso8859_1
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3936 static void TestUtf8()
3938 wxPuts(_T("*** Testing UTF8 support ***\n"));
3943 for ( size_t n
= 0; n
< WXSIZEOF(utf8data
); n
++ )
3945 const Utf8Data
& u8d
= utf8data
[n
];
3946 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)u8d
.text
,
3947 WXSIZEOF(wbuf
)) == (size_t)-1 )
3949 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3953 wxCSConv
conv(u8d
.charset
);
3954 if ( conv
.WC2MB(buf
, wbuf
, WXSIZEOF(buf
)) == (size_t)-1 )
3956 wxPrintf(_T("ERROR: conversion to %s failed.\n"), u8d
.charset
);
3960 wxPrintf(_T("String in %s: %s\n"), u8d
.charset
, buf
);
3964 wxString
s(wxConvUTF8
.cMB2WC((const char *)u8d
.text
), *wxConvCurrent
);
3966 s
= _T("<< conversion failed >>");
3967 wxPrintf(_T("String in current cset: %s\n"), s
.c_str());
3974 static void TestEncodingConverter()
3976 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
3978 // using wxEncodingConverter should give the same result as above
3981 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)utf8koi8r
,
3982 WXSIZEOF(utf8koi8r
)) == (size_t)-1 )
3984 wxPuts(_T("ERROR: UTF-8 decoding failed."));
3988 wxEncodingConverter ec
;
3989 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
3990 ec
.Convert(wbuf
, buf
);
3991 wxPrintf(_T("The same KOI8-R string using wxEC: %s\n"), buf
);
3997 #endif // TEST_WCHAR
3999 // ----------------------------------------------------------------------------
4001 // ----------------------------------------------------------------------------
4005 #include "wx/filesys.h"
4006 #include "wx/fs_zip.h"
4007 #include "wx/zipstrm.h"
4009 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
4011 static void TestZipStreamRead()
4013 wxPuts(_T("*** Testing ZIP reading ***\n"));
4015 static const wxChar
*filename
= _T("foo");
4016 wxZipInputStream
istr(TESTFILE_ZIP
, filename
);
4017 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
4019 wxPrintf(_T("Dumping the file '%s':\n"), filename
);
4020 while ( !istr
.Eof() )
4022 putchar(istr
.GetC());
4026 wxPuts(_T("\n----- done ------"));
4029 static void DumpZipDirectory(wxFileSystem
& fs
,
4030 const wxString
& dir
,
4031 const wxString
& indent
)
4033 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
4034 TESTFILE_ZIP
, dir
.c_str());
4035 wxString wildcard
= prefix
+ _T("/*");
4037 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
4038 while ( !dirname
.empty() )
4040 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
4042 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
4047 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
4049 DumpZipDirectory(fs
, dirname
,
4050 indent
+ wxString(_T(' '), 4));
4052 dirname
= fs
.FindNext();
4055 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
4056 while ( !filename
.empty() )
4058 if ( !filename
.StartsWith(prefix
, &filename
) )
4060 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
4065 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
4067 filename
= fs
.FindNext();
4071 static void TestZipFileSystem()
4073 wxPuts(_T("*** Testing ZIP file system ***\n"));
4075 wxFileSystem::AddHandler(new wxZipFSHandler
);
4077 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
4079 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
4084 // ----------------------------------------------------------------------------
4086 // ----------------------------------------------------------------------------
4090 #include "wx/zstream.h"
4091 #include "wx/wfstream.h"
4093 static const wxChar
*FILENAME_GZ
= _T("test.gz");
4094 static const wxChar
*TEST_DATA
= _T("hello and hello and hello and hello and hello");
4096 static void TestZlibStreamWrite()
4098 wxPuts(_T("*** Testing Zlib stream reading ***\n"));
4100 wxFileOutputStream
fileOutStream(FILENAME_GZ
);
4101 wxZlibOutputStream
ostr(fileOutStream
);
4102 wxPrintf(_T("Compressing the test string... "));
4103 ostr
.Write(TEST_DATA
, wxStrlen(TEST_DATA
) + 1);
4106 wxPuts(_T("(ERROR: failed)"));
4113 wxPuts(_T("\n----- done ------"));
4116 static void TestZlibStreamRead()
4118 wxPuts(_T("*** Testing Zlib stream reading ***\n"));
4120 wxFileInputStream
fileInStream(FILENAME_GZ
);
4121 wxZlibInputStream
istr(fileInStream
);
4122 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
4124 wxPuts(_T("Dumping the file:"));
4125 while ( !istr
.Eof() )
4127 putchar(istr
.GetC());
4131 wxPuts(_T("\n----- done ------"));
4136 // ----------------------------------------------------------------------------
4138 // ----------------------------------------------------------------------------
4140 #ifdef TEST_DATETIME
4144 #include "wx/date.h"
4145 #include "wx/datetime.h"
4150 wxDateTime::wxDateTime_t day
;
4151 wxDateTime::Month month
;
4153 wxDateTime::wxDateTime_t hour
, min
, sec
;
4155 wxDateTime::WeekDay wday
;
4156 time_t gmticks
, ticks
;
4158 void Init(const wxDateTime::Tm
& tm
)
4167 gmticks
= ticks
= -1;
4170 wxDateTime
DT() const
4171 { return wxDateTime(day
, month
, year
, hour
, min
, sec
); }
4173 bool SameDay(const wxDateTime::Tm
& tm
) const
4175 return day
== tm
.mday
&& month
== tm
.mon
&& year
== tm
.year
;
4178 wxString
Format() const
4181 s
.Printf(_T("%02d:%02d:%02d %10s %02d, %4d%s"),
4183 wxDateTime::GetMonthName(month
).c_str(),
4185 abs(wxDateTime::ConvertYearToBC(year
)),
4186 year
> 0 ? _T("AD") : _T("BC"));
4190 wxString
FormatDate() const
4193 s
.Printf(_T("%02d-%s-%4d%s"),
4195 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
4196 abs(wxDateTime::ConvertYearToBC(year
)),
4197 year
> 0 ? _T("AD") : _T("BC"));
4202 static const Date testDates
[] =
4204 { 1, wxDateTime::Jan
, 1970, 00, 00, 00, 2440587.5, wxDateTime::Thu
, 0, -3600 },
4205 { 7, wxDateTime::Feb
, 2036, 00, 00, 00, 2464730.5, wxDateTime::Thu
, -1, -1 },
4206 { 8, wxDateTime::Feb
, 2036, 00, 00, 00, 2464731.5, wxDateTime::Fri
, -1, -1 },
4207 { 1, wxDateTime::Jan
, 2037, 00, 00, 00, 2465059.5, wxDateTime::Thu
, -1, -1 },
4208 { 1, wxDateTime::Jan
, 2038, 00, 00, 00, 2465424.5, wxDateTime::Fri
, -1, -1 },
4209 { 21, wxDateTime::Jan
, 2222, 00, 00, 00, 2532648.5, wxDateTime::Mon
, -1, -1 },
4210 { 29, wxDateTime::May
, 1976, 12, 00, 00, 2442928.0, wxDateTime::Sat
, 202219200, 202212000 },
4211 { 29, wxDateTime::Feb
, 1976, 00, 00, 00, 2442837.5, wxDateTime::Sun
, 194400000, 194396400 },
4212 { 1, wxDateTime::Jan
, 1900, 12, 00, 00, 2415021.0, wxDateTime::Mon
, -1, -1 },
4213 { 1, wxDateTime::Jan
, 1900, 00, 00, 00, 2415020.5, wxDateTime::Mon
, -1, -1 },
4214 { 15, wxDateTime::Oct
, 1582, 00, 00, 00, 2299160.5, wxDateTime::Fri
, -1, -1 },
4215 { 4, wxDateTime::Oct
, 1582, 00, 00, 00, 2299149.5, wxDateTime::Mon
, -1, -1 },
4216 { 1, wxDateTime::Mar
, 1, 00, 00, 00, 1721484.5, wxDateTime::Thu
, -1, -1 },
4217 { 1, wxDateTime::Jan
, 1, 00, 00, 00, 1721425.5, wxDateTime::Mon
, -1, -1 },
4218 { 31, wxDateTime::Dec
, 0, 00, 00, 00, 1721424.5, wxDateTime::Sun
, -1, -1 },
4219 { 1, wxDateTime::Jan
, 0, 00, 00, 00, 1721059.5, wxDateTime::Sat
, -1, -1 },
4220 { 12, wxDateTime::Aug
, -1234, 00, 00, 00, 1270573.5, wxDateTime::Fri
, -1, -1 },
4221 { 12, wxDateTime::Aug
, -4000, 00, 00, 00, 260313.5, wxDateTime::Sat
, -1, -1 },
4222 { 24, wxDateTime::Nov
, -4713, 00, 00, 00, -0.5, wxDateTime::Mon
, -1, -1 },
4225 // this test miscellaneous static wxDateTime functions
4226 static void TestTimeStatic()
4228 wxPuts(_T("\n*** wxDateTime static methods test ***"));
4230 // some info about the current date
4231 int year
= wxDateTime::GetCurrentYear();
4232 wxPrintf(_T("Current year %d is %sa leap one and has %d days.\n"),
4234 wxDateTime::IsLeapYear(year
) ? "" : "not ",
4235 wxDateTime::GetNumberOfDays(year
));
4237 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
4238 wxPrintf(_T("Current month is '%s' ('%s') and it has %d days\n"),
4239 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
4240 wxDateTime::GetMonthName(month
).c_str(),
4241 wxDateTime::GetNumberOfDays(month
));
4244 static const size_t nYears
= 5;
4245 static const size_t years
[2][nYears
] =
4247 // first line: the years to test
4248 { 1990, 1976, 2000, 2030, 1984, },
4250 // second line: TRUE if leap, FALSE otherwise
4251 { FALSE
, TRUE
, TRUE
, FALSE
, TRUE
}
4254 for ( size_t n
= 0; n
< nYears
; n
++ )
4256 int year
= years
[0][n
];
4257 bool should
= years
[1][n
] != 0,
4258 is
= wxDateTime::IsLeapYear(year
);
4260 wxPrintf(_T("Year %d is %sa leap year (%s)\n"),
4263 should
== is
? "ok" : "ERROR");
4265 wxASSERT( should
== wxDateTime::IsLeapYear(year
) );
4269 // test constructing wxDateTime objects
4270 static void TestTimeSet()
4272 wxPuts(_T("\n*** wxDateTime construction test ***"));
4274 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4276 const Date
& d1
= testDates
[n
];
4277 wxDateTime dt
= d1
.DT();
4280 d2
.Init(dt
.GetTm());
4282 wxString s1
= d1
.Format(),
4285 wxPrintf(_T("Date: %s == %s (%s)\n"),
4286 s1
.c_str(), s2
.c_str(),
4287 s1
== s2
? _T("ok") : _T("ERROR"));
4291 // test time zones stuff
4292 static void TestTimeZones()
4294 wxPuts(_T("\n*** wxDateTime timezone test ***"));
4296 wxDateTime now
= wxDateTime::Now();
4298 wxPrintf(_T("Current GMT time:\t%s\n"), now
.Format(_T("%c"), wxDateTime::GMT0
).c_str());
4299 wxPrintf(_T("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::GMT0
).c_str());
4300 wxPrintf(_T("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::EST
).c_str());
4301 wxPrintf(_T("Current time in Paris:\t%s\n"), now
.Format(_T("%c"), wxDateTime::CET
).c_str());
4302 wxPrintf(_T(" Moscow:\t%s\n"), now
.Format(_T("%c"), wxDateTime::MSK
).c_str());
4303 wxPrintf(_T(" New York:\t%s\n"), now
.Format(_T("%c"), wxDateTime::EST
).c_str());
4305 wxDateTime::Tm tm
= now
.GetTm();
4306 if ( wxDateTime(tm
) != now
)
4308 wxPrintf(_T("ERROR: got %s instead of %s\n"),
4309 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
4313 // test some minimal support for the dates outside the standard range
4314 static void TestTimeRange()
4316 wxPuts(_T("\n*** wxDateTime out-of-standard-range dates test ***"));
4318 static const wxChar
*fmt
= _T("%d-%b-%Y %H:%M:%S");
4320 wxPrintf(_T("Unix epoch:\t%s\n"),
4321 wxDateTime(2440587.5).Format(fmt
).c_str());
4322 wxPrintf(_T("Feb 29, 0: \t%s\n"),
4323 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
4324 wxPrintf(_T("JDN 0: \t%s\n"),
4325 wxDateTime(0.0).Format(fmt
).c_str());
4326 wxPrintf(_T("Jan 1, 1AD:\t%s\n"),
4327 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
4328 wxPrintf(_T("May 29, 2099:\t%s\n"),
4329 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
4332 static void TestTimeTicks()
4334 wxPuts(_T("\n*** wxDateTime ticks test ***"));
4336 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4338 const Date
& d
= testDates
[n
];
4339 if ( d
.ticks
== -1 )
4342 wxDateTime dt
= d
.DT();
4343 long ticks
= (dt
.GetValue() / 1000).ToLong();
4344 wxPrintf(_T("Ticks of %s:\t% 10ld"), d
.Format().c_str(), ticks
);
4345 if ( ticks
== d
.ticks
)
4347 wxPuts(_T(" (ok)"));
4351 wxPrintf(_T(" (ERROR: should be %ld, delta = %ld)\n"),
4352 (long)d
.ticks
, (long)(ticks
- d
.ticks
));
4355 dt
= d
.DT().ToTimezone(wxDateTime::GMT0
);
4356 ticks
= (dt
.GetValue() / 1000).ToLong();
4357 wxPrintf(_T("GMtks of %s:\t% 10ld"), d
.Format().c_str(), ticks
);
4358 if ( ticks
== d
.gmticks
)
4360 wxPuts(_T(" (ok)"));
4364 wxPrintf(_T(" (ERROR: should be %ld, delta = %ld)\n"),
4365 (long)d
.gmticks
, (long)(ticks
- d
.gmticks
));
4372 // test conversions to JDN &c
4373 static void TestTimeJDN()
4375 wxPuts(_T("\n*** wxDateTime to JDN test ***"));
4377 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4379 const Date
& d
= testDates
[n
];
4380 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
4381 double jdn
= dt
.GetJulianDayNumber();
4383 wxPrintf(_T("JDN of %s is:\t% 15.6f"), d
.Format().c_str(), jdn
);
4386 wxPuts(_T(" (ok)"));
4390 wxPrintf(_T(" (ERROR: should be %f, delta = %f)\n"),
4391 d
.jdn
, jdn
- d
.jdn
);
4396 // test week days computation
4397 static void TestTimeWDays()
4399 wxPuts(_T("\n*** wxDateTime weekday test ***"));
4401 // test GetWeekDay()
4403 for ( n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4405 const Date
& d
= testDates
[n
];
4406 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
4408 wxDateTime::WeekDay wday
= dt
.GetWeekDay();
4409 wxPrintf(_T("%s is: %s"),
4411 wxDateTime::GetWeekDayName(wday
).c_str());
4412 if ( wday
== d
.wday
)
4414 wxPuts(_T(" (ok)"));
4418 wxPrintf(_T(" (ERROR: should be %s)\n"),
4419 wxDateTime::GetWeekDayName(d
.wday
).c_str());
4425 // test SetToWeekDay()
4426 struct WeekDateTestData
4428 Date date
; // the real date (precomputed)
4429 int nWeek
; // its week index in the month
4430 wxDateTime::WeekDay wday
; // the weekday
4431 wxDateTime::Month month
; // the month
4432 int year
; // and the year
4434 wxString
Format() const
4437 switch ( nWeek
< -1 ? -nWeek
: nWeek
)
4439 case 1: which
= _T("first"); break;
4440 case 2: which
= _T("second"); break;
4441 case 3: which
= _T("third"); break;
4442 case 4: which
= _T("fourth"); break;
4443 case 5: which
= _T("fifth"); break;
4445 case -1: which
= _T("last"); break;
4450 which
+= _T(" from end");
4453 s
.Printf(_T("The %s %s of %s in %d"),
4455 wxDateTime::GetWeekDayName(wday
).c_str(),
4456 wxDateTime::GetMonthName(month
).c_str(),
4463 // the array data was generated by the following python program
4465 from DateTime import *
4466 from whrandom import *
4467 from string import *
4469 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4470 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4472 week = DateTimeDelta(7)
4475 year = randint(1900, 2100)
4476 month = randint(1, 12)
4477 day = randint(1, 28)
4478 dt = DateTime(year, month, day)
4479 wday = dt.day_of_week
4481 countFromEnd = choice([-1, 1])
4484 while dt.month is month:
4485 dt = dt - countFromEnd * week
4486 weekNum = weekNum + countFromEnd
4488 data = { 'day': rjust(`day`, 2), 'month': monthNames[month - 1], 'year': year, 'weekNum': rjust(`weekNum`, 2), 'wday': wdayNames[wday] }
4490 print "{ { %(day)s, wxDateTime::%(month)s, %(year)d }, %(weekNum)d, "\
4491 "wxDateTime::%(wday)s, wxDateTime::%(month)s, %(year)d }," % data
4494 static const WeekDateTestData weekDatesTestData
[] =
4496 { { 20, wxDateTime::Mar
, 2045 }, 3, wxDateTime::Mon
, wxDateTime::Mar
, 2045 },
4497 { { 5, wxDateTime::Jun
, 1985 }, -4, wxDateTime::Wed
, wxDateTime::Jun
, 1985 },
4498 { { 12, wxDateTime::Nov
, 1961 }, -3, wxDateTime::Sun
, wxDateTime::Nov
, 1961 },
4499 { { 27, wxDateTime::Feb
, 2093 }, -1, wxDateTime::Fri
, wxDateTime::Feb
, 2093 },
4500 { { 4, wxDateTime::Jul
, 2070 }, -4, wxDateTime::Fri
, wxDateTime::Jul
, 2070 },
4501 { { 2, wxDateTime::Apr
, 1906 }, -5, wxDateTime::Mon
, wxDateTime::Apr
, 1906 },
4502 { { 19, wxDateTime::Jul
, 2023 }, -2, wxDateTime::Wed
, wxDateTime::Jul
, 2023 },
4503 { { 5, wxDateTime::May
, 1958 }, -4, wxDateTime::Mon
, wxDateTime::May
, 1958 },
4504 { { 11, wxDateTime::Aug
, 1900 }, 2, wxDateTime::Sat
, wxDateTime::Aug
, 1900 },
4505 { { 14, wxDateTime::Feb
, 1945 }, 2, wxDateTime::Wed
, wxDateTime::Feb
, 1945 },
4506 { { 25, wxDateTime::Jul
, 1967 }, -1, wxDateTime::Tue
, wxDateTime::Jul
, 1967 },
4507 { { 9, wxDateTime::May
, 1916 }, -4, wxDateTime::Tue
, wxDateTime::May
, 1916 },
4508 { { 20, wxDateTime::Jun
, 1927 }, 3, wxDateTime::Mon
, wxDateTime::Jun
, 1927 },
4509 { { 2, wxDateTime::Aug
, 2000 }, 1, wxDateTime::Wed
, wxDateTime::Aug
, 2000 },
4510 { { 20, wxDateTime::Apr
, 2044 }, 3, wxDateTime::Wed
, wxDateTime::Apr
, 2044 },
4511 { { 20, wxDateTime::Feb
, 1932 }, -2, wxDateTime::Sat
, wxDateTime::Feb
, 1932 },
4512 { { 25, wxDateTime::Jul
, 2069 }, 4, wxDateTime::Thu
, wxDateTime::Jul
, 2069 },
4513 { { 3, wxDateTime::Apr
, 1925 }, 1, wxDateTime::Fri
, wxDateTime::Apr
, 1925 },
4514 { { 21, wxDateTime::Mar
, 2093 }, 3, wxDateTime::Sat
, wxDateTime::Mar
, 2093 },
4515 { { 3, wxDateTime::Dec
, 2074 }, -5, wxDateTime::Mon
, wxDateTime::Dec
, 2074 },
4518 static const wxChar
*fmt
= _T("%d-%b-%Y");
4521 for ( n
= 0; n
< WXSIZEOF(weekDatesTestData
); n
++ )
4523 const WeekDateTestData
& wd
= weekDatesTestData
[n
];
4525 dt
.SetToWeekDay(wd
.wday
, wd
.nWeek
, wd
.month
, wd
.year
);
4527 wxPrintf(_T("%s is %s"), wd
.Format().c_str(), dt
.Format(fmt
).c_str());
4529 const Date
& d
= wd
.date
;
4530 if ( d
.SameDay(dt
.GetTm()) )
4532 wxPuts(_T(" (ok)"));
4536 dt
.Set(d
.day
, d
.month
, d
.year
);
4538 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.Format(fmt
).c_str());
4543 // test the computation of (ISO) week numbers
4544 static void TestTimeWNumber()
4546 wxPuts(_T("\n*** wxDateTime week number test ***"));
4548 struct WeekNumberTestData
4550 Date date
; // the date
4551 wxDateTime::wxDateTime_t week
; // the week number in the year
4552 wxDateTime::wxDateTime_t wmon
; // the week number in the month
4553 wxDateTime::wxDateTime_t wmon2
; // same but week starts with Sun
4554 wxDateTime::wxDateTime_t dnum
; // day number in the year
4557 // data generated with the following python script:
4559 from DateTime import *
4560 from whrandom import *
4561 from string import *
4563 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4564 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4566 def GetMonthWeek(dt):
4567 weekNumMonth = dt.iso_week[1] - DateTime(dt.year, dt.month, 1).iso_week[1] + 1
4568 if weekNumMonth < 0:
4569 weekNumMonth = weekNumMonth + 53
4572 def GetLastSundayBefore(dt):
4573 if dt.iso_week[2] == 7:
4576 return dt - DateTimeDelta(dt.iso_week[2])
4579 year = randint(1900, 2100)
4580 month = randint(1, 12)
4581 day = randint(1, 28)
4582 dt = DateTime(year, month, day)
4583 dayNum = dt.day_of_year
4584 weekNum = dt.iso_week[1]
4585 weekNumMonth = GetMonthWeek(dt)
4588 dtSunday = GetLastSundayBefore(dt)
4590 while dtSunday >= GetLastSundayBefore(DateTime(dt.year, dt.month, 1)):
4591 weekNumMonth2 = weekNumMonth2 + 1
4592 dtSunday = dtSunday - DateTimeDelta(7)
4594 data = { 'day': rjust(`day`, 2), \
4595 'month': monthNames[month - 1], \
4597 'weekNum': rjust(`weekNum`, 2), \
4598 'weekNumMonth': weekNumMonth, \
4599 'weekNumMonth2': weekNumMonth2, \
4600 'dayNum': rjust(`dayNum`, 3) }
4602 print " { { %(day)s, "\
4603 "wxDateTime::%(month)s, "\
4606 "%(weekNumMonth)s, "\
4607 "%(weekNumMonth2)s, "\
4608 "%(dayNum)s }," % data
4611 static const WeekNumberTestData weekNumberTestDates
[] =
4613 { { 27, wxDateTime::Dec
, 1966 }, 52, 5, 5, 361 },
4614 { { 22, wxDateTime::Jul
, 1926 }, 29, 4, 4, 203 },
4615 { { 22, wxDateTime::Oct
, 2076 }, 43, 4, 4, 296 },
4616 { { 1, wxDateTime::Jul
, 1967 }, 26, 1, 1, 182 },
4617 { { 8, wxDateTime::Nov
, 2004 }, 46, 2, 2, 313 },
4618 { { 21, wxDateTime::Mar
, 1920 }, 12, 3, 4, 81 },
4619 { { 7, wxDateTime::Jan
, 1965 }, 1, 2, 2, 7 },
4620 { { 19, wxDateTime::Oct
, 1999 }, 42, 4, 4, 292 },
4621 { { 13, wxDateTime::Aug
, 1955 }, 32, 2, 2, 225 },
4622 { { 18, wxDateTime::Jul
, 2087 }, 29, 3, 3, 199 },
4623 { { 2, wxDateTime::Sep
, 2028 }, 35, 1, 1, 246 },
4624 { { 28, wxDateTime::Jul
, 1945 }, 30, 5, 4, 209 },
4625 { { 15, wxDateTime::Jun
, 1901 }, 24, 3, 3, 166 },
4626 { { 10, wxDateTime::Oct
, 1939 }, 41, 3, 2, 283 },
4627 { { 3, wxDateTime::Dec
, 1965 }, 48, 1, 1, 337 },
4628 { { 23, wxDateTime::Feb
, 1940 }, 8, 4, 4, 54 },
4629 { { 2, wxDateTime::Jan
, 1987 }, 1, 1, 1, 2 },
4630 { { 11, wxDateTime::Aug
, 2079 }, 32, 2, 2, 223 },
4631 { { 2, wxDateTime::Feb
, 2063 }, 5, 1, 1, 33 },
4632 { { 16, wxDateTime::Oct
, 1942 }, 42, 3, 3, 289 },
4635 for ( size_t n
= 0; n
< WXSIZEOF(weekNumberTestDates
); n
++ )
4637 const WeekNumberTestData
& wn
= weekNumberTestDates
[n
];
4638 const Date
& d
= wn
.date
;
4640 wxDateTime dt
= d
.DT();
4642 wxDateTime::wxDateTime_t
4643 week
= dt
.GetWeekOfYear(wxDateTime::Monday_First
),
4644 wmon
= dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4645 wmon2
= dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4646 dnum
= dt
.GetDayOfYear();
4648 wxPrintf(_T("%s: the day number is %d"), d
.FormatDate().c_str(), dnum
);
4649 if ( dnum
== wn
.dnum
)
4651 wxPrintf(_T(" (ok)"));
4655 wxPrintf(_T(" (ERROR: should be %d)"), wn
.dnum
);
4658 wxPrintf(_T(", week in month = %d"), wmon
);
4659 if ( wmon
!= wn
.wmon
)
4661 wxPrintf(_T(" (ERROR: should be %d)"), wn
.wmon
);
4664 wxPrintf(_T(" or %d"), wmon2
);
4665 if ( wmon2
== wn
.wmon2
)
4667 wxPrintf(_T(" (ok)"));
4671 wxPrintf(_T(" (ERROR: should be %d)"), wn
.wmon2
);
4674 wxPrintf(_T(", week in year = %d"), week
);
4675 if ( week
!= wn
.week
)
4677 wxPrintf(_T(" (ERROR: should be %d)"), wn
.week
);
4680 wxPutchar(_T('\n'));
4682 wxDateTime
dt2(1, wxDateTime::Jan
, d
.year
);
4683 dt2
.SetToTheWeek(wn
.week
, dt
.GetWeekDay());
4687 d2
.Init(dt2
.GetTm());
4688 wxPrintf(_T("ERROR: SetToTheWeek() returned %s\n"),
4689 d2
.FormatDate().c_str());
4694 // test DST calculations
4695 static void TestTimeDST()
4697 wxPuts(_T("\n*** wxDateTime DST test ***"));
4699 wxPrintf(_T("DST is%s in effect now.\n\n"),
4700 wxDateTime::Now().IsDST() ? _T("") : _T(" not"));
4702 // taken from http://www.energy.ca.gov/daylightsaving.html
4703 static const Date datesDST
[2][2004 - 1900 + 1] =
4706 { 1, wxDateTime::Apr
, 1990 },
4707 { 7, wxDateTime::Apr
, 1991 },
4708 { 5, wxDateTime::Apr
, 1992 },
4709 { 4, wxDateTime::Apr
, 1993 },
4710 { 3, wxDateTime::Apr
, 1994 },
4711 { 2, wxDateTime::Apr
, 1995 },
4712 { 7, wxDateTime::Apr
, 1996 },
4713 { 6, wxDateTime::Apr
, 1997 },
4714 { 5, wxDateTime::Apr
, 1998 },
4715 { 4, wxDateTime::Apr
, 1999 },
4716 { 2, wxDateTime::Apr
, 2000 },
4717 { 1, wxDateTime::Apr
, 2001 },
4718 { 7, wxDateTime::Apr
, 2002 },
4719 { 6, wxDateTime::Apr
, 2003 },
4720 { 4, wxDateTime::Apr
, 2004 },
4723 { 28, wxDateTime::Oct
, 1990 },
4724 { 27, wxDateTime::Oct
, 1991 },
4725 { 25, wxDateTime::Oct
, 1992 },
4726 { 31, wxDateTime::Oct
, 1993 },
4727 { 30, wxDateTime::Oct
, 1994 },
4728 { 29, wxDateTime::Oct
, 1995 },
4729 { 27, wxDateTime::Oct
, 1996 },
4730 { 26, wxDateTime::Oct
, 1997 },
4731 { 25, wxDateTime::Oct
, 1998 },
4732 { 31, wxDateTime::Oct
, 1999 },
4733 { 29, wxDateTime::Oct
, 2000 },
4734 { 28, wxDateTime::Oct
, 2001 },
4735 { 27, wxDateTime::Oct
, 2002 },
4736 { 26, wxDateTime::Oct
, 2003 },
4737 { 31, wxDateTime::Oct
, 2004 },
4742 for ( year
= 1990; year
< 2005; year
++ )
4744 wxDateTime dtBegin
= wxDateTime::GetBeginDST(year
, wxDateTime::USA
),
4745 dtEnd
= wxDateTime::GetEndDST(year
, wxDateTime::USA
);
4747 wxPrintf(_T("DST period in the US for year %d: from %s to %s"),
4748 year
, dtBegin
.Format().c_str(), dtEnd
.Format().c_str());
4750 size_t n
= year
- 1990;
4751 const Date
& dBegin
= datesDST
[0][n
];
4752 const Date
& dEnd
= datesDST
[1][n
];
4754 if ( dBegin
.SameDay(dtBegin
.GetTm()) && dEnd
.SameDay(dtEnd
.GetTm()) )
4756 wxPuts(_T(" (ok)"));
4760 wxPrintf(_T(" (ERROR: should be %s %d to %s %d)\n"),
4761 wxDateTime::GetMonthName(dBegin
.month
).c_str(), dBegin
.day
,
4762 wxDateTime::GetMonthName(dEnd
.month
).c_str(), dEnd
.day
);
4768 for ( year
= 1990; year
< 2005; year
++ )
4770 wxPrintf(_T("DST period in Europe for year %d: from %s to %s\n"),
4772 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
4773 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
4777 // test wxDateTime -> text conversion
4778 static void TestTimeFormat()
4780 wxPuts(_T("\n*** wxDateTime formatting test ***"));
4782 // some information may be lost during conversion, so store what kind
4783 // of info should we recover after a round trip
4786 CompareNone
, // don't try comparing
4787 CompareBoth
, // dates and times should be identical
4788 CompareDate
, // dates only
4789 CompareTime
// time only
4794 CompareKind compareKind
;
4795 const wxChar
*format
;
4796 } formatTestFormats
[] =
4798 { CompareBoth
, _T("---> %c") },
4799 { CompareDate
, _T("Date is %A, %d of %B, in year %Y") },
4800 { CompareBoth
, _T("Date is %x, time is %X") },
4801 { CompareTime
, _T("Time is %H:%M:%S or %I:%M:%S %p") },
4802 { CompareNone
, _T("The day of year: %j, the week of year: %W") },
4803 { CompareDate
, _T("ISO date without separators: %Y%m%d") },
4806 static const Date formatTestDates
[] =
4808 { 29, wxDateTime::May
, 1976, 18, 30, 00 },
4809 { 31, wxDateTime::Dec
, 1999, 23, 30, 00 },
4811 // this test can't work for other centuries because it uses two digit
4812 // years in formats, so don't even try it
4813 { 29, wxDateTime::May
, 2076, 18, 30, 00 },
4814 { 29, wxDateTime::Feb
, 2400, 02, 15, 25 },
4815 { 01, wxDateTime::Jan
, -52, 03, 16, 47 },
4819 // an extra test (as it doesn't depend on date, don't do it in the loop)
4820 wxPrintf(_T("%s\n"), wxDateTime::Now().Format(_T("Our timezone is %Z")).c_str());
4822 for ( size_t d
= 0; d
< WXSIZEOF(formatTestDates
) + 1; d
++ )
4826 wxDateTime dt
= d
== 0 ? wxDateTime::Now() : formatTestDates
[d
- 1].DT();
4827 for ( size_t n
= 0; n
< WXSIZEOF(formatTestFormats
); n
++ )
4829 wxString s
= dt
.Format(formatTestFormats
[n
].format
);
4830 wxPrintf(_T("%s"), s
.c_str());
4832 // what can we recover?
4833 int kind
= formatTestFormats
[n
].compareKind
;
4837 const wxChar
*result
= dt2
.ParseFormat(s
, formatTestFormats
[n
].format
);
4840 // converion failed - should it have?
4841 if ( kind
== CompareNone
)
4842 wxPuts(_T(" (ok)"));
4844 wxPuts(_T(" (ERROR: conversion back failed)"));
4848 // should have parsed the entire string
4849 wxPuts(_T(" (ERROR: conversion back stopped too soon)"));
4853 bool equal
= FALSE
; // suppress compilaer warning
4861 equal
= dt
.IsSameDate(dt2
);
4865 equal
= dt
.IsSameTime(dt2
);
4871 wxPrintf(_T(" (ERROR: got back '%s' instead of '%s')\n"),
4872 dt2
.Format().c_str(), dt
.Format().c_str());
4876 wxPuts(_T(" (ok)"));
4883 // test text -> wxDateTime conversion
4884 static void TestTimeParse()
4886 wxPuts(_T("\n*** wxDateTime parse test ***"));
4888 struct ParseTestData
4890 const wxChar
*format
;
4895 static const ParseTestData parseTestDates
[] =
4897 { _T("Sat, 18 Dec 1999 00:46:40 +0100"), { 18, wxDateTime::Dec
, 1999, 00, 46, 40 }, TRUE
},
4898 { _T("Wed, 1 Dec 1999 05:17:20 +0300"), { 1, wxDateTime::Dec
, 1999, 03, 17, 20 }, TRUE
},
4901 for ( size_t n
= 0; n
< WXSIZEOF(parseTestDates
); n
++ )
4903 const wxChar
*format
= parseTestDates
[n
].format
;
4905 wxPrintf(_T("%s => "), format
);
4908 if ( dt
.ParseRfc822Date(format
) )
4910 wxPrintf(_T("%s "), dt
.Format().c_str());
4912 if ( parseTestDates
[n
].good
)
4914 wxDateTime dtReal
= parseTestDates
[n
].date
.DT();
4921 wxPrintf(_T("(ERROR: should be %s)\n"), dtReal
.Format().c_str());
4926 wxPuts(_T("(ERROR: bad format)"));
4931 wxPrintf(_T("bad format (%s)\n"),
4932 parseTestDates
[n
].good
? "ERROR" : "ok");
4937 static void TestDateTimeInteractive()
4939 wxPuts(_T("\n*** interactive wxDateTime tests ***"));
4945 wxPrintf(_T("Enter a date: "));
4946 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
4949 // kill the last '\n'
4950 buf
[wxStrlen(buf
) - 1] = 0;
4953 const wxChar
*p
= dt
.ParseDate(buf
);
4956 wxPrintf(_T("ERROR: failed to parse the date '%s'.\n"), buf
);
4962 wxPrintf(_T("WARNING: parsed only first %u characters.\n"), p
- buf
);
4965 wxPrintf(_T("%s: day %u, week of month %u/%u, week of year %u\n"),
4966 dt
.Format(_T("%b %d, %Y")).c_str(),
4968 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4969 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4970 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
4973 wxPuts(_T("\n*** done ***"));
4976 static void TestTimeMS()
4978 wxPuts(_T("*** testing millisecond-resolution support in wxDateTime ***"));
4980 wxDateTime dt1
= wxDateTime::Now(),
4981 dt2
= wxDateTime::UNow();
4983 wxPrintf(_T("Now = %s\n"), dt1
.Format(_T("%H:%M:%S:%l")).c_str());
4984 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
4985 wxPrintf(_T("Dummy loop: "));
4986 for ( int i
= 0; i
< 6000; i
++ )
4988 //for ( int j = 0; j < 10; j++ )
4991 s
.Printf(_T("%g"), sqrt(i
));
4997 wxPuts(_T(", done"));
5000 dt2
= wxDateTime::UNow();
5001 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
5003 wxPrintf(_T("Loop executed in %s ms\n"), (dt2
- dt1
).Format(_T("%l")).c_str());
5005 wxPuts(_T("\n*** done ***"));
5008 static void TestTimeArithmetics()
5010 wxPuts(_T("\n*** testing arithmetic operations on wxDateTime ***"));
5012 static const struct ArithmData
5014 ArithmData(const wxDateSpan
& sp
, const wxChar
*nam
)
5015 : span(sp
), name(nam
) { }
5019 } testArithmData
[] =
5021 ArithmData(wxDateSpan::Day(), _T("day")),
5022 ArithmData(wxDateSpan::Week(), _T("week")),
5023 ArithmData(wxDateSpan::Month(), _T("month")),
5024 ArithmData(wxDateSpan::Year(), _T("year")),
5025 ArithmData(wxDateSpan(1, 2, 3, 4), _T("year, 2 months, 3 weeks, 4 days")),
5028 wxDateTime
dt(29, wxDateTime::Dec
, 1999), dt1
, dt2
;
5030 for ( size_t n
= 0; n
< WXSIZEOF(testArithmData
); n
++ )
5032 wxDateSpan span
= testArithmData
[n
].span
;
5036 const wxChar
*name
= testArithmData
[n
].name
;
5037 wxPrintf(_T("%s + %s = %s, %s - %s = %s\n"),
5038 dt
.FormatISODate().c_str(), name
, dt1
.FormatISODate().c_str(),
5039 dt
.FormatISODate().c_str(), name
, dt2
.FormatISODate().c_str());
5041 wxPrintf(_T("Going back: %s"), (dt1
- span
).FormatISODate().c_str());
5042 if ( dt1
- span
== dt
)
5044 wxPuts(_T(" (ok)"));
5048 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.FormatISODate().c_str());
5051 wxPrintf(_T("Going forward: %s"), (dt2
+ span
).FormatISODate().c_str());
5052 if ( dt2
+ span
== dt
)
5054 wxPuts(_T(" (ok)"));
5058 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.FormatISODate().c_str());
5061 wxPrintf(_T("Double increment: %s"), (dt2
+ 2*span
).FormatISODate().c_str());
5062 if ( dt2
+ 2*span
== dt1
)
5064 wxPuts(_T(" (ok)"));
5068 wxPrintf(_T(" (ERROR: should be %s)\n"), dt2
.FormatISODate().c_str());
5075 static void TestTimeHolidays()
5077 wxPuts(_T("\n*** testing wxDateTimeHolidayAuthority ***\n"));
5079 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
5080 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
5081 dtEnd
= dtStart
.GetLastMonthDay();
5083 wxDateTimeArray hol
;
5084 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
5086 const wxChar
*format
= _T("%d-%b-%Y (%a)");
5088 wxPrintf(_T("All holidays between %s and %s:\n"),
5089 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
5091 size_t count
= hol
.GetCount();
5092 for ( size_t n
= 0; n
< count
; n
++ )
5094 wxPrintf(_T("\t%s\n"), hol
[n
].Format(format
).c_str());
5100 static void TestTimeZoneBug()
5102 wxPuts(_T("\n*** testing for DST/timezone bug ***\n"));
5104 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
5105 for ( int i
= 0; i
< 31; i
++ )
5107 wxPrintf(_T("Date %s: week day %s.\n"),
5108 date
.Format(_T("%d-%m-%Y")).c_str(),
5109 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
5111 date
+= wxDateSpan::Day();
5117 static void TestTimeSpanFormat()
5119 wxPuts(_T("\n*** wxTimeSpan tests ***"));
5121 static const wxChar
*formats
[] =
5123 _T("(default) %H:%M:%S"),
5124 _T("%E weeks and %D days"),
5125 _T("%l milliseconds"),
5126 _T("(with ms) %H:%M:%S:%l"),
5127 _T("100%% of minutes is %M"), // test "%%"
5128 _T("%D days and %H hours"),
5129 _T("or also %S seconds"),
5132 wxTimeSpan
ts1(1, 2, 3, 4),
5134 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
5136 wxPrintf(_T("ts1 = %s\tts2 = %s\n"),
5137 ts1
.Format(formats
[n
]).c_str(),
5138 ts2
.Format(formats
[n
]).c_str());
5146 // test compatibility with the old wxDate/wxTime classes
5147 static void TestTimeCompatibility()
5149 wxPuts(_T("\n*** wxDateTime compatibility test ***"));
5151 wxPrintf(_T("wxDate for JDN 0: %s\n"), wxDate(0l).FormatDate().c_str());
5152 wxPrintf(_T("wxDate for MJD 0: %s\n"), wxDate(2400000).FormatDate().c_str());
5154 double jdnNow
= wxDateTime::Now().GetJDN();
5155 long jdnMidnight
= (long)(jdnNow
- 0.5);
5156 wxPrintf(_T("wxDate for today: %s\n"), wxDate(jdnMidnight
).FormatDate().c_str());
5158 jdnMidnight
= wxDate().Set().GetJulianDate();
5159 wxPrintf(_T("wxDateTime for today: %s\n"),
5160 wxDateTime((double)(jdnMidnight
+ 0.5)).Format("%c", wxDateTime::GMT0
).c_str());
5162 int flags
= wxEUROPEAN
;//wxFULL;
5165 wxPrintf(_T("Today is %s\n"), date
.FormatDate(flags
).c_str());
5166 for ( int n
= 0; n
< 7; n
++ )
5168 wxPrintf(_T("Previous %s is %s\n"),
5169 wxDateTime::GetWeekDayName((wxDateTime::WeekDay
)n
),
5170 date
.Previous(n
+ 1).FormatDate(flags
).c_str());
5176 #endif // TEST_DATETIME
5178 // ----------------------------------------------------------------------------
5179 // wxTextInput/OutputStream
5180 // ----------------------------------------------------------------------------
5182 #ifdef TEST_TEXTSTREAM
5184 #include "wx/txtstrm.h"
5185 #include "wx/wfstream.h"
5187 static void TestTextInputStream()
5189 wxPuts(_T("\n*** wxTextInputStream test ***"));
5191 wxFileInputStream
fsIn(_T("testdata.fc"));
5194 wxPuts(_T("ERROR: couldn't open file."));
5198 wxTextInputStream
tis(fsIn
);
5203 const wxString s
= tis
.ReadLine();
5205 // line could be non empty if the last line of the file isn't
5206 // terminated with EOL
5207 if ( fsIn
.Eof() && s
.empty() )
5210 wxPrintf(_T("Line %d: %s\n"), line
++, s
.c_str());
5215 #endif // TEST_TEXTSTREAM
5217 // ----------------------------------------------------------------------------
5219 // ----------------------------------------------------------------------------
5223 #include "wx/thread.h"
5225 static size_t gs_counter
= (size_t)-1;
5226 static wxCriticalSection gs_critsect
;
5227 static wxSemaphore gs_cond
;
5229 class MyJoinableThread
: public wxThread
5232 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
5233 { m_n
= n
; Create(); }
5235 // thread execution starts here
5236 virtual ExitCode
Entry();
5242 wxThread::ExitCode
MyJoinableThread::Entry()
5244 unsigned long res
= 1;
5245 for ( size_t n
= 1; n
< m_n
; n
++ )
5249 // it's a loooong calculation :-)
5253 return (ExitCode
)res
;
5256 class MyDetachedThread
: public wxThread
5259 MyDetachedThread(size_t n
, wxChar ch
)
5263 m_cancelled
= FALSE
;
5268 // thread execution starts here
5269 virtual ExitCode
Entry();
5272 virtual void OnExit();
5275 size_t m_n
; // number of characters to write
5276 wxChar m_ch
; // character to write
5278 bool m_cancelled
; // FALSE if we exit normally
5281 wxThread::ExitCode
MyDetachedThread::Entry()
5284 wxCriticalSectionLocker
lock(gs_critsect
);
5285 if ( gs_counter
== (size_t)-1 )
5291 for ( size_t n
= 0; n
< m_n
; n
++ )
5293 if ( TestDestroy() )
5303 wxThread::Sleep(100);
5309 void MyDetachedThread::OnExit()
5311 wxLogTrace(_T("thread"), _T("Thread %ld is in OnExit"), GetId());
5313 wxCriticalSectionLocker
lock(gs_critsect
);
5314 if ( !--gs_counter
&& !m_cancelled
)
5318 static void TestDetachedThreads()
5320 wxPuts(_T("\n*** Testing detached threads ***"));
5322 static const size_t nThreads
= 3;
5323 MyDetachedThread
*threads
[nThreads
];
5325 for ( n
= 0; n
< nThreads
; n
++ )
5327 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
5330 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
5331 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
5333 for ( n
= 0; n
< nThreads
; n
++ )
5338 // wait until all threads terminate
5344 static void TestJoinableThreads()
5346 wxPuts(_T("\n*** Testing a joinable thread (a loooong calculation...) ***"));
5348 // calc 10! in the background
5349 MyJoinableThread
thread(10);
5352 wxPrintf(_T("\nThread terminated with exit code %lu.\n"),
5353 (unsigned long)thread
.Wait());
5356 static void TestThreadSuspend()
5358 wxPuts(_T("\n*** Testing thread suspend/resume functions ***"));
5360 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
5364 // this is for this demo only, in a real life program we'd use another
5365 // condition variable which would be signaled from wxThread::Entry() to
5366 // tell us that the thread really started running - but here just wait a
5367 // bit and hope that it will be enough (the problem is, of course, that
5368 // the thread might still not run when we call Pause() which will result
5370 wxThread::Sleep(300);
5372 for ( size_t n
= 0; n
< 3; n
++ )
5376 wxPuts(_T("\nThread suspended"));
5379 // don't sleep but resume immediately the first time
5380 wxThread::Sleep(300);
5382 wxPuts(_T("Going to resume the thread"));
5387 wxPuts(_T("Waiting until it terminates now"));
5389 // wait until the thread terminates
5395 static void TestThreadDelete()
5397 // As above, using Sleep() is only for testing here - we must use some
5398 // synchronisation object instead to ensure that the thread is still
5399 // running when we delete it - deleting a detached thread which already
5400 // terminated will lead to a crash!
5402 wxPuts(_T("\n*** Testing thread delete function ***"));
5404 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
5408 wxPuts(_T("\nDeleted a thread which didn't start to run yet."));
5410 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
5414 wxThread::Sleep(300);
5418 wxPuts(_T("\nDeleted a running thread."));
5420 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
5424 wxThread::Sleep(300);
5430 wxPuts(_T("\nDeleted a sleeping thread."));
5432 MyJoinableThread
thread3(20);
5437 wxPuts(_T("\nDeleted a joinable thread."));
5439 MyJoinableThread
thread4(2);
5442 wxThread::Sleep(300);
5446 wxPuts(_T("\nDeleted a joinable thread which already terminated."));
5451 class MyWaitingThread
: public wxThread
5454 MyWaitingThread( wxMutex
*mutex
, wxCondition
*condition
)
5457 m_condition
= condition
;
5462 virtual ExitCode
Entry()
5464 wxPrintf(_T("Thread %lu has started running.\n"), GetId());
5469 wxPrintf(_T("Thread %lu starts to wait...\n"), GetId());
5473 m_condition
->Wait();
5476 wxPrintf(_T("Thread %lu finished to wait, exiting.\n"), GetId());
5484 wxCondition
*m_condition
;
5487 static void TestThreadConditions()
5490 wxCondition
condition(mutex
);
5492 // otherwise its difficult to understand which log messages pertain to
5494 //wxLogTrace(_T("thread"), _T("Local condition var is %08x, gs_cond = %08x"),
5495 // condition.GetId(), gs_cond.GetId());
5497 // create and launch threads
5498 MyWaitingThread
*threads
[10];
5501 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5503 threads
[n
] = new MyWaitingThread( &mutex
, &condition
);
5506 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5511 // wait until all threads run
5512 wxPuts(_T("Main thread is waiting for the other threads to start"));
5515 size_t nRunning
= 0;
5516 while ( nRunning
< WXSIZEOF(threads
) )
5522 wxPrintf(_T("Main thread: %u already running\n"), nRunning
);
5526 wxPuts(_T("Main thread: all threads started up."));
5529 wxThread::Sleep(500);
5532 // now wake one of them up
5533 wxPrintf(_T("Main thread: about to signal the condition.\n"));
5538 wxThread::Sleep(200);
5540 // wake all the (remaining) threads up, so that they can exit
5541 wxPrintf(_T("Main thread: about to broadcast the condition.\n"));
5543 condition
.Broadcast();
5545 // give them time to terminate (dirty!)
5546 wxThread::Sleep(500);
5549 #include "wx/utils.h"
5551 class MyExecThread
: public wxThread
5554 MyExecThread(const wxString
& command
) : wxThread(wxTHREAD_JOINABLE
),
5560 virtual ExitCode
Entry()
5562 return (ExitCode
)wxExecute(m_command
, wxEXEC_SYNC
);
5569 static void TestThreadExec()
5571 wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
5573 MyExecThread
thread(_T("true"));
5576 wxPrintf(_T("Main program exit code: %ld.\n"),
5577 wxExecute(_T("false"), wxEXEC_SYNC
));
5579 wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread
.Wait());
5583 #include "wx/datetime.h"
5585 class MySemaphoreThread
: public wxThread
5588 MySemaphoreThread(int i
, wxSemaphore
*sem
)
5589 : wxThread(wxTHREAD_JOINABLE
),
5596 virtual ExitCode
Entry()
5598 wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
5599 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5603 wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
5604 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5608 wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
5609 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5621 WX_DEFINE_ARRAY(wxThread
*, ArrayThreads
);
5623 static void TestSemaphore()
5625 wxPuts(_T("*** Testing wxSemaphore class. ***"));
5627 static const int SEM_LIMIT
= 3;
5629 wxSemaphore
sem(SEM_LIMIT
, SEM_LIMIT
);
5630 ArrayThreads threads
;
5632 for ( int i
= 0; i
< 3*SEM_LIMIT
; i
++ )
5634 threads
.Add(new MySemaphoreThread(i
, &sem
));
5635 threads
.Last()->Run();
5638 for ( size_t n
= 0; n
< threads
.GetCount(); n
++ )
5645 #endif // TEST_THREADS
5647 // ----------------------------------------------------------------------------
5649 // ----------------------------------------------------------------------------
5653 #include "wx/dynarray.h"
5655 typedef unsigned short ushort
;
5657 #define DefineCompare(name, T) \
5659 int wxCMPFUNC_CONV name ## CompareValues(T first, T second) \
5661 return first - second; \
5664 int wxCMPFUNC_CONV name ## Compare(T* first, T* second) \
5666 return *first - *second; \
5669 int wxCMPFUNC_CONV name ## RevCompare(T* first, T* second) \
5671 return *second - *first; \
5674 DefineCompare(UShort, ushort);
5675 DefineCompare(Int
, int);
5677 // test compilation of all macros
5678 WX_DEFINE_ARRAY_SHORT(ushort
, wxArrayUShort
);
5679 WX_DEFINE_SORTED_ARRAY_SHORT(ushort
, wxSortedArrayUShortNoCmp
);
5680 WX_DEFINE_SORTED_ARRAY_CMP_SHORT(ushort
, UShortCompareValues
, wxSortedArrayUShort
);
5681 WX_DEFINE_SORTED_ARRAY_CMP_INT(int, IntCompareValues
, wxSortedArrayInt
);
5683 WX_DECLARE_OBJARRAY(Bar
, ArrayBars
);
5684 #include "wx/arrimpl.cpp"
5685 WX_DEFINE_OBJARRAY(ArrayBars
);
5687 static void PrintArray(const wxChar
* name
, const wxArrayString
& array
)
5689 wxPrintf(_T("Dump of the array '%s'\n"), name
);
5691 size_t nCount
= array
.GetCount();
5692 for ( size_t n
= 0; n
< nCount
; n
++ )
5694 wxPrintf(_T("\t%s[%u] = '%s'\n"), name
, n
, array
[n
].c_str());
5698 int wxCMPFUNC_CONV
StringLenCompare(const wxString
& first
,
5699 const wxString
& second
)
5701 return first
.length() - second
.length();
5704 #define TestArrayOf(name) \
5706 static void PrintArray(const wxChar* name, const wxSortedArray##name & array) \
5708 wxPrintf(_T("Dump of the array '%s'\n"), name); \
5710 size_t nCount = array.GetCount(); \
5711 for ( size_t n = 0; n < nCount; n++ ) \
5713 wxPrintf(_T("\t%s[%u] = %d\n"), name, n, array[n]); \
5717 static void PrintArray(const wxChar* name, const wxArray##name & array) \
5719 wxPrintf(_T("Dump of the array '%s'\n"), name); \
5721 size_t nCount = array.GetCount(); \
5722 for ( size_t n = 0; n < nCount; n++ ) \
5724 wxPrintf(_T("\t%s[%u] = %d\n"), name, n, array[n]); \
5728 static void TestArrayOf ## name ## s() \
5730 wxPrintf(_T("*** Testing wxArray%s ***\n"), #name); \
5738 wxPuts(_T("Initially:")); \
5739 PrintArray(_T("a"), a); \
5741 wxPuts(_T("After sort:")); \
5742 a.Sort(name ## Compare); \
5743 PrintArray(_T("a"), a); \
5745 wxPuts(_T("After reverse sort:")); \
5746 a.Sort(name ## RevCompare); \
5747 PrintArray(_T("a"), a); \
5749 wxSortedArray##name b; \
5755 wxPuts(_T("Sorted array initially:")); \
5756 PrintArray(_T("b"), b); \
5759 TestArrayOf(UShort
);
5762 static void TestArrayOfObjects()
5764 wxPuts(_T("*** Testing wxObjArray ***\n"));
5768 Bar
bar("second bar (two copies!)");
5770 wxPrintf(_T("Initially: %u objects in the array, %u objects total.\n"),
5771 bars
.GetCount(), Bar::GetNumber());
5773 bars
.Add(new Bar("first bar"));
5776 wxPrintf(_T("Now: %u objects in the array, %u objects total.\n"),
5777 bars
.GetCount(), Bar::GetNumber());
5779 bars
.RemoveAt(1, bars
.GetCount() - 1);
5781 wxPrintf(_T("After removing all but first element: %u objects in the ")
5782 _T("array, %u objects total.\n"),
5783 bars
.GetCount(), Bar::GetNumber());
5787 wxPrintf(_T("After Empty(): %u objects in the array, %u objects total.\n"),
5788 bars
.GetCount(), Bar::GetNumber());
5791 wxPrintf(_T("Finally: no more objects in the array, %u objects total.\n"),
5795 #endif // TEST_ARRAYS
5797 // ----------------------------------------------------------------------------
5799 // ----------------------------------------------------------------------------
5803 #include "wx/timer.h"
5804 #include "wx/tokenzr.h"
5806 static void TestStringConstruction()
5808 wxPuts(_T("*** Testing wxString constructores ***"));
5810 #define TEST_CTOR(args, res) \
5813 wxPrintf(_T("wxString%s = %s "), #args, s.c_str()); \
5816 wxPuts(_T("(ok)")); \
5820 wxPrintf(_T("(ERROR: should be %s)\n"), res); \
5824 TEST_CTOR((_T('Z'), 4), _T("ZZZZ"));
5825 TEST_CTOR((_T("Hello"), 4), _T("Hell"));
5826 TEST_CTOR((_T("Hello"), 5), _T("Hello"));
5827 // TEST_CTOR((_T("Hello"), 6), _T("Hello")); -- should give assert failure
5829 static const wxChar
*s
= _T("?really!");
5830 const wxChar
*start
= wxStrchr(s
, _T('r'));
5831 const wxChar
*end
= wxStrchr(s
, _T('!'));
5832 TEST_CTOR((start
, end
), _T("really"));
5837 static void TestString()
5847 for (int i
= 0; i
< 1000000; ++i
)
5851 c
= "! How'ya doin'?";
5854 c
= "Hello world! What's up?";
5859 wxPrintf(_T("TestString elapsed time: %ld\n"), sw
.Time());
5862 static void TestPChar()
5870 for (int i
= 0; i
< 1000000; ++i
)
5872 wxStrcpy (a
, _T("Hello"));
5873 wxStrcpy (b
, _T(" world"));
5874 wxStrcpy (c
, _T("! How'ya doin'?"));
5877 wxStrcpy (c
, _T("Hello world! What's up?"));
5878 if (wxStrcmp (c
, a
) == 0)
5879 wxStrcpy (c
, _T("Doh!"));
5882 wxPrintf(_T("TestPChar elapsed time: %ld\n"), sw
.Time());
5885 static void TestStringSub()
5887 wxString
s("Hello, world!");
5889 wxPuts(_T("*** Testing wxString substring extraction ***"));
5891 wxPrintf(_T("String = '%s'\n"), s
.c_str());
5892 wxPrintf(_T("Left(5) = '%s'\n"), s
.Left(5).c_str());
5893 wxPrintf(_T("Right(6) = '%s'\n"), s
.Right(6).c_str());
5894 wxPrintf(_T("Mid(3, 5) = '%s'\n"), s(3, 5).c_str());
5895 wxPrintf(_T("Mid(3) = '%s'\n"), s
.Mid(3).c_str());
5896 wxPrintf(_T("substr(3, 5) = '%s'\n"), s
.substr(3, 5).c_str());
5897 wxPrintf(_T("substr(3) = '%s'\n"), s
.substr(3).c_str());
5899 static const wxChar
*prefixes
[] =
5903 _T("Hello, world!"),
5904 _T("Hello, world!!!"),
5910 for ( size_t n
= 0; n
< WXSIZEOF(prefixes
); n
++ )
5912 wxString prefix
= prefixes
[n
], rest
;
5913 bool rc
= s
.StartsWith(prefix
, &rest
);
5914 wxPrintf(_T("StartsWith('%s') = %s"), prefix
.c_str(), rc
? _T("TRUE") : _T("FALSE"));
5917 wxPrintf(_T(" (the rest is '%s')\n"), rest
.c_str());
5928 static void TestStringFormat()
5930 wxPuts(_T("*** Testing wxString formatting ***"));
5933 s
.Printf(_T("%03d"), 18);
5935 wxPrintf(_T("Number 18: %s\n"), wxString::Format(_T("%03d"), 18).c_str());
5936 wxPrintf(_T("Number 18: %s\n"), s
.c_str());
5941 // returns "not found" for npos, value for all others
5942 static wxString
PosToString(size_t res
)
5944 wxString s
= res
== wxString::npos
? wxString(_T("not found"))
5945 : wxString::Format(_T("%u"), res
);
5949 static void TestStringFind()
5951 wxPuts(_T("*** Testing wxString find() functions ***"));
5953 static const wxChar
*strToFind
= _T("ell");
5954 static const struct StringFindTest
5958 result
; // of searching "ell" in str
5961 { _T("Well, hello world"), 0, 1 },
5962 { _T("Well, hello world"), 6, 7 },
5963 { _T("Well, hello world"), 9, wxString::npos
},
5966 for ( size_t n
= 0; n
< WXSIZEOF(findTestData
); n
++ )
5968 const StringFindTest
& ft
= findTestData
[n
];
5969 size_t res
= wxString(ft
.str
).find(strToFind
, ft
.start
);
5971 wxPrintf(_T("Index of '%s' in '%s' starting from %u is %s "),
5972 strToFind
, ft
.str
, ft
.start
, PosToString(res
).c_str());
5974 size_t resTrue
= ft
.result
;
5975 if ( res
== resTrue
)
5981 wxPrintf(_T("(ERROR: should be %s)\n"),
5982 PosToString(resTrue
).c_str());
5989 static void TestStringTokenizer()
5991 wxPuts(_T("*** Testing wxStringTokenizer ***"));
5993 static const wxChar
*modeNames
[] =
5997 _T("return all empty"),
6002 static const struct StringTokenizerTest
6004 const wxChar
*str
; // string to tokenize
6005 const wxChar
*delims
; // delimiters to use
6006 size_t count
; // count of token
6007 wxStringTokenizerMode mode
; // how should we tokenize it
6008 } tokenizerTestData
[] =
6010 { _T(""), _T(" "), 0 },
6011 { _T("Hello, world"), _T(" "), 2 },
6012 { _T("Hello, world "), _T(" "), 2 },
6013 { _T("Hello, world"), _T(","), 2 },
6014 { _T("Hello, world!"), _T(",!"), 2 },
6015 { _T("Hello,, world!"), _T(",!"), 3 },
6016 { _T("Hello, world!"), _T(",!"), 3, wxTOKEN_RET_EMPTY_ALL
},
6017 { _T("username:password:uid:gid:gecos:home:shell"), _T(":"), 7 },
6018 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 4 },
6019 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 6, wxTOKEN_RET_EMPTY
},
6020 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 9, wxTOKEN_RET_EMPTY_ALL
},
6021 { _T("01/02/99"), _T("/-"), 3 },
6022 { _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS
},
6025 for ( size_t n
= 0; n
< WXSIZEOF(tokenizerTestData
); n
++ )
6027 const StringTokenizerTest
& tt
= tokenizerTestData
[n
];
6028 wxStringTokenizer
tkz(tt
.str
, tt
.delims
, tt
.mode
);
6030 size_t count
= tkz
.CountTokens();
6031 wxPrintf(_T("String '%s' has %u tokens delimited by '%s' (mode = %s) "),
6032 MakePrintable(tt
.str
).c_str(),
6034 MakePrintable(tt
.delims
).c_str(),
6035 modeNames
[tkz
.GetMode()]);
6036 if ( count
== tt
.count
)
6042 wxPrintf(_T("(ERROR: should be %u)\n"), tt
.count
);
6047 // if we emulate strtok(), check that we do it correctly
6048 wxChar
*buf
, *s
= NULL
, *last
;
6050 if ( tkz
.GetMode() == wxTOKEN_STRTOK
)
6052 buf
= new wxChar
[wxStrlen(tt
.str
) + 1];
6053 wxStrcpy(buf
, tt
.str
);
6055 s
= wxStrtok(buf
, tt
.delims
, &last
);
6062 // now show the tokens themselves
6064 while ( tkz
.HasMoreTokens() )
6066 wxString token
= tkz
.GetNextToken();
6068 wxPrintf(_T("\ttoken %u: '%s'"),
6070 MakePrintable(token
).c_str());
6076 wxPuts(_T(" (ok)"));
6080 wxPrintf(_T(" (ERROR: should be %s)\n"), s
);
6083 s
= wxStrtok(NULL
, tt
.delims
, &last
);
6087 // nothing to compare with
6092 if ( count2
!= count
)
6094 wxPuts(_T("\tERROR: token count mismatch"));
6103 static void TestStringReplace()
6105 wxPuts(_T("*** Testing wxString::replace ***"));
6107 static const struct StringReplaceTestData
6109 const wxChar
*original
; // original test string
6110 size_t start
, len
; // the part to replace
6111 const wxChar
*replacement
; // the replacement string
6112 const wxChar
*result
; // and the expected result
6113 } stringReplaceTestData
[] =
6115 { _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") },
6116 { _T("increase"), 0, 2, _T("de"), _T("decrease") },
6117 { _T("wxWindow"), 8, 0, _T("s"), _T("wxWindows") },
6118 { _T("foobar"), 3, 0, _T("-"), _T("foo-bar") },
6119 { _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") },
6122 for ( size_t n
= 0; n
< WXSIZEOF(stringReplaceTestData
); n
++ )
6124 const StringReplaceTestData data
= stringReplaceTestData
[n
];
6126 wxString original
= data
.original
;
6127 original
.replace(data
.start
, data
.len
, data
.replacement
);
6129 wxPrintf(_T("wxString(\"%s\").replace(%u, %u, %s) = %s "),
6130 data
.original
, data
.start
, data
.len
, data
.replacement
,
6133 if ( original
== data
.result
)
6139 wxPrintf(_T("(ERROR: should be '%s')\n"), data
.result
);
6146 static void TestStringMatch()
6148 wxPuts(_T("*** Testing wxString::Matches() ***"));
6150 static const struct StringMatchTestData
6153 const wxChar
*wildcard
;
6155 } stringMatchTestData
[] =
6157 { _T("foobar"), _T("foo*"), 1 },
6158 { _T("foobar"), _T("*oo*"), 1 },
6159 { _T("foobar"), _T("*bar"), 1 },
6160 { _T("foobar"), _T("??????"), 1 },
6161 { _T("foobar"), _T("f??b*"), 1 },
6162 { _T("foobar"), _T("f?b*"), 0 },
6163 { _T("foobar"), _T("*goo*"), 0 },
6164 { _T("foobar"), _T("*foo"), 0 },
6165 { _T("foobarfoo"), _T("*foo"), 1 },
6166 { _T(""), _T("*"), 1 },
6167 { _T(""), _T("?"), 0 },
6170 for ( size_t n
= 0; n
< WXSIZEOF(stringMatchTestData
); n
++ )
6172 const StringMatchTestData
& data
= stringMatchTestData
[n
];
6173 bool matches
= wxString(data
.text
).Matches(data
.wildcard
);
6174 wxPrintf(_T("'%s' %s '%s' (%s)\n"),
6176 matches
? _T("matches") : _T("doesn't match"),
6178 matches
== data
.matches
? _T("ok") : _T("ERROR"));
6184 #endif // TEST_STRINGS
6186 // ----------------------------------------------------------------------------
6188 // ----------------------------------------------------------------------------
6190 #ifdef TEST_SNGLINST
6191 #include "wx/snglinst.h"
6192 #endif // TEST_SNGLINST
6194 int main(int argc
, char **argv
)
6196 wxApp::CheckBuildOptions(wxBuildOptions());
6198 wxInitializer initializer
;
6201 fprintf(stderr
, "Failed to initialize the wxWindows library, aborting.");
6206 #ifdef TEST_SNGLINST
6207 wxSingleInstanceChecker checker
;
6208 if ( checker
.Create(_T(".wxconsole.lock")) )
6210 if ( checker
.IsAnotherRunning() )
6212 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
6217 // wait some time to give time to launch another instance
6218 wxPrintf(_T("Press \"Enter\" to continue..."));
6221 else // failed to create
6223 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
6225 #endif // TEST_SNGLINST
6229 #endif // TEST_CHARSET
6232 TestCmdLineConvert();
6234 #if wxUSE_CMDLINE_PARSER
6235 static const wxCmdLineEntryDesc cmdLineDesc
[] =
6237 { wxCMD_LINE_SWITCH
, _T("h"), _T("help"), _T("show this help message"),
6238 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
6239 { wxCMD_LINE_SWITCH
, _T("v"), _T("verbose"), _T("be verbose") },
6240 { wxCMD_LINE_SWITCH
, _T("q"), _T("quiet"), _T("be quiet") },
6242 { wxCMD_LINE_OPTION
, _T("o"), _T("output"), _T("output file") },
6243 { wxCMD_LINE_OPTION
, _T("i"), _T("input"), _T("input dir") },
6244 { wxCMD_LINE_OPTION
, _T("s"), _T("size"), _T("output block size"),
6245 wxCMD_LINE_VAL_NUMBER
},
6246 { wxCMD_LINE_OPTION
, _T("d"), _T("date"), _T("output file date"),
6247 wxCMD_LINE_VAL_DATE
},
6249 { wxCMD_LINE_PARAM
, NULL
, NULL
, _T("input file"),
6250 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
6256 wxChar
**wargv
= new wxChar
*[argc
+ 1];
6259 for ( int n
= 0; n
< argc
; n
++ )
6261 wxMB2WXbuf warg
= wxConvertMB2WX(argv
[n
]);
6262 wargv
[n
] = wxStrdup(warg
);
6269 #endif // wxUSE_UNICODE
6271 wxCmdLineParser
parser(cmdLineDesc
, argc
, argv
);
6275 for ( int n
= 0; n
< argc
; n
++ )
6280 #endif // wxUSE_UNICODE
6282 parser
.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
6283 wxCMD_LINE_VAL_STRING
,
6284 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
6286 switch ( parser
.Parse() )
6289 wxLogMessage(_T("Help was given, terminating."));
6293 ShowCmdLine(parser
);
6297 wxLogMessage(_T("Syntax error detected, aborting."));
6300 #endif // wxUSE_CMDLINE_PARSER
6302 #endif // TEST_CMDLINE
6310 TestStringConstruction();
6313 TestStringTokenizer();
6314 TestStringReplace();
6320 #endif // TEST_STRINGS
6326 a1
.Add(_T("tiger"));
6328 a1
.Add(_T("lion"), 3);
6330 a1
.Add(_T("human"));
6333 wxPuts(_T("*** Initially:"));
6335 PrintArray(_T("a1"), a1
);
6337 wxArrayString
a2(a1
);
6338 PrintArray(_T("a2"), a2
);
6340 wxSortedArrayString
a3(a1
);
6341 PrintArray(_T("a3"), a3
);
6343 wxPuts(_T("*** After deleting three strings from a1"));
6346 PrintArray(_T("a1"), a1
);
6347 PrintArray(_T("a2"), a2
);
6348 PrintArray(_T("a3"), a3
);
6350 wxPuts(_T("*** After reassigning a1 to a2 and a3"));
6352 PrintArray(_T("a2"), a2
);
6353 PrintArray(_T("a3"), a3
);
6355 wxPuts(_T("*** After sorting a1"));
6357 PrintArray(_T("a1"), a1
);
6359 wxPuts(_T("*** After sorting a1 in reverse order"));
6361 PrintArray(_T("a1"), a1
);
6363 wxPuts(_T("*** After sorting a1 by the string length"));
6364 a1
.Sort(StringLenCompare
);
6365 PrintArray(_T("a1"), a1
);
6367 TestArrayOfObjects();
6368 TestArrayOfUShorts();
6372 #endif // TEST_ARRAYS
6383 #ifdef TEST_DLLLOADER
6385 #endif // TEST_DLLLOADER
6389 #endif // TEST_ENVIRON
6393 #endif // TEST_EXECUTE
6395 #ifdef TEST_FILECONF
6397 #endif // TEST_FILECONF
6405 #endif // TEST_LOCALE
6409 for ( size_t n
= 0; n
< 8000; n
++ )
6411 s
<< (wxChar
)(_T('A') + (n
% 26));
6415 msg
.Printf(_T("A very very long message: '%s', the end!\n"), s
.c_str());
6417 // this one shouldn't be truncated
6420 // but this one will because log functions use fixed size buffer
6421 // (note that it doesn't need '\n' at the end neither - will be added
6423 wxLogMessage(_T("A very very long message 2: '%s', the end!"), s
.c_str());
6435 #ifdef TEST_FILENAME
6439 fn
.Assign(_T("c:\\foo"), _T("bar.baz"));
6440 fn
.Assign(_T("/u/os9-port/Viewer/tvision/WEI2HZ-3B3-14_05-04-00MSC1.asc"));
6445 TestFileNameConstruction();
6448 TestFileNameConstruction();
6449 TestFileNameMakeRelative();
6450 TestFileNameMakeAbsolute();
6451 TestFileNameSplit();
6454 TestFileNameComparison();
6455 TestFileNameOperations();
6457 #endif // TEST_FILENAME
6459 #ifdef TEST_FILETIME
6463 #endif // TEST_FILETIME
6466 wxLog::AddTraceMask(FTP_TRACE_MASK
);
6467 if ( TestFtpConnect() )
6478 if ( TEST_INTERACTIVE
)
6479 TestFtpInteractive();
6481 //else: connecting to the FTP server failed
6487 #ifdef TEST_LONGLONG
6488 // seed pseudo random generator
6489 srand((unsigned)time(NULL
));
6498 TestMultiplication();
6501 TestLongLongConversion();
6502 TestBitOperations();
6503 TestLongLongComparison();
6504 TestLongLongToString();
6505 TestLongLongPrintf();
6507 #endif // TEST_LONGLONG
6515 #endif // TEST_HASHMAP
6518 wxLog::AddTraceMask(_T("mime"));
6523 TestMimeAssociate();
6528 #ifdef TEST_INFO_FUNCTIONS
6534 if ( TEST_INTERACTIVE
)
6537 #endif // TEST_INFO_FUNCTIONS
6539 #ifdef TEST_PATHLIST
6541 #endif // TEST_PATHLIST
6549 #endif // TEST_PRINTF
6553 #endif // TEST_REGCONF
6556 // TODO: write a real test using src/regex/tests file
6561 TestRegExSubmatch();
6562 TestRegExReplacement();
6564 if ( TEST_INTERACTIVE
)
6565 TestRegExInteractive();
6567 #endif // TEST_REGEX
6569 #ifdef TEST_REGISTRY
6571 TestRegistryAssociation();
6572 #endif // TEST_REGISTRY
6577 #endif // TEST_SOCKETS
6585 #endif // TEST_STREAMS
6587 #ifdef TEST_TEXTSTREAM
6588 TestTextInputStream();
6589 #endif // TEST_TEXTSTREAM
6592 int nCPUs
= wxThread::GetCPUCount();
6593 wxPrintf(_T("This system has %d CPUs\n"), nCPUs
);
6595 wxThread::SetConcurrency(nCPUs
);
6597 TestDetachedThreads();
6600 TestJoinableThreads();
6601 TestThreadSuspend();
6603 TestThreadConditions();
6607 #endif // TEST_THREADS
6611 #endif // TEST_TIMER
6613 #ifdef TEST_DATETIME
6626 TestTimeArithmetics();
6629 TestTimeSpanFormat();
6637 if ( TEST_INTERACTIVE
)
6638 TestDateTimeInteractive();
6639 #endif // TEST_DATETIME
6642 wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
6644 #endif // TEST_USLEEP
6649 #endif // TEST_VCARD
6653 #endif // TEST_VOLUME
6656 TestUnicodeToFromAscii();
6657 #endif // TEST_UNICODE
6661 TestEncodingConverter();
6662 #endif // TEST_WCHAR
6665 TestZipStreamRead();
6666 TestZipFileSystem();
6670 TestZlibStreamWrite();
6671 TestZlibStreamRead();