X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f312f981b5687ae96760f65ee53b2741909955cc..9cc4ab8522ec1978be193ae11b71e5623d78a14d:/tests/strings/strings.cpp?ds=sidebyside diff --git a/tests/strings/strings.cpp b/tests/strings/strings.cpp index e56d7e9a25..f937121091 100644 --- a/tests/strings/strings.cpp +++ b/tests/strings/strings.cpp @@ -53,12 +53,14 @@ private: CPPUNIT_TEST( ToULongLong ); #endif // wxLongLong_t CPPUNIT_TEST( ToDouble ); - CPPUNIT_TEST( WriteBuf ); + CPPUNIT_TEST( StringBuf ); CPPUNIT_TEST( UTF8Buf ); CPPUNIT_TEST( CStrDataTernaryOperator ); CPPUNIT_TEST( CStrDataOperators ); CPPUNIT_TEST( CStrDataImplicitConversion ); CPPUNIT_TEST( ExplicitConversion ); + CPPUNIT_TEST( IndexedAccess ); + CPPUNIT_TEST( BeforeAndAfter ); CPPUNIT_TEST_SUITE_END(); void String(); @@ -82,13 +84,15 @@ private: void ToULongLong(); #endif // wxLongLong_t void ToDouble(); - void WriteBuf(); + void StringBuf(); void UTF8Buf(); void CStrDataTernaryOperator(); void DoCStrDataTernaryOperator(bool cond); void CStrDataOperators(); void CStrDataImplicitConversion(); void ExplicitConversion(); + void IndexedAccess(); + void BeforeAndAfter(); DECLARE_NO_COPY_CLASS(StringTestCase) }; @@ -161,48 +165,48 @@ void StringTestCase::Format() void StringTestCase::Constructors() { - WX_ASSERT_STR_EQUAL( "", wxString('Z', 0) ); - WX_ASSERT_STR_EQUAL( "Z", wxString('Z') ); - WX_ASSERT_STR_EQUAL( "ZZZZ", wxString('Z', 4) ); - WX_ASSERT_STR_EQUAL( "Hell", wxString("Hello", 4) ); - WX_ASSERT_STR_EQUAL( "Hello", wxString("Hello", 5) ); + CPPUNIT_ASSERT_EQUAL( "", wxString('Z', 0) ); + CPPUNIT_ASSERT_EQUAL( "Z", wxString('Z') ); + CPPUNIT_ASSERT_EQUAL( "ZZZZ", wxString('Z', 4) ); + CPPUNIT_ASSERT_EQUAL( "Hell", wxString("Hello", 4) ); + CPPUNIT_ASSERT_EQUAL( "Hello", wxString("Hello", 5) ); #if wxUSE_UNICODE - WX_ASSERT_STR_EQUAL( L"", wxString(L'Z', 0) ); - WX_ASSERT_STR_EQUAL( L"Z", wxString(L'Z') ); - WX_ASSERT_STR_EQUAL( L"ZZZZ", wxString(L'Z', 4) ); - WX_ASSERT_STR_EQUAL( L"Hell", wxString(L"Hello", 4) ); - WX_ASSERT_STR_EQUAL( L"Hello", wxString(L"Hello", 5) ); + CPPUNIT_ASSERT_EQUAL( L"", wxString(L'Z', 0) ); + CPPUNIT_ASSERT_EQUAL( L"Z", wxString(L'Z') ); + CPPUNIT_ASSERT_EQUAL( L"ZZZZ", wxString(L'Z', 4) ); + CPPUNIT_ASSERT_EQUAL( L"Hell", wxString(L"Hello", 4) ); + CPPUNIT_ASSERT_EQUAL( L"Hello", wxString(L"Hello", 5) ); #endif // wxUSE_UNICODE static const char *s = "?really!"; const char *start = wxStrchr(s, 'r'); const char *end = wxStrchr(s, '!'); - WX_ASSERT_STR_EQUAL( "really", wxString(start, end) ); + CPPUNIT_ASSERT_EQUAL( "really", wxString(start, end) ); // test if creating string from NULL C pointer works: - WX_ASSERT_STR_EQUAL( "", wxString((const char *)NULL) ); + CPPUNIT_ASSERT_EQUAL( "", wxString((const char *)NULL) ); } void StringTestCase::StaticConstructors() { - WX_ASSERT_STR_EQUAL( "", wxString::FromAscii("") ); - WX_ASSERT_STR_EQUAL( "", wxString::FromAscii("Hello", 0) ); - WX_ASSERT_STR_EQUAL( "Hell", wxString::FromAscii("Hello", 4) ); - WX_ASSERT_STR_EQUAL( "Hello", wxString::FromAscii("Hello", 5) ); - WX_ASSERT_STR_EQUAL( "Hello", wxString::FromAscii("Hello") ); + CPPUNIT_ASSERT_EQUAL( "", wxString::FromAscii("") ); + CPPUNIT_ASSERT_EQUAL( "", wxString::FromAscii("Hello", 0) ); + CPPUNIT_ASSERT_EQUAL( "Hell", wxString::FromAscii("Hello", 4) ); + CPPUNIT_ASSERT_EQUAL( "Hello", wxString::FromAscii("Hello", 5) ); + CPPUNIT_ASSERT_EQUAL( "Hello", wxString::FromAscii("Hello") ); // FIXME: this doesn't work currently but should! - //WX_ASSERT_SIZET_EQUAL( 1, wxString::FromAscii("", 1).length() ); + //CPPUNIT_ASSERT_EQUAL( 1, wxString::FromAscii("", 1).length() ); - WX_ASSERT_STR_EQUAL( "", wxString::FromUTF8("") ); - WX_ASSERT_STR_EQUAL( "", wxString::FromUTF8("Hello", 0) ); - WX_ASSERT_STR_EQUAL( "Hell", wxString::FromUTF8("Hello", 4) ); - WX_ASSERT_STR_EQUAL( "Hello", wxString::FromUTF8("Hello", 5) ); - WX_ASSERT_STR_EQUAL( "Hello", wxString::FromUTF8("Hello") ); + CPPUNIT_ASSERT_EQUAL( "", wxString::FromUTF8("") ); + CPPUNIT_ASSERT_EQUAL( "", wxString::FromUTF8("Hello", 0) ); + CPPUNIT_ASSERT_EQUAL( "Hell", wxString::FromUTF8("Hello", 4) ); + CPPUNIT_ASSERT_EQUAL( "Hello", wxString::FromUTF8("Hello", 5) ); + CPPUNIT_ASSERT_EQUAL( "Hello", wxString::FromUTF8("Hello") ); - //WX_ASSERT_SIZET_EQUAL( 1, wxString::FromUTF8("", 1).length() ); + //CPPUNIT_ASSERT_EQUAL( 1, wxString::FromUTF8("", 1).length() ); } void StringTestCase::Extraction() @@ -230,7 +234,7 @@ void StringTestCase::Extraction() #define TEST_STARTS_WITH(prefix, correct_rest, result) \ CPPUNIT_ASSERT_EQUAL(result, s.StartsWith(prefix, &rest)); \ if ( result ) \ - WX_ASSERT_STR_EQUAL(correct_rest, rest) + CPPUNIT_ASSERT_EQUAL(correct_rest, rest) TEST_STARTS_WITH( _T("Hello"), _T(", world!"), true ); TEST_STARTS_WITH( _T("Hello, "), _T("world!"), true ); @@ -244,12 +248,12 @@ void StringTestCase::Extraction() rest = "Hello world"; CPPUNIT_ASSERT( rest.StartsWith("Hello ", &rest) ); - WX_ASSERT_STR_EQUAL("world", rest); + CPPUNIT_ASSERT_EQUAL("world", rest); #define TEST_ENDS_WITH(suffix, correct_rest, result) \ CPPUNIT_ASSERT_EQUAL(result, s.EndsWith(suffix, &rest)); \ if ( result ) \ - WX_ASSERT_STR_EQUAL(correct_rest, rest) + CPPUNIT_ASSERT_EQUAL(correct_rest, rest) TEST_ENDS_WITH( _T(""), _T("Hello, world!"), true ); TEST_ENDS_WITH( _T("!"), _T("Hello, world"), true ); @@ -300,7 +304,7 @@ void StringTestCase::Replace() { \ wxString s = original; \ s.replace( pos , len , replacement ); \ - WX_ASSERT_STR_EQUAL( result, s ); \ + CPPUNIT_ASSERT_EQUAL( result, s ); \ } TEST_REPLACE( _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") ); @@ -309,16 +313,16 @@ void StringTestCase::Replace() TEST_REPLACE( _T("foobar"), 3, 0, _T("-"), _T("foo-bar") ); TEST_REPLACE( _T("barfoo"), 0, 6, _T("foobar"), _T("foobar") ); - + #define TEST_NULLCHARREPLACE( o , olen, pos , len , replacement , r, rlen ) \ { \ wxString s(o,olen); \ s.replace( pos , len , replacement ); \ CPPUNIT_ASSERT( s == wxString(r,rlen) ); \ } - - TEST_NULLCHARREPLACE( _T("null\0char"), 9, 5, 1, _T("d"), - _T("null\0dhar"), 9 ); + + TEST_NULLCHARREPLACE( _T("null\0char"), 9, 5, 1, _T("d"), + _T("null\0dhar"), 9 ); #define TEST_WXREPLACE( o , olen, olds, news, all, r, rlen ) \ { \ @@ -326,12 +330,14 @@ void StringTestCase::Replace() s.Replace( olds, news, all ); \ CPPUNIT_ASSERT( s == wxString(r,rlen) ); \ } - + TEST_WXREPLACE( _T("null\0char"), 9, _T("c"), _T("de"), true, - _T("null\0dehar"), 10 ); + _T("null\0dehar"), 10 ); TEST_WXREPLACE( _T("null\0dehar"), 10, _T("de"), _T("c"), true, - _T("null\0char"), 9 ); + _T("null\0char"), 9 ); + + TEST_WXREPLACE( "life", 4, "f", "", false, "lie", 3 ); #undef TEST_WXREPLACE #undef TEST_NULLCHARREPLACE @@ -366,30 +372,26 @@ void StringTestCase::CaseChanges() wxString s1l(s1); s1u.MakeUpper(); s1l.MakeLower(); + + CPPUNIT_ASSERT_EQUAL( _T("HELLO!"), s1u ); + CPPUNIT_ASSERT_EQUAL( _T("hello!"), s1l ); + wxString s2u, s2l; s2u.MakeUpper(); s2l.MakeLower(); - CPPUNIT_ASSERT( s1u == _T("HELLO!") ); - CPPUNIT_ASSERT( s1l == _T("hello!") ); - CPPUNIT_ASSERT( s2u == wxEmptyString ); - CPPUNIT_ASSERT( s2l == wxEmptyString ); + CPPUNIT_ASSERT_EQUAL( "", s2u ); + CPPUNIT_ASSERT_EQUAL( "", s2l ); -#if !wxUSE_UNICODE - wxLocale locRu(wxLANGUAGE_RUSSIAN, 0 /* flags */); - if ( locRu.IsOk() ) - { - // try upper casing 8bit strings - const wchar_t capital_ya[] = { 0x42f, 0 }, - small_ya[] = { 0x44f, 0 }; - wxString sUpper(wxConvLibc.cWC2MB(capital_ya)), - sLower(wxConvLibc.cWC2MB(small_ya)); + wxString s3("good bye"); + CPPUNIT_ASSERT_EQUAL( "Good bye", s3.Capitalize() ); + s3.MakeCapitalized(); + CPPUNIT_ASSERT_EQUAL( "Good bye", s3 ); - CPPUNIT_ASSERT( sUpper.Lower() == sLower ); - CPPUNIT_ASSERT( sLower.Upper() == sUpper ); - } -#endif // !wxUSE_UNICODE + CPPUNIT_ASSERT_EQUAL( "Abc", wxString("ABC").Capitalize() ); + + CPPUNIT_ASSERT_EQUAL( "", wxString().Capitalize() ); } void StringTestCase::Compare() @@ -529,7 +531,7 @@ enum Number_Unsigned = 2, // if not specified, works for signed conversion Number_Signed = 4, // if not specified, works for unsigned Number_LongLong = 8, // only for long long tests - Number_Long = 16, // only for long tests + Number_Long = 16 // only for long tests }; static const struct ToLongData @@ -677,31 +679,50 @@ void StringTestCase::ToDouble() } } -void StringTestCase::WriteBuf() +void StringTestCase::StringBuf() { + // check that buffer can be used to write into the string wxString s; wxStrcpy(wxStringBuffer(s, 10), _T("foo")); - CPPUNIT_ASSERT(s[0u] == _T('f') ); + CPPUNIT_ASSERT_EQUAL(3, s.length()); CPPUNIT_ASSERT(_T('f') == s[0u]); CPPUNIT_ASSERT(_T('o') == s[1]); CPPUNIT_ASSERT(_T('o') == s[2]); - WX_ASSERT_SIZET_EQUAL(3, s.length()); + { + // also check that the buffer initially contains the original string + // contents + wxStringBuffer buf(s, 10); + CPPUNIT_ASSERT_EQUAL( _T('f'), buf[0] ); + CPPUNIT_ASSERT_EQUAL( _T('o'), buf[1] ); + CPPUNIT_ASSERT_EQUAL( _T('o'), buf[2] ); + CPPUNIT_ASSERT_EQUAL( _T('\0'), buf[3] ); + } { wxStringBufferLength buf(s, 10); + CPPUNIT_ASSERT_EQUAL( _T('f'), buf[0] ); + CPPUNIT_ASSERT_EQUAL( _T('o'), buf[1] ); + CPPUNIT_ASSERT_EQUAL( _T('o'), buf[2] ); + CPPUNIT_ASSERT_EQUAL( _T('\0'), buf[3] ); + + // and check that it can be used to write only the specified number of + // characters to the string wxStrcpy(buf, _T("barrbaz")); buf.SetLength(4); } + CPPUNIT_ASSERT_EQUAL(4, s.length()); CPPUNIT_ASSERT(_T('b') == s[0u]); CPPUNIT_ASSERT(_T('a') == s[1]); CPPUNIT_ASSERT(_T('r') == s[2]); CPPUNIT_ASSERT(_T('r') == s[3]); - WX_ASSERT_SIZET_EQUAL(4, s.length()); - CPPUNIT_ASSERT_EQUAL( 0, wxStrcmp(_T("barr"), s) ); + // check that creating buffer of length smaller than string works, i.e. at + // least doesn't crash (it would if we naively copied the entire original + // string contents in the buffer) + *wxStringBuffer(s, 1) = '!'; } void StringTestCase::UTF8Buf() @@ -809,3 +830,37 @@ void StringTestCase::ExplicitConversion() CPPUNIT_ASSERT( CheckStrConstWChar(s, s.wc_str()) ); CPPUNIT_ASSERT( CheckStrWChar(s, s.wchar_str()) ); } + +void StringTestCase::IndexedAccess() +{ + wxString s("bar"); + CPPUNIT_ASSERT_EQUAL( 'r', (char)s[2] ); + + // this tests for a possible bug in UTF-8 based wxString implementation: + // the 3rd character of the underlying byte string is going to change, but + // the 3rd character of wxString should remain the same + s[0] = L'\u00e9'; + CPPUNIT_ASSERT_EQUAL( 'r', (char)s[2] ); +} + +void StringTestCase::BeforeAndAfter() +{ + const wxString s(L"letter=\u00e9;\u00e7a=l\u00e0"); + + CPPUNIT_ASSERT_EQUAL( "letter", s.BeforeFirst('=') ); + CPPUNIT_ASSERT_EQUAL( s, s.BeforeFirst('!') ); + CPPUNIT_ASSERT_EQUAL( L"letter=\u00e9", s.BeforeFirst(';') ); + + CPPUNIT_ASSERT_EQUAL( L"letter=\u00e9;\u00e7a", s.BeforeLast('=') ); + CPPUNIT_ASSERT_EQUAL( "", s.BeforeLast('!') ); + CPPUNIT_ASSERT_EQUAL( L"letter=\u00e9", s.BeforeLast(';') ); + + CPPUNIT_ASSERT_EQUAL( L"\u00e9;\u00e7a=l\u00e0", s.AfterFirst('=') ); + CPPUNIT_ASSERT_EQUAL( "", s.AfterFirst('!') ); + CPPUNIT_ASSERT_EQUAL( L"\u00e7a=l\u00e0", s.AfterFirst(';') ); + + CPPUNIT_ASSERT_EQUAL( L"l\u00e0", s.AfterLast('=') ); + CPPUNIT_ASSERT_EQUAL( s, s.AfterLast('!') ); + CPPUNIT_ASSERT_EQUAL( L"\u00e7a=l\u00e0", s.AfterLast(';') ); +} +