From 1cd53e884b78da17408bc80567574bb1c212a9a6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Tue, 20 Apr 2004 18:55:09 +0000 Subject: [PATCH] added wxString tests (patch 938082) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26883 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/console/console.cpp | 730 +----------------------------------- tests/Makefile.in | 4 + tests/makefile.bcc | 4 + tests/makefile.gcc | 4 + tests/makefile.vc | 4 + tests/makefile.wat | 4 + tests/strings/strings.cpp | 529 ++++++++++++++++++++++++++ tests/test.bkl | 1 + tests/test.dsp | 4 + 9 files changed, 555 insertions(+), 729 deletions(-) create mode 100644 tests/strings/strings.cpp diff --git a/samples/console/console.cpp b/samples/console/console.cpp index 29288d8e8d..b18744999c 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -81,7 +81,6 @@ #define TEST_SNGLINST // #define TEST_SOCKETS --FIXME! (RN) #define TEST_STREAMS - #define TEST_STRINGS #define TEST_TEXTSTREAM #define TEST_THREADS #define TEST_TIMER @@ -143,7 +142,7 @@ size_t Bar::ms_bars = 0; // helper functions // ---------------------------------------------------------------------------- -#if defined(TEST_STRINGS) || defined(TEST_SOCKETS) +#if defined(TEST_SOCKETS) // replace TABs with \t and CRs with \n static wxString MakePrintable(const wxChar *s) @@ -5880,716 +5879,6 @@ static void TestSemaphore() #endif // TEST_THREADS -// ---------------------------------------------------------------------------- -// strings -// ---------------------------------------------------------------------------- - -#ifdef TEST_STRINGS - -#include "wx/timer.h" -#include "wx/tokenzr.h" - -static void TestStringConstruction() -{ - wxPuts(_T("*** Testing wxString constructores ***")); - - #define TEST_CTOR(args, res) \ - { \ - wxString s args ; \ - wxPrintf(_T("wxString%s = %s "), #args, s.c_str()); \ - if ( s == res ) \ - { \ - wxPuts(_T("(ok)")); \ - } \ - else \ - { \ - wxPrintf(_T("(ERROR: should be %s)\n"), res); \ - } \ - } - - TEST_CTOR((_T('Z'), 4), _T("ZZZZ")); - TEST_CTOR((_T("Hello"), 4), _T("Hell")); - TEST_CTOR((_T("Hello"), 5), _T("Hello")); - // TEST_CTOR((_T("Hello"), 6), _T("Hello")); -- should give assert failure - - static const wxChar *s = _T("?really!"); - const wxChar *start = wxStrchr(s, _T('r')); - const wxChar *end = wxStrchr(s, _T('!')); - TEST_CTOR((start, end), _T("really")); - - wxPuts(wxEmptyString); -} - -static void TestString() -{ - wxStopWatch sw; - - wxString a, b, c; - - a.reserve (128); - b.reserve (128); - c.reserve (128); - - for (int i = 0; i < 1000000; ++i) - { - a = _T("Hello"); - b = _T(" world"); - c = _T("! How'ya doin'?"); - a += b; - a += c; - c = _T("Hello world! What's up?"); - if (c != a) - c = _T("Doh!"); - } - - wxPrintf(_T("TestString elapsed time: %ld\n"), sw.Time()); -} - -static void TestPChar() -{ - wxStopWatch sw; - - wxChar a [128]; - wxChar b [128]; - wxChar c [128]; - - for (int i = 0; i < 1000000; ++i) - { - wxStrcpy (a, _T("Hello")); - wxStrcpy (b, _T(" world")); - wxStrcpy (c, _T("! How'ya doin'?")); - wxStrcat (a, b); - wxStrcat (a, c); - wxStrcpy (c, _T("Hello world! What's up?")); - if (wxStrcmp (c, a) == 0) - wxStrcpy (c, _T("Doh!")); - } - - wxPrintf(_T("TestPChar elapsed time: %ld\n"), sw.Time()); -} - -static void TestStringSub() -{ - wxString s(_T("Hello, world!")); - - wxPuts(_T("*** Testing wxString substring extraction ***")); - - wxPrintf(_T("String = '%s'\n"), s.c_str()); - wxPrintf(_T("Left(5) = '%s'\n"), s.Left(5).c_str()); - wxPrintf(_T("Right(6) = '%s'\n"), s.Right(6).c_str()); - wxPrintf(_T("Mid(3, 5) = '%s'\n"), s(3, 5).c_str()); - wxPrintf(_T("Mid(3) = '%s'\n"), s.Mid(3).c_str()); - wxPrintf(_T("substr(3, 5) = '%s'\n"), s.substr(3, 5).c_str()); - wxPrintf(_T("substr(3) = '%s'\n"), s.substr(3).c_str()); - - static const wxChar *prefixes[] = - { - _T("Hello"), - _T("Hello, "), - _T("Hello, world!"), - _T("Hello, world!!!"), - _T(""), - _T("Goodbye"), - _T("Hi"), - }; - - for ( size_t n = 0; n < WXSIZEOF(prefixes); n++ ) - { - wxString prefix = prefixes[n], rest; - bool rc = s.StartsWith(prefix, &rest); - 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()); - } - else - { - wxPutchar('\n'); - } - } - - wxPuts(wxEmptyString); -} - -static void TestStringFormat() -{ - wxPuts(_T("*** Testing wxString formatting ***")); - - wxString s; - s.Printf(_T("%03d"), 18); - - wxPrintf(_T("Number 18: %s\n"), wxString::Format(_T("%03d"), 18).c_str()); - wxPrintf(_T("Number 18: %s\n"), s.c_str()); - - wxPuts(wxEmptyString); -} - -// returns "not found" for npos, value for all others -static wxString PosToString(size_t res) -{ - wxString s = res == wxString::npos ? wxString(_T("not found")) - : wxString::Format(_T("%u"), res); - return s; -} - -static void TestStringFind() -{ - wxPuts(_T("*** Testing wxString find() functions ***")); - - static const wxChar *strToFind = _T("ell"); - static const struct StringFindTest - { - const wxChar *str; - size_t start, - result; // of searching "ell" in str - } findTestData[] = - { - { _T("Well, hello world"), 0, 1 }, - { _T("Well, hello world"), 6, 7 }, - { _T("Well, hello world"), 9, wxString::npos }, - }; - - for ( size_t n = 0; n < WXSIZEOF(findTestData); n++ ) - { - const StringFindTest& ft = findTestData[n]; - size_t res = wxString(ft.str).find(strToFind, ft.start); - - wxPrintf(_T("Index of '%s' in '%s' starting from %u is %s "), - strToFind, ft.str, ft.start, PosToString(res).c_str()); - - size_t resTrue = ft.result; - if ( res == resTrue ) - { - wxPuts(_T("(ok)")); - } - else - { - wxPrintf(_T("(ERROR: should be %s)\n"), - PosToString(resTrue).c_str()); - } - } - - wxPuts(wxEmptyString); -} - -static void TestStringTokenizer() -{ - wxPuts(_T("*** Testing wxStringTokenizer ***")); - - static const wxChar *modeNames[] = - { - _T("default"), - _T("return empty"), - _T("return all empty"), - _T("with delims"), - _T("like strtok"), - }; - - static const struct StringTokenizerTest - { - const wxChar *str; // string to tokenize - const wxChar *delims; // delimiters to use - size_t count; // count of token - wxStringTokenizerMode mode; // how should we tokenize it - } tokenizerTestData[] = - { - { _T(""), _T(" "), 0 }, - { _T("Hello, world"), _T(" "), 2 }, - { _T("Hello, world "), _T(" "), 2 }, - { _T("Hello, world"), _T(","), 2 }, - { _T("Hello, world!"), _T(",!"), 2 }, - { _T("Hello,, world!"), _T(",!"), 3 }, - { _T("Hello, world!"), _T(",!"), 3, wxTOKEN_RET_EMPTY_ALL }, - { _T("username:password:uid:gid:gecos:home:shell"), _T(":"), 7 }, - { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, 4 }, - { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, 6, wxTOKEN_RET_EMPTY }, - { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, 9, wxTOKEN_RET_EMPTY_ALL }, - { _T("01/02/99"), _T("/-"), 3 }, - { _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS }, - }; - - for ( size_t n = 0; n < WXSIZEOF(tokenizerTestData); n++ ) - { - const StringTokenizerTest& tt = tokenizerTestData[n]; - wxStringTokenizer tkz(tt.str, tt.delims, tt.mode); - - size_t count = tkz.CountTokens(); - wxPrintf(_T("String '%s' has %u tokens delimited by '%s' (mode = %s) "), - MakePrintable(tt.str).c_str(), - count, - MakePrintable(tt.delims).c_str(), - modeNames[tkz.GetMode()]); - if ( count == tt.count ) - { - wxPuts(_T("(ok)")); - } - else - { - wxPrintf(_T("(ERROR: should be %u)\n"), tt.count); - - continue; - } - - // if we emulate strtok(), check that we do it correctly - wxChar *buf, *s = NULL, *last; - - if ( tkz.GetMode() == wxTOKEN_STRTOK ) - { - buf = new wxChar[wxStrlen(tt.str) + 1]; - wxStrcpy(buf, tt.str); - - s = wxStrtok(buf, tt.delims, &last); - } - else - { - buf = NULL; - } - - // now show the tokens themselves - size_t count2 = 0; - while ( tkz.HasMoreTokens() ) - { - wxString token = tkz.GetNextToken(); - - wxPrintf(_T("\ttoken %u: '%s'"), - ++count2, - MakePrintable(token).c_str()); - - if ( buf ) - { - if ( token == s ) - { - wxPuts(_T(" (ok)")); - } - else - { - wxPrintf(_T(" (ERROR: should be %s)\n"), s); - } - - s = wxStrtok(NULL, tt.delims, &last); - } - else - { - // nothing to compare with - wxPuts(wxEmptyString); - } - } - - if ( count2 != count ) - { - wxPuts(_T("\tERROR: token count mismatch")); - } - - delete [] buf; - } - - wxPuts(wxEmptyString); -} - -static void TestStringReplace() -{ - wxPuts(_T("*** Testing wxString::replace ***")); - - static const struct StringReplaceTestData - { - const wxChar *original; // original test string - size_t start, len; // the part to replace - const wxChar *replacement; // the replacement string - const wxChar *result; // and the expected result - } stringReplaceTestData[] = - { - { _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") }, - { _T("increase"), 0, 2, _T("de"), _T("decrease") }, - { _T("wxWindow"), 8, 0, _T("s"), _T("wxWindows") }, - { _T("foobar"), 3, 0, _T("-"), _T("foo-bar") }, - { _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") }, - }; - - for ( size_t n = 0; n < WXSIZEOF(stringReplaceTestData); n++ ) - { - const StringReplaceTestData data = stringReplaceTestData[n]; - - wxString original = data.original; - original.replace(data.start, data.len, data.replacement); - - wxPrintf(_T("wxString(\"%s\").replace(%u, %u, %s) = %s "), - data.original, data.start, data.len, data.replacement, - original.c_str()); - - if ( original == data.result ) - { - wxPuts(_T("(ok)")); - } - else - { - wxPrintf(_T("(ERROR: should be '%s')\n"), data.result); - } - } - - wxPuts(wxEmptyString); -} - -#if !TEST_ALL -static void TestStringMatch() -{ - wxPuts(_T("*** Testing wxString::Matches() ***")); - - static const struct StringMatchTestData - { - const wxChar *text; - const wxChar *wildcard; - bool matches; - } stringMatchTestData[] = - { - { _T("foobar"), _T("foo*"), 1 }, - { _T("foobar"), _T("*oo*"), 1 }, - { _T("foobar"), _T("*bar"), 1 }, - { _T("foobar"), _T("??????"), 1 }, - { _T("foobar"), _T("f??b*"), 1 }, - { _T("foobar"), _T("f?b*"), 0 }, - { _T("foobar"), _T("*goo*"), 0 }, - { _T("foobar"), _T("*foo"), 0 }, - { _T("foobarfoo"), _T("*foo"), 1 }, - { _T(""), _T("*"), 1 }, - { _T(""), _T("?"), 0 }, - }; - - for ( size_t n = 0; n < WXSIZEOF(stringMatchTestData); n++ ) - { - const StringMatchTestData& data = stringMatchTestData[n]; - bool matches = wxString(data.text).Matches(data.wildcard); - wxPrintf(_T("'%s' %s '%s' (%s)\n"), - data.wildcard, - matches ? _T("matches") : _T("doesn't match"), - data.text, - matches == data.matches ? _T("ok") : _T("ERROR")); - } - - wxPuts(wxEmptyString); -} -#endif - -// 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); - } -} - -#if 0 -void is(int line, const wxChar* got, const wxChar* expected, - const wxString& msg = wxEmptyString) -{ - bool isOk = wxStrcmp( got, expected ) == 0; - ok(line, isOk, msg); - if( !isOk ) - { - wxPuts(_T("Got: ") + wxString(got)); - wxPuts(_T("Expected: ") + wxString(expected)); - } -} -#endif - -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(_T("Got: ") + got); - wxPuts(_T("Expected: ") + expected); - } -} - -void is(int line, size_t got, size_t expected, - const wxString& msg = wxEmptyString) -{ - bool isOk = got == expected; - ok(line, isOk, msg); - if( !isOk ) - { - wxPuts(wxString::Format(_T("Got: %d"), got)); - wxPuts(wxString::Format(_T("Expected: %d"), expected)); - } -} - -#define is_m( got, expected, message ) is( __LINE__, (got), (expected), (message) ) -#define is_nom( got, expected ) is( __LINE__, (got), (expected), wxEmptyString ) - -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() ); - - // find - // 0 1 2 - // 01234567890123456789012345 - s1 = _T("abcdefgABCDEFGabcABCabcABC"); - s2 = _T("gAB"); - - is_nom( s1.find(_T('A')), 7u ); - is_nom( s1.find(_T('A'), 7), 7u ); - is_nom( s1.find(_T('Z')), wxString::npos ); - is_nom( s1.find(_T('C'), 22), 25u ); - - is_nom( s1.find(_T("gAB")), 6u ); - is_nom( s1.find(_T("gAB"), 7), wxString::npos ); - is_nom( s1.find(_T("gAB"), 6), 6u ); - - is_nom( s1.find(_T("gABZZZ"), 2, 3), 6u ); - is_nom( s1.find(_T("gABZZZ"), 7, 3), wxString::npos ); - - is_nom( s1.find(s2), 6u ); - is_nom( s1.find(s2, 7), wxString::npos ); - is_nom( s1.find(s2, 6), 6u ); - - // find_first_not_of - // 0 1 2 3 - // 01234567890123456789012345678901234 - s1 = _T("aaaaaabcdefghlkjiaaaaaabcdbcdbcdbcd"); - s2 = _T("aaaaaa"); - - is_nom( s1.find_first_not_of(_T('a')), 6u ); - is_nom( s1.find_first_not_of(_T('a'), 7), 7u ); - is_nom( s2.find_first_not_of(_T('a')), wxString::npos ); - - is_nom( s1.find_first_not_of(_T("abde"), 4), 7u ); - is_nom( s1.find_first_not_of(_T("abde"), 7), 7u ); - is_nom( s1.find_first_not_of(_T("abcdefghijkl")), wxString::npos ); - - is_nom( s1.find_first_not_of(_T("abcdefghi"), 0, 4), 9u ); - - // find_first_of - is_nom( s1.find_first_of(_T('c')), 7u ); - is_nom( s1.find_first_of(_T('v')), wxString::npos ); - is_nom( s1.find_first_of(_T('c'), 10), 24u ); - - is_nom( s1.find_first_of(_T("ijkl")), 13u ); - is_nom( s1.find_first_of(_T("ddcfg"), 17), 24u ); - is_nom( s1.find_first_of(_T("ddcfga"), 17, 5), 24u ); - - // find_last_not_of - // 0 1 2 3 - // 01234567890123456789012345678901234 - s1 = _T("aaaaaabcdefghlkjiaaaaaabcdbcdbcdbcd"); - s2 = _T("aaaaaa"); - - is_nom( s2.find_last_not_of(_T('a')), wxString::npos ); - is_nom( s1.find_last_not_of(_T('d')), 33u ); - is_nom( s1.find_last_not_of(_T('d'), 25), 24u ); - - is_nom( s1.find_last_not_of(_T("bcd")), 22u ); - is_nom( s1.find_last_not_of(_T("abc"), 24), 16u ); - - is_nom( s1.find_last_not_of(_T("abcdefghijklmnopqrstuv"), 24, 3), 16u ); - - // find_last_of - is_nom( s2.find_last_of(_T('c')), wxString::npos ); - is_nom( s1.find_last_of(_T('a')), 22u ); - is_nom( s1.find_last_of(_T('b'), 24), 23u ); - - is_nom( s1.find_last_of(_T("ijklm")), 16u ); - is_nom( s1.find_last_of(_T("ijklma"), 33, 4), 16u ); - is_nom( s1.find_last_of(_T("a"), 17), 17u ); - - // 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") ); - - // rfind - // 0 1 2 - // 01234567890123456789012345 - s1 = _T("abcdefgABCDEFGabcABCabcABC"); - s2 = _T("gAB"); - s3 = _T("ab"); - - is_nom( s1.rfind(_T('A')), 23u ); - is_nom( s1.rfind(_T('A'), 7), 7u ); - is_nom( s1.rfind(_T('Z')), wxString::npos ); - is_nom( s1.rfind(_T('C'), 22), 19u ); - - is_nom( s1.rfind(_T("cAB")), 22u ); - is_nom( s1.rfind(_T("cAB"), 15), wxString::npos ); - is_nom( s1.rfind(_T("cAB"), 21), 16u ); - - is_nom( s1.rfind(_T("gABZZZ"), 7, 3), 6u ); - is_nom( s1.rfind(_T("gABZZZ"), 5, 3), wxString::npos ); - - is_nom( s1.rfind(s2), 6u ); - is_nom( s1.rfind(s2, 5), wxString::npos ); - is_nom( s1.rfind(s2, 6), 6u ); - is_nom( s1.rfind(s3, 1), 0u ); - - // resize - s1 = s2 = s3 = s4 = _T("abcABCdefDEF"); - - s1.resize( 12 ); - s2.resize( 10 ); - s3.resize( 14, _T(' ') ); - s4.resize( 14, _T('W') ); - - is_nom( s1, _T("abcABCdefDEF") ); - is_nom( s2, _T("abcABCdefD") ); - is_nom( s3, _T("abcABCdefDEF ") ); - is_nom( s4, _T("abcABCdefDEFWW") ); - - // substr - s1 = _T("abcdefgABCDEFG"); - - is_nom( s1.substr( 0, 14 ), s1 ); - is_nom( s1.substr( 1, 13 ), _T("bcdefgABCDEFG") ); - is_nom( s1.substr( 1, 20 ), _T("bcdefgABCDEFG") ); - is_nom( s1.substr( 14, 30 ), _T("") ); - - wxPuts(_T("*** Testing std::string operations finished ***\n")); -} - -#endif // TEST_STRINGS - // ---------------------------------------------------------------------------- // entry point // ---------------------------------------------------------------------------- @@ -6710,23 +5999,6 @@ int main(int argc, char **argv) #endif // TEST_CMDLINE -#ifdef TEST_STRINGS - #if TEST_ALL - TestPChar(); - TestString(); - TestStringSub(); - TestStringConstruction(); - TestStringFormat(); - TestStringFind(); - TestStringTokenizer(); - TestStringReplace(); - #else - TestStringMatch(); - #endif - - TestStdString(); -#endif // TEST_STRINGS - #ifdef TEST_DIR #if TEST_ALL TestDirExists(); diff --git a/tests/Makefile.in b/tests/Makefile.in index d2c83c7c49..27f4878c33 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -43,6 +43,7 @@ TEST_OBJECTS = \ test_filesys.o \ test_arrays.o \ test_longlong.o \ + test_strings.o \ test_bstream.o \ test_ffilestream.o \ test_filestream.o \ @@ -131,6 +132,9 @@ test_arrays.o: $(srcdir)/arrays/arrays.cpp test_longlong.o: $(srcdir)/longlong/longlong.cpp $(CXXC) -c -o $@ $(TEST_CXXFLAGS) $< +test_strings.o: $(srcdir)/strings/strings.cpp + $(CXXC) -c -o $@ $(TEST_CXXFLAGS) $< + test_bstream.o: $(srcdir)/streams/bstream.cpp $(CXXC) -c -o $@ $(TEST_CXXFLAGS) $< diff --git a/tests/makefile.bcc b/tests/makefile.bcc index 0ce0217ae3..0ed5ea706a 100644 --- a/tests/makefile.bcc +++ b/tests/makefile.bcc @@ -37,6 +37,7 @@ TEST_OBJECTS = \ $(OBJS)\test_filesys.obj \ $(OBJS)\test_arrays.obj \ $(OBJS)\test_longlong.obj \ + $(OBJS)\test_strings.obj \ $(OBJS)\test_bstream.obj \ $(OBJS)\test_ffilestream.obj \ $(OBJS)\test_filestream.obj \ @@ -182,6 +183,9 @@ $(OBJS)\test_arrays.obj: .\arrays\arrays.cpp $(OBJS)\test_longlong.obj: .\longlong\longlong.cpp $(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) $** +$(OBJS)\test_strings.obj: .\strings\strings.cpp + $(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) $** + $(OBJS)\test_bstream.obj: .\streams\bstream.cpp $(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) $** diff --git a/tests/makefile.gcc b/tests/makefile.gcc index d04789b796..99f1ca299a 100644 --- a/tests/makefile.gcc +++ b/tests/makefile.gcc @@ -28,6 +28,7 @@ TEST_OBJECTS = \ $(OBJS)\test_filesys.o \ $(OBJS)\test_arrays.o \ $(OBJS)\test_longlong.o \ + $(OBJS)\test_strings.o \ $(OBJS)\test_bstream.o \ $(OBJS)\test_ffilestream.o \ $(OBJS)\test_filestream.o \ @@ -176,6 +177,9 @@ $(OBJS)\test_arrays.o: ./arrays/arrays.cpp $(OBJS)\test_longlong.o: ./longlong/longlong.cpp $(CXX) -c -o $@ $(TEST_CXXFLAGS) $< +$(OBJS)\test_strings.o: ./strings/strings.cpp + $(CXX) -c -o $@ $(TEST_CXXFLAGS) $< + $(OBJS)\test_bstream.o: ./streams/bstream.cpp $(CXX) -c -o $@ $(TEST_CXXFLAGS) $< diff --git a/tests/makefile.vc b/tests/makefile.vc index 465cc7be8b..a2f6040190 100644 --- a/tests/makefile.vc +++ b/tests/makefile.vc @@ -30,6 +30,7 @@ TEST_OBJECTS = \ $(OBJS)\test_filesys.obj \ $(OBJS)\test_arrays.obj \ $(OBJS)\test_longlong.obj \ + $(OBJS)\test_strings.obj \ $(OBJS)\test_bstream.obj \ $(OBJS)\test_ffilestream.obj \ $(OBJS)\test_filestream.obj \ @@ -238,6 +239,9 @@ $(OBJS)\test_arrays.obj: .\arrays\arrays.cpp $(OBJS)\test_longlong.obj: .\longlong\longlong.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) $** +$(OBJS)\test_strings.obj: .\strings\strings.cpp + $(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) $** + $(OBJS)\test_bstream.obj: .\streams\bstream.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) $** diff --git a/tests/makefile.wat b/tests/makefile.wat index be5b8fcc95..963bf1520f 100644 --- a/tests/makefile.wat +++ b/tests/makefile.wat @@ -178,6 +178,7 @@ TEST_OBJECTS = & $(OBJS)\test_filesys.obj & $(OBJS)\test_arrays.obj & $(OBJS)\test_longlong.obj & + $(OBJS)\test_strings.obj & $(OBJS)\test_bstream.obj & $(OBJS)\test_ffilestream.obj & $(OBJS)\test_filestream.obj & @@ -232,6 +233,9 @@ $(OBJS)\test_arrays.obj : .AUTODEPEND .\arrays\arrays.cpp $(OBJS)\test_longlong.obj : .AUTODEPEND .\longlong\longlong.cpp $(CXX) -zq -fo=$^@ $(TEST_CXXFLAGS) $< +$(OBJS)\test_strings.obj : .AUTODEPEND .\strings\strings.cpp + $(CXX) -zq -fo=$^@ $(TEST_CXXFLAGS) $< + $(OBJS)\test_bstream.obj : .AUTODEPEND .\streams\bstream.cpp $(CXX) -zq -fo=$^@ $(TEST_CXXFLAGS) $< diff --git a/tests/strings/strings.cpp b/tests/strings/strings.cpp new file mode 100644 index 0000000000..322735ee38 --- /dev/null +++ b/tests/strings/strings.cpp @@ -0,0 +1,529 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: tests/strings/strings.cpp +// Purpose: wxString unit test +// Author: Vadim Zeitlin, Wlodzimierz ABX Skiba +// Created: 2004-04-19 +// RCS-ID: $Id$ +// Copyright: (c) 2004 Vadim Zeitlin, Wlodzimierz Skiba +/////////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif // WX_PRECOMP + +#include "wx/tokenzr.h" + +#include "wx/cppunit.h" + +// ---------------------------------------------------------------------------- +// test class +// ---------------------------------------------------------------------------- + +class StringTestCase : public CppUnit::TestCase +{ +public: + StringTestCase(); + +private: + CPPUNIT_TEST_SUITE( StringTestCase ); + CPPUNIT_TEST( String ); + CPPUNIT_TEST( PChar ); + CPPUNIT_TEST( Format ); + CPPUNIT_TEST( Constructors ); + CPPUNIT_TEST( Extraction ); + CPPUNIT_TEST( Find ); + CPPUNIT_TEST( Tokenizer ); + CPPUNIT_TEST( Replace ); + CPPUNIT_TEST( Match ); + CPPUNIT_TEST( Std ); + CPPUNIT_TEST_SUITE_END(); + + void String(); + void PChar(); + void Format(); + void Constructors(); + void Extraction(); + void Find(); + void Tokenizer(); + void Replace(); + void Match(); + void Std(); + + DECLARE_NO_COPY_CLASS(StringTestCase) +}; + +// register in the unnamed registry so that these tests are run by default +CPPUNIT_TEST_SUITE_REGISTRATION( StringTestCase ); + +// also include in it's own registry so that these tests can be run alone +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( StringTestCase, "StringTestCase" ); + +StringTestCase::StringTestCase() +{ +} + +void StringTestCase::String() +{ + wxString a, b, c; + + a.reserve (128); + b.reserve (128); + c.reserve (128); + + for (int i = 0; i < 2; ++i) + { + a = _T("Hello"); + b = _T(" world"); + c = _T("! How'ya doin'?"); + a += b; + a += c; + c = _T("Hello world! What's up?"); + CPPUNIT_ASSERT( c != a ); + } +} + +void StringTestCase::PChar() +{ + wxChar a [128]; + wxChar b [128]; + wxChar c [128]; + + for (int i = 0; i < 2; ++i) + { + wxStrcpy (a, _T("Hello")); + wxStrcpy (b, _T(" world")); + wxStrcpy (c, _T("! How'ya doin'?")); + wxStrcat (a, b); + wxStrcat (a, c); + wxStrcpy (c, _T("Hello world! What's up?")); + CPPUNIT_ASSERT( wxStrcmp (c, a) != 0 ); + } +} + +void StringTestCase::Format() +{ + wxString s1,s2; + s1.Printf(_T("%03d"), 18); + CPPUNIT_ASSERT( s1 == wxString::Format(_T("%03d"), 18) ); + s2.Printf(_T("Number 18: %s\n"), s1.c_str()); + CPPUNIT_ASSERT( s2 == wxString::Format(_T("Number 18: %s\n"), s1.c_str()) ); +} + +void StringTestCase::Constructors() +{ + #define TEST_CTOR(args, res) \ + { \ + wxString s args ; \ + CPPUNIT_ASSERT( s == res ); \ + } + + TEST_CTOR((_T('Z'), 4), _T("ZZZZ")); + TEST_CTOR((_T("Hello"), 4), _T("Hell")); + TEST_CTOR((_T("Hello"), 5), _T("Hello")); + + static const wxChar *s = _T("?really!"); + const wxChar *start = wxStrchr(s, _T('r')); + const wxChar *end = wxStrchr(s, _T('!')); + TEST_CTOR((start, end), _T("really")); +} + +void StringTestCase::Extraction() +{ + wxString s(_T("Hello, world!")); + + CPPUNIT_ASSERT( wxStrcmp( s.c_str() , _T("Hello, world!") ) == 0 ); + CPPUNIT_ASSERT( wxStrcmp( s.Left(5).c_str() , _T("Hello") ) == 0 ); + CPPUNIT_ASSERT( wxStrcmp( s.Right(6).c_str() , _T("world!") ) == 0 ); + CPPUNIT_ASSERT( wxStrcmp( s(3, 5).c_str() , _T("lo, w") ) == 0 ); + CPPUNIT_ASSERT( wxStrcmp( s.Mid(3).c_str() , _T("lo, world!") ) == 0 ); + CPPUNIT_ASSERT( wxStrcmp( s.substr(3, 5).c_str() , _T("lo, w") ) == 0 ); + CPPUNIT_ASSERT( wxStrcmp( s.substr(3).c_str() , _T("lo, world!") ) == 0 ); + + wxString rest; + + #define TEST_STARTS_WITH( prefix , correct_rest, result ) \ + CPPUNIT_ASSERT( \ + ( s.StartsWith( prefix, &rest ) == result ) && \ + ( ( result == false ) || ( wxStrcmp( correct_rest , rest ) == 0 ) ) \ + ) + + TEST_STARTS_WITH( _T("Hello"), _T(", world!"), true ); + TEST_STARTS_WITH( _T("Hello, "), _T("world!"), true ); + TEST_STARTS_WITH( _T("Hello, world!"), _T(""), true ); + TEST_STARTS_WITH( _T("Hello, world!!!"), _T(""), false ); + TEST_STARTS_WITH( _T(""), _T("Hello, world!"), true ); + TEST_STARTS_WITH( _T("Goodbye"), _T(""), false ); + TEST_STARTS_WITH( _T("Hi"), _T(""), false ); + + #undef TEST_STARTS_WITH +} + +void StringTestCase::Find() +{ + #define TEST_FIND( str , start , result ) \ + CPPUNIT_ASSERT( wxString(str).find(_T("ell"), start) == result ); + + TEST_FIND( _T("Well, hello world"), 0, 1 ); + TEST_FIND( _T("Well, hello world"), 6, 7 ); + TEST_FIND( _T("Well, hello world"), 9, wxString::npos ); + + #undef TEST_FIND +} + +void StringTestCase::Tokenizer() +{ + #define TEST_TOKENIZER( str , delims, count , mode ) \ + { \ + wxStringTokenizer tkz( str, delims, mode); \ + CPPUNIT_ASSERT( tkz.CountTokens() == count ); \ + \ + wxChar *buf, *s = NULL, *last; \ + \ + if ( tkz.GetMode() == wxTOKEN_STRTOK ) \ + { \ + buf = new wxChar[wxStrlen(str) + 1]; \ + wxStrcpy(buf, str); \ + s = wxStrtok(buf, delims, &last); \ + } \ + else \ + { \ + buf = NULL; \ + } \ + \ + size_t count2 = 0; \ + while ( tkz.HasMoreTokens() ) \ + { \ + wxString token = tkz.GetNextToken(); \ + if ( buf ) \ + { \ + CPPUNIT_ASSERT( token == s ); \ + s = wxStrtok(NULL, delims, &last); \ + } \ + count2++; \ + } \ + \ + CPPUNIT_ASSERT( count2 == count ); \ + if ( buf ) \ + { \ + delete [] buf; \ + } \ + } + + TEST_TOKENIZER( _T(""), _T(" "), 0, wxTOKEN_DEFAULT ); + TEST_TOKENIZER( _T("Hello, world"), _T(" "), 2, wxTOKEN_DEFAULT ); + TEST_TOKENIZER( _T("Hello, world "), _T(" "), 2, wxTOKEN_DEFAULT ); + TEST_TOKENIZER( _T("Hello, world"), _T(","), 2, wxTOKEN_DEFAULT ); + TEST_TOKENIZER( _T("Hello, world!"), _T(",!"), 2, wxTOKEN_DEFAULT ); + TEST_TOKENIZER( _T("Hello,, world!"), _T(",!"), 3, wxTOKEN_DEFAULT ); + TEST_TOKENIZER( _T("Hello, world!"), _T(",!"), 3, wxTOKEN_RET_EMPTY_ALL ); + TEST_TOKENIZER( _T("username:password:uid:gid:gecos:home:shell"), _T(":"), 7, wxTOKEN_DEFAULT ); + TEST_TOKENIZER( _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, 4, wxTOKEN_DEFAULT ); + TEST_TOKENIZER( _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, 6, wxTOKEN_RET_EMPTY ); + TEST_TOKENIZER( _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, 9, wxTOKEN_RET_EMPTY_ALL ); + TEST_TOKENIZER( _T("01/02/99"), _T("/-"), 3, wxTOKEN_DEFAULT ); + TEST_TOKENIZER( _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS ); + + #undef TEST_TOKENIZER +} + +void StringTestCase::Replace() +{ + #define TEST_REPLACE( original , pos , len , replacement , result ) \ + { \ + wxString s = original; \ + s.replace( pos , len , replacement ); \ + CPPUNIT_ASSERT( s == result ); \ + } + + TEST_REPLACE( _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") ); + TEST_REPLACE( _T("increase"), 0, 2, _T("de"), _T("decrease") ); + TEST_REPLACE( _T("wxWindow"), 8, 0, _T("s"), _T("wxWindows") ); + TEST_REPLACE( _T("foobar"), 3, 0, _T("-"), _T("foo-bar") ); + TEST_REPLACE( _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") ); + + #undef TEST_REPLACE +} + +void StringTestCase::Match() +{ + #define TEST_MATCH( s1 , s2 , result ) \ + CPPUNIT_ASSERT( wxString(s1).Matches(s2) == result ) + + TEST_MATCH( _T("foobar"), _T("foo*"), true ); + TEST_MATCH( _T("foobar"), _T("*oo*"), true ); + TEST_MATCH( _T("foobar"), _T("*bar"), true ); + TEST_MATCH( _T("foobar"), _T("??????"), true ); + TEST_MATCH( _T("foobar"), _T("f??b*"), true ); + TEST_MATCH( _T("foobar"), _T("f?b*"), false ); + TEST_MATCH( _T("foobar"), _T("*goo*"), false ); + TEST_MATCH( _T("foobar"), _T("*foo"), false ); + TEST_MATCH( _T("foobarfoo"), _T("*foo"), true ); + TEST_MATCH( _T(""), _T("*"), true ); + TEST_MATCH( _T(""), _T("?"), false ); + + #undef TEST_MATCH +} + +void StringTestCase::Std() +{ + 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; + + CPPUNIT_ASSERT( s1 == _T("abcdefgh") ); + CPPUNIT_ASSERT( s2 == s1 ); + CPPUNIT_ASSERT( s4 == _T("aaaaaaaa") ); + CPPUNIT_ASSERT( s5 == _T("abcdefgh") ); + CPPUNIT_ASSERT( s6 == s1 ); + CPPUNIT_ASSERT( s7 == s1 ); + CPPUNIT_ASSERT( 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()); + + CPPUNIT_ASSERT( s1 == _T("abcdef") ); + CPPUNIT_ASSERT( s2 == _T("abcdef") ); + CPPUNIT_ASSERT( s3 == _T("abcdef") ); + CPPUNIT_ASSERT( s4 == _T("abcabcdef") ); + CPPUNIT_ASSERT( s5 == _T("abcaaa") ); + CPPUNIT_ASSERT( 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()); + + CPPUNIT_ASSERT( s1 == _T("def") ); + CPPUNIT_ASSERT( s2 == _T("def") ); + CPPUNIT_ASSERT( s3 == _T("def") ); + CPPUNIT_ASSERT( s4 == _T("def") ); + CPPUNIT_ASSERT( s5 == _T("aaa") ); + CPPUNIT_ASSERT( 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"); + + CPPUNIT_ASSERT( s1.compare(s2) == 0 ); + CPPUNIT_ASSERT( s1.compare(s3) > 0 ); + CPPUNIT_ASSERT( s1.compare(s4) < 0 ); + CPPUNIT_ASSERT( s1.compare(s5) > 0 ); + CPPUNIT_ASSERT( s1.compare(s6) < 0 ); + CPPUNIT_ASSERT( s1.compare(1, 12, s1) > 0); + CPPUNIT_ASSERT( s1.compare(_T("abcdefgh")) == 0); + CPPUNIT_ASSERT( s1.compare(1, 7, _T("bcdefgh")) == 0); + CPPUNIT_ASSERT( 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); + + CPPUNIT_ASSERT( s1 == _T("acdefgh") ); + CPPUNIT_ASSERT( s2 == _T("abcd") ); + CPPUNIT_ASSERT( s3 == _T("ac") ); + CPPUNIT_ASSERT( s4 == _T("abcdghi") ); + CPPUNIT_ASSERT( s7 == _T("zabc") ); + CPPUNIT_ASSERT( *it == _T('c') ); + CPPUNIT_ASSERT( *it2 == _T('g') ); + CPPUNIT_ASSERT( it3 == s7.end() ); + + // find + // 0 1 2 + // 01234567890123456789012345 + s1 = _T("abcdefgABCDEFGabcABCabcABC"); + s2 = _T("gAB"); + + CPPUNIT_ASSERT( s1.find(_T('A')) == 7u ); + CPPUNIT_ASSERT( s1.find(_T('A'), 7) == 7u ); + CPPUNIT_ASSERT( s1.find(_T('Z')) == wxString::npos ); + CPPUNIT_ASSERT( s1.find(_T('C'), 22) == 25u ); + + CPPUNIT_ASSERT( s1.find(_T("gAB")) == 6u ); + CPPUNIT_ASSERT( s1.find(_T("gAB"), 7) == wxString::npos ); + CPPUNIT_ASSERT( s1.find(_T("gAB"), 6) == 6u ); + + CPPUNIT_ASSERT( s1.find(_T("gABZZZ"), 2, 3) == 6u ); + CPPUNIT_ASSERT( s1.find(_T("gABZZZ"), 7, 3) == wxString::npos ); + + CPPUNIT_ASSERT( s1.find(s2) == 6u ); + CPPUNIT_ASSERT( s1.find(s2, 7) == wxString::npos ); + CPPUNIT_ASSERT( s1.find(s2, 6) == 6u ); + + // find_first_not_of + // 0 1 2 3 + // 01234567890123456789012345678901234 + s1 = _T("aaaaaabcdefghlkjiaaaaaabcdbcdbcdbcd"); + s2 = _T("aaaaaa"); + + CPPUNIT_ASSERT( s1.find_first_not_of(_T('a')) == 6u ); + CPPUNIT_ASSERT( s1.find_first_not_of(_T('a'), 7) == 7u ); + CPPUNIT_ASSERT( s2.find_first_not_of(_T('a')) == wxString::npos ); + + CPPUNIT_ASSERT( s1.find_first_not_of(_T("abde"), 4) == 7u ); + CPPUNIT_ASSERT( s1.find_first_not_of(_T("abde"), 7) == 7u ); + CPPUNIT_ASSERT( s1.find_first_not_of(_T("abcdefghijkl")) == wxString::npos ); + + CPPUNIT_ASSERT( s1.find_first_not_of(_T("abcdefghi"), 0, 4) == 9u ); + + // find_first_of + CPPUNIT_ASSERT( s1.find_first_of(_T('c')) == 7u ); + CPPUNIT_ASSERT( s1.find_first_of(_T('v')) == wxString::npos ); + CPPUNIT_ASSERT( s1.find_first_of(_T('c'), 10) == 24u ); + + CPPUNIT_ASSERT( s1.find_first_of(_T("ijkl")) == 13u ); + CPPUNIT_ASSERT( s1.find_first_of(_T("ddcfg"), 17) == 24u ); + CPPUNIT_ASSERT( s1.find_first_of(_T("ddcfga"), 17, 5) == 24u ); + + // find_last_not_of + // 0 1 2 3 + // 01234567890123456789012345678901234 + s1 = _T("aaaaaabcdefghlkjiaaaaaabcdbcdbcdbcd"); + s2 = _T("aaaaaa"); + + CPPUNIT_ASSERT( s2.find_last_not_of(_T('a')) == wxString::npos ); + CPPUNIT_ASSERT( s1.find_last_not_of(_T('d')) == 33u ); + CPPUNIT_ASSERT( s1.find_last_not_of(_T('d'), 25) == 24u ); + + CPPUNIT_ASSERT( s1.find_last_not_of(_T("bcd")) == 22u ); + CPPUNIT_ASSERT( s1.find_last_not_of(_T("abc"), 24) == 16u ); + + CPPUNIT_ASSERT( s1.find_last_not_of(_T("abcdefghijklmnopqrstuv"), 24, 3) == 16u ); + + // find_last_of + CPPUNIT_ASSERT( s2.find_last_of(_T('c')) == wxString::npos ); + CPPUNIT_ASSERT( s1.find_last_of(_T('a')) == 22u ); + CPPUNIT_ASSERT( s1.find_last_of(_T('b'), 24) == 23u ); + + CPPUNIT_ASSERT( s1.find_last_of(_T("ijklm")) == 16u ); + CPPUNIT_ASSERT( s1.find_last_of(_T("ijklma"), 33, 4) == 16u ); + CPPUNIT_ASSERT( s1.find_last_of(_T("a"), 17) == 17u ); + + // 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')); + + CPPUNIT_ASSERT( s1 == _T("accaaa") ); + CPPUNIT_ASSERT( s2 == _T("aacdeaa") ); + CPPUNIT_ASSERT( s3 == _T("aacdefgaa") ); + CPPUNIT_ASSERT( s4 == _T("aafgaa") ); + CPPUNIT_ASSERT( s5 == _T("accaaa") ); + CPPUNIT_ASSERT( s6 == _T("aaaXa") ); + CPPUNIT_ASSERT( s7 == _T("cdefaaaa") ); + CPPUNIT_ASSERT( s8 == _T("ccaaaa") ); + + s1 = s2 = s3 = _T("aaaa"); + s1.insert(0, _T("ccc"), 2); + s2.insert(4, _T("ccc"), 2); + + CPPUNIT_ASSERT( s1 == _T("ccaaaa") ); + CPPUNIT_ASSERT( 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); + + CPPUNIT_ASSERT( s1 == _T("QWErtyuIopopop") ); + CPPUNIT_ASSERT( s2 == _T("QWERTYUIOPWWWW") ); + CPPUNIT_ASSERT( s3 == _T("QwertyUIOP") ); + CPPUNIT_ASSERT( s4 == _T("QwertYUIOP") ); + CPPUNIT_ASSERT( s5 == _T("QertyRTYUIOP") ); + CPPUNIT_ASSERT( s6 == s9); + CPPUNIT_ASSERT( s7 == _T("QWwertyP") ); + + // rfind + // 0 1 2 + // 01234567890123456789012345 + s1 = _T("abcdefgABCDEFGabcABCabcABC"); + s2 = _T("gAB"); + s3 = _T("ab"); + + CPPUNIT_ASSERT( s1.rfind(_T('A')) == 23u ); + CPPUNIT_ASSERT( s1.rfind(_T('A'), 7) == 7u ); + CPPUNIT_ASSERT( s1.rfind(_T('Z')) == wxString::npos ); + CPPUNIT_ASSERT( s1.rfind(_T('C'), 22) == 19u ); + + CPPUNIT_ASSERT( s1.rfind(_T("cAB")) == 22u ); + CPPUNIT_ASSERT( s1.rfind(_T("cAB"), 15) == wxString::npos ); + CPPUNIT_ASSERT( s1.rfind(_T("cAB"), 21) == 16u ); + + CPPUNIT_ASSERT( s1.rfind(_T("gABZZZ"), 7, 3) == 6u ); + CPPUNIT_ASSERT( s1.rfind(_T("gABZZZ"), 5, 3) == wxString::npos ); + + CPPUNIT_ASSERT( s1.rfind(s2) == 6u ); + CPPUNIT_ASSERT( s1.rfind(s2, 5) == wxString::npos ); + CPPUNIT_ASSERT( s1.rfind(s2, 6) == 6u ); + CPPUNIT_ASSERT( s1.rfind(s3, 1) == 0u ); + + // resize + s1 = s2 = s3 = s4 = _T("abcABCdefDEF"); + + s1.resize( 12 ); + s2.resize( 10 ); + s3.resize( 14, _T(' ') ); + s4.resize( 14, _T('W') ); + + CPPUNIT_ASSERT( s1 == _T("abcABCdefDEF") ); + CPPUNIT_ASSERT( s2 == _T("abcABCdefD") ); + CPPUNIT_ASSERT( s3 == _T("abcABCdefDEF ") ); + CPPUNIT_ASSERT( s4 == _T("abcABCdefDEFWW") ); + + // substr + s1 = _T("abcdefgABCDEFG"); + + CPPUNIT_ASSERT( s1.substr( 0, 14 ) == s1 ); + CPPUNIT_ASSERT( s1.substr( 1, 13 ) == _T("bcdefgABCDEFG") ); + CPPUNIT_ASSERT( s1.substr( 1, 20 ) == _T("bcdefgABCDEFG") ); + CPPUNIT_ASSERT( s1.substr( 14, 30 ) == _T("") ); +} + diff --git a/tests/test.bkl b/tests/test.bkl index 7819fd082c..76e17e2514 100644 --- a/tests/test.bkl +++ b/tests/test.bkl @@ -15,6 +15,7 @@ filesys/filesys.cpp arrays/arrays.cpp longlong/longlong.cpp + strings/strings.cpp streams/bstream.cpp streams/ffilestream.cpp streams/filestream.cpp diff --git a/tests/test.dsp b/tests/test.dsp index 291a684bf5..2fc12e1c66 100644 --- a/tests/test.dsp +++ b/tests/test.dsp @@ -475,6 +475,10 @@ SOURCE=.\regex\regex.cpp # End Source File # Begin Source File +SOURCE=.\strings\strings.cpp +# End Source File +# Begin Source File + SOURCE=.\test.cpp # End Source File # Begin Source File -- 2.45.2