X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/16f7158098c4dac76529b4772aaa600617936537..bbd55ff9564dcaf1a5d2ee93d789c4d656baabef:/tests/strings/vsnprintf.cpp diff --git a/tests/strings/vsnprintf.cpp b/tests/strings/vsnprintf.cpp index 5f9a60796c..142884e66f 100644 --- a/tests/strings/vsnprintf.cpp +++ b/tests/strings/vsnprintf.cpp @@ -55,27 +55,27 @@ int r; #define CMP6(expected, fmt, y, z, w, t) \ r=wxSnprintf(buf, MAX_TEST_LEN, wxT(fmt), y, z, w, t); \ - CPPUNIT_ASSERT( r == (int)wxStrlen(buf) ); \ + CPPUNIT_ASSERT_EQUAL( r, wxStrlen(buf) ); \ ASSERT_STR_EQUAL( wxT(expected), buf ); #define CMP5(expected, fmt, y, z, w) \ r=wxSnprintf(buf, MAX_TEST_LEN, wxT(fmt), y, z, w); \ - CPPUNIT_ASSERT( r == (int)wxStrlen(buf) ); \ + CPPUNIT_ASSERT_EQUAL( r, wxStrlen(buf) ); \ ASSERT_STR_EQUAL( wxT(expected), buf ); #define CMP4(expected, fmt, y, z) \ r=wxSnprintf(buf, MAX_TEST_LEN, wxT(fmt), y, z); \ - CPPUNIT_ASSERT( r == (int)wxStrlen(buf) ); \ + CPPUNIT_ASSERT_EQUAL( r, wxStrlen(buf) ); \ ASSERT_STR_EQUAL( wxT(expected), buf ); #define CMP3(expected, fmt, y) \ r=wxSnprintf(buf, MAX_TEST_LEN, wxT(fmt), y); \ - CPPUNIT_ASSERT( r == (int)wxStrlen(buf) ); \ + CPPUNIT_ASSERT_EQUAL( r, wxStrlen(buf) ); \ ASSERT_STR_EQUAL( wxT(expected), buf ); #define CMP2(expected, fmt) \ r=wxSnprintf(buf, MAX_TEST_LEN, wxT(fmt)); \ - CPPUNIT_ASSERT( r == (int)wxStrlen(buf) ); \ + CPPUNIT_ASSERT_EQUAL( r, wxStrlen(buf) ); \ ASSERT_STR_EQUAL( wxT(expected), buf ); // NOTE: this macro is used also with too-small buffers (see Miscellaneous()) @@ -143,6 +143,8 @@ private: CPPUNIT_TEST( WrongFormatStrings ); #endif // wxUSE_WXVSNPRINTF CPPUNIT_TEST( Miscellaneous ); + CPPUNIT_TEST( GlibcMisc1 ); + CPPUNIT_TEST( GlibcMisc2 ); CPPUNIT_TEST_SUITE_END(); void C(); @@ -177,6 +179,9 @@ private: size_t max, const wxChar *format, ...); void Miscellaneous(); + void GlibcMisc1(); + void GlibcMisc2(); + DECLARE_NO_COPY_CLASS(VsnprintfTestCase) }; @@ -235,7 +240,8 @@ void VsnprintfTestCase::P() // printed as '(nil)'. // MSVC always print them as %8X on 32 bit systems and as %16X // on 64 bit systems -#ifdef __VISUALC__ + // mingw32 uses MSVC CRT by default so uses the same rules +#if defined(__VISUALC__) || (defined(__MINGW32__) && !__USE_MINGW_ANSI_STDIO) #if SIZEOF_VOID_P == 4 CMP3("00ABCDEF", "%p", (void*)0xABCDEF); CMP3("00000000", "%p", (void*)NULL); @@ -243,6 +249,9 @@ void VsnprintfTestCase::P() CMP3("0000ABCDEFABCDEF", "%p", (void*)0xABCDEFABCDEF); CMP3("0000000000000000", "%p", (void*)NULL); #endif +#elif defined(__MINGW32__) + CMP3("0xabcdef", "%p", (void*)0xABCDEF); + CMP3("0", "%p", (void*)NULL); #elif defined(__GNUG__) CMP3("0xabcdef", "%p", (void*)0xABCDEF); CMP3("(nil)", "%p", (void*)NULL); @@ -253,7 +262,7 @@ void VsnprintfTestCase::N() { int nchar; - wxSnprintf(buf, MAX_TEST_LEN, _T("%d %s%n\n"), 3, _T("bears"), &nchar); + wxSnprintf(buf, MAX_TEST_LEN, wxT("%d %s%n\n"), 3, wxT("bears"), &nchar); CPPUNIT_ASSERT_EQUAL( 7, nchar ); } @@ -344,21 +353,27 @@ void VsnprintfTestCase::S() #define ABCDEFGHI "\xCE\xB1\xCE\xB2\xCE\xB3\xCE\xB4\xCE\xB5\xCE\xB6\xCE\xB7\xCE\xB8\xCE\xB9" // alpha+beta+gamma+delta+epsilon+zeta+eta+theta+iota -#define ALPHA_w wxT(ALPHA) -#define ABC_w wxT(ABC) -#define ABCDE_w wxT(ABCDE) -#define ABCDEFGHI_w wxT(ABCDEFGHI) - - // CMP3 uses wxT() on the first argument so we need to be careful - // when using string concatenation that all parts of the string after - // the first explicitely use wxT(): - CMP3(" " ABC_w, "%5s", ABC); - CMP3(" " ALPHA_w, "%5s", ALPHA); - CMP3(ABCDEFGHI, "%5s", ABCDEFGHI); - CMP3(ABC L" ", "%-5s", ABC); - CMP3(ABCDEFGHI, "%-5s", ABCDEFGHI); - CMP3(ABCDE, "%.5s", ABCDEFGHI); -#endif + // the 'expected' and 'arg' parameters of this macro are supposed to be + // UTF-8 strings +#define CMP3_UTF8(expected, fmt, arg) \ + CPPUNIT_ASSERT_EQUAL \ + ( \ + wxString::FromUTF8(expected).length(), \ + wxSnprintf(buf, MAX_TEST_LEN, fmt, wxString::FromUTF8(arg)) \ + ); \ + CPPUNIT_ASSERT_EQUAL \ + ( \ + wxString::FromUTF8(expected), \ + buf \ + ) + + CMP3_UTF8(" " ABC, "%5s", ABC); + CMP3_UTF8(" " ALPHA, "%5s", ALPHA); + CMP3_UTF8(ABCDEFGHI, "%5s", ABCDEFGHI); + CMP3_UTF8(ABC " ", "%-5s", ABC); + CMP3_UTF8(ABCDEFGHI, "%-5s", ABCDEFGHI); + CMP3_UTF8(ABCDE, "%.5s", ABCDEFGHI); +#endif // wxUSE_UNICODE // test a string which has a NULL character after "ab"; // obviously it should be handled exactly like just as "ab" @@ -487,7 +502,7 @@ void VsnprintfTestCase::DoBigToSmallBuffer(T *buffer, int size) // format and gcc would warn about this otherwise r = wxUnsafeSnprintf(buffer, size, - _T("unicode string/char: %ls/%lc -- ansi string/char: %hs/%hc"), + wxT("unicode string/char: %ls/%lc -- ansi string/char: %hs/%hc"), L"unicode", L'U', "ansi", 'A'); wxString expected = wxString(wxT("unicode string/char: unicode/U -- ansi string/char: ansi/A")).Left(size - 1); @@ -546,10 +561,10 @@ void VsnprintfTestCase::DoMisc( // Prepare messages so that it is possible to see from the error which // test was running. wxString errStr, overflowStr; - errStr << _T("No.: ") << ++count << _T(", expected: ") << expectedLen - << _T(" '") << expectedString << _T("', result: "); - overflowStr << errStr << _T("buffer overflow"); - errStr << n << _T(" '") << buf << _T("'"); + errStr << wxT("No.: ") << ++count << wxT(", expected: ") << expectedLen + << wxT(" '") << expectedString << wxT("', result: "); + overflowStr << errStr << wxT("buffer overflow"); + errStr << n << wxT(" '") << buf << wxT("'"); // turn them into std::strings std::string errMsg(errStr.mb_str()); @@ -589,4 +604,59 @@ void VsnprintfTestCase::Miscellaneous() DoMisc(6, wxT("%%%%12"), 7, wxT("%%%%%%%%%d"), 12); } + +/* (C) Copyright C E Chew +* +* Feel free to copy, use and distribute this software provided: +* +* 1. you do not pretend that you wrote it +* 2. you leave this copyright notice intact. +*/ + +void VsnprintfTestCase::GlibcMisc1() +{ + CMP3(" ", "%5.s", "xyz"); + CMP3(" 33", "%5.f", 33.3); +#if defined(__VISUALC__) + // see the previous notes about the minimum width of mantissa: + CMP3(" 3e+008", "%8.e", 33.3e7); + CMP3(" 3E+008", "%8.E", 33.3e7); + CMP3("3e+001", "%.g", 33.3); + CMP3("3E+001", "%.G", 33.3); +#else + CMP3(" 3e+08", "%8.e", 33.3e7); + CMP3(" 3E+08", "%8.E", 33.3e7); + CMP3("3e+01", "%.g", 33.3); + CMP3("3E+01", "%.G", 33.3); +#endif +} + +void VsnprintfTestCase::GlibcMisc2() +{ + int prec; + wxString test_format; + + prec = 0; + CMP4("3", "%.*g", prec, 3.3); + + prec = 0; + CMP4("3", "%.*G", prec, 3.3); + + prec = 0; + CMP4(" 3", "%7.*G", prec, 3.33); + + prec = 3; + CMP4(" 041", "%04.*o", prec, 33); + + prec = 7; + CMP4(" 0000033", "%09.*u", prec, 33); + + prec = 3; + CMP4(" 021", "%04.*x", prec, 33); + + prec = 3; + CMP4(" 021", "%04.*X", prec, 33); +} + #endif // wxUSE_WXVSNPRINTF +