X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5975f1982da76bfb39254971aee6d1b0d80f8fb3..f2ea42557b8570b18082542f043c26b9ba346d21:/tests/strings/unicode.cpp diff --git a/tests/strings/unicode.cpp b/tests/strings/unicode.cpp index 6e74b1e3fe..7a0303bd89 100644 --- a/tests/strings/unicode.cpp +++ b/tests/strings/unicode.cpp @@ -53,20 +53,24 @@ private: CPPUNIT_TEST( ToFromAscii ); #if wxUSE_WCHAR_T CPPUNIT_TEST( ConstructorsWithConversion ); + CPPUNIT_TEST( ConversionEmpty ); CPPUNIT_TEST( ConversionWithNULs ); CPPUNIT_TEST( ConversionUTF7 ); CPPUNIT_TEST( ConversionUTF8 ); CPPUNIT_TEST( ConversionUTF16 ); + CPPUNIT_TEST( ConversionUTF32 ); #endif // wxUSE_WCHAR_T CPPUNIT_TEST_SUITE_END(); void ToFromAscii(); #if wxUSE_WCHAR_T void ConstructorsWithConversion(); + void ConversionEmpty(); void ConversionWithNULs(); void ConversionUTF7(); void ConversionUTF8(); void ConversionUTF16(); + void ConversionUTF32(); // test if converting s using the given encoding gives ws and vice versa // @@ -83,7 +87,7 @@ private: CPPUNIT_TEST_SUITE_REGISTRATION( UnicodeTestCase ); // also include in it's own registry so that these tests can be run alone -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( UnicodeTestCase, "UnicodeTestCase" ); +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( UnicodeTestCase, "Unicode" ); UnicodeTestCase::UnicodeTestCase() { @@ -137,34 +141,47 @@ void UnicodeTestCase::ConstructorsWithConversion() #endif } +void UnicodeTestCase::ConversionEmpty() +{ + size_t len; + +#if wxUSE_UNICODE + wxCharBuffer buf = wxConvLibc.cWC2MB(L"", 0, &len); +#else // !wxUSE_UNICODE + wxWCharBuffer wbuf = wxConvLibc.cMB2WC("", 0, &len); +#endif // wxUSE_UNICODE/!wxUSE_UNICODE + + CPPUNIT_ASSERT(len == 0); +} + void UnicodeTestCase::ConversionWithNULs() { #if wxUSE_UNICODE - static const size_t lenNulString = 10; + static const size_t lenNulString = 10; - wxString szTheString(L"The\0String", wxConvLibc, lenNulString); - wxCharBuffer theBuffer = szTheString.mb_str(); + wxString szTheString(L"The\0String", wxConvLibc, lenNulString); + wxCharBuffer theBuffer = szTheString.mb_str(); - CPPUNIT_ASSERT( memcmp(theBuffer.data(), "The\0String", - lenNulString + 1) == 0 ); + CPPUNIT_ASSERT( memcmp(theBuffer.data(), "The\0String", + lenNulString + 1) == 0 ); - wxString szTheString2("The\0String", wxConvLocal, lenNulString); - CPPUNIT_ASSERT_EQUAL( lenNulString, szTheString2.length() ); - CPPUNIT_ASSERT( wxTmemcmp(szTheString2.c_str(), L"The\0String", - lenNulString + 1) == 0 ); -#else - wxString szTheString(wxT("TheString")); - szTheString.insert(3, 1, '\0'); - wxWCharBuffer theBuffer = szTheString.wc_str(wxConvLibc); + wxString szTheString2("The\0String", wxConvLocal, lenNulString); + CPPUNIT_ASSERT_EQUAL( lenNulString, szTheString2.length() ); + CPPUNIT_ASSERT( wxTmemcmp(szTheString2.c_str(), L"The\0String", + lenNulString + 1) == 0 ); +#else // !wxUSE_UNICODE + wxString szTheString(wxT("TheString")); + szTheString.insert(3, 1, '\0'); + wxWCharBuffer theBuffer = szTheString.wc_str(wxConvLibc); - CPPUNIT_ASSERT( memcmp(theBuffer.data(), L"The\0String", 11 * sizeof(wchar_t)) == 0 ); + CPPUNIT_ASSERT( memcmp(theBuffer.data(), L"The\0String", 11 * sizeof(wchar_t)) == 0 ); - wxString szLocalTheString(wxT("TheString")); - szLocalTheString.insert(3, 1, '\0'); - wxWCharBuffer theLocalBuffer = szLocalTheString.wc_str(wxConvLocal); + wxString szLocalTheString(wxT("TheString")); + szLocalTheString.insert(3, 1, '\0'); + wxWCharBuffer theLocalBuffer = szLocalTheString.wc_str(wxConvLocal); - CPPUNIT_ASSERT( memcmp(theLocalBuffer.data(), L"The\0String", 11 * sizeof(wchar_t)) == 0 ); -#endif + CPPUNIT_ASSERT( memcmp(theLocalBuffer.data(), L"The\0String", 11 * sizeof(wchar_t)) == 0 ); +#endif // wxUSE_UNICODE/!wxUSE_UNICODE } void @@ -175,19 +192,24 @@ UnicodeTestCase::DoTestConversion(const char *s, #if wxUSE_UNICODE if ( ws ) { - wxCharBuffer buf(wxString(ws).mb_str(conv)); + wxCharBuffer buf = conv.cWC2MB(ws, (size_t)-1, NULL); CPPUNIT_ASSERT( strcmp(buf, s) == 0 ); } #else // wxUSE_UNICODE if ( s ) { - wxWCharBuffer wbuf(wxString(s).wc_str(conv)); + wxWCharBuffer wbuf = conv.cMB2WC(s, (size_t)-1, NULL); if ( ws ) + { + CPPUNIT_ASSERT( wbuf.data() ); CPPUNIT_ASSERT( wx_wcscmp(wbuf, ws) == 0 ); - else - CPPUNIT_ASSERT_EQUAL( L'\0', *wbuf ); + } + else // conversion is supposed to fail + { + CPPUNIT_ASSERT_EQUAL( (wchar_t *)NULL, wbuf.data() ); + } } #endif // wxUSE_UNICODE/!wxUSE_UNICODE } @@ -248,10 +270,11 @@ void UnicodeTestCase::ConversionUTF16() static const StringConversionData utf16data[] = { #ifdef wxHAVE_U_ESCAPE - { "\x04\x1f\x04\x40\x04\x38\x04\x32\x04\x35\x04\x42", + { "\x04\x1f\x04\x40\x04\x38\x04\x32\x04\x35\x04\x42\0\0", L"\u041f\u0440\u0438\u0432\u0435\u0442" }, + { "\x01\0\0b\x01\0\0a\x01\0\0r\0\0", L"\u0100b\u0100a\u0100r" }, #endif - { "\0f\0o\0o", L"foo" }, + { "\0f\0o\0o\0\0", L"foo" }, }; wxCSConv conv(wxFONTENCODING_UTF16BE); @@ -260,6 +283,38 @@ void UnicodeTestCase::ConversionUTF16() const StringConversionData& d = utf16data[n]; DoTestConversion(d.str, d.wcs, conv); } + + // special case: this string has consecutive NULs inside it which don't + // terminate the string, this exposed a bug in our conversion code which + // got confused in this case + size_t len; + wxWCharBuffer wbuf(conv.cMB2WC("\x01\0\0B\0C" /* A macron BC */, 6, &len)); + CPPUNIT_ASSERT_EQUAL( (size_t)3, len ); +} + +void UnicodeTestCase::ConversionUTF32() +{ + static const StringConversionData utf32data[] = + { +#ifdef wxHAVE_U_ESCAPE + { + "\0\0\x04\x1f\0\0\x04\x40\0\0\x04\x38\0\0\x04\x32\0\0\x04\x35\0\0\x04\x42\0\0\0\0", + L"\u041f\u0440\u0438\u0432\u0435\u0442" }, +#endif + { "\0\0\0f\0\0\0o\0\0\0o\0\0\0\0", L"foo" }, + }; + + wxCSConv conv(wxFONTENCODING_UTF32BE); + for ( size_t n = 0; n < WXSIZEOF(utf32data); n++ ) + { + const StringConversionData& d = utf32data[n]; + DoTestConversion(d.str, d.wcs, conv); + } + + size_t len; + wxWCharBuffer wbuf(conv.cMB2WC("\0\0\x01\0\0\0\0B\0\0\0C" /* A macron BC */, + 12, &len)); + CPPUNIT_ASSERT_EQUAL( (size_t)3, len ); } #endif // wxUSE_WCHAR_T