X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9b59b90cdade332e7fa5235969f1354db6b822c9..fce127d758a53bec28bce0c66f52a2e03ae9bf4b:/tests/strings/strings.cpp diff --git a/tests/strings/strings.cpp b/tests/strings/strings.cpp index ca6a5cd709..b83b8f18c3 100644 --- a/tests/strings/strings.cpp +++ b/tests/strings/strings.cpp @@ -53,7 +53,9 @@ private: #endif // wxLongLong_t CPPUNIT_TEST( ToDouble ); CPPUNIT_TEST( WriteBuf ); + CPPUNIT_TEST( UTF8Buf ); CPPUNIT_TEST( CStrDataTernaryOperator ); + CPPUNIT_TEST( CStrDataOperators ); CPPUNIT_TEST( CStrDataImplicitConversion ); CPPUNIT_TEST( ExplicitConversion ); CPPUNIT_TEST_SUITE_END(); @@ -79,8 +81,10 @@ private: #endif // wxLongLong_t void ToDouble(); void WriteBuf(); + void UTF8Buf(); void CStrDataTernaryOperator(); void DoCStrDataTernaryOperator(bool cond); + void CStrDataOperators(); void CStrDataImplicitConversion(); void ExplicitConversion(); @@ -169,6 +173,9 @@ void StringTestCase::Constructors() const wxChar *start = wxStrchr(s, _T('r')); const wxChar *end = wxStrchr(s, _T('!')); TEST_CTOR((start, end), _T("really")); + + // test if creating string from NULL C pointer works: + TEST_CTOR(((char*)NULL), ""); } @@ -184,12 +191,20 @@ void StringTestCase::Extraction() 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 ); +#if wxUSE_UNICODE + static const char *germanUTF8 = "Oberfl\303\244che"; + wxString strUnicode(wxString::FromUTF8(germanUTF8)); + + CPPUNIT_ASSERT( strUnicode.Mid(0, 10) == strUnicode ); + CPPUNIT_ASSERT( strUnicode.Mid(7, 2) == "ch" ); +#endif // wxUSE_UNICODE + wxString rest; #define TEST_STARTS_WITH(prefix, correct_rest, result) \ CPPUNIT_ASSERT_EQUAL(result, s.StartsWith(prefix, &rest)); \ if ( result ) \ - CPPUNIT_ASSERT_EQUAL(wxString(correct_rest), rest) + WX_ASSERT_STR_EQUAL(correct_rest, rest) TEST_STARTS_WITH( _T("Hello"), _T(", world!"), true ); TEST_STARTS_WITH( _T("Hello, "), _T("world!"), true ); @@ -201,10 +216,14 @@ void StringTestCase::Extraction() #undef TEST_STARTS_WITH + rest = "Hello world"; + CPPUNIT_ASSERT( rest.StartsWith("Hello ", &rest) ); + WX_ASSERT_STR_EQUAL("world", rest); + #define TEST_ENDS_WITH(suffix, correct_rest, result) \ CPPUNIT_ASSERT_EQUAL(result, s.EndsWith(suffix, &rest)); \ if ( result ) \ - CPPUNIT_ASSERT_EQUAL(wxString(correct_rest), rest) + WX_ASSERT_STR_EQUAL(correct_rest, rest) TEST_ENDS_WITH( _T(""), _T("Hello, world!"), true ); TEST_ENDS_WITH( _T("!"), _T("Hello, world"), true ); @@ -255,7 +274,7 @@ void StringTestCase::Replace() { \ wxString s = original; \ s.replace( pos , len , replacement ); \ - CPPUNIT_ASSERT( s == result ); \ + WX_ASSERT_STR_EQUAL( result, s ); \ } TEST_REPLACE( _T("012-AWORD-XYZ"), 4, 5, _T("BWORD"), _T("012-BWORD-XYZ") ); @@ -620,7 +639,7 @@ void StringTestCase::ToDouble() // we need to use decimal point, not comma or whatever is its value for the // current locale - wxSetlocale(LC_ALL, _T("C")); + wxSetlocale(LC_ALL, "C"); size_t n; for ( n = 0; n < WXSIZEOF(doubleData); n++ ) @@ -641,7 +660,7 @@ void StringTestCase::WriteBuf() CPPUNIT_ASSERT(_T('f') == s[0u]); CPPUNIT_ASSERT(_T('o') == s[1]); CPPUNIT_ASSERT(_T('o') == s[2]); - CPPUNIT_ASSERT_EQUAL((size_t)3, s.length()); + WX_ASSERT_SIZET_EQUAL(3, s.length()); { @@ -654,11 +673,31 @@ void StringTestCase::WriteBuf() CPPUNIT_ASSERT(_T('a') == s[1]); CPPUNIT_ASSERT(_T('r') == s[2]); CPPUNIT_ASSERT(_T('r') == s[3]); - CPPUNIT_ASSERT_EQUAL((size_t)4, s.length()); + WX_ASSERT_SIZET_EQUAL(4, s.length()); CPPUNIT_ASSERT_EQUAL( 0, wxStrcmp(_T("barr"), s) ); } +void StringTestCase::UTF8Buf() +{ +#if wxUSE_UNICODE + // "czech" in Czech ("cestina"): + static const char *textUTF8 = "\304\215e\305\241tina"; + static const wchar_t textUTF16[] = {0x10D, 0x65, 0x161, 0x74, 0x69, 0x6E, 0x61, 0}; + + wxString s; + wxStrcpy(wxUTF8StringBuffer(s, 9), textUTF8); + CPPUNIT_ASSERT(s == textUTF16); + + { + wxUTF8StringBufferLength buf(s, 20); + wxStrcpy(buf, textUTF8); + buf.SetLength(5); + } + CPPUNIT_ASSERT(s == wxString(textUTF16, 0, 3)); +#endif // wxUSE_UNICODE +} + void StringTestCase::CStrDataTernaryOperator() @@ -679,27 +718,36 @@ void StringTestCase::DoCStrDataTernaryOperator(bool cond) wxString s("foo"); - // FIXME-UTF8: when wxCStrData can handle both conversions, this should - // be changed to always test all versions, both MB and WC -#if wxUSE_UNICODE const wchar_t *wcStr = L"foo"; CPPUNIT_ASSERT( CheckStr(s, (cond ? s.c_str() : wcStr)) ); - CPPUNIT_ASSERT( CheckStr(s, (cond ? s.c_str() : L"bar")) ); + CPPUNIT_ASSERT( CheckStr(s, (cond ? s.c_str() : L"foo")) ); CPPUNIT_ASSERT( CheckStr(s, (cond ? wcStr : s.c_str())) ); - CPPUNIT_ASSERT( CheckStr(s, (cond ? L"bar" : s.c_str())) ); -#else + CPPUNIT_ASSERT( CheckStr(s, (cond ? L"foo" : s.c_str())) ); + const char *mbStr = "foo"; CPPUNIT_ASSERT( CheckStr(s, (cond ? s.c_str() : mbStr)) ); CPPUNIT_ASSERT( CheckStr(s, (cond ? s.c_str() : "foo")) ); CPPUNIT_ASSERT( CheckStr(s, (cond ? mbStr : s.c_str())) ); CPPUNIT_ASSERT( CheckStr(s, (cond ? "foo" : s.c_str())) ); -#endif wxString empty(""); CPPUNIT_ASSERT( CheckStr(empty, (cond ? empty.c_str() : wxEmptyString)) ); CPPUNIT_ASSERT( CheckStr(empty, (cond ? wxEmptyString : empty.c_str())) ); } +void StringTestCase::CStrDataOperators() +{ + wxString s("hello"); + + CPPUNIT_ASSERT( s.c_str()[0] == 'h' ); + CPPUNIT_ASSERT( s.c_str()[1] == 'e' ); + 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' ); +} + bool CheckStrChar(const wxString& expected, char *s) { return CheckStr(expected, s); } bool CheckStrWChar(const wxString& expected, wchar_t *s) @@ -713,13 +761,12 @@ void StringTestCase::CStrDataImplicitConversion() { wxString s("foo"); - // FIXME-UTF8: when wxCStrData can handle both conversions, this should - // be changed to always test all versions, both MB and WC -#if wxUSE_UNICODE CPPUNIT_ASSERT( CheckStrConstWChar(s, s.c_str()) ); - CPPUNIT_ASSERT( CheckStrConstWChar(s, s) ); -#else CPPUNIT_ASSERT( CheckStrConstChar(s, s.c_str()) ); + + // implicit conversion of wxString is not available in STL build +#if !wxUSE_STL + CPPUNIT_ASSERT( CheckStrConstWChar(s, s) ); CPPUNIT_ASSERT( CheckStrConstChar(s, s) ); #endif }