Add a test case for constructing wxString with supplementary wxUniChar values

See #11827
This commit is contained in:
ARATA Mizuki
2017-04-21 04:23:52 +09:00
parent 8a29c5c09f
commit ad47857072

View File

@@ -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
}