X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/456ae26d78a0081e0258c9a1c0e88bd211ca70c1..6c04a87329930a8278e6da33564099aa76435d00:/samples/console/console.cpp diff --git a/samples/console/console.cpp b/samples/console/console.cpp index ecee38a137..7906063b3c 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -28,6 +28,7 @@ #include "wx/string.h" #include "wx/file.h" #include "wx/app.h" +#include "wx/log.h" // without this pragma, the stupid compiler precompiles #defines below so that // changing them doesn't "take place" later! @@ -48,7 +49,7 @@ */ // what to test (in alphabetic order)? uncomment the line below to do all tests -#define TEST_ALL +//#define TEST_ALL #ifdef TEST_ALL #define TEST_ARRAYS #define TEST_CHARSET @@ -65,6 +66,7 @@ #define TEST_FTP #define TEST_HASH #define TEST_HASHMAP + #define TEST_HASHSET #define TEST_INFO_FUNCTIONS #define TEST_LIST #define TEST_LOCALE @@ -73,13 +75,16 @@ #define TEST_MIME #define TEST_PATHLIST #define TEST_ODBC + #define TEST_PRINTF #define TEST_REGCONF #define TEST_REGEX #define TEST_REGISTRY + #define TEST_SCOPEGUARD #define TEST_SNGLINST #define TEST_SOCKETS #define TEST_STREAMS #define TEST_STRINGS + #define TEST_TEXTSTREAM #define TEST_THREADS #define TEST_TIMER #define TEST_UNICODE @@ -90,20 +95,20 @@ #define TEST_ZLIB #undef TEST_ALL - static const bool TEST_ALL = TRUE; + static const bool TEST_ALL = true; #else - #define TEST_DLLLOADER + #define TEST_HASHSET - static const bool TEST_ALL = FALSE; + static const bool TEST_ALL = false; #endif // some tests are interactive, define this to run them #ifdef TEST_INTERACTIVE #undef TEST_INTERACTIVE - static const bool TEST_INTERACTIVE = TRUE; + static const bool TEST_INTERACTIVE = true; #else - static const bool TEST_INTERACTIVE = FALSE; + static const bool TEST_INTERACTIVE = false; #endif // ---------------------------------------------------------------------------- @@ -204,7 +209,6 @@ static void TestCharset() #include "wx/cmdline.h" #include "wx/datetime.h" -#include "wx/log.h" #if wxUSE_CMDLINE_PARSER @@ -277,7 +281,7 @@ static void TestCmdLineConvert() #ifdef __UNIX__ static const wxChar *ROOTDIR = _T("/"); - static const wxChar *TESTDIR = _T("/usr"); + static const wxChar *TESTDIR = _T("/usr/local/share"); #elif defined(__WXMSW__) static const wxChar *ROOTDIR = _T("c:\\"); static const wxChar *TESTDIR = _T("d:\\"); @@ -316,7 +320,7 @@ static void TestDirEnum() return; } - wxDir dir(_T("s:/tmp/foo")); + wxDir dir(cwd); if ( !dir.IsOpened() ) { wxPrintf(_T("ERROR: failed to open current directory '%s'.\n"), cwd.c_str()); @@ -330,7 +334,7 @@ static void TestDirEnum() TestDirEnumHelper(dir, wxDIR_DEFAULT | wxDIR_DOTDOT); wxPuts(_T("Enumerating object files in current directory:")); - TestDirEnumHelper(dir, wxDIR_DEFAULT, "*.o"); + TestDirEnumHelper(dir, wxDIR_DEFAULT, "*.o*"); wxPuts(_T("Enumerating directories in current directory:")); TestDirEnumHelper(dir, wxDIR_DIRS); @@ -404,6 +408,7 @@ static void TestDirTraverse() } // enum again with custom traverser + wxPuts(_T("Now enumerating directories:")); wxDir dir(TESTDIR); DirPrintTraverser traverser; dir.Traverse(traverser, _T(""), wxDIR_DIRS | wxDIR_HIDDEN); @@ -551,7 +556,7 @@ static void TestExecute() #define SHELL_COMMAND "echo hi from shell" #define REDIRECT_COMMAND COMMAND // "date" #elif defined(__WXMSW__) - #define COMMAND "command.com -c 'echo hi'" + #define COMMAND "command.com /c echo hi" #define SHELL_COMMAND "echo hi" #define REDIRECT_COMMAND COMMAND #else @@ -567,7 +572,7 @@ static void TestExecute() wxPrintf(_T("Testing wxExecute: ")); fflush(stdout); - if ( wxExecute(COMMAND, TRUE /* sync */) == 0 ) + if ( wxExecute(COMMAND, true /* sync */) == 0 ) wxPuts(_T("Ok.")); else wxPuts(_T("ERROR.")); @@ -795,6 +800,12 @@ static void TestFileConfRead() cont = fileconf.GetNextEntry(name, dummy); } + + static const wxChar *testEntry = _T("TestEntry"); + wxPrintf(_T("\nTesting deletion of newly created \"Test\" entry: ")); + fileconf.Write(testEntry, _T("A value")); + fileconf.DeleteEntry(testEntry); + wxPrintf(fileconf.HasEntry(testEntry) ? _T("ERROR\n") : _T("ok\n")); } #endif // TEST_FILECONF @@ -850,39 +861,39 @@ static struct FileNameInfo } filenames[] = { // Unix file names - { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), TRUE, wxPATH_UNIX }, - { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), TRUE, wxPATH_UNIX }, - { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), TRUE, wxPATH_UNIX }, - { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), FALSE, wxPATH_UNIX }, - { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE, wxPATH_UNIX }, - { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), TRUE, wxPATH_UNIX }, - { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), TRUE, wxPATH_UNIX }, - { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), FALSE, wxPATH_UNIX }, - { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), TRUE, wxPATH_UNIX }, + { _T("/usr/bin/ls"), _T(""), _T("/usr/bin"), _T("ls"), _T(""), true, wxPATH_UNIX }, + { _T("/usr/bin/"), _T(""), _T("/usr/bin"), _T(""), _T(""), true, wxPATH_UNIX }, + { _T("~/.zshrc"), _T(""), _T("~"), _T(".zshrc"), _T(""), true, wxPATH_UNIX }, + { _T("../../foo"), _T(""), _T("../.."), _T("foo"), _T(""), false, wxPATH_UNIX }, + { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), false, wxPATH_UNIX }, + { _T("~/foo.bar"), _T(""), _T("~"), _T("foo"), _T("bar"), true, wxPATH_UNIX }, + { _T("/foo"), _T(""), _T("/"), _T("foo"), _T(""), true, wxPATH_UNIX }, + { _T("Mahogany-0.60/foo.bar"), _T(""), _T("Mahogany-0.60"), _T("foo"), _T("bar"), false, wxPATH_UNIX }, + { _T("/tmp/wxwin.tar.bz"), _T(""), _T("/tmp"), _T("wxwin.tar"), _T("bz"), true, wxPATH_UNIX }, // Windows file names - { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), FALSE, wxPATH_DOS }, - { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), FALSE, wxPATH_DOS }, - { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), FALSE, wxPATH_DOS }, - { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), TRUE, wxPATH_DOS }, - { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), TRUE, wxPATH_DOS }, - { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), TRUE, wxPATH_DOS }, - { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), TRUE, wxPATH_DOS }, + { _T("foo.bar"), _T(""), _T(""), _T("foo"), _T("bar"), false, wxPATH_DOS }, + { _T("\\foo.bar"), _T(""), _T("\\"), _T("foo"), _T("bar"), false, wxPATH_DOS }, + { _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), false, wxPATH_DOS }, + { _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS }, + { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), true, wxPATH_DOS }, + { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS }, + { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), true, wxPATH_DOS }, // wxFileName support for Mac file names is broken currently #if 0 // Mac file names - { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE, wxPATH_MAC }, - { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), TRUE, wxPATH_MAC }, - { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), TRUE, wxPATH_MAC }, - { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), FALSE, wxPATH_MAC }, - { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE, wxPATH_MAC }, - { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE, wxPATH_MAC }, + { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), true, wxPATH_MAC }, + { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), true, wxPATH_MAC }, + { _T("Volume:"), _T("Volume"), _T(""), _T(""), _T(""), true, wxPATH_MAC }, + { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), false, wxPATH_MAC }, + { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC }, + { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC }, #endif // 0 // VMS file names - { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), TRUE, wxPATH_VMS }, - { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), FALSE, wxPATH_VMS }, + { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), true, wxPATH_VMS }, + { _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), false, wxPATH_VMS }, }; static void TestFileNameConstruction() @@ -1032,6 +1043,24 @@ static void TestFileNameMakeRelative() } } +static void TestFileNameMakeAbsolute() +{ + wxPuts(_T("*** testing wxFileName::MakeAbsolute() ***")); + + for ( size_t n = 0; n < WXSIZEOF(filenames); n++ ) + { + const FileNameInfo& fni = filenames[n]; + wxFileName fn(fni.fullname, fni.format); + + wxPrintf(_T("'%s' absolutized: "), + fn.GetFullPath(fni.format).c_str()); + fn.MakeAbsolute(); + wxPrintf(_T("'%s'\n"), fn.GetFullPath(fni.format).c_str()); + } + + wxPuts(_T("")); +} + static void TestFileNameComparison() { // TODO! @@ -1121,9 +1150,44 @@ static void TestHash() { wxPuts(_T("*** Testing wxHashTable ***\n")); + { + wxHashTable hash(wxKEY_INTEGER), hash2(wxKEY_STRING); + int i; + + for ( i = 0; i < 100; ++i ) + hash.Put(i, (wxObject*)&i + i); + + hash.BeginFind(); + wxHashTable::compatibility_iterator it = hash.Next(); + i = 0; + + while (it) + { + ++i; + it = hash.Next(); + } + + if (i != 100) + wxPuts(_T("Error in wxHashTable::compatibility_iterator\n")); + + for ( i = 99; i >= 0; --i ) + if( hash.Get(i) != (wxObject*)&i + i ) + wxPuts(_T("Error in wxHashTable::Get/Put\n")); + + hash2.Put("foo", (wxObject*)&i + 1); + hash2.Put("bar", (wxObject*)&i + 2); + hash2.Put("baz", (wxObject*)&i + 3); + + if (hash2.Get("moo") != NULL) + wxPuts(_T("Error in wxHashTable::Get\n")); + + if (hash2.Get("bar") != (wxObject*)&i + 2) + wxPuts(_T("Error in wxHashTable::Get/Put\n")); + } +#if !wxUSE_STL { wxHashFoos hash; - hash.DeleteContents(TRUE); + hash.DeleteContents(true); wxPrintf(_T("Hash created: %u foos in hash, %u foos totally\n"), hash.GetCount(), Foo::count); @@ -1170,8 +1234,10 @@ static void TestHash() wxPuts(_T("ok (not found)")); } } +#endif wxPrintf(_T("Hash destroyed: %u foos left\n"), Foo::count); + wxPuts(_T("*** Testing wxHashTable finished ***\n")); } #endif // TEST_HASH @@ -1322,6 +1388,100 @@ static void TestHashMap() #endif // TEST_HASHMAP +// ---------------------------------------------------------------------------- +// wxHashSet +// ---------------------------------------------------------------------------- + +#ifdef TEST_HASHSET + +#include "wx/hashset.h" + +// test compilation of basic map types +WX_DECLARE_HASH_SET( int*, wxPointerHash, wxPointerEqual, myPtrHashSet ); +WX_DECLARE_HASH_SET( long, wxIntegerHash, wxIntegerEqual, myLongHashSet ); +WX_DECLARE_HASH_SET( unsigned long, wxIntegerHash, wxIntegerEqual, + myUnsignedHashSet ); +WX_DECLARE_HASH_SET( unsigned int, wxIntegerHash, wxIntegerEqual, + myTestHashSet1 ); +WX_DECLARE_HASH_SET( int, wxIntegerHash, wxIntegerEqual, + myTestHashSet2 ); +WX_DECLARE_HASH_SET( short, wxIntegerHash, wxIntegerEqual, + myTestHashSet3 ); +WX_DECLARE_HASH_SET( unsigned short, wxIntegerHash, wxIntegerEqual, + myTestHashSet4 ); +WX_DECLARE_HASH_SET( wxString, wxStringHash, wxStringEqual, + myTestHashSet5 ); + +struct MyStruct +{ + int* ptr; + wxString str; +}; + +class MyHash +{ +public: + unsigned long operator()(const MyStruct& s) const + { return m_dummy(s.ptr); } + MyHash& operator=(const MyHash&) { return *this; } +private: + wxPointerHash m_dummy; +}; + +class MyEqual +{ +public: + bool operator()(const MyStruct& s1, const MyStruct& s2) const + { return s1.ptr == s2.ptr; } + MyEqual& operator=(const MyEqual&) { return *this; } +}; + +WX_DECLARE_HASH_SET( MyStruct, MyHash, MyEqual, mySet ); + +typedef myTestHashSet5 wxStringHashSet; + +static void TestHashSet() +{ + wxPrintf(_T("*** Testing wxHashSet ***\n")); + + wxStringHashSet set1; + + set1.insert( _T("abc") ); + set1.insert( _T("bbc") ); + set1.insert( _T("cbc") ); + set1.insert( _T("abc") ); + + if( set1.size() != 3 ) + wxPrintf(_T("*** ERROR IN INSERT ***\n")); + + mySet set2; + int dummy; + MyStruct tmp; + + tmp.ptr = &dummy; tmp.str = _T("ABC"); + set2.insert( tmp ); + tmp.ptr = &dummy + 1; + set2.insert( tmp ); + tmp.ptr = &dummy; tmp.str = _T("CDE"); + set2.insert( tmp ); + + if( set2.size() != 2 ) + wxPrintf(_T("*** ERROR IN INSERT - 2 ***\n")); + + mySet::iterator it = set2.find( tmp ); + + if( it == set2.end() ) + wxPrintf(_T("*** ERROR IN FIND - 1 ***\n")); + if( it->ptr != &dummy ) + wxPrintf(_T("*** ERROR IN FIND - 2 ***\n")); + if( it->str != _T("ABC") ) + wxPrintf(_T("*** ERROR IN INSERT - 3 ***\n")); + + wxPrintf(_T("*** Finished testing wxHashSet ***\n")); +} + +#endif // TEST_HASHSET + // ---------------------------------------------------------------------------- // wxList // ---------------------------------------------------------------------------- @@ -1334,6 +1494,104 @@ WX_DECLARE_LIST(Bar, wxListBars); #include "wx/listimpl.cpp" WX_DEFINE_LIST(wxListBars); +WX_DECLARE_LIST(int, wxListInt); +WX_DEFINE_LIST(wxListInt); + +static void TestList() +{ + wxPuts(_T("*** Testing wxList operations ***\n")); + { + wxListInt list1; + int dummy[5]; + int i; + + for ( i = 0; i < 5; ++i ) + list1.Append(dummy + i); + + if ( list1.GetCount() != 5 ) + wxPuts(_T("Wrong number of items in list\n")); + + if ( list1.Item(3)->GetData() != dummy + 3 ) + wxPuts(_T("Error in Item()\n")); + + if ( !list1.Find(dummy + 4) ) + wxPuts(_T("Error in Find()\n")); + + wxListInt::compatibility_iterator node = list1.GetFirst(); + i = 0; + + while (node) + { + if ( node->GetData() != dummy + i ) + wxPuts(_T("Error in compatibility_iterator\n")); + node = node->GetNext(); + ++i; + } + + if ( size_t(i) != list1.GetCount() ) + wxPuts(_T("Error in compatibility_iterator\n")); + + list1.Insert(dummy + 0); + list1.Insert(1, dummy + 1); + list1.Insert(list1.GetFirst()->GetNext()->GetNext(), dummy + 2); + + node = list1.GetFirst(); + i = 0; + + while (i < 3) + { + int* t = node->GetData(); + if ( t != dummy + i ) + wxPuts(_T("Error in Insert\n")); + node = node->GetNext(); + ++i; + } + } + + wxPuts(_T("*** Testing wxList operations finished ***\n")); + + wxPuts(_T("*** Testing std::list operations ***\n")); + + { + wxListInt list1; + wxListInt::iterator it, en; + wxListInt::reverse_iterator rit, ren; + int i; + for ( i = 0; i < 5; ++i ) + list1.push_back(i + &i); + + for ( it = list1.begin(), en = list1.end(), i = 0; + it != en; ++it, ++i ) + if ( *it != i + &i ) + wxPuts(_T("Error in iterator\n")); + + for ( rit = list1.rbegin(), ren = list1.rend(), i = 4; + rit != ren; ++rit, --i ) + if ( *rit != i + &i ) + wxPuts(_T("Error in reverse_iterator\n")); + + if ( *list1.rbegin() != *--list1.end() || + *list1.begin() != *--list1.rend() ) + wxPuts(_T("Error in iterator/reverse_iterator\n")); + if ( *list1.begin() != *--++list1.begin() || + *list1.rbegin() != *--++list1.rbegin() ) + wxPuts(_T("Error in iterator/reverse_iterator\n")); + + if ( list1.front() != &i || list1.back() != &i + 4 ) + wxPuts(_T("Error in front()/back()\n")); + + list1.erase(list1.begin()); + list1.erase(--list1.end()); + + for ( it = list1.begin(), en = list1.end(), i = 1; + it != en; ++it, ++i ) + if ( *it != i + &i ) + wxPuts(_T("Error in erase()\n")); + } + + wxPuts(_T("*** Testing std::list operations finished ***\n")); +} + static void TestListCtor() { wxPuts(_T("*** Testing wxList construction ***\n")); @@ -1352,7 +1610,11 @@ static void TestListCtor() wxPrintf(_T("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n"), list1.GetCount(), list2.GetCount(), Bar::GetNumber()); - list1.DeleteContents(TRUE); +#if !wxUSE_STL + list1.DeleteContents(true); +#else + WX_CLEAR_LIST(wxListBars, list1); +#endif } wxPrintf(_T("After list destruction: %u objects left.\n"), Bar::GetNumber()); @@ -1764,8 +2026,10 @@ static void TestMimeFilename() if ( !ft->GetOpenCommand(&cmd, wxFileType::MessageParameters(fname, _T(""))) ) cmd = _T(""); + else + cmd = wxString(_T('"')) + cmd + _T('"'); - wxPrintf(_T("To open %s (%s) do '%s'.\n"), + wxPrintf(_T("To open %s (%s) do %s.\n"), fname.c_str(), desc.c_str(), cmd.c_str()); delete ft; @@ -2166,9 +2430,9 @@ static void TestLongLongComparison() #endif // wxUSE_LONGLONG_WX } -static void TestLongLongPrint() +static void TestLongLongToString() { - wxPuts(_T("*** Testing wxLongLong printing ***\n")); + wxPuts(_T("*** Testing wxLongLong::ToString() ***\n")); for ( size_t n = 0; n < WXSIZEOF(testLongs); n++ ) { @@ -2183,6 +2447,20 @@ static void TestLongLongPrint() wxPrintf(_T("-0x1234567887654321 = %s\n"), ll.ToString().c_str()); } +static void TestLongLongPrintf() +{ + wxPuts(_T("*** Testing wxLongLong printing ***\n")); + +#ifdef wxLongLongFmtSpec + wxLongLong ll = wxLL(0x1234567890abcdef); + wxString s = wxString::Format(_T("%") wxLongLongFmtSpec _T("x"), ll); + wxPrintf(_T("0x1234567890abcdef -> %s (%s)\n"), + s.c_str(), s == _T("1234567890abcdef") ? _T("ok") : _T("ERROR")); +#else // !wxLongLongFmtSpec + #error "wxLongLongFmtSpec not defined for this compiler/platform" +#endif +} + #undef MAKE_LL #undef RAND_LL @@ -2194,13 +2472,19 @@ static void TestLongLongPrint() #ifdef TEST_PATHLIST +#ifdef __UNIX__ + #define CMD_IN_PATH _T("ls") +#else + #define CMD_IN_PATH _T("command.com") +#endif + static void TestPathList() { wxPuts(_T("*** Testing wxPathList ***\n")); wxPathList pathlist; - pathlist.AddEnvList("PATH"); - wxString path = pathlist.FindValidPath("ls"); + pathlist.AddEnvList(_T("PATH")); + wxString path = pathlist.FindValidPath(CMD_IN_PATH); if ( path.empty() ) { wxPrintf(_T("ERROR: command not found in the path.\n")); @@ -2231,26 +2515,26 @@ static void TestRegExCompile() bool correct; } regExCompTestData[] = { - { _T("foo"), TRUE }, - { _T("foo("), FALSE }, - { _T("foo(bar"), FALSE }, - { _T("foo(bar)"), TRUE }, - { _T("foo["), FALSE }, - { _T("foo[bar"), FALSE }, - { _T("foo[bar]"), TRUE }, - { _T("foo{"), TRUE }, - { _T("foo{1"), FALSE }, - { _T("foo{bar"), TRUE }, - { _T("foo{1}"), TRUE }, - { _T("foo{1,2}"), TRUE }, - { _T("foo{bar}"), TRUE }, - { _T("foo*"), TRUE }, - { _T("foo**"), FALSE }, - { _T("foo+"), TRUE }, - { _T("foo++"), FALSE }, - { _T("foo?"), TRUE }, - { _T("foo??"), FALSE }, - { _T("foo?+"), FALSE }, + { _T("foo"), true }, + { _T("foo("), false }, + { _T("foo(bar"), false }, + { _T("foo(bar)"), true }, + { _T("foo["), false }, + { _T("foo[bar"), false }, + { _T("foo[bar]"), true }, + { _T("foo{"), true }, + { _T("foo{1"), false }, + { _T("foo{bar"), true }, + { _T("foo{1}"), true }, + { _T("foo{1,2}"), true }, + { _T("foo{bar}"), true }, + { _T("foo*"), true }, + { _T("foo**"), false }, + { _T("foo+"), true }, + { _T("foo++"), false }, + { _T("foo?"), true }, + { _T("foo??"), false }, + { _T("foo?+"), false }, }; wxRegEx re; @@ -2277,12 +2561,12 @@ static void TestRegExMatch() bool correct; } regExMatchTestData[] = { - { _T("foo"), _T("bar"), FALSE }, - { _T("foo"), _T("foobar"), TRUE }, - { _T("^foo"), _T("foobar"), TRUE }, - { _T("^foo"), _T("barfoo"), FALSE }, - { _T("bar$"), _T("barbar"), TRUE }, - { _T("bar$"), _T("barbar "), FALSE }, + { _T("foo"), _T("bar"), false }, + { _T("foo"), _T("foobar"), true }, + { _T("^foo"), _T("foobar"), true }, + { _T("^foo"), _T("barfoo"), false }, + { _T("bar$"), _T("barbar"), true }, + { _T("bar$"), _T("barbar "), false }, }; for ( size_t n = 0; n < WXSIZEOF(regExMatchTestData); n++ ) @@ -2454,6 +2738,360 @@ static void TestDbOpen() #endif // TEST_ODBC +// ---------------------------------------------------------------------------- +// printf() tests +// ---------------------------------------------------------------------------- + +/* + NB: this stuff was taken from the glibc test suite and modified to build + in wxWindows: if I read the copyright below properly, this shouldn't + be a problem + */ + +#ifdef TEST_PRINTF + +#ifdef wxTEST_PRINTF + // use our functions from wxchar.cpp + #undef wxPrintf + #undef wxSprintf + + // NB: do _not_ use ATTRIBUTE_PRINTF here, we have some invalid formats + // in the tests below + int wxPrintf( const wxChar *format, ... ); + int wxSprintf( wxChar *str, const wxChar *format, ... ); +#endif + +#include "wx/longlong.h" + +#include + +static void rfg1 (void); +static void rfg2 (void); + + +static void +fmtchk (const wxChar *fmt) +{ + (void) wxPrintf(_T("%s:\t`"), fmt); + (void) wxPrintf(fmt, 0x12); + (void) wxPrintf(_T("'\n")); +} + +static void +fmtst1chk (const wxChar *fmt) +{ + (void) wxPrintf(_T("%s:\t`"), fmt); + (void) wxPrintf(fmt, 4, 0x12); + (void) wxPrintf(_T("'\n")); +} + +static void +fmtst2chk (const wxChar *fmt) +{ + (void) wxPrintf(_T("%s:\t`"), fmt); + (void) wxPrintf(fmt, 4, 4, 0x12); + (void) wxPrintf(_T("'\n")); +} + +/* This page is covered by the following copyright: */ + +/* (C) Copyright C E Chew + * + * Feel free to copy, use and distribute this software provided: + * + * 1. you do not pretend that you wrote it + * 2. you leave this copyright notice intact. + */ + +/* + * Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans. + */ + +#define DEC -123 +#define INT 255 +#define UNS (~0) + +/* Formatted Output Test + * + * This exercises the output formatting code. + */ + +static void +fp_test (void) +{ + int i, j, k, l; + wxChar buf[7]; + wxChar *prefix = buf; + wxChar tp[20]; + + wxPuts(_T("\nFormatted output test")); + wxPrintf(_T("prefix 6d 6o 6x 6X 6u\n")); + wxStrcpy(prefix, _T("%")); + for (i = 0; i < 2; i++) { + for (j = 0; j < 2; j++) { + for (k = 0; k < 2; k++) { + for (l = 0; l < 2; l++) { + wxStrcpy(prefix, _T("%")); + if (i == 0) wxStrcat(prefix, _T("-")); + if (j == 0) wxStrcat(prefix, _T("+")); + if (k == 0) wxStrcat(prefix, _T("#")); + if (l == 0) wxStrcat(prefix, _T("0")); + wxPrintf(_T("%5s |"), prefix); + wxStrcpy(tp, prefix); + wxStrcat(tp, _T("6d |")); + wxPrintf(tp, DEC); + wxStrcpy(tp, prefix); + wxStrcat(tp, _T("6o |")); + wxPrintf(tp, INT); + wxStrcpy(tp, prefix); + wxStrcat(tp, _T("6x |")); + wxPrintf(tp, INT); + wxStrcpy(tp, prefix); + wxStrcat(tp, _T("6X |")); + wxPrintf(tp, INT); + wxStrcpy(tp, prefix); + wxStrcat(tp, _T("6u |")); + wxPrintf(tp, UNS); + wxPrintf(_T("\n")); + } + } + } + } + wxPrintf(_T("%10s\n"), (wxChar *) NULL); + wxPrintf(_T("%-10s\n"), (wxChar *) NULL); +} + +static void TestPrintf() +{ + static wxChar shortstr[] = _T("Hi, Z."); + static wxChar longstr[] = _T("Good morning, Doctor Chandra. This is Hal. \ +I am ready for my first lesson today."); + int result = 0; + + fmtchk(_T("%.4x")); + fmtchk(_T("%04x")); + fmtchk(_T("%4.4x")); + fmtchk(_T("%04.4x")); + fmtchk(_T("%4.3x")); + fmtchk(_T("%04.3x")); + + fmtst1chk(_T("%.*x")); + fmtst1chk(_T("%0*x")); + fmtst2chk(_T("%*.*x")); + fmtst2chk(_T("%0*.*x")); + + wxPrintf(_T("bad format:\t\"%b\"\n")); + wxPrintf(_T("nil pointer (padded):\t\"%10p\"\n"), (void *) NULL); + + wxPrintf(_T("decimal negative:\t\"%d\"\n"), -2345); + wxPrintf(_T("octal negative:\t\"%o\"\n"), -2345); + wxPrintf(_T("hex negative:\t\"%x\"\n"), -2345); + wxPrintf(_T("long decimal number:\t\"%ld\"\n"), -123456L); + wxPrintf(_T("long octal negative:\t\"%lo\"\n"), -2345L); + wxPrintf(_T("long unsigned decimal number:\t\"%lu\"\n"), -123456L); + wxPrintf(_T("zero-padded LDN:\t\"%010ld\"\n"), -123456L); + wxPrintf(_T("left-adjusted ZLDN:\t\"%-010ld\"\n"), -123456); + wxPrintf(_T("space-padded LDN:\t\"%10ld\"\n"), -123456L); + wxPrintf(_T("left-adjusted SLDN:\t\"%-10ld\"\n"), -123456L); + + wxPrintf(_T("zero-padded string:\t\"%010s\"\n"), shortstr); + wxPrintf(_T("left-adjusted Z string:\t\"%-010s\"\n"), shortstr); + wxPrintf(_T("space-padded string:\t\"%10s\"\n"), shortstr); + wxPrintf(_T("left-adjusted S string:\t\"%-10s\"\n"), shortstr); + wxPrintf(_T("null string:\t\"%s\"\n"), (wxChar *)NULL); + wxPrintf(_T("limited string:\t\"%.22s\"\n"), longstr); + + wxPrintf(_T("e-style >= 1:\t\"%e\"\n"), 12.34); + wxPrintf(_T("e-style >= .1:\t\"%e\"\n"), 0.1234); + wxPrintf(_T("e-style < .1:\t\"%e\"\n"), 0.001234); + wxPrintf(_T("e-style big:\t\"%.60e\"\n"), 1e20); + wxPrintf(_T("e-style == .1:\t\"%e\"\n"), 0.1); + wxPrintf(_T("f-style >= 1:\t\"%f\"\n"), 12.34); + wxPrintf(_T("f-style >= .1:\t\"%f\"\n"), 0.1234); + wxPrintf(_T("f-style < .1:\t\"%f\"\n"), 0.001234); + wxPrintf(_T("g-style >= 1:\t\"%g\"\n"), 12.34); + wxPrintf(_T("g-style >= .1:\t\"%g\"\n"), 0.1234); + wxPrintf(_T("g-style < .1:\t\"%g\"\n"), 0.001234); + wxPrintf(_T("g-style big:\t\"%.60g\"\n"), 1e20); + + wxPrintf (_T(" %6.5f\n"), .099999999860301614); + wxPrintf (_T(" %6.5f\n"), .1); + wxPrintf (_T("x%5.4fx\n"), .5); + + wxPrintf (_T("%#03x\n"), 1); + + //wxPrintf (_T("something really insane: %.10000f\n"), 1.0); + + { + double d = FLT_MIN; + int niter = 17; + + while (niter-- != 0) + wxPrintf (_T("%.17e\n"), d / 2); + fflush (stdout); + } + + wxPrintf (_T("%15.5e\n"), 4.9406564584124654e-324); + +#define FORMAT _T("|%12.4f|%12.4e|%12.4g|\n") + wxPrintf (FORMAT, 0.0, 0.0, 0.0); + wxPrintf (FORMAT, 1.0, 1.0, 1.0); + wxPrintf (FORMAT, -1.0, -1.0, -1.0); + wxPrintf (FORMAT, 100.0, 100.0, 100.0); + wxPrintf (FORMAT, 1000.0, 1000.0, 1000.0); + wxPrintf (FORMAT, 10000.0, 10000.0, 10000.0); + wxPrintf (FORMAT, 12345.0, 12345.0, 12345.0); + wxPrintf (FORMAT, 100000.0, 100000.0, 100000.0); + wxPrintf (FORMAT, 123456.0, 123456.0, 123456.0); +#undef FORMAT + + { + wxChar buf[20]; + int rc = wxSnprintf (buf, WXSIZEOF(buf), _T("%30s"), _T("foo")); + + wxPrintf(_T("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n"), + rc, WXSIZEOF(buf), buf); +#if 0 + wxChar buf2[512]; + wxPrintf ("snprintf (\"%%.999999u\", 10)\n", + wxSnprintf(buf2, WXSIZEOFbuf2), "%.999999u", 10)); +#endif + } + + fp_test (); + + wxPrintf (_T("%e should be 1.234568e+06\n"), 1234567.8); + wxPrintf (_T("%f should be 1234567.800000\n"), 1234567.8); + wxPrintf (_T("%g should be 1.23457e+06\n"), 1234567.8); + wxPrintf (_T("%g should be 123.456\n"), 123.456); + wxPrintf (_T("%g should be 1e+06\n"), 1000000.0); + wxPrintf (_T("%g should be 10\n"), 10.0); + wxPrintf (_T("%g should be 0.02\n"), 0.02); + + { + double x=1.0; + wxPrintf(_T("%.17f\n"),(1.0/x/10.0+1.0)*x-x); + } + + { + wxChar buf[200]; + + wxSprintf(buf,_T("%*s%*s%*s"),-1,_T("one"),-20,_T("two"),-30,_T("three")); + + result |= wxStrcmp (buf, + _T("onetwo three ")); + + wxPuts (result != 0 ? _T("Test failed!") : _T("Test ok.")); + } + +#ifdef wxLongLong_t + { + wxChar buf[200]; + + wxSprintf(buf, _T("%07") wxLongLongFmtSpec _T("o"), wxLL(040000000000)); + wxPrintf (_T("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf); + + if (wxStrcmp (buf, _T("40000000000")) != 0) + { + result = 1; + wxPuts (_T("\tFAILED")); + } + wxPuts (_T("")); + } +#endif // wxLongLong_t + + wxPrintf (_T("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX + 2, UCHAR_MAX + 2); + wxPrintf (_T("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX + 2, USHRT_MAX + 2); + + wxPuts (_T("--- Should be no further output. ---")); + rfg1 (); + rfg2 (); + +#if 0 + { + wxChar bytes[7]; + wxChar buf[20]; + + memset (bytes, '\xff', sizeof bytes); + wxSprintf (buf, _T("foo%hhn\n"), &bytes[3]); + if (bytes[0] != '\xff' || bytes[1] != '\xff' || bytes[2] != '\xff' + || bytes[4] != '\xff' || bytes[5] != '\xff' || bytes[6] != '\xff') + { + wxPuts (_T("%hhn overwrite more bytes")); + result = 1; + } + if (bytes[3] != 3) + { + wxPuts (_T("%hhn wrote incorrect value")); + result = 1; + } + } +#endif +} + +static void +rfg1 (void) +{ + wxChar buf[100]; + + wxSprintf (buf, _T("%5.s"), _T("xyz")); + if (wxStrcmp (buf, _T(" ")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" ")); + wxSprintf (buf, _T("%5.f"), 33.3); + if (wxStrcmp (buf, _T(" 33")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 33")); + wxSprintf (buf, _T("%8.e"), 33.3e7); + if (wxStrcmp (buf, _T(" 3e+08")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 3e+08")); + wxSprintf (buf, _T("%8.E"), 33.3e7); + if (wxStrcmp (buf, _T(" 3E+08")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 3E+08")); + wxSprintf (buf, _T("%.g"), 33.3); + if (wxStrcmp (buf, _T("3e+01")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T("3e+01")); + wxSprintf (buf, _T("%.G"), 33.3); + if (wxStrcmp (buf, _T("3E+01")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T("3E+01")); +} + +static void +rfg2 (void) +{ + int prec; + wxChar buf[100]; + + prec = 0; + wxSprintf (buf, _T("%.*g"), prec, 3.3); + if (wxStrcmp (buf, _T("3")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T("3")); + prec = 0; + wxSprintf (buf, _T("%.*G"), prec, 3.3); + if (wxStrcmp (buf, _T("3")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T("3")); + prec = 0; + wxSprintf (buf, _T("%7.*G"), prec, 3.33); + if (wxStrcmp (buf, _T(" 3")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 3")); + prec = 3; + wxSprintf (buf, _T("%04.*o"), prec, 33); + if (wxStrcmp (buf, _T(" 041")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 041")); + prec = 7; + wxSprintf (buf, _T("%09.*u"), prec, 33); + if (wxStrcmp (buf, _T(" 0000033")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 0000033")); + prec = 3; + wxSprintf (buf, _T("%04.*x"), prec, 33); + if (wxStrcmp (buf, _T(" 021")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 021")); + prec = 3; + wxSprintf (buf, _T("%04.*X"), prec, 33); + if (wxStrcmp (buf, _T(" 021")) != 0) + wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 021")); +} + +#endif // TEST_PRINTF + // ---------------------------------------------------------------------------- // registry and related stuff // ---------------------------------------------------------------------------- @@ -2582,6 +3220,42 @@ static void TestRegistryAssociation() #endif // TEST_REGISTRY +// ---------------------------------------------------------------------------- +// scope guard +// ---------------------------------------------------------------------------- + +#ifdef TEST_SCOPEGUARD + +#include "wx/scopeguard.h" + +static void function0() { puts("function0()"); } +static void function1(int n) { printf("function1(%d)\n", n); } +static void function2(double x, char c) { printf("function2(%g, %c)\n", x, c); } + +struct Object +{ + void method0() { printf("method0()\n"); } + void method1(int n) { printf("method1(%d)\n", n); } + void method2(double x, char c) { printf("method2(%g, %c)\n", x, c); } +}; + +static void TestScopeGuard() +{ + ON_BLOCK_EXIT0(function0); + ON_BLOCK_EXIT1(function1, 17); + ON_BLOCK_EXIT2(function2, 3.14, 'p'); + + Object obj; + ON_BLOCK_EXIT_OBJ0(obj, &Object::method0); + ON_BLOCK_EXIT_OBJ1(obj, &Object::method1, 7); + ON_BLOCK_EXIT_OBJ2(obj, &Object::method2, 2.71, 'e'); + + wxScopeGuard dismissed = wxMakeGuard(function0); + dismissed.Dismiss(); +} + +#endif + // ---------------------------------------------------------------------------- // sockets // ---------------------------------------------------------------------------- @@ -2609,7 +3283,8 @@ static void TestSocketServer() return; } - for ( ;; ) + bool quit = false; + while ( !quit ) { wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT); @@ -2624,7 +3299,8 @@ static void TestSocketServer() server->SetTimeout(60); // 1 min - while ( socket->IsConnected() ) + bool close = false; + while ( !close && socket->IsConnected() ) { wxString s; wxChar ch = _T('\0'); @@ -2656,19 +3332,31 @@ static void TestSocketServer() } wxPrintf(_T("Server: got '%s'.\n"), s.c_str()); - if ( s == _T("bye") ) + if ( s == _T("close") ) { - delete socket; + wxPuts(_T("Closing connection")); - break; + close = true; } + else if ( s == _T("quit") ) + { + close = + quit = true; - socket->Write(s.MakeUpper().c_str(), s.length()); - socket->Write("\r\n", 2); - wxPrintf(_T("Server: wrote '%s'.\n"), s.c_str()); + wxPuts(_T("Shutting down the server")); + } + else // not a special command + { + socket->Write(s.MakeUpper().c_str(), s.length()); + socket->Write("\r\n", 2); + wxPrintf(_T("Server: wrote '%s'.\n"), s.c_str()); + } } - wxPuts(_T("Server: lost a client.")); + if ( !close ) + { + wxPuts(_T("Server: lost a client unexpectedly.")); + } socket->Destroy(); } @@ -2763,7 +3451,7 @@ static bool TestFtpConnect() { wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname); - return FALSE; + return false; } else { @@ -2771,7 +3459,7 @@ static bool TestFtpConnect() hostname, ftp.Pwd().c_str()); } - return TRUE; + return true; } // test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0? @@ -2793,7 +3481,7 @@ static void TestFtpWuFtpd() } else { - size_t size = in->StreamSize(); + size_t size = in->GetSize(); wxPrintf(_T("Reading file %s (%u bytes)..."), filename, size); wxChar *data = new wxChar[size]; @@ -2876,7 +3564,7 @@ static void TestFtpDownload() } else { - size_t size = in->StreamSize(); + size_t size = in->GetSize(); wxPrintf(_T("Reading file %s (%u bytes)..."), filename, size); fflush(stdout); @@ -3481,7 +4169,7 @@ static void TestUnicodeToFromAscii() wxString s = wxString::FromAscii(msg); wxPrintf(_T("Message in Unicode: %s\n"), s.c_str()); - wxPrintf(_T("Message in ASCII: %s\n"), s.ToAscii()); + printf("Message in ASCII: %s\n", (const char *)s.ToAscii()); wxPutchar(_T('\n')); } @@ -3495,7 +4183,7 @@ static void TestUnicodeToFromAscii() #include "wx/encconv.h" #include "wx/buffer.h" -static const unsigned char textInUtf8_[] = +static const unsigned char utf8koi8r[] = { 208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176, 208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208, @@ -3506,7 +4194,36 @@ static const unsigned char textInUtf8_[] = 178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0 }; -#define textInUtf8 ((const char *)textInUtf8_) +static const unsigned char utf8iso8859_1[] = +{ + 0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e, + 0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65, + 0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65, + 0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0 +}; + +static const unsigned char utf8Invalid[] = +{ + 0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30, + 0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6, + 0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88, + 0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0 +}; + +static const struct Utf8Data +{ + const unsigned char *text; + size_t len; + const wxChar *charset; + wxFontEncoding encoding; +} utf8data[] = +{ + { utf8Invalid, WXSIZEOF(utf8Invalid), _T("iso8859-1"), wxFONTENCODING_ISO8859_1 }, + { utf8koi8r, WXSIZEOF(utf8koi8r), _T("koi8-r"), wxFONTENCODING_KOI8 }, + { utf8iso8859_1, WXSIZEOF(utf8iso8859_1), _T("iso8859-1"), wxFONTENCODING_ISO8859_1 }, +}; static void TestUtf8() { @@ -3514,30 +4231,33 @@ static void TestUtf8() char buf[1024]; wchar_t wbuf[1024]; - if ( wxConvUTF8.MB2WC(wbuf, textInUtf8, WXSIZEOF(textInUtf8)) <= 0 ) - { - wxPuts(_T("ERROR: UTF-8 decoding failed.")); - } - else + + for ( size_t n = 0; n < WXSIZEOF(utf8data); n++ ) { - wxCSConv conv(_T("koi8-r")); - if ( conv.WC2MB(buf, wbuf, 0 /* not needed wcslen(wbuf) */) <= 0 ) + const Utf8Data& u8d = utf8data[n]; + if ( wxConvUTF8.MB2WC(wbuf, (const char *)u8d.text, + WXSIZEOF(wbuf)) == (size_t)-1 ) { - wxPuts(_T("ERROR: conversion to KOI8-R failed.")); + wxPuts(_T("ERROR: UTF-8 decoding failed.")); } else { - wxPrintf(_T("The resulting string (in KOI8-R): %s\n"), buf); + wxCSConv conv(u8d.charset); + if ( conv.WC2MB(buf, wbuf, WXSIZEOF(buf)) == (size_t)-1 ) + { + wxPrintf(_T("ERROR: conversion to %s failed.\n"), u8d.charset); + } + else + { + wxPrintf(_T("String in %s: %s\n"), u8d.charset, buf); + } } - } - if ( wxConvUTF8.WC2MB(buf, L"à la", WXSIZEOF(buf)) <= 0 ) - { - wxPuts(_T("ERROR: conversion to UTF-8 failed.")); - } - else - { - wxPrintf(_T("The string in UTF-8: %s\n"), buf); + wxString s(wxConvUTF8.cMB2WC((const char *)u8d.text), *wxConvCurrent); + if ( s.empty() ) + s = _T("<< conversion failed >>"); + wxPrintf(_T("String in current cset: %s\n"), s.c_str()); + } wxPuts(_T("")); @@ -3550,7 +4270,8 @@ static void TestEncodingConverter() // using wxEncodingConverter should give the same result as above char buf[1024]; wchar_t wbuf[1024]; - if ( wxConvUTF8.MB2WC(wbuf, textInUtf8, WXSIZEOF(textInUtf8)) <= 0 ) + if ( wxConvUTF8.MB2WC(wbuf, (const char *)utf8koi8r, + WXSIZEOF(utf8koi8r)) == (size_t)-1 ) { wxPuts(_T("ERROR: UTF-8 decoding failed.")); } @@ -3559,7 +4280,7 @@ static void TestEncodingConverter() wxEncodingConverter ec; ec.Init(wxFONTENCODING_UNICODE, wxFONTENCODING_KOI8); ec.Convert(wbuf, buf); - wxPrintf(_T("The same string obtained using wxEC: %s\n"), buf); + wxPrintf(_T("The same KOI8-R string using wxEC: %s\n"), buf); } wxPuts(_T("")); @@ -3712,7 +4433,6 @@ static void TestZlibStreamRead() #include -#include "wx/date.h" #include "wx/datetime.h" // the test data @@ -3818,8 +4538,8 @@ static void TestTimeStatic() // first line: the years to test { 1990, 1976, 2000, 2030, 1984, }, - // second line: TRUE if leap, FALSE otherwise - { FALSE, TRUE, TRUE, FALSE, TRUE } + // second line: true if leap, false otherwise + { false, true, true, false, true } }; for ( size_t n = 0; n < nYears; n++ ) @@ -4226,12 +4946,8 @@ for n in range(20): wxPrintf(_T(" (ERROR: should be %d)"), wn.dnum); } - wxPrintf(_T(", week in month is %d"), wmon); - if ( wmon == wn.wmon ) - { - wxPrintf(_T(" (ok)")); - } - else + wxPrintf(_T(", week in month = %d"), wmon); + if ( wmon != wn.wmon ) { wxPrintf(_T(" (ERROR: should be %d)"), wn.wmon); } @@ -4246,14 +4962,22 @@ for n in range(20): wxPrintf(_T(" (ERROR: should be %d)"), wn.wmon2); } - wxPrintf(_T(", week in year is %d"), week); - if ( week == wn.week ) + wxPrintf(_T(", week in year = %d"), week); + if ( week != wn.week ) { - wxPuts(_T(" (ok)")); + wxPrintf(_T(" (ERROR: should be %d)"), wn.week); } - else + + wxPutchar(_T('\n')); + + wxDateTime dt2(1, wxDateTime::Jan, d.year); + dt2.SetToTheWeek(wn.week, dt.GetWeekDay()); + if ( dt2 != dt ) { - wxPrintf(_T(" (ERROR: should be %d)\n"), wn.week); + Date d2; + d2.Init(dt2.GetTm()); + wxPrintf(_T("ERROR: SetToTheWeek() returned %s\n"), + d2.FormatDate().c_str()); } } } @@ -4367,7 +5091,7 @@ static void TestTimeFormat() { CompareBoth, _T("Date is %x, time is %X") }, { CompareTime, _T("Time is %H:%M:%S or %I:%M:%S %p") }, { CompareNone, _T("The day of year: %j, the week of year: %W") }, - { CompareDate, _T("ISO date without separators: %4Y%2m%2d") }, + { CompareDate, _T("ISO date without separators: %Y%m%d") }, }; static const Date formatTestDates[] = @@ -4417,7 +5141,7 @@ static void TestTimeFormat() } else { - bool equal = FALSE; // suppress compilaer warning + bool equal = false; // suppress compilaer warning switch ( kind ) { case CompareBoth: @@ -4461,8 +5185,8 @@ static void TestTimeParse() static const ParseTestData parseTestDates[] = { - { _T("Sat, 18 Dec 1999 00:46:40 +0100"), { 18, wxDateTime::Dec, 1999, 00, 46, 40 }, TRUE }, - { _T("Wed, 1 Dec 1999 05:17:20 +0300"), { 1, wxDateTime::Dec, 1999, 03, 17, 20 }, TRUE }, + { _T("Sat, 18 Dec 1999 00:46:40 +0100"), { 18, wxDateTime::Dec, 1999, 00, 46, 40 }, true }, + { _T("Wed, 1 Dec 1999 05:17:20 +0300"), { 1, wxDateTime::Dec, 1999, 03, 17, 20 }, true }, }; for ( size_t n = 0; n < WXSIZEOF(parseTestDates); n++ ) @@ -4708,39 +5432,46 @@ static void TestTimeSpanFormat() wxPuts(_T("")); } -#if 0 +#endif // TEST_DATETIME -// test compatibility with the old wxDate/wxTime classes -static void TestTimeCompatibility() -{ - wxPuts(_T("\n*** wxDateTime compatibility test ***")); +// ---------------------------------------------------------------------------- +// wxTextInput/OutputStream +// ---------------------------------------------------------------------------- - wxPrintf(_T("wxDate for JDN 0: %s\n"), wxDate(0l).FormatDate().c_str()); - wxPrintf(_T("wxDate for MJD 0: %s\n"), wxDate(2400000).FormatDate().c_str()); +#ifdef TEST_TEXTSTREAM - double jdnNow = wxDateTime::Now().GetJDN(); - long jdnMidnight = (long)(jdnNow - 0.5); - wxPrintf(_T("wxDate for today: %s\n"), wxDate(jdnMidnight).FormatDate().c_str()); +#include "wx/txtstrm.h" +#include "wx/wfstream.h" - jdnMidnight = wxDate().Set().GetJulianDate(); - wxPrintf(_T("wxDateTime for today: %s\n"), - wxDateTime((double)(jdnMidnight + 0.5)).Format("%c", wxDateTime::GMT0).c_str()); +static void TestTextInputStream() +{ + wxPuts(_T("\n*** wxTextInputStream test ***")); - int flags = wxEUROPEAN;//wxFULL; - wxDate date; - date.Set(); - wxPrintf(_T("Today is %s\n"), date.FormatDate(flags).c_str()); - for ( int n = 0; n < 7; n++ ) + wxFileInputStream fsIn(_T("testdata.fc")); + if ( !fsIn.Ok() ) { - wxPrintf(_T("Previous %s is %s\n"), - wxDateTime::GetWeekDayName((wxDateTime::WeekDay)n), - date.Previous(n + 1).FormatDate(flags).c_str()); + wxPuts(_T("ERROR: couldn't open file.")); } -} + else + { + wxTextInputStream tis(fsIn); -#endif // 0 + size_t line = 1; + for ( ;; ) + { + const wxString s = tis.ReadLine(); -#endif // TEST_DATETIME + // line could be non empty if the last line of the file isn't + // terminated with EOL + if ( fsIn.Eof() && s.empty() ) + break; + + wxPrintf(_T("Line %d: %s\n"), line++, s.c_str()); + } + } +} + +#endif // TEST_TEXTSTREAM // ---------------------------------------------------------------------------- // threads @@ -4788,7 +5519,7 @@ public: { m_n = n; m_ch = ch; - m_cancelled = FALSE; + m_cancelled = false; Create(); } @@ -4803,7 +5534,7 @@ private: size_t m_n; // number of characters to write wxChar m_ch; // character to write - bool m_cancelled; // FALSE if we exit normally + bool m_cancelled; // false if we exit normally }; wxThread::ExitCode MyDetachedThread::Entry() @@ -4820,7 +5551,7 @@ wxThread::ExitCode MyDetachedThread::Entry() { if ( TestDestroy() ) { - m_cancelled = TRUE; + m_cancelled = true; break; } @@ -5223,6 +5954,17 @@ static void PrintArray(const wxChar* name, const wxArrayString& array) } } +static void PrintArray(const wxChar* name, const wxSortedArrayString& array) +{ + wxPrintf(_T("Dump of the array '%s'\n"), name); + + size_t nCount = array.GetCount(); + for ( size_t n = 0; n < nCount; n++ ) + { + wxPrintf(_T("\t%s[%u] = '%s'\n"), name, n, array[n].c_str()); + } +} + int wxCMPFUNC_CONV StringLenCompare(const wxString& first, const wxString& second) { @@ -5287,6 +6029,53 @@ static void TestArrayOf ## name ## s() \ TestArrayOf(UShort); TestArrayOf(Int); +static void TestStlArray() +{ + wxPuts(_T("*** Testing std::vector operations ***\n")); + + { + wxArrayInt list1; + wxArrayInt::iterator it, en; + wxArrayInt::reverse_iterator rit, ren; + int i; + for ( i = 0; i < 5; ++i ) + list1.push_back(i); + + for ( it = list1.begin(), en = list1.end(), i = 0; + it != en; ++it, ++i ) + if ( *it != i ) + wxPuts(_T("Error in iterator\n")); + + for ( rit = list1.rbegin(), ren = list1.rend(), i = 4; + rit != ren; ++rit, --i ) + if ( *rit != i ) + wxPuts(_T("Error in reverse_iterator\n")); + + if ( *list1.rbegin() != *(list1.end()-1) || + *list1.begin() != *(list1.rend()-1) ) + wxPuts(_T("Error in iterator/reverse_iterator\n")); + + it = list1.begin()+1; + rit = list1.rbegin()+1; + if ( *list1.begin() != *(it-1) || + *list1.rbegin() != *(rit-1) ) + wxPuts(_T("Error in iterator/reverse_iterator\n")); + + if ( list1.front() != 0 || list1.back() != 4 ) + wxPuts(_T("Error in front()/back()\n")); + + list1.erase(list1.begin()); + list1.erase(list1.end()-1); + + for ( it = list1.begin(), en = list1.end(), i = 1; + it != en; ++it, ++i ) + if ( *it != i ) + wxPuts(_T("Error in erase()\n")); + } + + wxPuts(_T("*** Testing std::vector operations finished ***\n")); +} + static void TestArrayOfObjects() { wxPuts(_T("*** Testing wxObjArray ***\n")); @@ -5374,14 +6163,14 @@ static void TestString() for (int i = 0; i < 1000000; ++i) { - a = "Hello"; - b = " world"; - c = "! How'ya doin'?"; + a = _T("Hello"); + b = _T(" world"); + c = _T("! How'ya doin'?"); a += b; a += c; - c = "Hello world! What's up?"; + c = _T("Hello world! What's up?"); if (c != a) - c = "Doh!"; + c = _T("Doh!"); } wxPrintf(_T("TestString elapsed time: %ld\n"), sw.Time()); @@ -5412,7 +6201,7 @@ static void TestPChar() static void TestStringSub() { - wxString s("Hello, world!"); + wxString s(_T("Hello, world!")); wxPuts(_T("*** Testing wxString substring extraction ***")); @@ -5439,7 +6228,7 @@ static void TestStringSub() { wxString prefix = prefixes[n], rest; bool rc = s.StartsWith(prefix, &rest); - wxPrintf(_T("StartsWith('%s') = %s"), prefix.c_str(), rc ? _T("TRUE") : _T("FALSE")); + wxPrintf(_T("StartsWith('%s') = %s"), prefix.c_str(), rc ? _T("true") : _T("false")); if ( rc ) { wxPrintf(_T(" (the rest is '%s')\n"), rest.c_str()); @@ -5709,6 +6498,180 @@ static void TestStringMatch() wxPuts(_T("")); } +// Sigh, I want Test::Simple, Test::More and Test::Harness... +void ok(int line, bool ok, const wxString& msg = wxEmptyString) +{ + if( !ok ) + wxPuts(_T("NOT OK: (") + wxString::Format(_T("%d"), line) + + _T(") ") + msg); +} + +void is(int line, const wxString& got, const wxString& expected, + const wxString& msg = wxEmptyString) +{ + bool isOk = got == expected; + ok(line, isOk, msg); + if( !isOk ) + { + wxPuts(_T("Got: ") + got); + wxPuts(_T("Expected: ") + expected); + } +} + +void is(int line, const wxChar& got, const wxChar& expected, + const wxString& msg = wxEmptyString) +{ + bool isOk = got == expected; + ok(line, isOk, msg); + if( !isOk ) + { + wxPuts("Got: " + got); + wxPuts("Expected: " + expected); + } +} + +void TestStdString() +{ + wxPuts(_T("*** Testing std::string operations ***\n")); + + // test ctors + wxString s1(_T("abcdefgh")), + s2(_T("abcdefghijklm"), 8), + s3(_T("abcdefghijklm")), + s4(8, _T('a')); + wxString s5(s1), + s6(s3, 0, 8), + s7(s3.begin(), s3.begin() + 8); + wxString s8(s1, 4, 8), s9, s10, s11; + + is( __LINE__, s1, _T("abcdefgh") ); + is( __LINE__, s2, s1 ); + is( __LINE__, s4, _T("aaaaaaaa") ); + is( __LINE__, s5, _T("abcdefgh") ); + is( __LINE__, s6, s1 ); + is( __LINE__, s7, s1 ); + is( __LINE__, s8, _T("efgh") ); + + // test append + s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = _T("abc"); + s1.append(_T("def")); + s2.append(_T("defgh"), 3); + s3.append(wxString(_T("abcdef")), 3, 6); + s4.append(s1); + s5.append(3, _T('a')); + s6.append(s1.begin() + 3, s1.end()); + + is( __LINE__, s1, _T("abcdef") ); + is( __LINE__, s2, _T("abcdef") ); + is( __LINE__, s3, _T("abcdef") ); + is( __LINE__, s4, _T("abcabcdef") ); + is( __LINE__, s5, _T("abcaaa") ); + is( __LINE__, s6, _T("abcdef") ); + + // test assign + s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = _T("abc"); + s1.assign(_T("def")); + s2.assign(_T("defgh"), 3); + s3.assign(wxString(_T("abcdef")), 3, 6); + s4.assign(s1); + s5.assign(3, _T('a')); + s6.assign(s1.begin() + 1, s1.end()); + + is( __LINE__, s1, _T("def") ); + is( __LINE__, s2, _T("def") ); + is( __LINE__, s3, _T("def") ); + is( __LINE__, s4, _T("def") ); + is( __LINE__, s5, _T("aaa") ); + is( __LINE__, s6, _T("ef") ); + + // test compare + s1 = _T("abcdefgh"); + s2 = _T("abcdefgh"); + s3 = _T("abc"); + s4 = _T("abcdefghi"); + s5 = _T("aaa"); + s6 = _T("zzz"); + s7 = _T("zabcdefg"); + + ok( __LINE__, s1.compare(s2) == 0 ); + ok( __LINE__, s1.compare(s3) > 0 ); + ok( __LINE__, s1.compare(s4) < 0 ); + ok( __LINE__, s1.compare(s5) > 0 ); + ok( __LINE__, s1.compare(s6) < 0 ); + ok( __LINE__, s1.compare(1, 12, s1) > 0); + ok( __LINE__, s1.compare(_T("abcdefgh")) == 0); + ok( __LINE__, s1.compare(1, 7, _T("bcdefgh")) == 0); + ok( __LINE__, s1.compare(1, 7, _T("bcdefgh"), 7) == 0); + + // test erase + s1.erase(1, 1); + s2.erase(4, 12); + wxString::iterator it = s3.erase(s3.begin() + 1); + wxString::iterator it2 = s4.erase(s4.begin() + 4, s4.begin() + 6); + wxString::iterator it3 = s7.erase(s7.begin() + 4, s7.begin() + 8); + + is( __LINE__, s1, _T("acdefgh") ); + is( __LINE__, s2, _T("abcd") ); + is( __LINE__, s3, _T("ac") ); + is( __LINE__, s4, _T("abcdghi") ); + is( __LINE__, s7, _T("zabc") ); + is( __LINE__, *it, _T('c') ); + is( __LINE__, *it2, _T('g') ); + ok( __LINE__, it3 == s7.end() ); + + // test insert + s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = _T("aaaa"); + s9 = s10 = _T("cdefg"); + + s1.insert(1, _T("cc") ); + s2.insert(2, _T("cdef"), 3); + s3.insert(2, s10); + s4.insert(2, s10, 3, 7); + s5.insert(1, 2, _T('c')); + it = s6.insert(s6.begin() + 3, _T('X')); + s7.insert(s7.begin(), s9.begin(), s9.end() - 1); + s8.insert(s8.begin(), 2, _T('c')); + + is( __LINE__, s1, _T("accaaa") ); + is( __LINE__, s2, _T("aacdeaa") ); + is( __LINE__, s3, _T("aacdefgaa") ); + is( __LINE__, s4, _T("aafgaa") ); + is( __LINE__, s5, _T("accaaa") ); + is( __LINE__, s6, _T("aaaXa") ); + is( __LINE__, s7, _T("cdefaaaa") ); + is( __LINE__, s8, _T("ccaaaa") ); + + s1 = s2 = s3 = _T("aaaa"); + s1.insert(0, _T("ccc"), 2); + s2.insert(4, _T("ccc"), 2); + + is( __LINE__, s1, _T("ccaaaa") ); + is( __LINE__, s2, _T("aaaacc") ); + + // test replace + s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = _T("QWERTYUIOP"); + s9 = s10 = _T("werty"); + + s1.replace(3, 4, _T("rtyu")); + s1.replace(8, 7, _T("opopop")); + s2.replace(10, 12, _T("WWWW")); + s3.replace(1, 5, s9); + s4.replace(1, 4, s9, 0, 4); + s5.replace(1, 2, s9, 1, 12); + s6.replace(0, 123, s9, 0, 123); + s7.replace(2, 7, s9); + + is( __LINE__, s1, _T("QWErtyuIopopop") ); + is( __LINE__, s2, _T("QWERTYUIOPWWWW") ); + is( __LINE__, s3, _T("QwertyUIOP") ); + is( __LINE__, s4, _T("QwertYUIOP") ); + is( __LINE__, s5, _T("QertyRTYUIOP") ); + is( __LINE__, s6, s9); + is( __LINE__, s7, _T("QWwertyP") ); + + wxPuts(_T("*** Testing std::string operations finished ***\n")); +} + #endif // TEST_STRINGS // ---------------------------------------------------------------------------- @@ -5721,7 +6684,7 @@ static void TestStringMatch() int main(int argc, char **argv) { - wxApp::CheckBuildOptions(wxBuildOptions()); + wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, "program"); wxInitializer initializer; if ( !initializer ) @@ -5845,10 +6808,12 @@ int main(int argc, char **argv) { TestStringMatch(); } + + TestStdString(); #endif // TEST_STRINGS #ifdef TEST_ARRAYS - if ( TEST_ALL ) + if ( 1 || TEST_ALL ) { wxArrayString a1; a1.Add(_T("tiger")); @@ -5865,47 +6830,59 @@ int main(int argc, char **argv) wxArrayString a2(a1); PrintArray(_T("a2"), a2); +#if !wxUSE_STL wxSortedArrayString a3(a1); +#else + wxSortedArrayString a3; + for (wxArrayString::iterator it = a1.begin(), en = a1.end(); + it != en; ++it) + a3.Add(*it); +#endif PrintArray(_T("a3"), a3); wxPuts(_T("*** After deleting three strings from a1")); - a1.Remove(2,3); + a1.RemoveAt(2,3); PrintArray(_T("a1"), a1); PrintArray(_T("a2"), a2); PrintArray(_T("a3"), a3); +#if !wxUSE_STL wxPuts(_T("*** After reassigning a1 to a2 and a3")); a3 = a2 = a1; PrintArray(_T("a2"), a2); PrintArray(_T("a3"), a3); +#endif wxPuts(_T("*** After sorting a1")); - a1.Sort(); + a1.Sort(wxStringCompareAscending); PrintArray(_T("a1"), a1); wxPuts(_T("*** After sorting a1 in reverse order")); - a1.Sort(TRUE); + a1.Sort(wxStringCompareDescending); PrintArray(_T("a1"), a1); +#if !wxUSE_STL wxPuts(_T("*** After sorting a1 by the string length")); - a1.Sort(StringLenCompare); + a1.Sort(&StringLenCompare); PrintArray(_T("a1"), a1); +#endif TestArrayOfObjects(); TestArrayOfUShorts(); } TestArrayOfInts(); + TestStlArray(); #endif // TEST_ARRAYS #ifdef TEST_DIR if ( TEST_ALL ) { TestDirExists(); - TestDirTraverse(); + TestDirEnum(); } - TestDirEnum(); + TestDirTraverse(); #endif // TEST_DIR #ifdef TEST_DLLLOADER @@ -5926,6 +6903,7 @@ int main(int argc, char **argv) #ifdef TEST_LIST TestListCtor(); + TestList(); #endif // TEST_LIST #ifdef TEST_LOCALE @@ -5933,12 +6911,17 @@ int main(int argc, char **argv) #endif // TEST_LOCALE #ifdef TEST_LOG + wxPuts(_T("*** Testing wxLog ***")); + wxString s; for ( size_t n = 0; n < 8000; n++ ) { s << (wxChar)(_T('A') + (n % 26)); } + wxLogWarning(_T("The length of the string is %lu"), + (unsigned long)s.length()); + wxString msg; msg.Printf(_T("A very very long message: '%s', the end!\n"), s.c_str()); @@ -5975,6 +6958,7 @@ int main(int argc, char **argv) { TestFileNameConstruction(); TestFileNameMakeRelative(); + TestFileNameMakeAbsolute(); TestFileNameSplit(); TestFileNameTemp(); TestFileNameCwd(); @@ -6028,7 +7012,8 @@ int main(int argc, char **argv) TestLongLongConversion(); TestBitOperations(); TestLongLongComparison(); - TestLongLongPrint(); + TestLongLongToString(); + TestLongLongPrintf(); } #endif // TEST_LONGLONG @@ -6040,6 +7025,10 @@ int main(int argc, char **argv) TestHashMap(); #endif // TEST_HASHMAP +#ifdef TEST_HASHSET + TestHashSet(); +#endif // TEST_HASHSET + #ifdef TEST_MIME wxLog::AddTraceMask(_T("mime")); if ( TEST_ALL ) @@ -6070,6 +7059,10 @@ int main(int argc, char **argv) TestDbOpen(); #endif // TEST_ODBC +#ifdef TEST_PRINTF + TestPrintf(); +#endif // TEST_PRINTF + #ifdef TEST_REGCONF TestRegConfWrite(); #endif // TEST_REGCONF @@ -6106,23 +7099,26 @@ int main(int argc, char **argv) TestMemoryStream(); #endif // TEST_STREAMS +#ifdef TEST_TEXTSTREAM + TestTextInputStream(); +#endif // TEST_TEXTSTREAM + #ifdef TEST_THREADS int nCPUs = wxThread::GetCPUCount(); wxPrintf(_T("This system has %d CPUs\n"), nCPUs); if ( nCPUs != -1 ) wxThread::SetConcurrency(nCPUs); + TestDetachedThreads(); if ( TEST_ALL ) { - TestDetachedThreads(); TestJoinableThreads(); TestThreadSuspend(); TestThreadDelete(); TestThreadConditions(); TestThreadExec(); + TestSemaphore(); } - - TestSemaphore(); #endif // TEST_THREADS #ifdef TEST_TIMER @@ -6151,10 +7147,16 @@ int main(int argc, char **argv) TestTimeZoneBug(); } + TestTimeWNumber(); + if ( TEST_INTERACTIVE ) TestDateTimeInteractive(); #endif // TEST_DATETIME +#ifdef TEST_SCOPEGUARD + TestScopeGuard(); +#endif + #ifdef TEST_USLEEP wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z...")); wxUsleep(3000);