1 /////////////////////////////////////////////////////////////////////////////
2 // Name: samples/console/console.cpp
3 // Purpose: a sample console (as opposed to GUI) progam using wxWindows
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
23 #error "This sample can't be compiled in GUI mode."
28 #include "wx/string.h"
33 // without this pragma, the stupid compiler precompiles #defines below so that
34 // changing them doesn't "take place" later!
39 // ----------------------------------------------------------------------------
40 // conditional compilation
41 // ----------------------------------------------------------------------------
44 A note about all these conditional compilation macros: this file is used
45 both as a test suite for various non-GUI wxWindows classes and as a
46 scratchpad for quick tests. So there are two compilation modes: if you
47 define TEST_ALL all tests are run, otherwise you may enable the individual
48 tests individually in the "#else" branch below.
51 // what to test (in alphabetic order)? uncomment the line below to do all tests
59 #define TEST_DLLLOADER
69 #define TEST_INFO_FUNCTIONS
85 #define TEST_TEXTSTREAM
89 // #define TEST_VCARD -- don't enable this (VZ)
96 static const bool TEST_ALL
= true;
100 static const bool TEST_ALL
= false;
103 // some tests are interactive, define this to run them
104 #ifdef TEST_INTERACTIVE
105 #undef TEST_INTERACTIVE
107 static const bool TEST_INTERACTIVE
= true;
109 static const bool TEST_INTERACTIVE
= false;
112 // ----------------------------------------------------------------------------
113 // test class for container objects
114 // ----------------------------------------------------------------------------
116 #if defined(TEST_ARRAYS) || defined(TEST_LIST)
118 class Bar
// Foo is already taken in the hash test
121 Bar(const wxString
& name
) : m_name(name
) { ms_bars
++; }
122 Bar(const Bar
& bar
) : m_name(bar
.m_name
) { ms_bars
++; }
123 ~Bar() { ms_bars
--; }
125 static size_t GetNumber() { return ms_bars
; }
127 const wxChar
*GetName() const { return m_name
; }
132 static size_t ms_bars
;
135 size_t Bar::ms_bars
= 0;
137 #endif // defined(TEST_ARRAYS) || defined(TEST_LIST)
139 // ============================================================================
141 // ============================================================================
143 // ----------------------------------------------------------------------------
145 // ----------------------------------------------------------------------------
147 #if defined(TEST_STRINGS) || defined(TEST_SOCKETS)
149 // replace TABs with \t and CRs with \n
150 static wxString
MakePrintable(const wxChar
*s
)
153 (void)str
.Replace(_T("\t"), _T("\\t"));
154 (void)str
.Replace(_T("\n"), _T("\\n"));
155 (void)str
.Replace(_T("\r"), _T("\\r"));
160 #endif // MakePrintable() is used
162 // ----------------------------------------------------------------------------
163 // wxFontMapper::CharsetToEncoding
164 // ----------------------------------------------------------------------------
168 #include "wx/fontmap.h"
170 static void TestCharset()
172 static const wxChar
*charsets
[] =
174 // some vali charsets
183 // and now some bogus ones
190 for ( size_t n
= 0; n
< WXSIZEOF(charsets
); n
++ )
192 wxFontEncoding enc
= wxFontMapper::Get()->CharsetToEncoding(charsets
[n
]);
193 wxPrintf(_T("Charset: %s\tEncoding: %s (%s)\n"),
195 wxFontMapper::Get()->GetEncodingName(enc
).c_str(),
196 wxFontMapper::Get()->GetEncodingDescription(enc
).c_str());
200 #endif // TEST_CHARSET
202 // ----------------------------------------------------------------------------
204 // ----------------------------------------------------------------------------
208 #include "wx/cmdline.h"
209 #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/local/share");
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
409 wxPuts(_T("Now enumerating directories:"));
411 DirPrintTraverser traverser
;
412 dir
.Traverse(traverser
, _T(""), wxDIR_DIRS
| wxDIR_HIDDEN
);
415 static void TestDirExists()
417 wxPuts(_T("*** Testing wxDir::Exists() ***"));
419 static const wxChar
*dirnames
[] =
422 #if defined(__WXMSW__)
425 _T("\\\\share\\file"),
429 _T("c:\\autoexec.bat"),
430 #elif defined(__UNIX__)
439 for ( size_t n
= 0; n
< WXSIZEOF(dirnames
); n
++ )
441 wxPrintf(_T("%-40s: %s\n"),
443 wxDir::Exists(dirnames
[n
]) ? _T("exists")
444 : _T("doesn't exist"));
450 // ----------------------------------------------------------------------------
452 // ----------------------------------------------------------------------------
454 #ifdef TEST_DLLLOADER
456 #include "wx/dynlib.h"
458 static void TestDllLoad()
460 #if defined(__WXMSW__)
461 static const wxChar
*LIB_NAME
= _T("kernel32.dll");
462 static const wxChar
*FUNC_NAME
= _T("lstrlenA");
463 #elif defined(__UNIX__)
464 // weird: using just libc.so does *not* work!
465 static const wxChar
*LIB_NAME
= _T("/lib/libc-2.0.7.so");
466 static const wxChar
*FUNC_NAME
= _T("strlen");
468 #error "don't know how to test wxDllLoader on this platform"
471 wxPuts(_T("*** testing wxDllLoader ***\n"));
473 wxDynamicLibrary
lib(LIB_NAME
);
474 if ( !lib
.IsLoaded() )
476 wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME
);
480 typedef int (*wxStrlenType
)(const char *);
481 wxStrlenType pfnStrlen
= (wxStrlenType
)lib
.GetSymbol(FUNC_NAME
);
484 wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
485 FUNC_NAME
, LIB_NAME
);
489 if ( pfnStrlen("foo") != 3 )
491 wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
495 wxPuts(_T("... ok"));
501 #endif // TEST_DLLLOADER
503 // ----------------------------------------------------------------------------
505 // ----------------------------------------------------------------------------
509 #include "wx/utils.h"
511 static wxString
MyGetEnv(const wxString
& var
)
514 if ( !wxGetEnv(var
, &val
) )
517 val
= wxString(_T('\'')) + val
+ _T('\'');
522 static void TestEnvironment()
524 const wxChar
*var
= _T("wxTestVar");
526 wxPuts(_T("*** testing environment access functions ***"));
528 wxPrintf(_T("Initially getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
529 wxSetEnv(var
, _T("value for wxTestVar"));
530 wxPrintf(_T("After wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
531 wxSetEnv(var
, _T("another value"));
532 wxPrintf(_T("After 2nd wxSetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
534 wxPrintf(_T("After wxUnsetEnv: getenv(%s) = %s\n"), var
, MyGetEnv(var
).c_str());
535 wxPrintf(_T("PATH = %s\n"), MyGetEnv(_T("PATH")).c_str());
538 #endif // TEST_ENVIRON
540 // ----------------------------------------------------------------------------
542 // ----------------------------------------------------------------------------
546 #include "wx/utils.h"
548 static void TestExecute()
550 wxPuts(_T("*** testing wxExecute ***"));
553 #define COMMAND "cat -n ../../Makefile" // "echo hi"
554 #define SHELL_COMMAND "echo hi from shell"
555 #define REDIRECT_COMMAND COMMAND // "date"
556 #elif defined(__WXMSW__)
557 #define COMMAND "command.com /c echo hi"
558 #define SHELL_COMMAND "echo hi"
559 #define REDIRECT_COMMAND COMMAND
561 #error "no command to exec"
564 wxPrintf(_T("Testing wxShell: "));
566 if ( wxShell(SHELL_COMMAND
) )
569 wxPuts(_T("ERROR."));
571 wxPrintf(_T("Testing wxExecute: "));
573 if ( wxExecute(COMMAND
, true /* sync */) == 0 )
576 wxPuts(_T("ERROR."));
578 #if 0 // no, it doesn't work (yet?)
579 wxPrintf(_T("Testing async wxExecute: "));
581 if ( wxExecute(COMMAND
) != 0 )
582 wxPuts(_T("Ok (command launched)."));
584 wxPuts(_T("ERROR."));
587 wxPrintf(_T("Testing wxExecute with redirection:\n"));
588 wxArrayString output
;
589 if ( wxExecute(REDIRECT_COMMAND
, output
) != 0 )
591 wxPuts(_T("ERROR."));
595 size_t count
= output
.GetCount();
596 for ( size_t n
= 0; n
< count
; n
++ )
598 wxPrintf(_T("\t%s\n"), output
[n
].c_str());
605 #endif // TEST_EXECUTE
607 // ----------------------------------------------------------------------------
609 // ----------------------------------------------------------------------------
614 #include "wx/ffile.h"
615 #include "wx/textfile.h"
617 static void TestFileRead()
619 wxPuts(_T("*** wxFile read test ***"));
621 wxFile
file(_T("testdata.fc"));
622 if ( file
.IsOpened() )
624 wxPrintf(_T("File length: %lu\n"), file
.Length());
626 wxPuts(_T("File dump:\n----------"));
628 static const off_t len
= 1024;
632 off_t nRead
= file
.Read(buf
, len
);
633 if ( nRead
== wxInvalidOffset
)
635 wxPrintf(_T("Failed to read the file."));
639 fwrite(buf
, nRead
, 1, stdout
);
645 wxPuts(_T("----------"));
649 wxPrintf(_T("ERROR: can't open test file.\n"));
655 static void TestTextFileRead()
657 wxPuts(_T("*** wxTextFile read test ***"));
659 wxTextFile
file(_T("testdata.fc"));
662 wxPrintf(_T("Number of lines: %u\n"), file
.GetLineCount());
663 wxPrintf(_T("Last line: '%s'\n"), file
.GetLastLine().c_str());
667 wxPuts(_T("\nDumping the entire file:"));
668 for ( s
= file
.GetFirstLine(); !file
.Eof(); s
= file
.GetNextLine() )
670 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
672 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
674 wxPuts(_T("\nAnd now backwards:"));
675 for ( s
= file
.GetLastLine();
676 file
.GetCurrentLine() != 0;
677 s
= file
.GetPrevLine() )
679 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
681 wxPrintf(_T("%6u: %s\n"), file
.GetCurrentLine() + 1, s
.c_str());
685 wxPrintf(_T("ERROR: can't open '%s'\n"), file
.GetName());
691 static void TestFileCopy()
693 wxPuts(_T("*** Testing wxCopyFile ***"));
695 static const wxChar
*filename1
= _T("testdata.fc");
696 static const wxChar
*filename2
= _T("test2");
697 if ( !wxCopyFile(filename1
, filename2
) )
699 wxPuts(_T("ERROR: failed to copy file"));
703 wxFFile
f1(filename1
, "rb"),
706 if ( !f1
.IsOpened() || !f2
.IsOpened() )
708 wxPuts(_T("ERROR: failed to open file(s)"));
713 if ( !f1
.ReadAll(&s1
) || !f2
.ReadAll(&s2
) )
715 wxPuts(_T("ERROR: failed to read file(s)"));
719 if ( (s1
.length() != s2
.length()) ||
720 (memcmp(s1
.c_str(), s2
.c_str(), s1
.length()) != 0) )
722 wxPuts(_T("ERROR: copy error!"));
726 wxPuts(_T("File was copied ok."));
732 if ( !wxRemoveFile(filename2
) )
734 wxPuts(_T("ERROR: failed to remove the file"));
742 // ----------------------------------------------------------------------------
744 // ----------------------------------------------------------------------------
748 #include "wx/confbase.h"
749 #include "wx/fileconf.h"
751 static const struct FileConfTestData
753 const wxChar
*name
; // value name
754 const wxChar
*value
; // the value from the file
757 { _T("value1"), _T("one") },
758 { _T("value2"), _T("two") },
759 { _T("novalue"), _T("default") },
762 static void TestFileConfRead()
764 wxPuts(_T("*** testing wxFileConfig loading/reading ***"));
766 wxFileConfig
fileconf(_T("test"), wxEmptyString
,
767 _T("testdata.fc"), wxEmptyString
,
768 wxCONFIG_USE_RELATIVE_PATH
);
770 // test simple reading
771 wxPuts(_T("\nReading config file:"));
772 wxString
defValue(_T("default")), value
;
773 for ( size_t n
= 0; n
< WXSIZEOF(fcTestData
); n
++ )
775 const FileConfTestData
& data
= fcTestData
[n
];
776 value
= fileconf
.Read(data
.name
, defValue
);
777 wxPrintf(_T("\t%s = %s "), data
.name
, value
.c_str());
778 if ( value
== data
.value
)
784 wxPrintf(_T("(ERROR: should be %s)\n"), data
.value
);
788 // test enumerating the entries
789 wxPuts(_T("\nEnumerating all root entries:"));
792 bool cont
= fileconf
.GetFirstEntry(name
, dummy
);
795 wxPrintf(_T("\t%s = %s\n"),
797 fileconf
.Read(name
.c_str(), _T("ERROR")).c_str());
799 cont
= fileconf
.GetNextEntry(name
, dummy
);
802 static const wxChar
*testEntry
= _T("TestEntry");
803 wxPrintf(_T("\nTesting deletion of newly created \"Test\" entry: "));
804 fileconf
.Write(testEntry
, _T("A value"));
805 fileconf
.DeleteEntry(testEntry
);
806 wxPrintf(fileconf
.HasEntry(testEntry
) ? _T("ERROR\n") : _T("ok\n"));
809 #endif // TEST_FILECONF
811 // ----------------------------------------------------------------------------
813 // ----------------------------------------------------------------------------
817 #include "wx/filename.h"
819 static void DumpFileName(const wxFileName
& fn
)
821 wxString full
= fn
.GetFullPath();
823 wxString vol
, path
, name
, ext
;
824 wxFileName::SplitPath(full
, &vol
, &path
, &name
, &ext
);
826 wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
827 full
.c_str(), vol
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
829 wxFileName::SplitPath(full
, &path
, &name
, &ext
);
830 wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
831 path
.c_str(), name
.c_str(), ext
.c_str());
833 wxPrintf(_T("path is also:\t'%s'\n"), fn
.GetPath().c_str());
834 wxPrintf(_T("with volume: \t'%s'\n"),
835 fn
.GetPath(wxPATH_GET_VOLUME
).c_str());
836 wxPrintf(_T("with separator:\t'%s'\n"),
837 fn
.GetPath(wxPATH_GET_SEPARATOR
).c_str());
838 wxPrintf(_T("with both: \t'%s'\n"),
839 fn
.GetPath(wxPATH_GET_SEPARATOR
| wxPATH_GET_VOLUME
).c_str());
841 wxPuts(_T("The directories in the path are:"));
842 wxArrayString dirs
= fn
.GetDirs();
843 size_t count
= dirs
.GetCount();
844 for ( size_t n
= 0; n
< count
; n
++ )
846 wxPrintf(_T("\t%u: %s\n"), n
, dirs
[n
].c_str());
850 static struct FileNameInfo
852 const wxChar
*fullname
;
853 const wxChar
*volume
;
862 { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), true, wxPATH_UNIX
},
863 { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), true, wxPATH_UNIX
},
864 { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), true, wxPATH_UNIX
},
865 { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), false, wxPATH_UNIX
},
866 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), false, wxPATH_UNIX
},
867 { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), true, wxPATH_UNIX
},
868 { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), true, wxPATH_UNIX
},
869 { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), false, wxPATH_UNIX
},
870 { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), true, wxPATH_UNIX
},
872 // Windows file names
873 { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), false, wxPATH_DOS
},
874 { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), false, wxPATH_DOS
},
875 { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), false, wxPATH_DOS
},
876 { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS
},
877 { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), true, wxPATH_DOS
},
878 { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS
},
879 { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), true, wxPATH_DOS
},
881 // wxFileName support for Mac file names is broken currently
884 { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), true, wxPATH_MAC
},
885 { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), true, wxPATH_MAC
},
886 { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), true, wxPATH_MAC
},
887 { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), false, wxPATH_MAC
},
888 { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC
},
889 { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC
},
893 { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), true, wxPATH_VMS
},
894 { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), false, wxPATH_VMS
},
897 static void TestFileNameConstruction()
899 wxPuts(_T("*** testing wxFileName construction ***"));
901 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
903 const FileNameInfo
& fni
= filenames
[n
];
905 wxFileName
fn(fni
.fullname
, fni
.format
);
907 wxString fullname
= fn
.GetFullPath(fni
.format
);
908 if ( fullname
!= fni
.fullname
)
910 wxPrintf(_T("ERROR: fullname should be '%s'\n"), fni
.fullname
);
913 bool isAbsolute
= fn
.IsAbsolute(fni
.format
);
914 wxPrintf(_T("'%s' is %s (%s)\n\t"),
916 isAbsolute
? "absolute" : "relative",
917 isAbsolute
== fni
.isAbsolute
? "ok" : "ERROR");
919 if ( !fn
.Normalize(wxPATH_NORM_ALL
, _T(""), fni
.format
) )
921 wxPuts(_T("ERROR (couldn't be normalized)"));
925 wxPrintf(_T("normalized: '%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
932 static void TestFileNameSplit()
934 wxPuts(_T("*** testing wxFileName splitting ***"));
936 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
938 const FileNameInfo
& fni
= filenames
[n
];
939 wxString volume
, path
, name
, ext
;
940 wxFileName::SplitPath(fni
.fullname
,
941 &volume
, &path
, &name
, &ext
, fni
.format
);
943 wxPrintf(_T("%s -> volume = '%s', path = '%s', name = '%s', ext = '%s'"),
945 volume
.c_str(), path
.c_str(), name
.c_str(), ext
.c_str());
947 if ( volume
!= fni
.volume
)
948 wxPrintf(_T(" (ERROR: volume = '%s')"), fni
.volume
);
949 if ( path
!= fni
.path
)
950 wxPrintf(_T(" (ERROR: path = '%s')"), fni
.path
);
951 if ( name
!= fni
.name
)
952 wxPrintf(_T(" (ERROR: name = '%s')"), fni
.name
);
953 if ( ext
!= fni
.ext
)
954 wxPrintf(_T(" (ERROR: ext = '%s')"), fni
.ext
);
960 static void TestFileNameTemp()
962 wxPuts(_T("*** testing wxFileName temp file creation ***"));
964 static const wxChar
*tmpprefixes
[] =
972 _T("/tmp/foo/bar"), // this one must be an error
976 for ( size_t n
= 0; n
< WXSIZEOF(tmpprefixes
); n
++ )
978 wxString path
= wxFileName::CreateTempFileName(tmpprefixes
[n
]);
981 // "error" is not in upper case because it may be ok
982 wxPrintf(_T("Prefix '%s'\t-> error\n"), tmpprefixes
[n
]);
986 wxPrintf(_T("Prefix '%s'\t-> temp file '%s'\n"),
987 tmpprefixes
[n
], path
.c_str());
989 if ( !wxRemoveFile(path
) )
991 wxLogWarning(_T("Failed to remove temp file '%s'"),
998 static void TestFileNameMakeRelative()
1000 wxPuts(_T("*** testing wxFileName::MakeRelativeTo() ***"));
1002 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1004 const FileNameInfo
& fni
= filenames
[n
];
1006 wxFileName
fn(fni
.fullname
, fni
.format
);
1008 // choose the base dir of the same format
1010 switch ( fni
.format
)
1022 // TODO: I don't know how this is supposed to work there
1025 case wxPATH_NATIVE
: // make gcc happy
1027 wxFAIL_MSG( "unexpected path format" );
1030 wxPrintf(_T("'%s' relative to '%s': "),
1031 fn
.GetFullPath(fni
.format
).c_str(), base
.c_str());
1033 if ( !fn
.MakeRelativeTo(base
, fni
.format
) )
1035 wxPuts(_T("unchanged"));
1039 wxPrintf(_T("'%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
1044 static void TestFileNameMakeAbsolute()
1046 wxPuts(_T("*** testing wxFileName::MakeAbsolute() ***"));
1048 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1050 const FileNameInfo
& fni
= filenames
[n
];
1051 wxFileName
fn(fni
.fullname
, fni
.format
);
1053 wxPrintf(_T("'%s' absolutized: "),
1054 fn
.GetFullPath(fni
.format
).c_str());
1056 wxPrintf(_T("'%s'\n"), fn
.GetFullPath(fni
.format
).c_str());
1062 static void TestFileNameComparison()
1067 static void TestFileNameOperations()
1072 static void TestFileNameCwd()
1077 #endif // TEST_FILENAME
1079 // ----------------------------------------------------------------------------
1080 // wxFileName time functions
1081 // ----------------------------------------------------------------------------
1083 #ifdef TEST_FILETIME
1085 #include <wx/filename.h>
1086 #include <wx/datetime.h>
1088 static void TestFileGetTimes()
1090 wxFileName
fn(_T("testdata.fc"));
1092 wxDateTime dtAccess
, dtMod
, dtCreate
;
1093 if ( !fn
.GetTimes(&dtAccess
, &dtMod
, &dtCreate
) )
1095 wxPrintf(_T("ERROR: GetTimes() failed.\n"));
1099 static const wxChar
*fmt
= _T("%Y-%b-%d %H:%M:%S");
1101 wxPrintf(_T("File times for '%s':\n"), fn
.GetFullPath().c_str());
1102 wxPrintf(_T("Creation: \t%s\n"), dtCreate
.Format(fmt
).c_str());
1103 wxPrintf(_T("Last read: \t%s\n"), dtAccess
.Format(fmt
).c_str());
1104 wxPrintf(_T("Last write: \t%s\n"), dtMod
.Format(fmt
).c_str());
1108 static void TestFileSetTimes()
1110 wxFileName
fn(_T("testdata.fc"));
1114 wxPrintf(_T("ERROR: Touch() failed.\n"));
1118 #endif // TEST_FILETIME
1120 // ----------------------------------------------------------------------------
1122 // ----------------------------------------------------------------------------
1126 #include "wx/hash.h"
1130 Foo(int n_
) { n
= n_
; count
++; }
1135 static size_t count
;
1138 size_t Foo::count
= 0;
1140 WX_DECLARE_LIST(Foo
, wxListFoos
);
1141 WX_DECLARE_HASH(Foo
, wxListFoos
, wxHashFoos
);
1143 #include "wx/listimpl.cpp"
1145 WX_DEFINE_LIST(wxListFoos
);
1147 static void TestHash()
1149 wxPuts(_T("*** Testing wxHashTable ***\n"));
1153 hash
.DeleteContents(true);
1155 wxPrintf(_T("Hash created: %u foos in hash, %u foos totally\n"),
1156 hash
.GetCount(), Foo::count
);
1158 static const int hashTestData
[] =
1160 0, 1, 17, -2, 2, 4, -4, 345, 3, 3, 2, 1,
1164 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1166 hash
.Put(hashTestData
[n
], n
, new Foo(n
));
1169 wxPrintf(_T("Hash filled: %u foos in hash, %u foos totally\n"),
1170 hash
.GetCount(), Foo::count
);
1172 wxPuts(_T("Hash access test:"));
1173 for ( n
= 0; n
< WXSIZEOF(hashTestData
); n
++ )
1175 wxPrintf(_T("\tGetting element with key %d, value %d: "),
1176 hashTestData
[n
], n
);
1177 Foo
*foo
= hash
.Get(hashTestData
[n
], n
);
1180 wxPrintf(_T("ERROR, not found.\n"));
1184 wxPrintf(_T("%d (%s)\n"), foo
->n
,
1185 (size_t)foo
->n
== n
? "ok" : "ERROR");
1189 wxPrintf(_T("\nTrying to get an element not in hash: "));
1191 if ( hash
.Get(1234) || hash
.Get(1, 0) )
1193 wxPuts(_T("ERROR: found!"));
1197 wxPuts(_T("ok (not found)"));
1201 wxPrintf(_T("Hash destroyed: %u foos left\n"), Foo::count
);
1206 // ----------------------------------------------------------------------------
1208 // ----------------------------------------------------------------------------
1212 #include "wx/hashmap.h"
1214 // test compilation of basic map types
1215 WX_DECLARE_HASH_MAP( int*, int*, wxPointerHash
, wxPointerEqual
, myPtrHashMap
);
1216 WX_DECLARE_HASH_MAP( long, long, wxIntegerHash
, wxIntegerEqual
, myLongHashMap
);
1217 WX_DECLARE_HASH_MAP( unsigned long, unsigned, wxIntegerHash
, wxIntegerEqual
,
1218 myUnsignedHashMap
);
1219 WX_DECLARE_HASH_MAP( unsigned int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1221 WX_DECLARE_HASH_MAP( int, unsigned, wxIntegerHash
, wxIntegerEqual
,
1223 WX_DECLARE_HASH_MAP( short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1225 WX_DECLARE_HASH_MAP( unsigned short, unsigned, wxIntegerHash
, wxIntegerEqual
,
1229 // WX_DECLARE_HASH_MAP( wxString, wxString, wxStringHash, wxStringEqual,
1230 // myStringHashMap );
1231 WX_DECLARE_STRING_HASH_MAP(wxString
, myStringHashMap
);
1233 typedef myStringHashMap::iterator Itor
;
1235 static void TestHashMap()
1237 wxPuts(_T("*** Testing wxHashMap ***\n"));
1238 myStringHashMap
sh(0); // as small as possible
1241 const size_t count
= 10000;
1243 // init with some data
1244 for( i
= 0; i
< count
; ++i
)
1246 buf
.Printf(wxT("%d"), i
);
1247 sh
[buf
] = wxT("A") + buf
+ wxT("C");
1250 // test that insertion worked
1251 if( sh
.size() != count
)
1253 wxPrintf(_T("*** ERROR: %u ELEMENTS, SHOULD BE %u ***\n"), sh
.size(), count
);
1256 for( i
= 0; i
< count
; ++i
)
1258 buf
.Printf(wxT("%d"), i
);
1259 if( sh
[buf
] != wxT("A") + buf
+ wxT("C") )
1261 wxPrintf(_T("*** ERROR INSERTION BROKEN! STOPPING NOW! ***\n"));
1266 // check that iterators work
1268 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1272 wxPrintf(_T("*** ERROR ITERATORS DO NOT TERMINATE! STOPPING NOW! ***\n"));
1276 if( it
->second
!= sh
[it
->first
] )
1278 wxPrintf(_T("*** ERROR ITERATORS BROKEN! STOPPING NOW! ***\n"));
1283 if( sh
.size() != i
)
1285 wxPrintf(_T("*** ERROR: %u ELEMENTS ITERATED, SHOULD BE %u ***\n"), i
, count
);
1288 // test copy ctor, assignment operator
1289 myStringHashMap
h1( sh
), h2( 0 );
1292 for( i
= 0, it
= sh
.begin(); it
!= sh
.end(); ++it
, ++i
)
1294 if( h1
[it
->first
] != it
->second
)
1296 wxPrintf(_T("*** ERROR: COPY CTOR BROKEN %s ***\n"), it
->first
.c_str());
1299 if( h2
[it
->first
] != it
->second
)
1301 wxPrintf(_T("*** ERROR: OPERATOR= BROKEN %s ***\n"), it
->first
.c_str());
1306 for( i
= 0; i
< count
; ++i
)
1308 buf
.Printf(wxT("%d"), i
);
1309 size_t sz
= sh
.size();
1311 // test find() and erase(it)
1314 it
= sh
.find( buf
);
1315 if( it
!= sh
.end() )
1319 if( sh
.find( buf
) != sh
.end() )
1321 wxPrintf(_T("*** ERROR: FOUND DELETED ELEMENT %u ***\n"), i
);
1325 wxPrintf(_T("*** ERROR: CANT FIND ELEMENT %u ***\n"), i
);
1330 size_t c
= sh
.erase( buf
);
1332 wxPrintf(_T("*** ERROR: SHOULD RETURN 1 ***\n"));
1334 if( sh
.find( buf
) != sh
.end() )
1336 wxPrintf(_T("*** ERROR: FOUND DELETED ELEMENT %u ***\n"), i
);
1340 // count should decrease
1341 if( sh
.size() != sz
- 1 )
1343 wxPrintf(_T("*** ERROR: COUNT DID NOT DECREASE ***\n"));
1347 wxPrintf(_T("*** Finished testing wxHashMap ***\n"));
1350 #endif // TEST_HASHMAP
1352 // ----------------------------------------------------------------------------
1354 // ----------------------------------------------------------------------------
1358 #include "wx/list.h"
1360 WX_DECLARE_LIST(Bar
, wxListBars
);
1361 #include "wx/listimpl.cpp"
1362 WX_DEFINE_LIST(wxListBars
);
1364 static void TestListCtor()
1366 wxPuts(_T("*** Testing wxList construction ***\n"));
1370 list1
.Append(new Bar(_T("first")));
1371 list1
.Append(new Bar(_T("second")));
1373 wxPrintf(_T("After 1st list creation: %u objects in the list, %u objects total.\n"),
1374 list1
.GetCount(), Bar::GetNumber());
1379 wxPrintf(_T("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n"),
1380 list1
.GetCount(), list2
.GetCount(), Bar::GetNumber());
1382 list1
.DeleteContents(true);
1385 wxPrintf(_T("After list destruction: %u objects left.\n"), Bar::GetNumber());
1390 // ----------------------------------------------------------------------------
1392 // ----------------------------------------------------------------------------
1396 #include "wx/intl.h"
1397 #include "wx/utils.h" // for wxSetEnv
1399 static wxLocale
gs_localeDefault(wxLANGUAGE_ENGLISH
);
1401 // find the name of the language from its value
1402 static const wxChar
*GetLangName(int lang
)
1404 static const wxChar
*languageNames
[] =
1414 _T("ARABIC_ALGERIA"),
1415 _T("ARABIC_BAHRAIN"),
1418 _T("ARABIC_JORDAN"),
1419 _T("ARABIC_KUWAIT"),
1420 _T("ARABIC_LEBANON"),
1422 _T("ARABIC_MOROCCO"),
1425 _T("ARABIC_SAUDI_ARABIA"),
1428 _T("ARABIC_TUNISIA"),
1435 _T("AZERI_CYRILLIC"),
1450 _T("CHINESE_SIMPLIFIED"),
1451 _T("CHINESE_TRADITIONAL"),
1452 _T("CHINESE_HONGKONG"),
1453 _T("CHINESE_MACAU"),
1454 _T("CHINESE_SINGAPORE"),
1455 _T("CHINESE_TAIWAN"),
1461 _T("DUTCH_BELGIAN"),
1465 _T("ENGLISH_AUSTRALIA"),
1466 _T("ENGLISH_BELIZE"),
1467 _T("ENGLISH_BOTSWANA"),
1468 _T("ENGLISH_CANADA"),
1469 _T("ENGLISH_CARIBBEAN"),
1470 _T("ENGLISH_DENMARK"),
1472 _T("ENGLISH_JAMAICA"),
1473 _T("ENGLISH_NEW_ZEALAND"),
1474 _T("ENGLISH_PHILIPPINES"),
1475 _T("ENGLISH_SOUTH_AFRICA"),
1476 _T("ENGLISH_TRINIDAD"),
1477 _T("ENGLISH_ZIMBABWE"),
1485 _T("FRENCH_BELGIAN"),
1486 _T("FRENCH_CANADIAN"),
1487 _T("FRENCH_LUXEMBOURG"),
1488 _T("FRENCH_MONACO"),
1494 _T("GERMAN_AUSTRIAN"),
1495 _T("GERMAN_BELGIUM"),
1496 _T("GERMAN_LIECHTENSTEIN"),
1497 _T("GERMAN_LUXEMBOURG"),
1515 _T("ITALIAN_SWISS"),
1520 _T("KASHMIRI_INDIA"),
1538 _T("MALAY_BRUNEI_DARUSSALAM"),
1539 _T("MALAY_MALAYSIA"),
1549 _T("NORWEGIAN_BOKMAL"),
1550 _T("NORWEGIAN_NYNORSK"),
1557 _T("PORTUGUESE_BRAZILIAN"),
1560 _T("RHAETO_ROMANCE"),
1563 _T("RUSSIAN_UKRAINE"),
1569 _T("SERBIAN_CYRILLIC"),
1570 _T("SERBIAN_LATIN"),
1571 _T("SERBO_CROATIAN"),
1582 _T("SPANISH_ARGENTINA"),
1583 _T("SPANISH_BOLIVIA"),
1584 _T("SPANISH_CHILE"),
1585 _T("SPANISH_COLOMBIA"),
1586 _T("SPANISH_COSTA_RICA"),
1587 _T("SPANISH_DOMINICAN_REPUBLIC"),
1588 _T("SPANISH_ECUADOR"),
1589 _T("SPANISH_EL_SALVADOR"),
1590 _T("SPANISH_GUATEMALA"),
1591 _T("SPANISH_HONDURAS"),
1592 _T("SPANISH_MEXICAN"),
1593 _T("SPANISH_MODERN"),
1594 _T("SPANISH_NICARAGUA"),
1595 _T("SPANISH_PANAMA"),
1596 _T("SPANISH_PARAGUAY"),
1598 _T("SPANISH_PUERTO_RICO"),
1599 _T("SPANISH_URUGUAY"),
1601 _T("SPANISH_VENEZUELA"),
1605 _T("SWEDISH_FINLAND"),
1623 _T("URDU_PAKISTAN"),
1625 _T("UZBEK_CYRILLIC"),
1638 if ( (size_t)lang
< WXSIZEOF(languageNames
) )
1639 return languageNames
[lang
];
1641 return _T("INVALID");
1644 static void TestDefaultLang()
1646 wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
1648 static const wxChar
*langStrings
[] =
1650 NULL
, // system default
1657 _T("de_DE.iso88591"),
1659 _T("?"), // invalid lang spec
1660 _T("klingonese"), // I bet on some systems it does exist...
1663 wxPrintf(_T("The default system encoding is %s (%d)\n"),
1664 wxLocale::GetSystemEncodingName().c_str(),
1665 wxLocale::GetSystemEncoding());
1667 for ( size_t n
= 0; n
< WXSIZEOF(langStrings
); n
++ )
1669 const wxChar
*langStr
= langStrings
[n
];
1672 // FIXME: this doesn't do anything at all under Windows, we need
1673 // to create a new wxLocale!
1674 wxSetEnv(_T("LC_ALL"), langStr
);
1677 int lang
= gs_localeDefault
.GetSystemLanguage();
1678 wxPrintf(_T("Locale for '%s' is %s.\n"),
1679 langStr
? langStr
: _T("system default"), GetLangName(lang
));
1683 #endif // TEST_LOCALE
1685 // ----------------------------------------------------------------------------
1687 // ----------------------------------------------------------------------------
1691 #include "wx/mimetype.h"
1693 static void TestMimeEnum()
1695 wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1697 wxArrayString mimetypes
;
1699 size_t count
= wxTheMimeTypesManager
->EnumAllFileTypes(mimetypes
);
1701 wxPrintf(_T("*** All %u known filetypes: ***\n"), count
);
1706 for ( size_t n
= 0; n
< count
; n
++ )
1708 wxFileType
*filetype
=
1709 wxTheMimeTypesManager
->GetFileTypeFromMimeType(mimetypes
[n
]);
1712 wxPrintf(_T("nothing known about the filetype '%s'!\n"),
1713 mimetypes
[n
].c_str());
1717 filetype
->GetDescription(&desc
);
1718 filetype
->GetExtensions(exts
);
1720 filetype
->GetIcon(NULL
);
1723 for ( size_t e
= 0; e
< exts
.GetCount(); e
++ )
1726 extsAll
<< _T(", ");
1730 wxPrintf(_T("\t%s: %s (%s)\n"),
1731 mimetypes
[n
].c_str(), desc
.c_str(), extsAll
.c_str());
1737 static void TestMimeOverride()
1739 wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
1741 static const wxChar
*mailcap
= _T("/tmp/mailcap");
1742 static const wxChar
*mimetypes
= _T("/tmp/mime.types");
1744 if ( wxFile::Exists(mailcap
) )
1745 wxPrintf(_T("Loading mailcap from '%s': %s\n"),
1747 wxTheMimeTypesManager
->ReadMailcap(mailcap
) ? _T("ok") : _T("ERROR"));
1749 wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
1752 if ( wxFile::Exists(mimetypes
) )
1753 wxPrintf(_T("Loading mime.types from '%s': %s\n"),
1755 wxTheMimeTypesManager
->ReadMimeTypes(mimetypes
) ? _T("ok") : _T("ERROR"));
1757 wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
1763 static void TestMimeFilename()
1765 wxPuts(_T("*** Testing MIME type from filename query ***\n"));
1767 static const wxChar
*filenames
[] =
1775 for ( size_t n
= 0; n
< WXSIZEOF(filenames
); n
++ )
1777 const wxString fname
= filenames
[n
];
1778 wxString ext
= fname
.AfterLast(_T('.'));
1779 wxFileType
*ft
= wxTheMimeTypesManager
->GetFileTypeFromExtension(ext
);
1782 wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext
.c_str());
1787 if ( !ft
->GetDescription(&desc
) )
1788 desc
= _T("<no description>");
1791 if ( !ft
->GetOpenCommand(&cmd
,
1792 wxFileType::MessageParameters(fname
, _T(""))) )
1793 cmd
= _T("<no command available>");
1795 cmd
= wxString(_T('"')) + cmd
+ _T('"');
1797 wxPrintf(_T("To open %s (%s) do %s.\n"),
1798 fname
.c_str(), desc
.c_str(), cmd
.c_str());
1807 static void TestMimeAssociate()
1809 wxPuts(_T("*** Testing creation of filetype association ***\n"));
1811 wxFileTypeInfo
ftInfo(
1812 _T("application/x-xyz"),
1813 _T("xyzview '%s'"), // open cmd
1814 _T(""), // print cmd
1815 _T("XYZ File"), // description
1816 _T(".xyz"), // extensions
1817 NULL
// end of extensions
1819 ftInfo
.SetShortDesc(_T("XYZFile")); // used under Win32 only
1821 wxFileType
*ft
= wxTheMimeTypesManager
->Associate(ftInfo
);
1824 wxPuts(_T("ERROR: failed to create association!"));
1828 // TODO: read it back
1837 // ----------------------------------------------------------------------------
1838 // misc information functions
1839 // ----------------------------------------------------------------------------
1841 #ifdef TEST_INFO_FUNCTIONS
1843 #include "wx/utils.h"
1845 static void TestDiskInfo()
1847 wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
1851 wxChar pathname
[128];
1852 wxPrintf(_T("\nEnter a directory name: "));
1853 if ( !wxFgets(pathname
, WXSIZEOF(pathname
), stdin
) )
1856 // kill the last '\n'
1857 pathname
[wxStrlen(pathname
) - 1] = 0;
1859 wxLongLong total
, free
;
1860 if ( !wxGetDiskSpace(pathname
, &total
, &free
) )
1862 wxPuts(_T("ERROR: wxGetDiskSpace failed."));
1866 wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
1867 (total
/ 1024).ToString().c_str(),
1868 (free
/ 1024).ToString().c_str(),
1874 static void TestOsInfo()
1876 wxPuts(_T("*** Testing OS info functions ***\n"));
1879 wxGetOsVersion(&major
, &minor
);
1880 wxPrintf(_T("Running under: %s, version %d.%d\n"),
1881 wxGetOsDescription().c_str(), major
, minor
);
1883 wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory());
1885 wxPrintf(_T("Host name is %s (%s).\n"),
1886 wxGetHostName().c_str(), wxGetFullHostName().c_str());
1891 static void TestUserInfo()
1893 wxPuts(_T("*** Testing user info functions ***\n"));
1895 wxPrintf(_T("User id is:\t%s\n"), wxGetUserId().c_str());
1896 wxPrintf(_T("User name is:\t%s\n"), wxGetUserName().c_str());
1897 wxPrintf(_T("Home dir is:\t%s\n"), wxGetHomeDir().c_str());
1898 wxPrintf(_T("Email address:\t%s\n"), wxGetEmailAddress().c_str());
1903 #endif // TEST_INFO_FUNCTIONS
1905 // ----------------------------------------------------------------------------
1907 // ----------------------------------------------------------------------------
1909 #ifdef TEST_LONGLONG
1911 #include "wx/longlong.h"
1912 #include "wx/timer.h"
1914 // make a 64 bit number from 4 16 bit ones
1915 #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3)
1917 // get a random 64 bit number
1918 #define RAND_LL() MAKE_LL(rand(), rand(), rand(), rand())
1920 static const long testLongs
[] =
1931 #if wxUSE_LONGLONG_WX
1932 inline bool operator==(const wxLongLongWx
& a
, const wxLongLongNative
& b
)
1933 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1934 inline bool operator==(const wxLongLongNative
& a
, const wxLongLongWx
& b
)
1935 { return a
.GetHi() == b
.GetHi() && a
.GetLo() == b
.GetLo(); }
1936 #endif // wxUSE_LONGLONG_WX
1938 static void TestSpeed()
1940 static const long max
= 100000000;
1947 for ( n
= 0; n
< max
; n
++ )
1952 wxPrintf(_T("Summing longs took %ld milliseconds.\n"), sw
.Time());
1955 #if wxUSE_LONGLONG_NATIVE
1960 for ( n
= 0; n
< max
; n
++ )
1965 wxPrintf(_T("Summing wxLongLong_t took %ld milliseconds.\n"), sw
.Time());
1967 #endif // wxUSE_LONGLONG_NATIVE
1973 for ( n
= 0; n
< max
; n
++ )
1978 wxPrintf(_T("Summing wxLongLongs took %ld milliseconds.\n"), sw
.Time());
1982 static void TestLongLongConversion()
1984 wxPuts(_T("*** Testing wxLongLong conversions ***\n"));
1988 for ( size_t n
= 0; n
< 100000; n
++ )
1992 #if wxUSE_LONGLONG_NATIVE
1993 wxLongLongNative
b(a
.GetHi(), a
.GetLo());
1995 wxASSERT_MSG( a
== b
, "conversions failure" );
1997 wxPuts(_T("Can't do it without native long long type, test skipped."));
2000 #endif // wxUSE_LONGLONG_NATIVE
2002 if ( !(nTested
% 1000) )
2011 wxPuts(_T(" done!"));
2014 static void TestMultiplication()
2016 wxPuts(_T("*** Testing wxLongLong multiplication ***\n"));
2020 for ( size_t n
= 0; n
< 100000; n
++ )
2025 #if wxUSE_LONGLONG_NATIVE
2026 wxLongLongNative
aa(a
.GetHi(), a
.GetLo());
2027 wxLongLongNative
bb(b
.GetHi(), b
.GetLo());
2029 wxASSERT_MSG( a
*b
== aa
*bb
, "multiplication failure" );
2030 #else // !wxUSE_LONGLONG_NATIVE
2031 wxPuts(_T("Can't do it without native long long type, test skipped."));
2034 #endif // wxUSE_LONGLONG_NATIVE
2036 if ( !(nTested
% 1000) )
2045 wxPuts(_T(" done!"));
2048 static void TestDivision()
2050 wxPuts(_T("*** Testing wxLongLong division ***\n"));
2054 for ( size_t n
= 0; n
< 100000; n
++ )
2056 // get a random wxLongLong (shifting by 12 the MSB ensures that the
2057 // multiplication will not overflow)
2058 wxLongLong ll
= MAKE_LL((rand() >> 12), rand(), rand(), rand());
2060 // get a random (but non null) long (not wxLongLong for now) to divide
2072 #if wxUSE_LONGLONG_NATIVE
2073 wxLongLongNative
m(ll
.GetHi(), ll
.GetLo());
2075 wxLongLongNative p
= m
/ l
, s
= m
% l
;
2076 wxASSERT_MSG( q
== p
&& r
== s
, "division failure" );
2077 #else // !wxUSE_LONGLONG_NATIVE
2078 // verify the result
2079 wxASSERT_MSG( ll
== q
*l
+ r
, "division failure" );
2080 #endif // wxUSE_LONGLONG_NATIVE
2082 if ( !(nTested
% 1000) )
2091 wxPuts(_T(" done!"));
2094 static void TestAddition()
2096 wxPuts(_T("*** Testing wxLongLong addition ***\n"));
2100 for ( size_t n
= 0; n
< 100000; n
++ )
2106 #if wxUSE_LONGLONG_NATIVE
2107 wxASSERT_MSG( c
== wxLongLongNative(a
.GetHi(), a
.GetLo()) +
2108 wxLongLongNative(b
.GetHi(), b
.GetLo()),
2109 "addition failure" );
2110 #else // !wxUSE_LONGLONG_NATIVE
2111 wxASSERT_MSG( c
- b
== a
, "addition failure" );
2112 #endif // wxUSE_LONGLONG_NATIVE
2114 if ( !(nTested
% 1000) )
2123 wxPuts(_T(" done!"));
2126 static void TestBitOperations()
2128 wxPuts(_T("*** Testing wxLongLong bit operation ***\n"));
2132 for ( size_t n
= 0; n
< 100000; n
++ )
2136 #if wxUSE_LONGLONG_NATIVE
2137 for ( size_t n
= 0; n
< 33; n
++ )
2140 #else // !wxUSE_LONGLONG_NATIVE
2141 wxPuts(_T("Can't do it without native long long type, test skipped."));
2144 #endif // wxUSE_LONGLONG_NATIVE
2146 if ( !(nTested
% 1000) )
2155 wxPuts(_T(" done!"));
2158 static void TestLongLongComparison()
2160 #if wxUSE_LONGLONG_WX
2161 wxPuts(_T("*** Testing wxLongLong comparison ***\n"));
2163 static const long ls
[2] =
2169 wxLongLongWx lls
[2];
2173 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2177 for ( size_t m
= 0; m
< WXSIZEOF(lls
); m
++ )
2179 res
= lls
[m
] > testLongs
[n
];
2180 wxPrintf(_T("0x%lx > 0x%lx is %s (%s)\n"),
2181 ls
[m
], testLongs
[n
], res
? "true" : "false",
2182 res
== (ls
[m
] > testLongs
[n
]) ? "ok" : "ERROR");
2184 res
= lls
[m
] < testLongs
[n
];
2185 wxPrintf(_T("0x%lx < 0x%lx is %s (%s)\n"),
2186 ls
[m
], testLongs
[n
], res
? "true" : "false",
2187 res
== (ls
[m
] < testLongs
[n
]) ? "ok" : "ERROR");
2189 res
= lls
[m
] == testLongs
[n
];
2190 wxPrintf(_T("0x%lx == 0x%lx is %s (%s)\n"),
2191 ls
[m
], testLongs
[n
], res
? "true" : "false",
2192 res
== (ls
[m
] == testLongs
[n
]) ? "ok" : "ERROR");
2195 #endif // wxUSE_LONGLONG_WX
2198 static void TestLongLongToString()
2200 wxPuts(_T("*** Testing wxLongLong::ToString() ***\n"));
2202 for ( size_t n
= 0; n
< WXSIZEOF(testLongs
); n
++ )
2204 wxLongLong ll
= testLongs
[n
];
2205 wxPrintf(_T("%ld == %s\n"), testLongs
[n
], ll
.ToString().c_str());
2208 wxLongLong
ll(0x12345678, 0x87654321);
2209 wxPrintf(_T("0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2212 wxPrintf(_T("-0x1234567887654321 = %s\n"), ll
.ToString().c_str());
2215 static void TestLongLongPrintf()
2217 wxPuts(_T("*** Testing wxLongLong printing ***\n"));
2219 #ifdef wxLongLongFmtSpec
2220 wxLongLong ll
= wxLL(0x1234567890abcdef);
2221 wxString s
= wxString::Format(_T("%") wxLongLongFmtSpec
_T("x"), ll
);
2222 wxPrintf(_T("0x1234567890abcdef -> %s (%s)\n"),
2223 s
.c_str(), s
== _T("1234567890abcdef") ? _T("ok") : _T("ERROR"));
2224 #else // !wxLongLongFmtSpec
2225 #error "wxLongLongFmtSpec not defined for this compiler/platform"
2232 #endif // TEST_LONGLONG
2234 // ----------------------------------------------------------------------------
2236 // ----------------------------------------------------------------------------
2238 #ifdef TEST_PATHLIST
2241 #define CMD_IN_PATH _T("ls")
2243 #define CMD_IN_PATH _T("command.com")
2246 static void TestPathList()
2248 wxPuts(_T("*** Testing wxPathList ***\n"));
2250 wxPathList pathlist
;
2251 pathlist
.AddEnvList(_T("PATH"));
2252 wxString path
= pathlist
.FindValidPath(CMD_IN_PATH
);
2255 wxPrintf(_T("ERROR: command not found in the path.\n"));
2259 wxPrintf(_T("Command found in the path as '%s'.\n"), path
.c_str());
2263 #endif // TEST_PATHLIST
2265 // ----------------------------------------------------------------------------
2266 // regular expressions
2267 // ----------------------------------------------------------------------------
2271 #include "wx/regex.h"
2273 static void TestRegExCompile()
2275 wxPuts(_T("*** Testing RE compilation ***\n"));
2277 static struct RegExCompTestData
2279 const wxChar
*pattern
;
2281 } regExCompTestData
[] =
2283 { _T("foo"), true },
2284 { _T("foo("), false },
2285 { _T("foo(bar"), false },
2286 { _T("foo(bar)"), true },
2287 { _T("foo["), false },
2288 { _T("foo[bar"), false },
2289 { _T("foo[bar]"), true },
2290 { _T("foo{"), true },
2291 { _T("foo{1"), false },
2292 { _T("foo{bar"), true },
2293 { _T("foo{1}"), true },
2294 { _T("foo{1,2}"), true },
2295 { _T("foo{bar}"), true },
2296 { _T("foo*"), true },
2297 { _T("foo**"), false },
2298 { _T("foo+"), true },
2299 { _T("foo++"), false },
2300 { _T("foo?"), true },
2301 { _T("foo??"), false },
2302 { _T("foo?+"), false },
2306 for ( size_t n
= 0; n
< WXSIZEOF(regExCompTestData
); n
++ )
2308 const RegExCompTestData
& data
= regExCompTestData
[n
];
2309 bool ok
= re
.Compile(data
.pattern
);
2311 wxPrintf(_T("'%s' is %sa valid RE (%s)\n"),
2313 ok
? _T("") : _T("not "),
2314 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2318 static void TestRegExMatch()
2320 wxPuts(_T("*** Testing RE matching ***\n"));
2322 static struct RegExMatchTestData
2324 const wxChar
*pattern
;
2327 } regExMatchTestData
[] =
2329 { _T("foo"), _T("bar"), false },
2330 { _T("foo"), _T("foobar"), true },
2331 { _T("^foo"), _T("foobar"), true },
2332 { _T("^foo"), _T("barfoo"), false },
2333 { _T("bar$"), _T("barbar"), true },
2334 { _T("bar$"), _T("barbar "), false },
2337 for ( size_t n
= 0; n
< WXSIZEOF(regExMatchTestData
); n
++ )
2339 const RegExMatchTestData
& data
= regExMatchTestData
[n
];
2341 wxRegEx
re(data
.pattern
);
2342 bool ok
= re
.Matches(data
.text
);
2344 wxPrintf(_T("'%s' %s %s (%s)\n"),
2346 ok
? _T("matches") : _T("doesn't match"),
2348 ok
== data
.correct
? _T("ok") : _T("ERROR"));
2352 static void TestRegExSubmatch()
2354 wxPuts(_T("*** Testing RE subexpressions ***\n"));
2356 wxRegEx
re(_T("([[:alpha:]]+) ([[:alpha:]]+) ([[:digit:]]+).*([[:digit:]]+)$"));
2357 if ( !re
.IsValid() )
2359 wxPuts(_T("ERROR: compilation failed."));
2363 wxString text
= _T("Fri Jul 13 18:37:52 CEST 2001");
2365 if ( !re
.Matches(text
) )
2367 wxPuts(_T("ERROR: match expected."));
2371 wxPrintf(_T("Entire match: %s\n"), re
.GetMatch(text
).c_str());
2373 wxPrintf(_T("Date: %s/%s/%s, wday: %s\n"),
2374 re
.GetMatch(text
, 3).c_str(),
2375 re
.GetMatch(text
, 2).c_str(),
2376 re
.GetMatch(text
, 4).c_str(),
2377 re
.GetMatch(text
, 1).c_str());
2381 static void TestRegExReplacement()
2383 wxPuts(_T("*** Testing RE replacement ***"));
2385 static struct RegExReplTestData
2389 const wxChar
*result
;
2391 } regExReplTestData
[] =
2393 { _T("foo123"), _T("bar"), _T("bar"), 1 },
2394 { _T("foo123"), _T("\\2\\1"), _T("123foo"), 1 },
2395 { _T("foo_123"), _T("\\2\\1"), _T("123foo"), 1 },
2396 { _T("123foo"), _T("bar"), _T("123foo"), 0 },
2397 { _T("123foo456foo"), _T("&&"), _T("123foo456foo456foo"), 1 },
2398 { _T("foo123foo123"), _T("bar"), _T("barbar"), 2 },
2399 { _T("foo123_foo456_foo789"), _T("bar"), _T("bar_bar_bar"), 3 },
2402 const wxChar
*pattern
= _T("([a-z]+)[^0-9]*([0-9]+)");
2403 wxRegEx
re(pattern
);
2405 wxPrintf(_T("Using pattern '%s' for replacement.\n"), pattern
);
2407 for ( size_t n
= 0; n
< WXSIZEOF(regExReplTestData
); n
++ )
2409 const RegExReplTestData
& data
= regExReplTestData
[n
];
2411 wxString text
= data
.text
;
2412 size_t nRepl
= re
.Replace(&text
, data
.repl
);
2414 wxPrintf(_T("%s =~ s/RE/%s/g: %u match%s, result = '%s' ("),
2415 data
.text
, data
.repl
,
2416 nRepl
, nRepl
== 1 ? _T("") : _T("es"),
2418 if ( text
== data
.result
&& nRepl
== data
.count
)
2424 wxPrintf(_T("ERROR: should be %u and '%s')\n"),
2425 data
.count
, data
.result
);
2430 static void TestRegExInteractive()
2432 wxPuts(_T("*** Testing RE interactively ***"));
2436 wxChar pattern
[128];
2437 wxPrintf(_T("\nEnter a pattern: "));
2438 if ( !wxFgets(pattern
, WXSIZEOF(pattern
), stdin
) )
2441 // kill the last '\n'
2442 pattern
[wxStrlen(pattern
) - 1] = 0;
2445 if ( !re
.Compile(pattern
) )
2453 wxPrintf(_T("Enter text to match: "));
2454 if ( !wxFgets(text
, WXSIZEOF(text
), stdin
) )
2457 // kill the last '\n'
2458 text
[wxStrlen(text
) - 1] = 0;
2460 if ( !re
.Matches(text
) )
2462 wxPrintf(_T("No match.\n"));
2466 wxPrintf(_T("Pattern matches at '%s'\n"), re
.GetMatch(text
).c_str());
2469 for ( size_t n
= 1; ; n
++ )
2471 if ( !re
.GetMatch(&start
, &len
, n
) )
2476 wxPrintf(_T("Subexpr %u matched '%s'\n"),
2477 n
, wxString(text
+ start
, len
).c_str());
2484 #endif // TEST_REGEX
2486 // ----------------------------------------------------------------------------
2488 // ----------------------------------------------------------------------------
2498 static void TestDbOpen()
2506 // ----------------------------------------------------------------------------
2508 // ----------------------------------------------------------------------------
2511 NB: this stuff was taken from the glibc test suite and modified to build
2512 in wxWindows: if I read the copyright below properly, this shouldn't
2518 #ifdef wxTEST_PRINTF
2519 // use our functions from wxchar.cpp
2523 // NB: do _not_ use ATTRIBUTE_PRINTF here, we have some invalid formats
2524 // in the tests below
2525 int wxPrintf( const wxChar
*format
, ... );
2526 int wxSprintf( wxChar
*str
, const wxChar
*format
, ... );
2529 #include "wx/longlong.h"
2533 static void rfg1 (void);
2534 static void rfg2 (void);
2538 fmtchk (const wxChar
*fmt
)
2540 (void) wxPrintf(_T("%s:\t`"), fmt
);
2541 (void) wxPrintf(fmt
, 0x12);
2542 (void) wxPrintf(_T("'\n"));
2546 fmtst1chk (const wxChar
*fmt
)
2548 (void) wxPrintf(_T("%s:\t`"), fmt
);
2549 (void) wxPrintf(fmt
, 4, 0x12);
2550 (void) wxPrintf(_T("'\n"));
2554 fmtst2chk (const wxChar
*fmt
)
2556 (void) wxPrintf(_T("%s:\t`"), fmt
);
2557 (void) wxPrintf(fmt
, 4, 4, 0x12);
2558 (void) wxPrintf(_T("'\n"));
2561 /* This page is covered by the following copyright: */
2563 /* (C) Copyright C E Chew
2565 * Feel free to copy, use and distribute this software provided:
2567 * 1. you do not pretend that you wrote it
2568 * 2. you leave this copyright notice intact.
2572 * Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans.
2579 /* Formatted Output Test
2581 * This exercises the output formatting code.
2589 wxChar
*prefix
= buf
;
2592 wxPuts(_T("\nFormatted output test"));
2593 wxPrintf(_T("prefix 6d 6o 6x 6X 6u\n"));
2594 wxStrcpy(prefix
, _T("%"));
2595 for (i
= 0; i
< 2; i
++) {
2596 for (j
= 0; j
< 2; j
++) {
2597 for (k
= 0; k
< 2; k
++) {
2598 for (l
= 0; l
< 2; l
++) {
2599 wxStrcpy(prefix
, _T("%"));
2600 if (i
== 0) wxStrcat(prefix
, _T("-"));
2601 if (j
== 0) wxStrcat(prefix
, _T("+"));
2602 if (k
== 0) wxStrcat(prefix
, _T("#"));
2603 if (l
== 0) wxStrcat(prefix
, _T("0"));
2604 wxPrintf(_T("%5s |"), prefix
);
2605 wxStrcpy(tp
, prefix
);
2606 wxStrcat(tp
, _T("6d |"));
2608 wxStrcpy(tp
, prefix
);
2609 wxStrcat(tp
, _T("6o |"));
2611 wxStrcpy(tp
, prefix
);
2612 wxStrcat(tp
, _T("6x |"));
2614 wxStrcpy(tp
, prefix
);
2615 wxStrcat(tp
, _T("6X |"));
2617 wxStrcpy(tp
, prefix
);
2618 wxStrcat(tp
, _T("6u |"));
2625 wxPrintf(_T("%10s\n"), (wxChar
*) NULL
);
2626 wxPrintf(_T("%-10s\n"), (wxChar
*) NULL
);
2629 static void TestPrintf()
2631 static wxChar shortstr
[] = _T("Hi, Z.");
2632 static wxChar longstr
[] = _T("Good morning, Doctor Chandra. This is Hal. \
2633 I am ready for my first lesson today.");
2638 fmtchk(_T("%4.4x"));
2639 fmtchk(_T("%04.4x"));
2640 fmtchk(_T("%4.3x"));
2641 fmtchk(_T("%04.3x"));
2643 fmtst1chk(_T("%.*x"));
2644 fmtst1chk(_T("%0*x"));
2645 fmtst2chk(_T("%*.*x"));
2646 fmtst2chk(_T("%0*.*x"));
2648 wxPrintf(_T("bad format:\t\"%b\"\n"));
2649 wxPrintf(_T("nil pointer (padded):\t\"%10p\"\n"), (void *) NULL
);
2651 wxPrintf(_T("decimal negative:\t\"%d\"\n"), -2345);
2652 wxPrintf(_T("octal negative:\t\"%o\"\n"), -2345);
2653 wxPrintf(_T("hex negative:\t\"%x\"\n"), -2345);
2654 wxPrintf(_T("long decimal number:\t\"%ld\"\n"), -123456L);
2655 wxPrintf(_T("long octal negative:\t\"%lo\"\n"), -2345L);
2656 wxPrintf(_T("long unsigned decimal number:\t\"%lu\"\n"), -123456L);
2657 wxPrintf(_T("zero-padded LDN:\t\"%010ld\"\n"), -123456L);
2658 wxPrintf(_T("left-adjusted ZLDN:\t\"%-010ld\"\n"), -123456);
2659 wxPrintf(_T("space-padded LDN:\t\"%10ld\"\n"), -123456L);
2660 wxPrintf(_T("left-adjusted SLDN:\t\"%-10ld\"\n"), -123456L);
2662 wxPrintf(_T("zero-padded string:\t\"%010s\"\n"), shortstr
);
2663 wxPrintf(_T("left-adjusted Z string:\t\"%-010s\"\n"), shortstr
);
2664 wxPrintf(_T("space-padded string:\t\"%10s\"\n"), shortstr
);
2665 wxPrintf(_T("left-adjusted S string:\t\"%-10s\"\n"), shortstr
);
2666 wxPrintf(_T("null string:\t\"%s\"\n"), (wxChar
*)NULL
);
2667 wxPrintf(_T("limited string:\t\"%.22s\"\n"), longstr
);
2669 wxPrintf(_T("e-style >= 1:\t\"%e\"\n"), 12.34);
2670 wxPrintf(_T("e-style >= .1:\t\"%e\"\n"), 0.1234);
2671 wxPrintf(_T("e-style < .1:\t\"%e\"\n"), 0.001234);
2672 wxPrintf(_T("e-style big:\t\"%.60e\"\n"), 1e20
);
2673 wxPrintf(_T("e-style == .1:\t\"%e\"\n"), 0.1);
2674 wxPrintf(_T("f-style >= 1:\t\"%f\"\n"), 12.34);
2675 wxPrintf(_T("f-style >= .1:\t\"%f\"\n"), 0.1234);
2676 wxPrintf(_T("f-style < .1:\t\"%f\"\n"), 0.001234);
2677 wxPrintf(_T("g-style >= 1:\t\"%g\"\n"), 12.34);
2678 wxPrintf(_T("g-style >= .1:\t\"%g\"\n"), 0.1234);
2679 wxPrintf(_T("g-style < .1:\t\"%g\"\n"), 0.001234);
2680 wxPrintf(_T("g-style big:\t\"%.60g\"\n"), 1e20
);
2682 wxPrintf (_T(" %6.5f\n"), .099999999860301614);
2683 wxPrintf (_T(" %6.5f\n"), .1);
2684 wxPrintf (_T("x%5.4fx\n"), .5);
2686 wxPrintf (_T("%#03x\n"), 1);
2688 //wxPrintf (_T("something really insane: %.10000f\n"), 1.0);
2694 while (niter
-- != 0)
2695 wxPrintf (_T("%.17e\n"), d
/ 2);
2699 wxPrintf (_T("%15.5e\n"), 4.9406564584124654e-324);
2701 #define FORMAT _T("|%12.4f|%12.4e|%12.4g|\n")
2702 wxPrintf (FORMAT
, 0.0, 0.0, 0.0);
2703 wxPrintf (FORMAT
, 1.0, 1.0, 1.0);
2704 wxPrintf (FORMAT
, -1.0, -1.0, -1.0);
2705 wxPrintf (FORMAT
, 100.0, 100.0, 100.0);
2706 wxPrintf (FORMAT
, 1000.0, 1000.0, 1000.0);
2707 wxPrintf (FORMAT
, 10000.0, 10000.0, 10000.0);
2708 wxPrintf (FORMAT
, 12345.0, 12345.0, 12345.0);
2709 wxPrintf (FORMAT
, 100000.0, 100000.0, 100000.0);
2710 wxPrintf (FORMAT
, 123456.0, 123456.0, 123456.0);
2715 int rc
= wxSnprintf (buf
, WXSIZEOF(buf
), _T("%30s"), _T("foo"));
2717 wxPrintf(_T("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n"),
2718 rc
, WXSIZEOF(buf
), buf
);
2721 wxPrintf ("snprintf (\"%%.999999u\", 10)\n",
2722 wxSnprintf(buf2
, WXSIZEOFbuf2
), "%.999999u", 10));
2728 wxPrintf (_T("%e should be 1.234568e+06\n"), 1234567.8);
2729 wxPrintf (_T("%f should be 1234567.800000\n"), 1234567.8);
2730 wxPrintf (_T("%g should be 1.23457e+06\n"), 1234567.8);
2731 wxPrintf (_T("%g should be 123.456\n"), 123.456);
2732 wxPrintf (_T("%g should be 1e+06\n"), 1000000.0);
2733 wxPrintf (_T("%g should be 10\n"), 10.0);
2734 wxPrintf (_T("%g should be 0.02\n"), 0.02);
2738 wxPrintf(_T("%.17f\n"),(1.0/x
/10.0+1.0)*x
-x
);
2744 wxSprintf(buf
,_T("%*s%*s%*s"),-1,_T("one"),-20,_T("two"),-30,_T("three"));
2746 result
|= wxStrcmp (buf
,
2747 _T("onetwo three "));
2749 wxPuts (result
!= 0 ? _T("Test failed!") : _T("Test ok."));
2756 wxSprintf(buf
, _T("%07") wxLongLongFmtSpec
_T("o"), wxLL(040000000000));
2757 wxPrintf (_T("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf
);
2759 if (wxStrcmp (buf
, _T("40000000000")) != 0)
2762 wxPuts (_T("\tFAILED"));
2766 #endif // wxLongLong_t
2768 wxPrintf (_T("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX
+ 2, UCHAR_MAX
+ 2);
2769 wxPrintf (_T("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX
+ 2, USHRT_MAX
+ 2);
2771 wxPuts (_T("--- Should be no further output. ---"));
2780 memset (bytes
, '\xff', sizeof bytes
);
2781 wxSprintf (buf
, _T("foo%hhn\n"), &bytes
[3]);
2782 if (bytes
[0] != '\xff' || bytes
[1] != '\xff' || bytes
[2] != '\xff'
2783 || bytes
[4] != '\xff' || bytes
[5] != '\xff' || bytes
[6] != '\xff')
2785 wxPuts (_T("%hhn overwrite more bytes"));
2790 wxPuts (_T("%hhn wrote incorrect value"));
2802 wxSprintf (buf
, _T("%5.s"), _T("xyz"));
2803 if (wxStrcmp (buf
, _T(" ")) != 0)
2804 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" "));
2805 wxSprintf (buf
, _T("%5.f"), 33.3);
2806 if (wxStrcmp (buf
, _T(" 33")) != 0)
2807 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 33"));
2808 wxSprintf (buf
, _T("%8.e"), 33.3e7
);
2809 if (wxStrcmp (buf
, _T(" 3e+08")) != 0)
2810 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3e+08"));
2811 wxSprintf (buf
, _T("%8.E"), 33.3e7
);
2812 if (wxStrcmp (buf
, _T(" 3E+08")) != 0)
2813 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3E+08"));
2814 wxSprintf (buf
, _T("%.g"), 33.3);
2815 if (wxStrcmp (buf
, _T("3e+01")) != 0)
2816 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3e+01"));
2817 wxSprintf (buf
, _T("%.G"), 33.3);
2818 if (wxStrcmp (buf
, _T("3E+01")) != 0)
2819 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3E+01"));
2829 wxSprintf (buf
, _T("%.*g"), prec
, 3.3);
2830 if (wxStrcmp (buf
, _T("3")) != 0)
2831 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2833 wxSprintf (buf
, _T("%.*G"), prec
, 3.3);
2834 if (wxStrcmp (buf
, _T("3")) != 0)
2835 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T("3"));
2837 wxSprintf (buf
, _T("%7.*G"), prec
, 3.33);
2838 if (wxStrcmp (buf
, _T(" 3")) != 0)
2839 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 3"));
2841 wxSprintf (buf
, _T("%04.*o"), prec
, 33);
2842 if (wxStrcmp (buf
, _T(" 041")) != 0)
2843 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 041"));
2845 wxSprintf (buf
, _T("%09.*u"), prec
, 33);
2846 if (wxStrcmp (buf
, _T(" 0000033")) != 0)
2847 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 0000033"));
2849 wxSprintf (buf
, _T("%04.*x"), prec
, 33);
2850 if (wxStrcmp (buf
, _T(" 021")) != 0)
2851 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2853 wxSprintf (buf
, _T("%04.*X"), prec
, 33);
2854 if (wxStrcmp (buf
, _T(" 021")) != 0)
2855 wxPrintf (_T("got: '%s', expected: '%s'\n"), buf
, _T(" 021"));
2858 #endif // TEST_PRINTF
2860 // ----------------------------------------------------------------------------
2861 // registry and related stuff
2862 // ----------------------------------------------------------------------------
2864 // this is for MSW only
2867 #undef TEST_REGISTRY
2872 #include "wx/confbase.h"
2873 #include "wx/msw/regconf.h"
2875 static void TestRegConfWrite()
2877 wxRegConfig
regconf(_T("console"), _T("wxwindows"));
2878 regconf
.Write(_T("Hello"), wxString(_T("world")));
2881 #endif // TEST_REGCONF
2883 #ifdef TEST_REGISTRY
2885 #include "wx/msw/registry.h"
2887 // I chose this one because I liked its name, but it probably only exists under
2889 static const wxChar
*TESTKEY
=
2890 _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
2892 static void TestRegistryRead()
2894 wxPuts(_T("*** testing registry reading ***"));
2896 wxRegKey
key(TESTKEY
);
2897 wxPrintf(_T("The test key name is '%s'.\n"), key
.GetName().c_str());
2900 wxPuts(_T("ERROR: test key can't be opened, aborting test."));
2905 size_t nSubKeys
, nValues
;
2906 if ( key
.GetKeyInfo(&nSubKeys
, NULL
, &nValues
, NULL
) )
2908 wxPrintf(_T("It has %u subkeys and %u values.\n"), nSubKeys
, nValues
);
2911 wxPrintf(_T("Enumerating values:\n"));
2915 bool cont
= key
.GetFirstValue(value
, dummy
);
2918 wxPrintf(_T("Value '%s': type "), value
.c_str());
2919 switch ( key
.GetValueType(value
) )
2921 case wxRegKey::Type_None
: wxPrintf(_T("ERROR (none)")); break;
2922 case wxRegKey::Type_String
: wxPrintf(_T("SZ")); break;
2923 case wxRegKey::Type_Expand_String
: wxPrintf(_T("EXPAND_SZ")); break;
2924 case wxRegKey::Type_Binary
: wxPrintf(_T("BINARY")); break;
2925 case wxRegKey::Type_Dword
: wxPrintf(_T("DWORD")); break;
2926 case wxRegKey::Type_Multi_String
: wxPrintf(_T("MULTI_SZ")); break;
2927 default: wxPrintf(_T("other (unknown)")); break;
2930 wxPrintf(_T(", value = "));
2931 if ( key
.IsNumericValue(value
) )
2934 key
.QueryValue(value
, &val
);
2935 wxPrintf(_T("%ld"), val
);
2940 key
.QueryValue(value
, val
);
2941 wxPrintf(_T("'%s'"), val
.c_str());
2943 key
.QueryRawValue(value
, val
);
2944 wxPrintf(_T(" (raw value '%s')"), val
.c_str());
2949 cont
= key
.GetNextValue(value
, dummy
);
2953 static void TestRegistryAssociation()
2956 The second call to deleteself genertaes an error message, with a
2957 messagebox saying .flo is crucial to system operation, while the .ddf
2958 call also fails, but with no error message
2963 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
2965 key
= "ddxf_auto_file" ;
2966 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
2968 key
= "ddxf_auto_file" ;
2969 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
2972 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
2974 key
= "program \"%1\"" ;
2976 key
.SetName("HKEY_CLASSES_ROOT\\.ddf" );
2978 key
.SetName("HKEY_CLASSES_ROOT\\.flo" );
2980 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
2982 key
.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
2986 #endif // TEST_REGISTRY
2988 // ----------------------------------------------------------------------------
2990 // ----------------------------------------------------------------------------
2992 #include "wx/scopeguard.h"
2994 static void function0() { puts("function0()"); }
2995 static void function1(int n
) { printf("function1(%d)\n", n
); }
2996 static void function2(double x
, char c
) { printf("function2(%g, %c)\n", x
, c
); }
3000 void method0() { printf("method0()\n"); }
3001 void method1(int n
) { printf("method1(%d)\n", n
); }
3002 void method2(double x
, char c
) { printf("method2(%g, %c)\n", x
, c
); }
3005 static void TestScopeGuard()
3007 ON_BLOCK_EXIT0(function0
);
3008 ON_BLOCK_EXIT1(function1
, 17);
3009 ON_BLOCK_EXIT2(function2
, 3.14, 'p');
3012 ON_BLOCK_EXIT_OBJ0(obj
, Object::method0
);
3013 ON_BLOCK_EXIT_OBJ1(obj
, Object::method1
, 7);
3014 ON_BLOCK_EXIT_OBJ2(obj
, Object::method2
, 2.71, 'e');
3016 wxScopeGuard dismissed
= wxMakeGuard(function0
);
3017 dismissed
.Dismiss();
3020 // ----------------------------------------------------------------------------
3022 // ----------------------------------------------------------------------------
3026 #include "wx/socket.h"
3027 #include "wx/protocol/protocol.h"
3028 #include "wx/protocol/http.h"
3030 static void TestSocketServer()
3032 wxPuts(_T("*** Testing wxSocketServer ***\n"));
3034 static const int PORT
= 3000;
3039 wxSocketServer
*server
= new wxSocketServer(addr
);
3040 if ( !server
->Ok() )
3042 wxPuts(_T("ERROR: failed to bind"));
3050 wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT
);
3052 wxSocketBase
*socket
= server
->Accept();
3055 wxPuts(_T("ERROR: wxSocketServer::Accept() failed."));
3059 wxPuts(_T("Server: got a client."));
3061 server
->SetTimeout(60); // 1 min
3064 while ( !close
&& socket
->IsConnected() )
3067 wxChar ch
= _T('\0');
3070 if ( socket
->Read(&ch
, sizeof(ch
)).Error() )
3072 // don't log error if the client just close the connection
3073 if ( socket
->IsConnected() )
3075 wxPuts(_T("ERROR: in wxSocket::Read."));
3095 wxPrintf(_T("Server: got '%s'.\n"), s
.c_str());
3096 if ( s
== _T("close") )
3098 wxPuts(_T("Closing connection"));
3102 else if ( s
== _T("quit") )
3107 wxPuts(_T("Shutting down the server"));
3109 else // not a special command
3111 socket
->Write(s
.MakeUpper().c_str(), s
.length());
3112 socket
->Write("\r\n", 2);
3113 wxPrintf(_T("Server: wrote '%s'.\n"), s
.c_str());
3119 wxPuts(_T("Server: lost a client unexpectedly."));
3125 // same as "delete server" but is consistent with GUI programs
3129 static void TestSocketClient()
3131 wxPuts(_T("*** Testing wxSocketClient ***\n"));
3133 static const wxChar
*hostname
= _T("www.wxwindows.org");
3136 addr
.Hostname(hostname
);
3139 wxPrintf(_T("--- Attempting to connect to %s:80...\n"), hostname
);
3141 wxSocketClient client
;
3142 if ( !client
.Connect(addr
) )
3144 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3148 wxPrintf(_T("--- Connected to %s:%u...\n"),
3149 addr
.Hostname().c_str(), addr
.Service());
3153 // could use simply "GET" here I suppose
3155 wxString::Format(_T("GET http://%s/\r\n"), hostname
);
3156 client
.Write(cmdGet
, cmdGet
.length());
3157 wxPrintf(_T("--- Sent command '%s' to the server\n"),
3158 MakePrintable(cmdGet
).c_str());
3159 client
.Read(buf
, WXSIZEOF(buf
));
3160 wxPrintf(_T("--- Server replied:\n%s"), buf
);
3164 #endif // TEST_SOCKETS
3166 // ----------------------------------------------------------------------------
3168 // ----------------------------------------------------------------------------
3172 #include "wx/protocol/ftp.h"
3176 #define FTP_ANONYMOUS
3178 #ifdef FTP_ANONYMOUS
3179 static const wxChar
*directory
= _T("/pub");
3180 static const wxChar
*filename
= _T("welcome.msg");
3182 static const wxChar
*directory
= _T("/etc");
3183 static const wxChar
*filename
= _T("issue");
3186 static bool TestFtpConnect()
3188 wxPuts(_T("*** Testing FTP connect ***"));
3190 #ifdef FTP_ANONYMOUS
3191 static const wxChar
*hostname
= _T("ftp.wxwindows.org");
3193 wxPrintf(_T("--- Attempting to connect to %s:21 anonymously...\n"), hostname
);
3194 #else // !FTP_ANONYMOUS
3195 static const wxChar
*hostname
= "localhost";
3198 wxFgets(user
, WXSIZEOF(user
), stdin
);
3199 user
[wxStrlen(user
) - 1] = '\0'; // chop off '\n'
3202 wxChar password
[256];
3203 wxPrintf(_T("Password for %s: "), password
);
3204 wxFgets(password
, WXSIZEOF(password
), stdin
);
3205 password
[wxStrlen(password
) - 1] = '\0'; // chop off '\n'
3206 ftp
.SetPassword(password
);
3208 wxPrintf(_T("--- Attempting to connect to %s:21 as %s...\n"), hostname
, user
);
3209 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
3211 if ( !ftp
.Connect(hostname
) )
3213 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3219 wxPrintf(_T("--- Connected to %s, current directory is '%s'\n"),
3220 hostname
, ftp
.Pwd().c_str());
3226 // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
3227 static void TestFtpWuFtpd()
3230 static const wxChar
*hostname
= _T("ftp.eudora.com");
3231 if ( !ftp
.Connect(hostname
) )
3233 wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname
);
3237 static const wxChar
*filename
= _T("eudora/pubs/draft-gellens-submit-09.txt");
3238 wxInputStream
*in
= ftp
.GetInputStream(filename
);
3241 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
3245 size_t size
= in
->GetSize();
3246 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
3248 wxChar
*data
= new wxChar
[size
];
3249 if ( !in
->Read(data
, size
) )
3251 wxPuts(_T("ERROR: read error"));
3255 wxPrintf(_T("Successfully retrieved the file.\n"));
3264 static void TestFtpList()
3266 wxPuts(_T("*** Testing wxFTP file listing ***\n"));
3269 if ( !ftp
.ChDir(directory
) )
3271 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
3274 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3276 // test NLIST and LIST
3277 wxArrayString files
;
3278 if ( !ftp
.GetFilesList(files
) )
3280 wxPuts(_T("ERROR: failed to get NLIST of files"));
3284 wxPrintf(_T("Brief list of files under '%s':\n"), ftp
.Pwd().c_str());
3285 size_t count
= files
.GetCount();
3286 for ( size_t n
= 0; n
< count
; n
++ )
3288 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3290 wxPuts(_T("End of the file list"));
3293 if ( !ftp
.GetDirList(files
) )
3295 wxPuts(_T("ERROR: failed to get LIST of files"));
3299 wxPrintf(_T("Detailed list of files under '%s':\n"), ftp
.Pwd().c_str());
3300 size_t count
= files
.GetCount();
3301 for ( size_t n
= 0; n
< count
; n
++ )
3303 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3305 wxPuts(_T("End of the file list"));
3308 if ( !ftp
.ChDir(_T("..")) )
3310 wxPuts(_T("ERROR: failed to cd to .."));
3313 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3316 static void TestFtpDownload()
3318 wxPuts(_T("*** Testing wxFTP download ***\n"));
3321 wxInputStream
*in
= ftp
.GetInputStream(filename
);
3324 wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename
);
3328 size_t size
= in
->GetSize();
3329 wxPrintf(_T("Reading file %s (%u bytes)..."), filename
, size
);
3332 wxChar
*data
= new wxChar
[size
];
3333 if ( !in
->Read(data
, size
) )
3335 wxPuts(_T("ERROR: read error"));
3339 wxPrintf(_T("\nContents of %s:\n%s\n"), filename
, data
);
3347 static void TestFtpFileSize()
3349 wxPuts(_T("*** Testing FTP SIZE command ***"));
3351 if ( !ftp
.ChDir(directory
) )
3353 wxPrintf(_T("ERROR: failed to cd to %s\n"), directory
);
3356 wxPrintf(_T("Current directory is '%s'\n"), ftp
.Pwd().c_str());
3358 if ( ftp
.FileExists(filename
) )
3360 int size
= ftp
.GetFileSize(filename
);
3362 wxPrintf(_T("ERROR: couldn't get size of '%s'\n"), filename
);
3364 wxPrintf(_T("Size of '%s' is %d bytes.\n"), filename
, size
);
3368 wxPrintf(_T("ERROR: '%s' doesn't exist\n"), filename
);
3372 static void TestFtpMisc()
3374 wxPuts(_T("*** Testing miscellaneous wxFTP functions ***"));
3376 if ( ftp
.SendCommand("STAT") != '2' )
3378 wxPuts(_T("ERROR: STAT failed"));
3382 wxPrintf(_T("STAT returned:\n\n%s\n"), ftp
.GetLastResult().c_str());
3385 if ( ftp
.SendCommand("HELP SITE") != '2' )
3387 wxPuts(_T("ERROR: HELP SITE failed"));
3391 wxPrintf(_T("The list of site-specific commands:\n\n%s\n"),
3392 ftp
.GetLastResult().c_str());
3396 static void TestFtpInteractive()
3398 wxPuts(_T("\n*** Interactive wxFTP test ***"));
3404 wxPrintf(_T("Enter FTP command: "));
3405 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
3408 // kill the last '\n'
3409 buf
[wxStrlen(buf
) - 1] = 0;
3411 // special handling of LIST and NLST as they require data connection
3412 wxString
start(buf
, 4);
3414 if ( start
== "LIST" || start
== "NLST" )
3417 if ( wxStrlen(buf
) > 4 )
3420 wxArrayString files
;
3421 if ( !ftp
.GetList(files
, wildcard
, start
== "LIST") )
3423 wxPrintf(_T("ERROR: failed to get %s of files\n"), start
.c_str());
3427 wxPrintf(_T("--- %s of '%s' under '%s':\n"),
3428 start
.c_str(), wildcard
.c_str(), ftp
.Pwd().c_str());
3429 size_t count
= files
.GetCount();
3430 for ( size_t n
= 0; n
< count
; n
++ )
3432 wxPrintf(_T("\t%s\n"), files
[n
].c_str());
3434 wxPuts(_T("--- End of the file list"));
3439 wxChar ch
= ftp
.SendCommand(buf
);
3440 wxPrintf(_T("Command %s"), ch
? _T("succeeded") : _T("failed"));
3443 wxPrintf(_T(" (return code %c)"), ch
);
3446 wxPrintf(_T(", server reply:\n%s\n\n"), ftp
.GetLastResult().c_str());
3450 wxPuts(_T("\n*** done ***"));
3453 static void TestFtpUpload()
3455 wxPuts(_T("*** Testing wxFTP uploading ***\n"));
3458 static const wxChar
*file1
= _T("test1");
3459 static const wxChar
*file2
= _T("test2");
3460 wxOutputStream
*out
= ftp
.GetOutputStream(file1
);
3463 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
3464 out
->Write("First hello", 11);
3468 // send a command to check the remote file
3469 if ( ftp
.SendCommand(wxString("STAT ") + file1
) != '2' )
3471 wxPrintf(_T("ERROR: STAT %s failed\n"), file1
);
3475 wxPrintf(_T("STAT %s returned:\n\n%s\n"),
3476 file1
, ftp
.GetLastResult().c_str());
3479 out
= ftp
.GetOutputStream(file2
);
3482 wxPrintf(_T("--- Uploading to %s ---\n"), file1
);
3483 out
->Write("Second hello", 12);
3490 // ----------------------------------------------------------------------------
3492 // ----------------------------------------------------------------------------
3496 #include "wx/wfstream.h"
3497 #include "wx/mstream.h"
3499 static void TestFileStream()
3501 wxPuts(_T("*** Testing wxFileInputStream ***"));
3503 static const wxChar
*filename
= _T("testdata.fs");
3505 wxFileOutputStream
fsOut(filename
);
3506 fsOut
.Write("foo", 3);
3509 wxFileInputStream
fsIn(filename
);
3510 wxPrintf(_T("File stream size: %u\n"), fsIn
.GetSize());
3511 while ( !fsIn
.Eof() )
3513 putchar(fsIn
.GetC());
3516 if ( !wxRemoveFile(filename
) )
3518 wxPrintf(_T("ERROR: failed to remove the file '%s'.\n"), filename
);
3521 wxPuts(_T("\n*** wxFileInputStream test done ***"));
3524 static void TestMemoryStream()
3526 wxPuts(_T("*** Testing wxMemoryOutputStream ***"));
3528 wxMemoryOutputStream memOutStream
;
3529 wxPrintf(_T("Initially out stream offset: %lu\n"),
3530 (unsigned long)memOutStream
.TellO());
3532 for ( const wxChar
*p
= _T("Hello, stream!"); *p
; p
++ )
3534 memOutStream
.PutC(*p
);
3537 wxPrintf(_T("Final out stream offset: %lu\n"),
3538 (unsigned long)memOutStream
.TellO());
3540 wxPuts(_T("*** Testing wxMemoryInputStream ***"));
3543 size_t len
= memOutStream
.CopyTo(buf
, WXSIZEOF(buf
));
3545 wxMemoryInputStream
memInpStream(buf
, len
);
3546 wxPrintf(_T("Memory stream size: %u\n"), memInpStream
.GetSize());
3547 while ( !memInpStream
.Eof() )
3549 putchar(memInpStream
.GetC());
3552 wxPuts(_T("\n*** wxMemoryInputStream test done ***"));
3555 #endif // TEST_STREAMS
3557 // ----------------------------------------------------------------------------
3559 // ----------------------------------------------------------------------------
3563 #include "wx/timer.h"
3564 #include "wx/utils.h"
3566 static void TestStopWatch()
3568 wxPuts(_T("*** Testing wxStopWatch ***\n"));
3572 wxPrintf(_T("Initially paused, after 2 seconds time is..."));
3575 wxPrintf(_T("\t%ldms\n"), sw
.Time());
3577 wxPrintf(_T("Resuming stopwatch and sleeping 3 seconds..."));
3581 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3584 wxPrintf(_T("Pausing agan and sleeping 2 more seconds..."));
3587 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3590 wxPrintf(_T("Finally resuming and sleeping 2 more seconds..."));
3593 wxPrintf(_T("\telapsed time: %ldms\n"), sw
.Time());
3596 wxPuts(_T("\nChecking for 'backwards clock' bug..."));
3597 for ( size_t n
= 0; n
< 70; n
++ )
3601 for ( size_t m
= 0; m
< 100000; m
++ )
3603 if ( sw
.Time() < 0 || sw2
.Time() < 0 )
3605 wxPuts(_T("\ntime is negative - ERROR!"));
3613 wxPuts(_T(", ok."));
3616 #endif // TEST_TIMER
3618 // ----------------------------------------------------------------------------
3620 // ----------------------------------------------------------------------------
3624 #include "wx/vcard.h"
3626 static void DumpVObject(size_t level
, const wxVCardObject
& vcard
)
3629 wxVCardObject
*vcObj
= vcard
.GetFirstProp(&cookie
);
3632 wxPrintf(_T("%s%s"),
3633 wxString(_T('\t'), level
).c_str(),
3634 vcObj
->GetName().c_str());
3637 switch ( vcObj
->GetType() )
3639 case wxVCardObject::String
:
3640 case wxVCardObject::UString
:
3643 vcObj
->GetValue(&val
);
3644 value
<< _T('"') << val
<< _T('"');
3648 case wxVCardObject::Int
:
3651 vcObj
->GetValue(&i
);
3652 value
.Printf(_T("%u"), i
);
3656 case wxVCardObject::Long
:
3659 vcObj
->GetValue(&l
);
3660 value
.Printf(_T("%lu"), l
);
3664 case wxVCardObject::None
:
3667 case wxVCardObject::Object
:
3668 value
= _T("<node>");
3672 value
= _T("<unknown value type>");
3676 wxPrintf(_T(" = %s"), value
.c_str());
3679 DumpVObject(level
+ 1, *vcObj
);
3682 vcObj
= vcard
.GetNextProp(&cookie
);
3686 static void DumpVCardAddresses(const wxVCard
& vcard
)
3688 wxPuts(_T("\nShowing all addresses from vCard:\n"));
3692 wxVCardAddress
*addr
= vcard
.GetFirstAddress(&cookie
);
3696 int flags
= addr
->GetFlags();
3697 if ( flags
& wxVCardAddress::Domestic
)
3699 flagsStr
<< _T("domestic ");
3701 if ( flags
& wxVCardAddress::Intl
)
3703 flagsStr
<< _T("international ");
3705 if ( flags
& wxVCardAddress::Postal
)
3707 flagsStr
<< _T("postal ");
3709 if ( flags
& wxVCardAddress::Parcel
)
3711 flagsStr
<< _T("parcel ");
3713 if ( flags
& wxVCardAddress::Home
)
3715 flagsStr
<< _T("home ");
3717 if ( flags
& wxVCardAddress::Work
)
3719 flagsStr
<< _T("work ");
3722 wxPrintf(_T("Address %u:\n")
3724 "\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
3727 addr
->GetPostOffice().c_str(),
3728 addr
->GetExtAddress().c_str(),
3729 addr
->GetStreet().c_str(),
3730 addr
->GetLocality().c_str(),
3731 addr
->GetRegion().c_str(),
3732 addr
->GetPostalCode().c_str(),
3733 addr
->GetCountry().c_str()
3737 addr
= vcard
.GetNextAddress(&cookie
);
3741 static void DumpVCardPhoneNumbers(const wxVCard
& vcard
)
3743 wxPuts(_T("\nShowing all phone numbers from vCard:\n"));
3747 wxVCardPhoneNumber
*phone
= vcard
.GetFirstPhoneNumber(&cookie
);
3751 int flags
= phone
->GetFlags();
3752 if ( flags
& wxVCardPhoneNumber::Voice
)
3754 flagsStr
<< _T("voice ");
3756 if ( flags
& wxVCardPhoneNumber::Fax
)
3758 flagsStr
<< _T("fax ");
3760 if ( flags
& wxVCardPhoneNumber::Cellular
)
3762 flagsStr
<< _T("cellular ");
3764 if ( flags
& wxVCardPhoneNumber::Modem
)
3766 flagsStr
<< _T("modem ");
3768 if ( flags
& wxVCardPhoneNumber::Home
)
3770 flagsStr
<< _T("home ");
3772 if ( flags
& wxVCardPhoneNumber::Work
)
3774 flagsStr
<< _T("work ");
3777 wxPrintf(_T("Phone number %u:\n")
3782 phone
->GetNumber().c_str()
3786 phone
= vcard
.GetNextPhoneNumber(&cookie
);
3790 static void TestVCardRead()
3792 wxPuts(_T("*** Testing wxVCard reading ***\n"));
3794 wxVCard
vcard(_T("vcard.vcf"));
3795 if ( !vcard
.IsOk() )
3797 wxPuts(_T("ERROR: couldn't load vCard."));
3801 // read individual vCard properties
3802 wxVCardObject
*vcObj
= vcard
.GetProperty("FN");
3806 vcObj
->GetValue(&value
);
3811 value
= _T("<none>");
3814 wxPrintf(_T("Full name retrieved directly: %s\n"), value
.c_str());
3817 if ( !vcard
.GetFullName(&value
) )
3819 value
= _T("<none>");
3822 wxPrintf(_T("Full name from wxVCard API: %s\n"), value
.c_str());
3824 // now show how to deal with multiply occuring properties
3825 DumpVCardAddresses(vcard
);
3826 DumpVCardPhoneNumbers(vcard
);
3828 // and finally show all
3829 wxPuts(_T("\nNow dumping the entire vCard:\n")
3830 "-----------------------------\n");
3832 DumpVObject(0, vcard
);
3836 static void TestVCardWrite()
3838 wxPuts(_T("*** Testing wxVCard writing ***\n"));
3841 if ( !vcard
.IsOk() )
3843 wxPuts(_T("ERROR: couldn't create vCard."));
3848 vcard
.SetName("Zeitlin", "Vadim");
3849 vcard
.SetFullName("Vadim Zeitlin");
3850 vcard
.SetOrganization("wxWindows", "R&D");
3852 // just dump the vCard back
3853 wxPuts(_T("Entire vCard follows:\n"));
3854 wxPuts(vcard
.Write());
3858 #endif // TEST_VCARD
3860 // ----------------------------------------------------------------------------
3862 // ----------------------------------------------------------------------------
3864 #if !defined(__WIN32__) || !wxUSE_FSVOLUME
3870 #include "wx/volume.h"
3872 static const wxChar
*volumeKinds
[] =
3878 _T("network volume"),
3882 static void TestFSVolume()
3884 wxPuts(_T("*** Testing wxFSVolume class ***"));
3886 wxArrayString volumes
= wxFSVolume::GetVolumes();
3887 size_t count
= volumes
.GetCount();
3891 wxPuts(_T("ERROR: no mounted volumes?"));
3895 wxPrintf(_T("%u mounted volumes found:\n"), count
);
3897 for ( size_t n
= 0; n
< count
; n
++ )
3899 wxFSVolume
vol(volumes
[n
]);
3902 wxPuts(_T("ERROR: couldn't create volume"));
3906 wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
3908 vol
.GetDisplayName().c_str(),
3909 vol
.GetName().c_str(),
3910 volumeKinds
[vol
.GetKind()],
3911 vol
.IsWritable() ? _T("rw") : _T("ro"),
3912 vol
.GetFlags() & wxFS_VOL_REMOVABLE
? _T("removable")
3917 #endif // TEST_VOLUME
3919 // ----------------------------------------------------------------------------
3920 // wide char and Unicode support
3921 // ----------------------------------------------------------------------------
3925 static void TestUnicodeToFromAscii()
3927 wxPuts(_T("Testing wxString::To/FromAscii()\n"));
3929 static const char *msg
= "Hello, world!";
3930 wxString s
= wxString::FromAscii(msg
);
3932 wxPrintf(_T("Message in Unicode: %s\n"), s
.c_str());
3933 printf("Message in ASCII: %s\n", (const char *)s
.ToAscii());
3935 wxPutchar(_T('\n'));
3938 #endif // TEST_UNICODE
3942 #include "wx/strconv.h"
3943 #include "wx/fontenc.h"
3944 #include "wx/encconv.h"
3945 #include "wx/buffer.h"
3947 static const unsigned char utf8koi8r
[] =
3949 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
3950 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
3951 176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
3952 208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
3953 181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
3954 208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
3955 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
3958 static const unsigned char utf8iso8859_1
[] =
3960 0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e,
3961 0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65,
3962 0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65,
3963 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65,
3964 0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0
3967 static const unsigned char utf8Invalid
[] =
3969 0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30,
3970 0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6,
3971 0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88,
3972 0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70,
3976 static const struct Utf8Data
3978 const unsigned char *text
;
3980 const wxChar
*charset
;
3981 wxFontEncoding encoding
;
3984 { utf8Invalid
, WXSIZEOF(utf8Invalid
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3985 { utf8koi8r
, WXSIZEOF(utf8koi8r
), _T("koi8-r"), wxFONTENCODING_KOI8
},
3986 { utf8iso8859_1
, WXSIZEOF(utf8iso8859_1
), _T("iso8859-1"), wxFONTENCODING_ISO8859_1
},
3989 static void TestUtf8()
3991 wxPuts(_T("*** Testing UTF8 support ***\n"));
3996 for ( size_t n
= 0; n
< WXSIZEOF(utf8data
); n
++ )
3998 const Utf8Data
& u8d
= utf8data
[n
];
3999 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)u8d
.text
,
4000 WXSIZEOF(wbuf
)) == (size_t)-1 )
4002 wxPuts(_T("ERROR: UTF-8 decoding failed."));
4006 wxCSConv
conv(u8d
.charset
);
4007 if ( conv
.WC2MB(buf
, wbuf
, WXSIZEOF(buf
)) == (size_t)-1 )
4009 wxPrintf(_T("ERROR: conversion to %s failed.\n"), u8d
.charset
);
4013 wxPrintf(_T("String in %s: %s\n"), u8d
.charset
, buf
);
4017 wxString
s(wxConvUTF8
.cMB2WC((const char *)u8d
.text
), *wxConvCurrent
);
4019 s
= _T("<< conversion failed >>");
4020 wxPrintf(_T("String in current cset: %s\n"), s
.c_str());
4027 static void TestEncodingConverter()
4029 wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
4031 // using wxEncodingConverter should give the same result as above
4034 if ( wxConvUTF8
.MB2WC(wbuf
, (const char *)utf8koi8r
,
4035 WXSIZEOF(utf8koi8r
)) == (size_t)-1 )
4037 wxPuts(_T("ERROR: UTF-8 decoding failed."));
4041 wxEncodingConverter ec
;
4042 ec
.Init(wxFONTENCODING_UNICODE
, wxFONTENCODING_KOI8
);
4043 ec
.Convert(wbuf
, buf
);
4044 wxPrintf(_T("The same KOI8-R string using wxEC: %s\n"), buf
);
4050 #endif // TEST_WCHAR
4052 // ----------------------------------------------------------------------------
4054 // ----------------------------------------------------------------------------
4058 #include "wx/filesys.h"
4059 #include "wx/fs_zip.h"
4060 #include "wx/zipstrm.h"
4062 static const wxChar
*TESTFILE_ZIP
= _T("testdata.zip");
4064 static void TestZipStreamRead()
4066 wxPuts(_T("*** Testing ZIP reading ***\n"));
4068 static const wxChar
*filename
= _T("foo");
4069 wxZipInputStream
istr(TESTFILE_ZIP
, filename
);
4070 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
4072 wxPrintf(_T("Dumping the file '%s':\n"), filename
);
4073 while ( !istr
.Eof() )
4075 putchar(istr
.GetC());
4079 wxPuts(_T("\n----- done ------"));
4082 static void DumpZipDirectory(wxFileSystem
& fs
,
4083 const wxString
& dir
,
4084 const wxString
& indent
)
4086 wxString prefix
= wxString::Format(_T("%s#zip:%s"),
4087 TESTFILE_ZIP
, dir
.c_str());
4088 wxString wildcard
= prefix
+ _T("/*");
4090 wxString dirname
= fs
.FindFirst(wildcard
, wxDIR
);
4091 while ( !dirname
.empty() )
4093 if ( !dirname
.StartsWith(prefix
+ _T('/'), &dirname
) )
4095 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
4100 wxPrintf(_T("%s%s\n"), indent
.c_str(), dirname
.c_str());
4102 DumpZipDirectory(fs
, dirname
,
4103 indent
+ wxString(_T(' '), 4));
4105 dirname
= fs
.FindNext();
4108 wxString filename
= fs
.FindFirst(wildcard
, wxFILE
);
4109 while ( !filename
.empty() )
4111 if ( !filename
.StartsWith(prefix
, &filename
) )
4113 wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
4118 wxPrintf(_T("%s%s\n"), indent
.c_str(), filename
.c_str());
4120 filename
= fs
.FindNext();
4124 static void TestZipFileSystem()
4126 wxPuts(_T("*** Testing ZIP file system ***\n"));
4128 wxFileSystem::AddHandler(new wxZipFSHandler
);
4130 wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP
);
4132 DumpZipDirectory(fs
, _T(""), wxString(_T(' '), 4));
4137 // ----------------------------------------------------------------------------
4139 // ----------------------------------------------------------------------------
4143 #include "wx/zstream.h"
4144 #include "wx/wfstream.h"
4146 static const wxChar
*FILENAME_GZ
= _T("test.gz");
4147 static const wxChar
*TEST_DATA
= _T("hello and hello and hello and hello and hello");
4149 static void TestZlibStreamWrite()
4151 wxPuts(_T("*** Testing Zlib stream reading ***\n"));
4153 wxFileOutputStream
fileOutStream(FILENAME_GZ
);
4154 wxZlibOutputStream
ostr(fileOutStream
);
4155 wxPrintf(_T("Compressing the test string... "));
4156 ostr
.Write(TEST_DATA
, wxStrlen(TEST_DATA
) + 1);
4159 wxPuts(_T("(ERROR: failed)"));
4166 wxPuts(_T("\n----- done ------"));
4169 static void TestZlibStreamRead()
4171 wxPuts(_T("*** Testing Zlib stream reading ***\n"));
4173 wxFileInputStream
fileInStream(FILENAME_GZ
);
4174 wxZlibInputStream
istr(fileInStream
);
4175 wxPrintf(_T("Archive size: %u\n"), istr
.GetSize());
4177 wxPuts(_T("Dumping the file:"));
4178 while ( !istr
.Eof() )
4180 putchar(istr
.GetC());
4184 wxPuts(_T("\n----- done ------"));
4189 // ----------------------------------------------------------------------------
4191 // ----------------------------------------------------------------------------
4193 #ifdef TEST_DATETIME
4197 #include "wx/datetime.h"
4202 wxDateTime::wxDateTime_t day
;
4203 wxDateTime::Month month
;
4205 wxDateTime::wxDateTime_t hour
, min
, sec
;
4207 wxDateTime::WeekDay wday
;
4208 time_t gmticks
, ticks
;
4210 void Init(const wxDateTime::Tm
& tm
)
4219 gmticks
= ticks
= -1;
4222 wxDateTime
DT() const
4223 { return wxDateTime(day
, month
, year
, hour
, min
, sec
); }
4225 bool SameDay(const wxDateTime::Tm
& tm
) const
4227 return day
== tm
.mday
&& month
== tm
.mon
&& year
== tm
.year
;
4230 wxString
Format() const
4233 s
.Printf(_T("%02d:%02d:%02d %10s %02d, %4d%s"),
4235 wxDateTime::GetMonthName(month
).c_str(),
4237 abs(wxDateTime::ConvertYearToBC(year
)),
4238 year
> 0 ? _T("AD") : _T("BC"));
4242 wxString
FormatDate() const
4245 s
.Printf(_T("%02d-%s-%4d%s"),
4247 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
4248 abs(wxDateTime::ConvertYearToBC(year
)),
4249 year
> 0 ? _T("AD") : _T("BC"));
4254 static const Date testDates
[] =
4256 { 1, wxDateTime::Jan
, 1970, 00, 00, 00, 2440587.5, wxDateTime::Thu
, 0, -3600 },
4257 { 7, wxDateTime::Feb
, 2036, 00, 00, 00, 2464730.5, wxDateTime::Thu
, -1, -1 },
4258 { 8, wxDateTime::Feb
, 2036, 00, 00, 00, 2464731.5, wxDateTime::Fri
, -1, -1 },
4259 { 1, wxDateTime::Jan
, 2037, 00, 00, 00, 2465059.5, wxDateTime::Thu
, -1, -1 },
4260 { 1, wxDateTime::Jan
, 2038, 00, 00, 00, 2465424.5, wxDateTime::Fri
, -1, -1 },
4261 { 21, wxDateTime::Jan
, 2222, 00, 00, 00, 2532648.5, wxDateTime::Mon
, -1, -1 },
4262 { 29, wxDateTime::May
, 1976, 12, 00, 00, 2442928.0, wxDateTime::Sat
, 202219200, 202212000 },
4263 { 29, wxDateTime::Feb
, 1976, 00, 00, 00, 2442837.5, wxDateTime::Sun
, 194400000, 194396400 },
4264 { 1, wxDateTime::Jan
, 1900, 12, 00, 00, 2415021.0, wxDateTime::Mon
, -1, -1 },
4265 { 1, wxDateTime::Jan
, 1900, 00, 00, 00, 2415020.5, wxDateTime::Mon
, -1, -1 },
4266 { 15, wxDateTime::Oct
, 1582, 00, 00, 00, 2299160.5, wxDateTime::Fri
, -1, -1 },
4267 { 4, wxDateTime::Oct
, 1582, 00, 00, 00, 2299149.5, wxDateTime::Mon
, -1, -1 },
4268 { 1, wxDateTime::Mar
, 1, 00, 00, 00, 1721484.5, wxDateTime::Thu
, -1, -1 },
4269 { 1, wxDateTime::Jan
, 1, 00, 00, 00, 1721425.5, wxDateTime::Mon
, -1, -1 },
4270 { 31, wxDateTime::Dec
, 0, 00, 00, 00, 1721424.5, wxDateTime::Sun
, -1, -1 },
4271 { 1, wxDateTime::Jan
, 0, 00, 00, 00, 1721059.5, wxDateTime::Sat
, -1, -1 },
4272 { 12, wxDateTime::Aug
, -1234, 00, 00, 00, 1270573.5, wxDateTime::Fri
, -1, -1 },
4273 { 12, wxDateTime::Aug
, -4000, 00, 00, 00, 260313.5, wxDateTime::Sat
, -1, -1 },
4274 { 24, wxDateTime::Nov
, -4713, 00, 00, 00, -0.5, wxDateTime::Mon
, -1, -1 },
4277 // this test miscellaneous static wxDateTime functions
4278 static void TestTimeStatic()
4280 wxPuts(_T("\n*** wxDateTime static methods test ***"));
4282 // some info about the current date
4283 int year
= wxDateTime::GetCurrentYear();
4284 wxPrintf(_T("Current year %d is %sa leap one and has %d days.\n"),
4286 wxDateTime::IsLeapYear(year
) ? "" : "not ",
4287 wxDateTime::GetNumberOfDays(year
));
4289 wxDateTime::Month month
= wxDateTime::GetCurrentMonth();
4290 wxPrintf(_T("Current month is '%s' ('%s') and it has %d days\n"),
4291 wxDateTime::GetMonthName(month
, wxDateTime::Name_Abbr
).c_str(),
4292 wxDateTime::GetMonthName(month
).c_str(),
4293 wxDateTime::GetNumberOfDays(month
));
4296 static const size_t nYears
= 5;
4297 static const size_t years
[2][nYears
] =
4299 // first line: the years to test
4300 { 1990, 1976, 2000, 2030, 1984, },
4302 // second line: true if leap, false otherwise
4303 { false, true, true, false, true }
4306 for ( size_t n
= 0; n
< nYears
; n
++ )
4308 int year
= years
[0][n
];
4309 bool should
= years
[1][n
] != 0,
4310 is
= wxDateTime::IsLeapYear(year
);
4312 wxPrintf(_T("Year %d is %sa leap year (%s)\n"),
4315 should
== is
? "ok" : "ERROR");
4317 wxASSERT( should
== wxDateTime::IsLeapYear(year
) );
4321 // test constructing wxDateTime objects
4322 static void TestTimeSet()
4324 wxPuts(_T("\n*** wxDateTime construction test ***"));
4326 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4328 const Date
& d1
= testDates
[n
];
4329 wxDateTime dt
= d1
.DT();
4332 d2
.Init(dt
.GetTm());
4334 wxString s1
= d1
.Format(),
4337 wxPrintf(_T("Date: %s == %s (%s)\n"),
4338 s1
.c_str(), s2
.c_str(),
4339 s1
== s2
? _T("ok") : _T("ERROR"));
4343 // test time zones stuff
4344 static void TestTimeZones()
4346 wxPuts(_T("\n*** wxDateTime timezone test ***"));
4348 wxDateTime now
= wxDateTime::Now();
4350 wxPrintf(_T("Current GMT time:\t%s\n"), now
.Format(_T("%c"), wxDateTime::GMT0
).c_str());
4351 wxPrintf(_T("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::GMT0
).c_str());
4352 wxPrintf(_T("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::EST
).c_str());
4353 wxPrintf(_T("Current time in Paris:\t%s\n"), now
.Format(_T("%c"), wxDateTime::CET
).c_str());
4354 wxPrintf(_T(" Moscow:\t%s\n"), now
.Format(_T("%c"), wxDateTime::MSK
).c_str());
4355 wxPrintf(_T(" New York:\t%s\n"), now
.Format(_T("%c"), wxDateTime::EST
).c_str());
4357 wxDateTime::Tm tm
= now
.GetTm();
4358 if ( wxDateTime(tm
) != now
)
4360 wxPrintf(_T("ERROR: got %s instead of %s\n"),
4361 wxDateTime(tm
).Format().c_str(), now
.Format().c_str());
4365 // test some minimal support for the dates outside the standard range
4366 static void TestTimeRange()
4368 wxPuts(_T("\n*** wxDateTime out-of-standard-range dates test ***"));
4370 static const wxChar
*fmt
= _T("%d-%b-%Y %H:%M:%S");
4372 wxPrintf(_T("Unix epoch:\t%s\n"),
4373 wxDateTime(2440587.5).Format(fmt
).c_str());
4374 wxPrintf(_T("Feb 29, 0: \t%s\n"),
4375 wxDateTime(29, wxDateTime::Feb
, 0).Format(fmt
).c_str());
4376 wxPrintf(_T("JDN 0: \t%s\n"),
4377 wxDateTime(0.0).Format(fmt
).c_str());
4378 wxPrintf(_T("Jan 1, 1AD:\t%s\n"),
4379 wxDateTime(1, wxDateTime::Jan
, 1).Format(fmt
).c_str());
4380 wxPrintf(_T("May 29, 2099:\t%s\n"),
4381 wxDateTime(29, wxDateTime::May
, 2099).Format(fmt
).c_str());
4384 static void TestTimeTicks()
4386 wxPuts(_T("\n*** wxDateTime ticks test ***"));
4388 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4390 const Date
& d
= testDates
[n
];
4391 if ( d
.ticks
== -1 )
4394 wxDateTime dt
= d
.DT();
4395 long ticks
= (dt
.GetValue() / 1000).ToLong();
4396 wxPrintf(_T("Ticks of %s:\t% 10ld"), d
.Format().c_str(), ticks
);
4397 if ( ticks
== d
.ticks
)
4399 wxPuts(_T(" (ok)"));
4403 wxPrintf(_T(" (ERROR: should be %ld, delta = %ld)\n"),
4404 (long)d
.ticks
, (long)(ticks
- d
.ticks
));
4407 dt
= d
.DT().ToTimezone(wxDateTime::GMT0
);
4408 ticks
= (dt
.GetValue() / 1000).ToLong();
4409 wxPrintf(_T("GMtks of %s:\t% 10ld"), d
.Format().c_str(), ticks
);
4410 if ( ticks
== d
.gmticks
)
4412 wxPuts(_T(" (ok)"));
4416 wxPrintf(_T(" (ERROR: should be %ld, delta = %ld)\n"),
4417 (long)d
.gmticks
, (long)(ticks
- d
.gmticks
));
4424 // test conversions to JDN &c
4425 static void TestTimeJDN()
4427 wxPuts(_T("\n*** wxDateTime to JDN test ***"));
4429 for ( size_t n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4431 const Date
& d
= testDates
[n
];
4432 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
4433 double jdn
= dt
.GetJulianDayNumber();
4435 wxPrintf(_T("JDN of %s is:\t% 15.6f"), d
.Format().c_str(), jdn
);
4438 wxPuts(_T(" (ok)"));
4442 wxPrintf(_T(" (ERROR: should be %f, delta = %f)\n"),
4443 d
.jdn
, jdn
- d
.jdn
);
4448 // test week days computation
4449 static void TestTimeWDays()
4451 wxPuts(_T("\n*** wxDateTime weekday test ***"));
4453 // test GetWeekDay()
4455 for ( n
= 0; n
< WXSIZEOF(testDates
); n
++ )
4457 const Date
& d
= testDates
[n
];
4458 wxDateTime
dt(d
.day
, d
.month
, d
.year
, d
.hour
, d
.min
, d
.sec
);
4460 wxDateTime::WeekDay wday
= dt
.GetWeekDay();
4461 wxPrintf(_T("%s is: %s"),
4463 wxDateTime::GetWeekDayName(wday
).c_str());
4464 if ( wday
== d
.wday
)
4466 wxPuts(_T(" (ok)"));
4470 wxPrintf(_T(" (ERROR: should be %s)\n"),
4471 wxDateTime::GetWeekDayName(d
.wday
).c_str());
4477 // test SetToWeekDay()
4478 struct WeekDateTestData
4480 Date date
; // the real date (precomputed)
4481 int nWeek
; // its week index in the month
4482 wxDateTime::WeekDay wday
; // the weekday
4483 wxDateTime::Month month
; // the month
4484 int year
; // and the year
4486 wxString
Format() const
4489 switch ( nWeek
< -1 ? -nWeek
: nWeek
)
4491 case 1: which
= _T("first"); break;
4492 case 2: which
= _T("second"); break;
4493 case 3: which
= _T("third"); break;
4494 case 4: which
= _T("fourth"); break;
4495 case 5: which
= _T("fifth"); break;
4497 case -1: which
= _T("last"); break;
4502 which
+= _T(" from end");
4505 s
.Printf(_T("The %s %s of %s in %d"),
4507 wxDateTime::GetWeekDayName(wday
).c_str(),
4508 wxDateTime::GetMonthName(month
).c_str(),
4515 // the array data was generated by the following python program
4517 from DateTime import *
4518 from whrandom import *
4519 from string import *
4521 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4522 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4524 week = DateTimeDelta(7)
4527 year = randint(1900, 2100)
4528 month = randint(1, 12)
4529 day = randint(1, 28)
4530 dt = DateTime(year, month, day)
4531 wday = dt.day_of_week
4533 countFromEnd = choice([-1, 1])
4536 while dt.month is month:
4537 dt = dt - countFromEnd * week
4538 weekNum = weekNum + countFromEnd
4540 data = { 'day': rjust(`day`, 2), 'month': monthNames[month - 1], 'year': year, 'weekNum': rjust(`weekNum`, 2), 'wday': wdayNames[wday] }
4542 print "{ { %(day)s, wxDateTime::%(month)s, %(year)d }, %(weekNum)d, "\
4543 "wxDateTime::%(wday)s, wxDateTime::%(month)s, %(year)d }," % data
4546 static const WeekDateTestData weekDatesTestData
[] =
4548 { { 20, wxDateTime::Mar
, 2045 }, 3, wxDateTime::Mon
, wxDateTime::Mar
, 2045 },
4549 { { 5, wxDateTime::Jun
, 1985 }, -4, wxDateTime::Wed
, wxDateTime::Jun
, 1985 },
4550 { { 12, wxDateTime::Nov
, 1961 }, -3, wxDateTime::Sun
, wxDateTime::Nov
, 1961 },
4551 { { 27, wxDateTime::Feb
, 2093 }, -1, wxDateTime::Fri
, wxDateTime::Feb
, 2093 },
4552 { { 4, wxDateTime::Jul
, 2070 }, -4, wxDateTime::Fri
, wxDateTime::Jul
, 2070 },
4553 { { 2, wxDateTime::Apr
, 1906 }, -5, wxDateTime::Mon
, wxDateTime::Apr
, 1906 },
4554 { { 19, wxDateTime::Jul
, 2023 }, -2, wxDateTime::Wed
, wxDateTime::Jul
, 2023 },
4555 { { 5, wxDateTime::May
, 1958 }, -4, wxDateTime::Mon
, wxDateTime::May
, 1958 },
4556 { { 11, wxDateTime::Aug
, 1900 }, 2, wxDateTime::Sat
, wxDateTime::Aug
, 1900 },
4557 { { 14, wxDateTime::Feb
, 1945 }, 2, wxDateTime::Wed
, wxDateTime::Feb
, 1945 },
4558 { { 25, wxDateTime::Jul
, 1967 }, -1, wxDateTime::Tue
, wxDateTime::Jul
, 1967 },
4559 { { 9, wxDateTime::May
, 1916 }, -4, wxDateTime::Tue
, wxDateTime::May
, 1916 },
4560 { { 20, wxDateTime::Jun
, 1927 }, 3, wxDateTime::Mon
, wxDateTime::Jun
, 1927 },
4561 { { 2, wxDateTime::Aug
, 2000 }, 1, wxDateTime::Wed
, wxDateTime::Aug
, 2000 },
4562 { { 20, wxDateTime::Apr
, 2044 }, 3, wxDateTime::Wed
, wxDateTime::Apr
, 2044 },
4563 { { 20, wxDateTime::Feb
, 1932 }, -2, wxDateTime::Sat
, wxDateTime::Feb
, 1932 },
4564 { { 25, wxDateTime::Jul
, 2069 }, 4, wxDateTime::Thu
, wxDateTime::Jul
, 2069 },
4565 { { 3, wxDateTime::Apr
, 1925 }, 1, wxDateTime::Fri
, wxDateTime::Apr
, 1925 },
4566 { { 21, wxDateTime::Mar
, 2093 }, 3, wxDateTime::Sat
, wxDateTime::Mar
, 2093 },
4567 { { 3, wxDateTime::Dec
, 2074 }, -5, wxDateTime::Mon
, wxDateTime::Dec
, 2074 },
4570 static const wxChar
*fmt
= _T("%d-%b-%Y");
4573 for ( n
= 0; n
< WXSIZEOF(weekDatesTestData
); n
++ )
4575 const WeekDateTestData
& wd
= weekDatesTestData
[n
];
4577 dt
.SetToWeekDay(wd
.wday
, wd
.nWeek
, wd
.month
, wd
.year
);
4579 wxPrintf(_T("%s is %s"), wd
.Format().c_str(), dt
.Format(fmt
).c_str());
4581 const Date
& d
= wd
.date
;
4582 if ( d
.SameDay(dt
.GetTm()) )
4584 wxPuts(_T(" (ok)"));
4588 dt
.Set(d
.day
, d
.month
, d
.year
);
4590 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.Format(fmt
).c_str());
4595 // test the computation of (ISO) week numbers
4596 static void TestTimeWNumber()
4598 wxPuts(_T("\n*** wxDateTime week number test ***"));
4600 struct WeekNumberTestData
4602 Date date
; // the date
4603 wxDateTime::wxDateTime_t week
; // the week number in the year
4604 wxDateTime::wxDateTime_t wmon
; // the week number in the month
4605 wxDateTime::wxDateTime_t wmon2
; // same but week starts with Sun
4606 wxDateTime::wxDateTime_t dnum
; // day number in the year
4609 // data generated with the following python script:
4611 from DateTime import *
4612 from whrandom import *
4613 from string import *
4615 monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
4616 wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
4618 def GetMonthWeek(dt):
4619 weekNumMonth = dt.iso_week[1] - DateTime(dt.year, dt.month, 1).iso_week[1] + 1
4620 if weekNumMonth < 0:
4621 weekNumMonth = weekNumMonth + 53
4624 def GetLastSundayBefore(dt):
4625 if dt.iso_week[2] == 7:
4628 return dt - DateTimeDelta(dt.iso_week[2])
4631 year = randint(1900, 2100)
4632 month = randint(1, 12)
4633 day = randint(1, 28)
4634 dt = DateTime(year, month, day)
4635 dayNum = dt.day_of_year
4636 weekNum = dt.iso_week[1]
4637 weekNumMonth = GetMonthWeek(dt)
4640 dtSunday = GetLastSundayBefore(dt)
4642 while dtSunday >= GetLastSundayBefore(DateTime(dt.year, dt.month, 1)):
4643 weekNumMonth2 = weekNumMonth2 + 1
4644 dtSunday = dtSunday - DateTimeDelta(7)
4646 data = { 'day': rjust(`day`, 2), \
4647 'month': monthNames[month - 1], \
4649 'weekNum': rjust(`weekNum`, 2), \
4650 'weekNumMonth': weekNumMonth, \
4651 'weekNumMonth2': weekNumMonth2, \
4652 'dayNum': rjust(`dayNum`, 3) }
4654 print " { { %(day)s, "\
4655 "wxDateTime::%(month)s, "\
4658 "%(weekNumMonth)s, "\
4659 "%(weekNumMonth2)s, "\
4660 "%(dayNum)s }," % data
4663 static const WeekNumberTestData weekNumberTestDates
[] =
4665 { { 27, wxDateTime::Dec
, 1966 }, 52, 5, 5, 361 },
4666 { { 22, wxDateTime::Jul
, 1926 }, 29, 4, 4, 203 },
4667 { { 22, wxDateTime::Oct
, 2076 }, 43, 4, 4, 296 },
4668 { { 1, wxDateTime::Jul
, 1967 }, 26, 1, 1, 182 },
4669 { { 8, wxDateTime::Nov
, 2004 }, 46, 2, 2, 313 },
4670 { { 21, wxDateTime::Mar
, 1920 }, 12, 3, 4, 81 },
4671 { { 7, wxDateTime::Jan
, 1965 }, 1, 2, 2, 7 },
4672 { { 19, wxDateTime::Oct
, 1999 }, 42, 4, 4, 292 },
4673 { { 13, wxDateTime::Aug
, 1955 }, 32, 2, 2, 225 },
4674 { { 18, wxDateTime::Jul
, 2087 }, 29, 3, 3, 199 },
4675 { { 2, wxDateTime::Sep
, 2028 }, 35, 1, 1, 246 },
4676 { { 28, wxDateTime::Jul
, 1945 }, 30, 5, 4, 209 },
4677 { { 15, wxDateTime::Jun
, 1901 }, 24, 3, 3, 166 },
4678 { { 10, wxDateTime::Oct
, 1939 }, 41, 3, 2, 283 },
4679 { { 3, wxDateTime::Dec
, 1965 }, 48, 1, 1, 337 },
4680 { { 23, wxDateTime::Feb
, 1940 }, 8, 4, 4, 54 },
4681 { { 2, wxDateTime::Jan
, 1987 }, 1, 1, 1, 2 },
4682 { { 11, wxDateTime::Aug
, 2079 }, 32, 2, 2, 223 },
4683 { { 2, wxDateTime::Feb
, 2063 }, 5, 1, 1, 33 },
4684 { { 16, wxDateTime::Oct
, 1942 }, 42, 3, 3, 289 },
4687 for ( size_t n
= 0; n
< WXSIZEOF(weekNumberTestDates
); n
++ )
4689 const WeekNumberTestData
& wn
= weekNumberTestDates
[n
];
4690 const Date
& d
= wn
.date
;
4692 wxDateTime dt
= d
.DT();
4694 wxDateTime::wxDateTime_t
4695 week
= dt
.GetWeekOfYear(wxDateTime::Monday_First
),
4696 wmon
= dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
4697 wmon2
= dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
4698 dnum
= dt
.GetDayOfYear();
4700 wxPrintf(_T("%s: the day number is %d"), d
.FormatDate().c_str(), dnum
);
4701 if ( dnum
== wn
.dnum
)
4703 wxPrintf(_T(" (ok)"));
4707 wxPrintf(_T(" (ERROR: should be %d)"), wn
.dnum
);
4710 wxPrintf(_T(", week in month = %d"), wmon
);
4711 if ( wmon
!= wn
.wmon
)
4713 wxPrintf(_T(" (ERROR: should be %d)"), wn
.wmon
);
4716 wxPrintf(_T(" or %d"), wmon2
);
4717 if ( wmon2
== wn
.wmon2
)
4719 wxPrintf(_T(" (ok)"));
4723 wxPrintf(_T(" (ERROR: should be %d)"), wn
.wmon2
);
4726 wxPrintf(_T(", week in year = %d"), week
);
4727 if ( week
!= wn
.week
)
4729 wxPrintf(_T(" (ERROR: should be %d)"), wn
.week
);
4732 wxPutchar(_T('\n'));
4734 wxDateTime
dt2(1, wxDateTime::Jan
, d
.year
);
4735 dt2
.SetToTheWeek(wn
.week
, dt
.GetWeekDay());
4739 d2
.Init(dt2
.GetTm());
4740 wxPrintf(_T("ERROR: SetToTheWeek() returned %s\n"),
4741 d2
.FormatDate().c_str());
4746 // test DST calculations
4747 static void TestTimeDST()
4749 wxPuts(_T("\n*** wxDateTime DST test ***"));
4751 wxPrintf(_T("DST is%s in effect now.\n\n"),
4752 wxDateTime::Now().IsDST() ? _T("") : _T(" not"));
4754 // taken from http://www.energy.ca.gov/daylightsaving.html
4755 static const Date datesDST
[2][2004 - 1900 + 1] =
4758 { 1, wxDateTime::Apr
, 1990 },
4759 { 7, wxDateTime::Apr
, 1991 },
4760 { 5, wxDateTime::Apr
, 1992 },
4761 { 4, wxDateTime::Apr
, 1993 },
4762 { 3, wxDateTime::Apr
, 1994 },
4763 { 2, wxDateTime::Apr
, 1995 },
4764 { 7, wxDateTime::Apr
, 1996 },
4765 { 6, wxDateTime::Apr
, 1997 },
4766 { 5, wxDateTime::Apr
, 1998 },
4767 { 4, wxDateTime::Apr
, 1999 },
4768 { 2, wxDateTime::Apr
, 2000 },
4769 { 1, wxDateTime::Apr
, 2001 },
4770 { 7, wxDateTime::Apr
, 2002 },
4771 { 6, wxDateTime::Apr
, 2003 },
4772 { 4, wxDateTime::Apr
, 2004 },
4775 { 28, wxDateTime::Oct
, 1990 },
4776 { 27, wxDateTime::Oct
, 1991 },
4777 { 25, wxDateTime::Oct
, 1992 },
4778 { 31, wxDateTime::Oct
, 1993 },
4779 { 30, wxDateTime::Oct
, 1994 },
4780 { 29, wxDateTime::Oct
, 1995 },
4781 { 27, wxDateTime::Oct
, 1996 },
4782 { 26, wxDateTime::Oct
, 1997 },
4783 { 25, wxDateTime::Oct
, 1998 },
4784 { 31, wxDateTime::Oct
, 1999 },
4785 { 29, wxDateTime::Oct
, 2000 },
4786 { 28, wxDateTime::Oct
, 2001 },
4787 { 27, wxDateTime::Oct
, 2002 },
4788 { 26, wxDateTime::Oct
, 2003 },
4789 { 31, wxDateTime::Oct
, 2004 },
4794 for ( year
= 1990; year
< 2005; year
++ )
4796 wxDateTime dtBegin
= wxDateTime::GetBeginDST(year
, wxDateTime::USA
),
4797 dtEnd
= wxDateTime::GetEndDST(year
, wxDateTime::USA
);
4799 wxPrintf(_T("DST period in the US for year %d: from %s to %s"),
4800 year
, dtBegin
.Format().c_str(), dtEnd
.Format().c_str());
4802 size_t n
= year
- 1990;
4803 const Date
& dBegin
= datesDST
[0][n
];
4804 const Date
& dEnd
= datesDST
[1][n
];
4806 if ( dBegin
.SameDay(dtBegin
.GetTm()) && dEnd
.SameDay(dtEnd
.GetTm()) )
4808 wxPuts(_T(" (ok)"));
4812 wxPrintf(_T(" (ERROR: should be %s %d to %s %d)\n"),
4813 wxDateTime::GetMonthName(dBegin
.month
).c_str(), dBegin
.day
,
4814 wxDateTime::GetMonthName(dEnd
.month
).c_str(), dEnd
.day
);
4820 for ( year
= 1990; year
< 2005; year
++ )
4822 wxPrintf(_T("DST period in Europe for year %d: from %s to %s\n"),
4824 wxDateTime::GetBeginDST(year
, wxDateTime::Country_EEC
).Format().c_str(),
4825 wxDateTime::GetEndDST(year
, wxDateTime::Country_EEC
).Format().c_str());
4829 // test wxDateTime -> text conversion
4830 static void TestTimeFormat()
4832 wxPuts(_T("\n*** wxDateTime formatting test ***"));
4834 // some information may be lost during conversion, so store what kind
4835 // of info should we recover after a round trip
4838 CompareNone
, // don't try comparing
4839 CompareBoth
, // dates and times should be identical
4840 CompareDate
, // dates only
4841 CompareTime
// time only
4846 CompareKind compareKind
;
4847 const wxChar
*format
;
4848 } formatTestFormats
[] =
4850 { CompareBoth
, _T("---> %c") },
4851 { CompareDate
, _T("Date is %A, %d of %B, in year %Y") },
4852 { CompareBoth
, _T("Date is %x, time is %X") },
4853 { CompareTime
, _T("Time is %H:%M:%S or %I:%M:%S %p") },
4854 { CompareNone
, _T("The day of year: %j, the week of year: %W") },
4855 { CompareDate
, _T("ISO date without separators: %Y%m%d") },
4858 static const Date formatTestDates
[] =
4860 { 29, wxDateTime::May
, 1976, 18, 30, 00 },
4861 { 31, wxDateTime::Dec
, 1999, 23, 30, 00 },
4863 // this test can't work for other centuries because it uses two digit
4864 // years in formats, so don't even try it
4865 { 29, wxDateTime::May
, 2076, 18, 30, 00 },
4866 { 29, wxDateTime::Feb
, 2400, 02, 15, 25 },
4867 { 01, wxDateTime::Jan
, -52, 03, 16, 47 },
4871 // an extra test (as it doesn't depend on date, don't do it in the loop)
4872 wxPrintf(_T("%s\n"), wxDateTime::Now().Format(_T("Our timezone is %Z")).c_str());
4874 for ( size_t d
= 0; d
< WXSIZEOF(formatTestDates
) + 1; d
++ )
4878 wxDateTime dt
= d
== 0 ? wxDateTime::Now() : formatTestDates
[d
- 1].DT();
4879 for ( size_t n
= 0; n
< WXSIZEOF(formatTestFormats
); n
++ )
4881 wxString s
= dt
.Format(formatTestFormats
[n
].format
);
4882 wxPrintf(_T("%s"), s
.c_str());
4884 // what can we recover?
4885 int kind
= formatTestFormats
[n
].compareKind
;
4889 const wxChar
*result
= dt2
.ParseFormat(s
, formatTestFormats
[n
].format
);
4892 // converion failed - should it have?
4893 if ( kind
== CompareNone
)
4894 wxPuts(_T(" (ok)"));
4896 wxPuts(_T(" (ERROR: conversion back failed)"));
4900 // should have parsed the entire string
4901 wxPuts(_T(" (ERROR: conversion back stopped too soon)"));
4905 bool equal
= false; // suppress compilaer warning
4913 equal
= dt
.IsSameDate(dt2
);
4917 equal
= dt
.IsSameTime(dt2
);
4923 wxPrintf(_T(" (ERROR: got back '%s' instead of '%s')\n"),
4924 dt2
.Format().c_str(), dt
.Format().c_str());
4928 wxPuts(_T(" (ok)"));
4935 // test text -> wxDateTime conversion
4936 static void TestTimeParse()
4938 wxPuts(_T("\n*** wxDateTime parse test ***"));
4940 struct ParseTestData
4942 const wxChar
*format
;
4947 static const ParseTestData parseTestDates
[] =
4949 { _T("Sat, 18 Dec 1999 00:46:40 +0100"), { 18, wxDateTime::Dec
, 1999, 00, 46, 40 }, true },
4950 { _T("Wed, 1 Dec 1999 05:17:20 +0300"), { 1, wxDateTime::Dec
, 1999, 03, 17, 20 }, true },
4953 for ( size_t n
= 0; n
< WXSIZEOF(parseTestDates
); n
++ )
4955 const wxChar
*format
= parseTestDates
[n
].format
;
4957 wxPrintf(_T("%s => "), format
);
4960 if ( dt
.ParseRfc822Date(format
) )
4962 wxPrintf(_T("%s "), dt
.Format().c_str());
4964 if ( parseTestDates
[n
].good
)
4966 wxDateTime dtReal
= parseTestDates
[n
].date
.DT();
4973 wxPrintf(_T("(ERROR: should be %s)\n"), dtReal
.Format().c_str());
4978 wxPuts(_T("(ERROR: bad format)"));
4983 wxPrintf(_T("bad format (%s)\n"),
4984 parseTestDates
[n
].good
? "ERROR" : "ok");
4989 static void TestDateTimeInteractive()
4991 wxPuts(_T("\n*** interactive wxDateTime tests ***"));
4997 wxPrintf(_T("Enter a date: "));
4998 if ( !wxFgets(buf
, WXSIZEOF(buf
), stdin
) )
5001 // kill the last '\n'
5002 buf
[wxStrlen(buf
) - 1] = 0;
5005 const wxChar
*p
= dt
.ParseDate(buf
);
5008 wxPrintf(_T("ERROR: failed to parse the date '%s'.\n"), buf
);
5014 wxPrintf(_T("WARNING: parsed only first %u characters.\n"), p
- buf
);
5017 wxPrintf(_T("%s: day %u, week of month %u/%u, week of year %u\n"),
5018 dt
.Format(_T("%b %d, %Y")).c_str(),
5020 dt
.GetWeekOfMonth(wxDateTime::Monday_First
),
5021 dt
.GetWeekOfMonth(wxDateTime::Sunday_First
),
5022 dt
.GetWeekOfYear(wxDateTime::Monday_First
));
5025 wxPuts(_T("\n*** done ***"));
5028 static void TestTimeMS()
5030 wxPuts(_T("*** testing millisecond-resolution support in wxDateTime ***"));
5032 wxDateTime dt1
= wxDateTime::Now(),
5033 dt2
= wxDateTime::UNow();
5035 wxPrintf(_T("Now = %s\n"), dt1
.Format(_T("%H:%M:%S:%l")).c_str());
5036 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
5037 wxPrintf(_T("Dummy loop: "));
5038 for ( int i
= 0; i
< 6000; i
++ )
5040 //for ( int j = 0; j < 10; j++ )
5043 s
.Printf(_T("%g"), sqrt(i
));
5049 wxPuts(_T(", done"));
5052 dt2
= wxDateTime::UNow();
5053 wxPrintf(_T("UNow = %s\n"), dt2
.Format(_T("%H:%M:%S:%l")).c_str());
5055 wxPrintf(_T("Loop executed in %s ms\n"), (dt2
- dt1
).Format(_T("%l")).c_str());
5057 wxPuts(_T("\n*** done ***"));
5060 static void TestTimeArithmetics()
5062 wxPuts(_T("\n*** testing arithmetic operations on wxDateTime ***"));
5064 static const struct ArithmData
5066 ArithmData(const wxDateSpan
& sp
, const wxChar
*nam
)
5067 : span(sp
), name(nam
) { }
5071 } testArithmData
[] =
5073 ArithmData(wxDateSpan::Day(), _T("day")),
5074 ArithmData(wxDateSpan::Week(), _T("week")),
5075 ArithmData(wxDateSpan::Month(), _T("month")),
5076 ArithmData(wxDateSpan::Year(), _T("year")),
5077 ArithmData(wxDateSpan(1, 2, 3, 4), _T("year, 2 months, 3 weeks, 4 days")),
5080 wxDateTime
dt(29, wxDateTime::Dec
, 1999), dt1
, dt2
;
5082 for ( size_t n
= 0; n
< WXSIZEOF(testArithmData
); n
++ )
5084 wxDateSpan span
= testArithmData
[n
].span
;
5088 const wxChar
*name
= testArithmData
[n
].name
;
5089 wxPrintf(_T("%s + %s = %s, %s - %s = %s\n"),
5090 dt
.FormatISODate().c_str(), name
, dt1
.FormatISODate().c_str(),
5091 dt
.FormatISODate().c_str(), name
, dt2
.FormatISODate().c_str());
5093 wxPrintf(_T("Going back: %s"), (dt1
- span
).FormatISODate().c_str());
5094 if ( dt1
- span
== dt
)
5096 wxPuts(_T(" (ok)"));
5100 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.FormatISODate().c_str());
5103 wxPrintf(_T("Going forward: %s"), (dt2
+ span
).FormatISODate().c_str());
5104 if ( dt2
+ span
== dt
)
5106 wxPuts(_T(" (ok)"));
5110 wxPrintf(_T(" (ERROR: should be %s)\n"), dt
.FormatISODate().c_str());
5113 wxPrintf(_T("Double increment: %s"), (dt2
+ 2*span
).FormatISODate().c_str());
5114 if ( dt2
+ 2*span
== dt1
)
5116 wxPuts(_T(" (ok)"));
5120 wxPrintf(_T(" (ERROR: should be %s)\n"), dt2
.FormatISODate().c_str());
5127 static void TestTimeHolidays()
5129 wxPuts(_T("\n*** testing wxDateTimeHolidayAuthority ***\n"));
5131 wxDateTime::Tm tm
= wxDateTime(29, wxDateTime::May
, 2000).GetTm();
5132 wxDateTime
dtStart(1, tm
.mon
, tm
.year
),
5133 dtEnd
= dtStart
.GetLastMonthDay();
5135 wxDateTimeArray hol
;
5136 wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart
, dtEnd
, hol
);
5138 const wxChar
*format
= _T("%d-%b-%Y (%a)");
5140 wxPrintf(_T("All holidays between %s and %s:\n"),
5141 dtStart
.Format(format
).c_str(), dtEnd
.Format(format
).c_str());
5143 size_t count
= hol
.GetCount();
5144 for ( size_t n
= 0; n
< count
; n
++ )
5146 wxPrintf(_T("\t%s\n"), hol
[n
].Format(format
).c_str());
5152 static void TestTimeZoneBug()
5154 wxPuts(_T("\n*** testing for DST/timezone bug ***\n"));
5156 wxDateTime date
= wxDateTime(1, wxDateTime::Mar
, 2000);
5157 for ( int i
= 0; i
< 31; i
++ )
5159 wxPrintf(_T("Date %s: week day %s.\n"),
5160 date
.Format(_T("%d-%m-%Y")).c_str(),
5161 date
.GetWeekDayName(date
.GetWeekDay()).c_str());
5163 date
+= wxDateSpan::Day();
5169 static void TestTimeSpanFormat()
5171 wxPuts(_T("\n*** wxTimeSpan tests ***"));
5173 static const wxChar
*formats
[] =
5175 _T("(default) %H:%M:%S"),
5176 _T("%E weeks and %D days"),
5177 _T("%l milliseconds"),
5178 _T("(with ms) %H:%M:%S:%l"),
5179 _T("100%% of minutes is %M"), // test "%%"
5180 _T("%D days and %H hours"),
5181 _T("or also %S seconds"),
5184 wxTimeSpan
ts1(1, 2, 3, 4),
5186 for ( size_t n
= 0; n
< WXSIZEOF(formats
); n
++ )
5188 wxPrintf(_T("ts1 = %s\tts2 = %s\n"),
5189 ts1
.Format(formats
[n
]).c_str(),
5190 ts2
.Format(formats
[n
]).c_str());
5196 #endif // TEST_DATETIME
5198 // ----------------------------------------------------------------------------
5199 // wxTextInput/OutputStream
5200 // ----------------------------------------------------------------------------
5202 #ifdef TEST_TEXTSTREAM
5204 #include "wx/txtstrm.h"
5205 #include "wx/wfstream.h"
5207 static void TestTextInputStream()
5209 wxPuts(_T("\n*** wxTextInputStream test ***"));
5211 wxFileInputStream
fsIn(_T("testdata.fc"));
5214 wxPuts(_T("ERROR: couldn't open file."));
5218 wxTextInputStream
tis(fsIn
);
5223 const wxString s
= tis
.ReadLine();
5225 // line could be non empty if the last line of the file isn't
5226 // terminated with EOL
5227 if ( fsIn
.Eof() && s
.empty() )
5230 wxPrintf(_T("Line %d: %s\n"), line
++, s
.c_str());
5235 #endif // TEST_TEXTSTREAM
5237 // ----------------------------------------------------------------------------
5239 // ----------------------------------------------------------------------------
5243 #include "wx/thread.h"
5245 static size_t gs_counter
= (size_t)-1;
5246 static wxCriticalSection gs_critsect
;
5247 static wxSemaphore gs_cond
;
5249 class MyJoinableThread
: public wxThread
5252 MyJoinableThread(size_t n
) : wxThread(wxTHREAD_JOINABLE
)
5253 { m_n
= n
; Create(); }
5255 // thread execution starts here
5256 virtual ExitCode
Entry();
5262 wxThread::ExitCode
MyJoinableThread::Entry()
5264 unsigned long res
= 1;
5265 for ( size_t n
= 1; n
< m_n
; n
++ )
5269 // it's a loooong calculation :-)
5273 return (ExitCode
)res
;
5276 class MyDetachedThread
: public wxThread
5279 MyDetachedThread(size_t n
, wxChar ch
)
5283 m_cancelled
= false;
5288 // thread execution starts here
5289 virtual ExitCode
Entry();
5292 virtual void OnExit();
5295 size_t m_n
; // number of characters to write
5296 wxChar m_ch
; // character to write
5298 bool m_cancelled
; // false if we exit normally
5301 wxThread::ExitCode
MyDetachedThread::Entry()
5304 wxCriticalSectionLocker
lock(gs_critsect
);
5305 if ( gs_counter
== (size_t)-1 )
5311 for ( size_t n
= 0; n
< m_n
; n
++ )
5313 if ( TestDestroy() )
5323 wxThread::Sleep(100);
5329 void MyDetachedThread::OnExit()
5331 wxLogTrace(_T("thread"), _T("Thread %ld is in OnExit"), GetId());
5333 wxCriticalSectionLocker
lock(gs_critsect
);
5334 if ( !--gs_counter
&& !m_cancelled
)
5338 static void TestDetachedThreads()
5340 wxPuts(_T("\n*** Testing detached threads ***"));
5342 static const size_t nThreads
= 3;
5343 MyDetachedThread
*threads
[nThreads
];
5345 for ( n
= 0; n
< nThreads
; n
++ )
5347 threads
[n
] = new MyDetachedThread(10, 'A' + n
);
5350 threads
[0]->SetPriority(WXTHREAD_MIN_PRIORITY
);
5351 threads
[1]->SetPriority(WXTHREAD_MAX_PRIORITY
);
5353 for ( n
= 0; n
< nThreads
; n
++ )
5358 // wait until all threads terminate
5364 static void TestJoinableThreads()
5366 wxPuts(_T("\n*** Testing a joinable thread (a loooong calculation...) ***"));
5368 // calc 10! in the background
5369 MyJoinableThread
thread(10);
5372 wxPrintf(_T("\nThread terminated with exit code %lu.\n"),
5373 (unsigned long)thread
.Wait());
5376 static void TestThreadSuspend()
5378 wxPuts(_T("\n*** Testing thread suspend/resume functions ***"));
5380 MyDetachedThread
*thread
= new MyDetachedThread(15, 'X');
5384 // this is for this demo only, in a real life program we'd use another
5385 // condition variable which would be signaled from wxThread::Entry() to
5386 // tell us that the thread really started running - but here just wait a
5387 // bit and hope that it will be enough (the problem is, of course, that
5388 // the thread might still not run when we call Pause() which will result
5390 wxThread::Sleep(300);
5392 for ( size_t n
= 0; n
< 3; n
++ )
5396 wxPuts(_T("\nThread suspended"));
5399 // don't sleep but resume immediately the first time
5400 wxThread::Sleep(300);
5402 wxPuts(_T("Going to resume the thread"));
5407 wxPuts(_T("Waiting until it terminates now"));
5409 // wait until the thread terminates
5415 static void TestThreadDelete()
5417 // As above, using Sleep() is only for testing here - we must use some
5418 // synchronisation object instead to ensure that the thread is still
5419 // running when we delete it - deleting a detached thread which already
5420 // terminated will lead to a crash!
5422 wxPuts(_T("\n*** Testing thread delete function ***"));
5424 MyDetachedThread
*thread0
= new MyDetachedThread(30, 'W');
5428 wxPuts(_T("\nDeleted a thread which didn't start to run yet."));
5430 MyDetachedThread
*thread1
= new MyDetachedThread(30, 'Y');
5434 wxThread::Sleep(300);
5438 wxPuts(_T("\nDeleted a running thread."));
5440 MyDetachedThread
*thread2
= new MyDetachedThread(30, 'Z');
5444 wxThread::Sleep(300);
5450 wxPuts(_T("\nDeleted a sleeping thread."));
5452 MyJoinableThread
thread3(20);
5457 wxPuts(_T("\nDeleted a joinable thread."));
5459 MyJoinableThread
thread4(2);
5462 wxThread::Sleep(300);
5466 wxPuts(_T("\nDeleted a joinable thread which already terminated."));
5471 class MyWaitingThread
: public wxThread
5474 MyWaitingThread( wxMutex
*mutex
, wxCondition
*condition
)
5477 m_condition
= condition
;
5482 virtual ExitCode
Entry()
5484 wxPrintf(_T("Thread %lu has started running.\n"), GetId());
5489 wxPrintf(_T("Thread %lu starts to wait...\n"), GetId());
5493 m_condition
->Wait();
5496 wxPrintf(_T("Thread %lu finished to wait, exiting.\n"), GetId());
5504 wxCondition
*m_condition
;
5507 static void TestThreadConditions()
5510 wxCondition
condition(mutex
);
5512 // otherwise its difficult to understand which log messages pertain to
5514 //wxLogTrace(_T("thread"), _T("Local condition var is %08x, gs_cond = %08x"),
5515 // condition.GetId(), gs_cond.GetId());
5517 // create and launch threads
5518 MyWaitingThread
*threads
[10];
5521 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5523 threads
[n
] = new MyWaitingThread( &mutex
, &condition
);
5526 for ( n
= 0; n
< WXSIZEOF(threads
); n
++ )
5531 // wait until all threads run
5532 wxPuts(_T("Main thread is waiting for the other threads to start"));
5535 size_t nRunning
= 0;
5536 while ( nRunning
< WXSIZEOF(threads
) )
5542 wxPrintf(_T("Main thread: %u already running\n"), nRunning
);
5546 wxPuts(_T("Main thread: all threads started up."));
5549 wxThread::Sleep(500);
5552 // now wake one of them up
5553 wxPrintf(_T("Main thread: about to signal the condition.\n"));
5558 wxThread::Sleep(200);
5560 // wake all the (remaining) threads up, so that they can exit
5561 wxPrintf(_T("Main thread: about to broadcast the condition.\n"));
5563 condition
.Broadcast();
5565 // give them time to terminate (dirty!)
5566 wxThread::Sleep(500);
5569 #include "wx/utils.h"
5571 class MyExecThread
: public wxThread
5574 MyExecThread(const wxString
& command
) : wxThread(wxTHREAD_JOINABLE
),
5580 virtual ExitCode
Entry()
5582 return (ExitCode
)wxExecute(m_command
, wxEXEC_SYNC
);
5589 static void TestThreadExec()
5591 wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
5593 MyExecThread
thread(_T("true"));
5596 wxPrintf(_T("Main program exit code: %ld.\n"),
5597 wxExecute(_T("false"), wxEXEC_SYNC
));
5599 wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread
.Wait());
5603 #include "wx/datetime.h"
5605 class MySemaphoreThread
: public wxThread
5608 MySemaphoreThread(int i
, wxSemaphore
*sem
)
5609 : wxThread(wxTHREAD_JOINABLE
),
5616 virtual ExitCode
Entry()
5618 wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
5619 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5623 wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
5624 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5628 wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
5629 wxDateTime::Now().FormatTime().c_str(), m_i
, (long)GetId());
5641 WX_DEFINE_ARRAY(wxThread
*, ArrayThreads
);
5643 static void TestSemaphore()
5645 wxPuts(_T("*** Testing wxSemaphore class. ***"));
5647 static const int SEM_LIMIT
= 3;
5649 wxSemaphore
sem(SEM_LIMIT
, SEM_LIMIT
);
5650 ArrayThreads threads
;
5652 for ( int i
= 0; i
< 3*SEM_LIMIT
; i
++ )
5654 threads
.Add(new MySemaphoreThread(i
, &sem
));
5655 threads
.Last()->Run();
5658 for ( size_t n
= 0; n
< threads
.GetCount(); n
++ )
5665 #endif // TEST_THREADS
5667 // ----------------------------------------------------------------------------
5669 // ----------------------------------------------------------------------------
5673 #include "wx/dynarray.h"
5675 typedef unsigned short ushort
;
5677 #define DefineCompare(name, T) \
5679 int wxCMPFUNC_CONV name ## CompareValues(T first, T second) \
5681 return first - second; \
5684 int wxCMPFUNC_CONV name ## Compare(T* first, T* second) \
5686 return *first - *second; \
5689 int wxCMPFUNC_CONV name ## RevCompare(T* first, T* second) \
5691 return *second - *first; \
5694 DefineCompare(UShort, ushort);
5695 DefineCompare(Int
, int);
5697 // test compilation of all macros
5698 WX_DEFINE_ARRAY_SHORT(ushort
, wxArrayUShort
);
5699 WX_DEFINE_SORTED_ARRAY_SHORT(ushort
, wxSortedArrayUShortNoCmp
);
5700 WX_DEFINE_SORTED_ARRAY_CMP_SHORT(ushort
, UShortCompareValues
, wxSortedArrayUShort
);
5701 WX_DEFINE_SORTED_ARRAY_CMP_INT(int, IntCompareValues
, wxSortedArrayInt
);
5703 WX_DECLARE_OBJARRAY(Bar
, ArrayBars
);
5704 #include "wx/arrimpl.cpp"
5705 WX_DEFINE_OBJARRAY(ArrayBars
);
5707 static void PrintArray(const wxChar
* name
, const wxArrayString
& array
)
5709 wxPrintf(_T("Dump of the array '%s'\n"), name
);
5711 size_t nCount
= array
.GetCount();
5712 for ( size_t n
= 0; n
< nCount
; n
++ )
5714 wxPrintf(_T("\t%s[%u] = '%s'\n"), name
, n
, array
[n
].c_str());
5718 int wxCMPFUNC_CONV
StringLenCompare(const wxString
& first
,
5719 const wxString
& second
)
5721 return first
.length() - second
.length();
5724 #define TestArrayOf(name) \
5726 static void PrintArray(const wxChar* name, const wxSortedArray##name & array) \
5728 wxPrintf(_T("Dump of the array '%s'\n"), name); \
5730 size_t nCount = array.GetCount(); \
5731 for ( size_t n = 0; n < nCount; n++ ) \
5733 wxPrintf(_T("\t%s[%u] = %d\n"), name, n, array[n]); \
5737 static void PrintArray(const wxChar* name, const wxArray##name & array) \
5739 wxPrintf(_T("Dump of the array '%s'\n"), name); \
5741 size_t nCount = array.GetCount(); \
5742 for ( size_t n = 0; n < nCount; n++ ) \
5744 wxPrintf(_T("\t%s[%u] = %d\n"), name, n, array[n]); \
5748 static void TestArrayOf ## name ## s() \
5750 wxPrintf(_T("*** Testing wxArray%s ***\n"), #name); \
5758 wxPuts(_T("Initially:")); \
5759 PrintArray(_T("a"), a); \
5761 wxPuts(_T("After sort:")); \
5762 a.Sort(name ## Compare); \
5763 PrintArray(_T("a"), a); \
5765 wxPuts(_T("After reverse sort:")); \
5766 a.Sort(name ## RevCompare); \
5767 PrintArray(_T("a"), a); \
5769 wxSortedArray##name b; \
5775 wxPuts(_T("Sorted array initially:")); \
5776 PrintArray(_T("b"), b); \
5779 TestArrayOf(UShort
);
5782 static void TestArrayOfObjects()
5784 wxPuts(_T("*** Testing wxObjArray ***\n"));
5788 Bar
bar("second bar (two copies!)");
5790 wxPrintf(_T("Initially: %u objects in the array, %u objects total.\n"),
5791 bars
.GetCount(), Bar::GetNumber());
5793 bars
.Add(new Bar("first bar"));
5796 wxPrintf(_T("Now: %u objects in the array, %u objects total.\n"),
5797 bars
.GetCount(), Bar::GetNumber());
5799 bars
.RemoveAt(1, bars
.GetCount() - 1);
5801 wxPrintf(_T("After removing all but first element: %u objects in the ")
5802 _T("array, %u objects total.\n"),
5803 bars
.GetCount(), Bar::GetNumber());
5807 wxPrintf(_T("After Empty(): %u objects in the array, %u objects total.\n"),
5808 bars
.GetCount(), Bar::GetNumber());
5811 wxPrintf(_T("Finally: no more objects in the array, %u objects total.\n"),
5815 #endif // TEST_ARRAYS
5817 // ----------------------------------------------------------------------------
5819 // ----------------------------------------------------------------------------
5823 #include "wx/timer.h"
5824 #include "wx/tokenzr.h"
5826 static void TestStringConstruction()
5828 wxPuts(_T("*** Testing wxString constructores ***"));
5830 #define TEST_CTOR(args, res) \
5833 wxPrintf(_T("wxString%s = %s "), #args, s.c_str()); \
5836 wxPuts(_T("(ok)")); \
5840 wxPrintf(_T("(ERROR: should be %s)\n"), res); \
5844 TEST_CTOR((_T('Z'), 4), _T("ZZZZ"));
5845 TEST_CTOR((_T("Hello"), 4), _T("Hell"));
5846 TEST_CTOR((_T("Hello"), 5), _T("Hello"));
5847 // TEST_CTOR((_T("Hello"), 6), _T("Hello")); -- should give assert failure
5849 static const wxChar
*s
= _T("?really!");
5850 const wxChar
*start
= wxStrchr(s
, _T('r'));
5851 const wxChar
*end
= wxStrchr(s
, _T('!'));
5852 TEST_CTOR((start
, end
), _T("really"));
5857 static void TestString()
5867 for (int i
= 0; i
< 1000000; ++i
)
5871 c
= "! How'ya doin'?";
5874 c
= "Hello world! What's up?";
5879 wxPrintf(_T("TestString elapsed time: %ld\n"), sw
.Time());
5882 static void TestPChar()
5890 for (int i
= 0; i
< 1000000; ++i
)
5892 wxStrcpy (a
, _T("Hello"));
5893 wxStrcpy (b
, _T(" world"));
5894 wxStrcpy (c
, _T("! How'ya doin'?"));
5897 wxStrcpy (c
, _T("Hello world! What's up?"));
5898 if (wxStrcmp (c
, a
) == 0)
5899 wxStrcpy (c
, _T("Doh!"));
5902 wxPrintf(_T("TestPChar elapsed time: %ld\n"), sw
.Time());
5905 static void TestStringSub()
5907 wxString
s("Hello, world!");
5909 wxPuts(_T("*** Testing wxString substring extraction ***"));
5911 wxPrintf(_T("String = '%s'\n"), s
.c_str());
5912 wxPrintf(_T("Left(5) = '%s'\n"), s
.Left(5).c_str());
5913 wxPrintf(_T("Right(6) = '%s'\n"), s
.Right(6).c_str());
5914 wxPrintf(_T("Mid(3, 5) = '%s'\n"), s(3, 5).c_str());
5915 wxPrintf(_T("Mid(3) = '%s'\n"), s
.Mid(3).c_str());
5916 wxPrintf(_T("substr(3, 5) = '%s'\n"), s
.substr(3, 5).c_str());
5917 wxPrintf(_T("substr(3) = '%s'\n"), s
.substr(3).c_str());
5919 static const wxChar
*prefixes
[] =
5923 _T("Hello, world!"),
5924 _T("Hello, world!!!"),
5930 for ( size_t n
= 0; n
< WXSIZEOF(prefixes
); n
++ )
5932 wxString prefix
= prefixes
[n
], rest
;
5933 bool rc
= s
.StartsWith(prefix
, &rest
);
5934 wxPrintf(_T("StartsWith('%s') = %s"), prefix
.c_str(), rc
? _T("true") : _T("false"));
5937 wxPrintf(_T(" (the rest is '%s')\n"), rest
.c_str());
5948 static void TestStringFormat()
5950 wxPuts(_T("*** Testing wxString formatting ***"));
5953 s
.Printf(_T("%03d"), 18);
5955 wxPrintf(_T("Number 18: %s\n"), wxString::Format(_T("%03d"), 18).c_str());
5956 wxPrintf(_T("Number 18: %s\n"), s
.c_str());
5961 // returns "not found" for npos, value for all others
5962 static wxString
PosToString(size_t res
)
5964 wxString s
= res
== wxString::npos
? wxString(_T("not found"))
5965 : wxString::Format(_T("%u"), res
);
5969 static void TestStringFind()
5971 wxPuts(_T("*** Testing wxString find() functions ***"));
5973 static const wxChar
*strToFind
= _T("ell");
5974 static const struct StringFindTest
5978 result
; // of searching "ell" in str
5981 { _T("Well, hello world"), 0, 1 },
5982 { _T("Well, hello world"), 6, 7 },
5983 { _T("Well, hello world"), 9, wxString::npos
},
5986 for ( size_t n
= 0; n
< WXSIZEOF(findTestData
); n
++ )
5988 const StringFindTest
& ft
= findTestData
[n
];
5989 size_t res
= wxString(ft
.str
).find(strToFind
, ft
.start
);
5991 wxPrintf(_T("Index of '%s' in '%s' starting from %u is %s "),
5992 strToFind
, ft
.str
, ft
.start
, PosToString(res
).c_str());
5994 size_t resTrue
= ft
.result
;
5995 if ( res
== resTrue
)
6001 wxPrintf(_T("(ERROR: should be %s)\n"),
6002 PosToString(resTrue
).c_str());
6009 static void TestStringTokenizer()
6011 wxPuts(_T("*** Testing wxStringTokenizer ***"));
6013 static const wxChar
*modeNames
[] =
6017 _T("return all empty"),
6022 static const struct StringTokenizerTest
6024 const wxChar
*str
; // string to tokenize
6025 const wxChar
*delims
; // delimiters to use
6026 size_t count
; // count of token
6027 wxStringTokenizerMode mode
; // how should we tokenize it
6028 } tokenizerTestData
[] =
6030 { _T(""), _T(" "), 0 },
6031 { _T("Hello, world"), _T(" "), 2 },
6032 { _T("Hello, world "), _T(" "), 2 },
6033 { _T("Hello, world"), _T(","), 2 },
6034 { _T("Hello, world!"), _T(",!"), 2 },
6035 { _T("Hello,, world!"), _T(",!"), 3 },
6036 { _T("Hello, world!"), _T(",!"), 3, wxTOKEN_RET_EMPTY_ALL
},
6037 { _T("username:password:uid:gid:gecos:home:shell"), _T(":"), 7 },
6038 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 4 },
6039 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 6, wxTOKEN_RET_EMPTY
},
6040 { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS
, 9, wxTOKEN_RET_EMPTY_ALL
},
6041 { _T("01/02/99"), _T("/-"), 3 },
6042 { _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS
},
6045 for ( size_t n
= 0; n
< WXSIZEOF(tokenizerTestData
); n
++ )
6047 const StringTokenizerTest
& tt
= tokenizerTestData
[n
];
6048 wxStringTokenizer
tkz(tt
.str
, tt
.delims
, tt
.mode
);
6050 size_t count
= tkz
.CountTokens();
6051 wxPrintf(_T("String '%s' has %u tokens delimited by '%s' (mode = %s) "),
6052 MakePrintable(tt
.str
).c_str(),
6054 MakePrintable(tt
.delims
).c_str(),
6055 modeNames
[tkz
.GetMode()]);
6056 if ( count
== tt
.count
)
6062 wxPrintf(_T("(ERROR: should be %u)\n"), tt
.count
);
6067 // if we emulate strtok(), check that we do it correctly
6068 wxChar
*buf
, *s
= NULL
, *last
;
6070 if ( tkz
.GetMode() == wxTOKEN_STRTOK
)
6072 buf
= new wxChar
[wxStrlen(tt
.str
) + 1];
6073 wxStrcpy(buf
, tt
.str
);
6075 s
= wxStrtok(buf
, tt
.delims
, &last
);
6082 // now show the tokens themselves
6084 while ( tkz
.HasMoreTokens() )
6086 wxString token
= tkz
.GetNextToken();
6088 wxPrintf(_T("\ttoken %u: '%s'"),
6090 MakePrintable(token
).c_str());
6096 wxPuts(_T(" (ok)"));
6100 wxPrintf(_T(" (ERROR: should be %s)\n"), s
);
6103 s
= wxStrtok(NULL
, tt
.delims
, &last
);
6107 // nothing to compare with
6112 if ( count2
!= count
)
6114 wxPuts(_T("\tERROR: token count mismatch"));
6123 static void TestStringReplace()
6125 wxPuts(_T("*** Testing wxString::replace ***"));
6127 static const struct StringReplaceTestData
6129 const wxChar
*original
; // original test string
6130 size_t start
, len
; // the part to replace
6131 const wxChar
*replacement
; // the replacement string
6132 const wxChar
*result
; // and the expected result
6133 } stringReplaceTestData
[] =
6135 { _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") },
6136 { _T("increase"), 0, 2, _T("de"), _T("decrease") },
6137 { _T("wxWindow"), 8, 0, _T("s"), _T("wxWindows") },
6138 { _T("foobar"), 3, 0, _T("-"), _T("foo-bar") },
6139 { _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") },
6142 for ( size_t n
= 0; n
< WXSIZEOF(stringReplaceTestData
); n
++ )
6144 const StringReplaceTestData data
= stringReplaceTestData
[n
];
6146 wxString original
= data
.original
;
6147 original
.replace(data
.start
, data
.len
, data
.replacement
);
6149 wxPrintf(_T("wxString(\"%s\").replace(%u, %u, %s) = %s "),
6150 data
.original
, data
.start
, data
.len
, data
.replacement
,
6153 if ( original
== data
.result
)
6159 wxPrintf(_T("(ERROR: should be '%s')\n"), data
.result
);
6166 static void TestStringMatch()
6168 wxPuts(_T("*** Testing wxString::Matches() ***"));
6170 static const struct StringMatchTestData
6173 const wxChar
*wildcard
;
6175 } stringMatchTestData
[] =
6177 { _T("foobar"), _T("foo*"), 1 },
6178 { _T("foobar"), _T("*oo*"), 1 },
6179 { _T("foobar"), _T("*bar"), 1 },
6180 { _T("foobar"), _T("??????"), 1 },
6181 { _T("foobar"), _T("f??b*"), 1 },
6182 { _T("foobar"), _T("f?b*"), 0 },
6183 { _T("foobar"), _T("*goo*"), 0 },
6184 { _T("foobar"), _T("*foo"), 0 },
6185 { _T("foobarfoo"), _T("*foo"), 1 },
6186 { _T(""), _T("*"), 1 },
6187 { _T(""), _T("?"), 0 },
6190 for ( size_t n
= 0; n
< WXSIZEOF(stringMatchTestData
); n
++ )
6192 const StringMatchTestData
& data
= stringMatchTestData
[n
];
6193 bool matches
= wxString(data
.text
).Matches(data
.wildcard
);
6194 wxPrintf(_T("'%s' %s '%s' (%s)\n"),
6196 matches
? _T("matches") : _T("doesn't match"),
6198 matches
== data
.matches
? _T("ok") : _T("ERROR"));
6204 #endif // TEST_STRINGS
6206 // ----------------------------------------------------------------------------
6208 // ----------------------------------------------------------------------------
6210 #ifdef TEST_SNGLINST
6211 #include "wx/snglinst.h"
6212 #endif // TEST_SNGLINST
6214 int main(int argc
, char **argv
)
6216 wxApp::CheckBuildOptions(wxBuildOptions());
6218 wxInitializer initializer
;
6221 fprintf(stderr
, "Failed to initialize the wxWindows library, aborting.");
6226 #ifdef TEST_SNGLINST
6227 wxSingleInstanceChecker checker
;
6228 if ( checker
.Create(_T(".wxconsole.lock")) )
6230 if ( checker
.IsAnotherRunning() )
6232 wxPrintf(_T("Another instance of the program is running, exiting.\n"));
6237 // wait some time to give time to launch another instance
6238 wxPrintf(_T("Press \"Enter\" to continue..."));
6241 else // failed to create
6243 wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
6245 #endif // TEST_SNGLINST
6249 #endif // TEST_CHARSET
6252 TestCmdLineConvert();
6254 #if wxUSE_CMDLINE_PARSER
6255 static const wxCmdLineEntryDesc cmdLineDesc
[] =
6257 { wxCMD_LINE_SWITCH
, _T("h"), _T("help"), _T("show this help message"),
6258 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
6259 { wxCMD_LINE_SWITCH
, _T("v"), _T("verbose"), _T("be verbose") },
6260 { wxCMD_LINE_SWITCH
, _T("q"), _T("quiet"), _T("be quiet") },
6262 { wxCMD_LINE_OPTION
, _T("o"), _T("output"), _T("output file") },
6263 { wxCMD_LINE_OPTION
, _T("i"), _T("input"), _T("input dir") },
6264 { wxCMD_LINE_OPTION
, _T("s"), _T("size"), _T("output block size"),
6265 wxCMD_LINE_VAL_NUMBER
},
6266 { wxCMD_LINE_OPTION
, _T("d"), _T("date"), _T("output file date"),
6267 wxCMD_LINE_VAL_DATE
},
6269 { wxCMD_LINE_PARAM
, NULL
, NULL
, _T("input file"),
6270 wxCMD_LINE_VAL_STRING
, wxCMD_LINE_PARAM_MULTIPLE
},
6276 wxChar
**wargv
= new wxChar
*[argc
+ 1];
6279 for ( int n
= 0; n
< argc
; n
++ )
6281 wxMB2WXbuf warg
= wxConvertMB2WX(argv
[n
]);
6282 wargv
[n
] = wxStrdup(warg
);
6289 #endif // wxUSE_UNICODE
6291 wxCmdLineParser
parser(cmdLineDesc
, argc
, argv
);
6295 for ( int n
= 0; n
< argc
; n
++ )
6300 #endif // wxUSE_UNICODE
6302 parser
.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
6303 wxCMD_LINE_VAL_STRING
,
6304 wxCMD_LINE_OPTION_MANDATORY
| wxCMD_LINE_NEEDS_SEPARATOR
);
6306 switch ( parser
.Parse() )
6309 wxLogMessage(_T("Help was given, terminating."));
6313 ShowCmdLine(parser
);
6317 wxLogMessage(_T("Syntax error detected, aborting."));
6320 #endif // wxUSE_CMDLINE_PARSER
6322 #endif // TEST_CMDLINE
6330 TestStringConstruction();
6333 TestStringTokenizer();
6334 TestStringReplace();
6340 #endif // TEST_STRINGS
6346 a1
.Add(_T("tiger"));
6348 a1
.Add(_T("lion"), 3);
6350 a1
.Add(_T("human"));
6353 wxPuts(_T("*** Initially:"));
6355 PrintArray(_T("a1"), a1
);
6357 wxArrayString
a2(a1
);
6358 PrintArray(_T("a2"), a2
);
6360 wxSortedArrayString
a3(a1
);
6361 PrintArray(_T("a3"), a3
);
6363 wxPuts(_T("*** After deleting three strings from a1"));
6366 PrintArray(_T("a1"), a1
);
6367 PrintArray(_T("a2"), a2
);
6368 PrintArray(_T("a3"), a3
);
6370 wxPuts(_T("*** After reassigning a1 to a2 and a3"));
6372 PrintArray(_T("a2"), a2
);
6373 PrintArray(_T("a3"), a3
);
6375 wxPuts(_T("*** After sorting a1"));
6377 PrintArray(_T("a1"), a1
);
6379 wxPuts(_T("*** After sorting a1 in reverse order"));
6381 PrintArray(_T("a1"), a1
);
6383 wxPuts(_T("*** After sorting a1 by the string length"));
6384 a1
.Sort(StringLenCompare
);
6385 PrintArray(_T("a1"), a1
);
6387 TestArrayOfObjects();
6388 TestArrayOfUShorts();
6392 #endif // TEST_ARRAYS
6403 #ifdef TEST_DLLLOADER
6405 #endif // TEST_DLLLOADER
6409 #endif // TEST_ENVIRON
6413 #endif // TEST_EXECUTE
6415 #ifdef TEST_FILECONF
6417 #endif // TEST_FILECONF
6425 #endif // TEST_LOCALE
6428 wxPuts(_T("*** Testing wxLog ***"));
6431 for ( size_t n
= 0; n
< 8000; n
++ )
6433 s
<< (wxChar
)(_T('A') + (n
% 26));
6436 wxLogWarning(_T("The length of the string is %lu"),
6437 (unsigned long)s
.length());
6440 msg
.Printf(_T("A very very long message: '%s', the end!\n"), s
.c_str());
6442 // this one shouldn't be truncated
6445 // but this one will because log functions use fixed size buffer
6446 // (note that it doesn't need '\n' at the end neither - will be added
6448 wxLogMessage(_T("A very very long message 2: '%s', the end!"), s
.c_str());
6460 #ifdef TEST_FILENAME
6464 fn
.Assign(_T("c:\\foo"), _T("bar.baz"));
6465 fn
.Assign(_T("/u/os9-port/Viewer/tvision/WEI2HZ-3B3-14_05-04-00MSC1.asc"));
6470 TestFileNameConstruction();
6473 TestFileNameConstruction();
6474 TestFileNameMakeRelative();
6475 TestFileNameMakeAbsolute();
6476 TestFileNameSplit();
6479 TestFileNameComparison();
6480 TestFileNameOperations();
6482 #endif // TEST_FILENAME
6484 #ifdef TEST_FILETIME
6488 #endif // TEST_FILETIME
6491 wxLog::AddTraceMask(FTP_TRACE_MASK
);
6492 if ( TestFtpConnect() )
6503 if ( TEST_INTERACTIVE
)
6504 TestFtpInteractive();
6506 //else: connecting to the FTP server failed
6512 #ifdef TEST_LONGLONG
6513 // seed pseudo random generator
6514 srand((unsigned)time(NULL
));
6523 TestMultiplication();
6526 TestLongLongConversion();
6527 TestBitOperations();
6528 TestLongLongComparison();
6529 TestLongLongToString();
6530 TestLongLongPrintf();
6532 #endif // TEST_LONGLONG
6540 #endif // TEST_HASHMAP
6543 wxLog::AddTraceMask(_T("mime"));
6548 TestMimeAssociate();
6553 #ifdef TEST_INFO_FUNCTIONS
6559 if ( TEST_INTERACTIVE
)
6562 #endif // TEST_INFO_FUNCTIONS
6564 #ifdef TEST_PATHLIST
6566 #endif // TEST_PATHLIST
6574 #endif // TEST_PRINTF
6578 #endif // TEST_REGCONF
6581 // TODO: write a real test using src/regex/tests file
6586 TestRegExSubmatch();
6587 TestRegExReplacement();
6589 if ( TEST_INTERACTIVE
)
6590 TestRegExInteractive();
6592 #endif // TEST_REGEX
6594 #ifdef TEST_REGISTRY
6596 TestRegistryAssociation();
6597 #endif // TEST_REGISTRY
6602 #endif // TEST_SOCKETS
6610 #endif // TEST_STREAMS
6612 #ifdef TEST_TEXTSTREAM
6613 TestTextInputStream();
6614 #endif // TEST_TEXTSTREAM
6617 int nCPUs
= wxThread::GetCPUCount();
6618 wxPrintf(_T("This system has %d CPUs\n"), nCPUs
);
6620 wxThread::SetConcurrency(nCPUs
);
6622 TestDetachedThreads();
6625 TestJoinableThreads();
6626 TestThreadSuspend();
6628 TestThreadConditions();
6632 #endif // TEST_THREADS
6636 #endif // TEST_TIMER
6638 #ifdef TEST_DATETIME
6651 TestTimeArithmetics();
6654 TestTimeSpanFormat();
6662 if ( TEST_INTERACTIVE
)
6663 TestDateTimeInteractive();
6664 #endif // TEST_DATETIME
6667 wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
6669 #endif // TEST_USLEEP
6674 #endif // TEST_VCARD
6678 #endif // TEST_VOLUME
6681 TestUnicodeToFromAscii();
6682 #endif // TEST_UNICODE
6686 TestEncodingConverter();
6687 #endif // TEST_WCHAR
6690 TestZipStreamRead();
6691 TestZipFileSystem();
6695 TestZlibStreamWrite();
6696 TestZlibStreamRead();