X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/062dc5fc22801a7c33ea192512de8fe2b5592133..ecde8361cce9ed8a51b41b619b7975a5abd8252c:/tests/strings/strings.cpp diff --git a/tests/strings/strings.cpp b/tests/strings/strings.cpp index 268197281f..b29747338a 100644 --- a/tests/strings/strings.cpp +++ b/tests/strings/strings.cpp @@ -59,6 +59,8 @@ private: CPPUNIT_TEST( CStrDataOperators ); CPPUNIT_TEST( CStrDataImplicitConversion ); CPPUNIT_TEST( ExplicitConversion ); + CPPUNIT_TEST( IndexedAccess ); + CPPUNIT_TEST( BeforeAndAfter ); CPPUNIT_TEST_SUITE_END(); void String(); @@ -89,6 +91,8 @@ private: 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,29 +313,35 @@ 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) ); \ + CPPUNIT_ASSERT_EQUAL( wxString(r,rlen), s ); \ } - - 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 ) \ { \ wxString s(o,olen); \ s.Replace( olds, news, all ); \ - CPPUNIT_ASSERT( s == wxString(r,rlen) ); \ + CPPUNIT_ASSERT_EQUAL( wxString(r,rlen), s ); \ } - + 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 ); + TEST_WXREPLACE( "life", 4, "f", "", true, "lie", 3 ); + TEST_WXREPLACE( "life", 4, "fe", "ve", true, "live", 4 ); + TEST_WXREPLACE( "xx", 2, "x", "yy", true, "yyyy", 4 ); + TEST_WXREPLACE( "xxx", 3, "xx", "z", true, "zx", 2 ); #undef TEST_WXREPLACE #undef TEST_NULLCHARREPLACE @@ -366,14 +376,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 ); + + + wxString s3("good bye"); + CPPUNIT_ASSERT_EQUAL( "Good bye", s3.Capitalize() ); + s3.MakeCapitalized(); + CPPUNIT_ASSERT_EQUAL( "Good bye", s3 ); + + CPPUNIT_ASSERT_EQUAL( "Abc", wxString("ABC").Capitalize() ); + + CPPUNIT_ASSERT_EQUAL( "", wxString().Capitalize() ); } void StringTestCase::Compare() @@ -513,7 +535,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 @@ -566,6 +588,13 @@ void StringTestCase::ToLong() if ( ld.flags & (Number_LongLong | Number_Unsigned) ) continue; + + // NOTE: unless you're using some exotic locale, ToCLong and ToLong + // should behave the same for our test data set: + + CPPUNIT_ASSERT_EQUAL( ld.IsOk(), wxString(ld.str).ToCLong(&l) ); + if ( ld.IsOk() ) + CPPUNIT_ASSERT_EQUAL( ld.LValue(), l ); CPPUNIT_ASSERT_EQUAL( ld.IsOk(), wxString(ld.str).ToLong(&l) ); if ( ld.IsOk() ) @@ -583,6 +612,13 @@ void StringTestCase::ToULong() if ( ld.flags & (Number_LongLong | Number_Signed) ) continue; + // NOTE: unless you're using some exotic locale, ToCLong and ToLong + // should behave the same for our test data set: + + CPPUNIT_ASSERT_EQUAL( ld.IsOk(), wxString(ld.str).ToCULong(&ul) ); + if ( ld.IsOk() ) + CPPUNIT_ASSERT_EQUAL( ld.ULValue(), ul ); + CPPUNIT_ASSERT_EQUAL( ld.IsOk(), wxString(ld.str).ToULong(&ul) ); if ( ld.IsOk() ) CPPUNIT_ASSERT_EQUAL( ld.ULValue(), ul ); @@ -645,20 +681,59 @@ void StringTestCase::ToDouble() { _T("12345"), 12345, true }, { _T("-1"), -1, true }, { _T("--1"), 0, false }, + { _T("-3E-5"), -3E-5, true }, + { _T("-3E-abcde5"), 0, false }, }; - // we need to use decimal point, not comma or whatever is its value for the - // current locale - wxSetlocale(LC_ALL, "C"); + // test ToCDouble() first: size_t n; for ( n = 0; n < WXSIZEOF(doubleData); n++ ) { const ToDoubleData& ld = doubleData[n]; + CPPUNIT_ASSERT_EQUAL( ld.ok, wxString(ld.str).ToCDouble(&d) ); + if ( ld.ok ) + CPPUNIT_ASSERT_EQUAL( ld.value, d ); + } + + + // test ToDouble() now: + // NOTE: for the test to be reliable, we need to set the locale explicitely + // so that we know the decimal point character to use + + if (!wxLocale::IsAvailable(wxLANGUAGE_FRENCH)) + return; // you should have french support installed to continue this test! + + wxLocale *locale = new wxLocale; + + // don't load default catalog, it may be unavailable: + CPPUNIT_ASSERT( locale->Init(wxLANGUAGE_FRENCH, wxLOCALE_CONV_ENCODING) ); + + static const struct ToDoubleData doubleData2[] = + { + { _T("1"), 1, true }, + { _T("1,23"), 1.23, true }, + { _T(",1"), .1, true }, + { _T("1,"), 1, true }, + { _T("1,,"), 0, false }, + { _T("0"), 0, true }, + { _T("a"), 0, false }, + { _T("12345"), 12345, true }, + { _T("-1"), -1, true }, + { _T("--1"), 0, false }, + { _T("-3E-5"), -3E-5, true }, + { _T("-3E-abcde5"), 0, false }, + }; + + for ( n = 0; n < WXSIZEOF(doubleData2); n++ ) + { + const ToDoubleData& ld = doubleData2[n]; CPPUNIT_ASSERT_EQUAL( ld.ok, wxString(ld.str).ToDouble(&d) ); if ( ld.ok ) CPPUNIT_ASSERT_EQUAL( ld.value, d ); } + + delete locale; } void StringTestCase::StringBuf() @@ -667,7 +742,7 @@ void StringTestCase::StringBuf() wxString s; wxStrcpy(wxStringBuffer(s, 10), _T("foo")); - WX_ASSERT_SIZET_EQUAL(3, s.length()); + CPPUNIT_ASSERT_EQUAL(3, s.length()); CPPUNIT_ASSERT(_T('f') == s[0u]); CPPUNIT_ASSERT(_T('o') == s[1]); CPPUNIT_ASSERT(_T('o') == s[2]); @@ -695,7 +770,7 @@ void StringTestCase::StringBuf() buf.SetLength(4); } - WX_ASSERT_SIZET_EQUAL(4, s.length()); + CPPUNIT_ASSERT_EQUAL(4, s.length()); CPPUNIT_ASSERT(_T('b') == s[0u]); CPPUNIT_ASSERT(_T('a') == s[1]); CPPUNIT_ASSERT(_T('r') == s[2]); @@ -770,11 +845,14 @@ void StringTestCase::CStrDataOperators() CPPUNIT_ASSERT( s.c_str()[0] == 'h' ); CPPUNIT_ASSERT( s.c_str()[1] == 'e' ); - CPPUNIT_ASSERT( s.c_str()[5] == '\0' ); + + // IMPORTANT: at least with the CRT coming with MSVC++ 2008 trying to access + // the final character results in an assert failure (with debug CRT) + //CPPUNIT_ASSERT( s.c_str()[5] == '\0' ); CPPUNIT_ASSERT( *s.c_str() == 'h' ); CPPUNIT_ASSERT( *(s.c_str() + 2) == 'l' ); - CPPUNIT_ASSERT( *(s.c_str() + 5) == '\0' ); + //CPPUNIT_ASSERT( *(s.c_str() + 5) == '\0' ); } bool CheckStrChar(const wxString& expected, char *s) @@ -812,3 +890,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'\xe9'; + CPPUNIT_ASSERT_EQUAL( 'r', (char)s[2] ); +} + +void StringTestCase::BeforeAndAfter() +{ + const wxString s(L"letter=\xe9;\xe7a=l\xe0"); + + CPPUNIT_ASSERT_EQUAL( "letter", s.BeforeFirst('=') ); + CPPUNIT_ASSERT_EQUAL( s, s.BeforeFirst('!') ); + CPPUNIT_ASSERT_EQUAL( L"letter=\xe9", s.BeforeFirst(';') ); + + CPPUNIT_ASSERT_EQUAL( L"letter=\xe9;\xe7a", s.BeforeLast('=') ); + CPPUNIT_ASSERT_EQUAL( "", s.BeforeLast('!') ); + CPPUNIT_ASSERT_EQUAL( L"letter=\xe9", s.BeforeLast(';') ); + + CPPUNIT_ASSERT_EQUAL( L"\xe9;\xe7a=l\xe0", s.AfterFirst('=') ); + CPPUNIT_ASSERT_EQUAL( "", s.AfterFirst('!') ); + CPPUNIT_ASSERT_EQUAL( L"\xe7a=l\xe0", s.AfterFirst(';') ); + + CPPUNIT_ASSERT_EQUAL( L"l\xe0", s.AfterLast('=') ); + CPPUNIT_ASSERT_EQUAL( s, s.AfterLast('!') ); + CPPUNIT_ASSERT_EQUAL( L"\xe7a=l\xe0", s.AfterLast(';') ); +} +