diff --git a/tests/strings/strings.cpp b/tests/strings/strings.cpp index 3562510b51..1cf282b0eb 100644 --- a/tests/strings/strings.cpp +++ b/tests/strings/strings.cpp @@ -63,6 +63,7 @@ private: CPPUNIT_TEST( IndexedAccess ); CPPUNIT_TEST( BeforeAndAfter ); CPPUNIT_TEST( ScopedBuffers ); + CPPUNIT_TEST( SupplementaryUniChar ); CPPUNIT_TEST_SUITE_END(); void String(); @@ -98,6 +99,7 @@ private: void IndexedAccess(); void BeforeAndAfter(); void ScopedBuffers(); + void SupplementaryUniChar(); wxDECLARE_NO_COPY_CLASS(StringTestCase); }; @@ -1142,3 +1144,171 @@ void StringTestCase::ScopedBuffers() buf5.extend(len); CPPUNIT_ASSERT_EQUAL('\0', buf5.data()[len]); } + +void StringTestCase::SupplementaryUniChar() +{ +#if wxUSE_UNICODE + // Test wxString(wxUniChar ch, size_t nRepeat = 1), + // which is implemented upon assign(size_t n, wxUniChar ch). + { + wxString s(wxUniChar(0x12345)); +#if wxUSE_UNICODE_UTF16 + CPPUNIT_ASSERT_EQUAL(2, s.length()); + CPPUNIT_ASSERT_EQUAL(0xD808, s[0].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xDF45, s[1].GetValue()); +#else + CPPUNIT_ASSERT_EQUAL(1, s.length()); + CPPUNIT_ASSERT_EQUAL(0x12345, s[0].GetValue()); +#endif + } + + // Test operator=(wxUniChar ch). + { + wxString s; + s = wxUniChar(0x23456); +#if wxUSE_UNICODE_UTF16 + CPPUNIT_ASSERT_EQUAL(2, s.length()); + CPPUNIT_ASSERT_EQUAL(0xD84D, s[0].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xDC56, s[1].GetValue()); +#else + CPPUNIT_ASSERT_EQUAL(1, s.length()); + CPPUNIT_ASSERT_EQUAL(0x23456, s[0].GetValue()); +#endif + } + + // Test operator+=(wxUniChar ch). + { + wxString s = "A"; + s += wxUniChar(0x34567); +#if wxUSE_UNICODE_UTF16 + CPPUNIT_ASSERT_EQUAL(3, s.length()); + CPPUNIT_ASSERT_EQUAL(0xD891, s[1].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xDD67, s[2].GetValue()); +#else + CPPUNIT_ASSERT_EQUAL(2, s.length()); + CPPUNIT_ASSERT_EQUAL(0x34567, s[1].GetValue()); +#endif + } + + // Test operator<<(wxUniChar ch), + // which is implemented upon append(size_t n, wxUniChar ch). + { + wxString s = "A"; + s << wxUniChar(0x45678); +#if wxUSE_UNICODE_UTF16 + CPPUNIT_ASSERT_EQUAL(3, s.length()); + CPPUNIT_ASSERT_EQUAL(0xD8D5, s[1].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xDE78, s[2].GetValue()); +#else + CPPUNIT_ASSERT_EQUAL(2, s.length()); + CPPUNIT_ASSERT_EQUAL(0x45678, s[1].GetValue()); +#endif + } + + // Test insert(size_t nPos, size_t n, wxUniChar ch). + { + wxString s = L"\x3042\x208\x3059"; + s.insert(1, 2, wxUniChar(0x12345)); +#if wxUSE_UNICODE_UTF16 + CPPUNIT_ASSERT_EQUAL(7, s.length()); + CPPUNIT_ASSERT_EQUAL(0xD808, s[1].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xDF45, s[2].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xD808, s[3].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xDF45, s[4].GetValue()); +#else + CPPUNIT_ASSERT_EQUAL(5, s.length()); + CPPUNIT_ASSERT_EQUAL(0x12345, s[1].GetValue()); + CPPUNIT_ASSERT_EQUAL(0x12345, s[2].GetValue()); +#endif + } + + // Test insert(iterator it, wxUniChar ch). + { + wxString s = L"\x3042\x208\x3059"; + s.insert(s.begin() + 1, wxUniChar(0x23456)); +#if wxUSE_UNICODE_UTF16 + CPPUNIT_ASSERT_EQUAL(5, s.length()); + CPPUNIT_ASSERT_EQUAL(0xD84D, s[1].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xDC56, s[2].GetValue()); +#else + CPPUNIT_ASSERT_EQUAL(4, s.length()); + CPPUNIT_ASSERT_EQUAL(0x23456, s[1].GetValue()); +#endif + } + + // Test insert(iterator it, size_type n, wxUniChar ch). + { + wxString s = L"\x3042\x208\x3059"; + s.insert(s.begin() + 1, 2, wxUniChar(0x34567)); +#if wxUSE_UNICODE_UTF16 + CPPUNIT_ASSERT_EQUAL(7, s.length()); + CPPUNIT_ASSERT_EQUAL(0xD891, s[1].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xDD67, s[2].GetValue()); +#else + CPPUNIT_ASSERT_EQUAL(5, s.length()); + CPPUNIT_ASSERT_EQUAL(0x34567, s[1].GetValue()); +#endif + } + + // Test replace(size_t nStart, size_t nLen, size_t nCount, wxUniChar ch). + { + wxString s = L"\x3042\x208\x3059"; + s.replace(1, 2, 2, wxUniChar(0x45678)); +#if wxUSE_UNICODE_UTF16 + CPPUNIT_ASSERT_EQUAL(5, s.length()); + CPPUNIT_ASSERT_EQUAL(0xD8D5, s[1].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xDE78, s[2].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xD8D5, s[3].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xDE78, s[4].GetValue()); +#else + CPPUNIT_ASSERT_EQUAL(3, s.length()); + CPPUNIT_ASSERT_EQUAL(0x45678, s[1].GetValue()); + CPPUNIT_ASSERT_EQUAL(0x45678, s[2].GetValue()); +#endif + } + + // Test replace(iterator first, iterator last, size_type n, wxUniChar ch). + { + wxString s = L"\x3042\x208\x3059"; + s.replace(s.begin() + 1, s.end(), 2, wxUniChar(0x34567)); +#if wxUSE_UNICODE_UTF16 + CPPUNIT_ASSERT_EQUAL(5, s.length()); + CPPUNIT_ASSERT_EQUAL(0xD891, s[1].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xDD67, s[2].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xD891, s[3].GetValue()); + CPPUNIT_ASSERT_EQUAL(0xDD67, s[4].GetValue()); +#else + CPPUNIT_ASSERT_EQUAL(3, s.length()); + CPPUNIT_ASSERT_EQUAL(0x34567, s[1].GetValue()); + CPPUNIT_ASSERT_EQUAL(0x34567, s[2].GetValue()); +#endif + } + + // Test find(wxUniChar ch, size_t nStart = 0) + // and rfind(wxUniChar ch, size_t nStart = npos). + { + wxString s = L"\x308\x2063"; + s << wxUniChar(0x12345); + s << "x"; + s += wxUniChar(0x12345); + s += "y"; +#if wxUSE_UNICODE_UTF16 + CPPUNIT_ASSERT_EQUAL(8, s.length()); + CPPUNIT_ASSERT_EQUAL(2, s.find(wxUniChar(0x12345))); + CPPUNIT_ASSERT_EQUAL(5, s.find(wxUniChar(0x12345), 3)); + CPPUNIT_ASSERT_EQUAL(5, s.rfind(wxUniChar(0x12345))); + CPPUNIT_ASSERT_EQUAL(2, s.rfind(wxUniChar(0x12345), 4)); +#else + CPPUNIT_ASSERT_EQUAL(6, s.length()); + CPPUNIT_ASSERT_EQUAL(2, s.find(wxUniChar(0x12345))); + CPPUNIT_ASSERT_EQUAL(4, s.find(wxUniChar(0x12345), 3)); + CPPUNIT_ASSERT_EQUAL(4, s.rfind(wxUniChar(0x12345))); + CPPUNIT_ASSERT_EQUAL(2, s.rfind(wxUniChar(0x12345), 3)); +#endif + } + + /* Not tested here: + find_first_of, find_last_of, find_first_not_of, find_last_not_of + */ +#endif +}