X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/75ac34cefc896f5fe466661e233bf6a6f0df8e84..5208671fbbca4e47af21f72877699b0352f27e1e:/tests/strings/vsnprintf.cpp diff --git a/tests/strings/vsnprintf.cpp b/tests/strings/vsnprintf.cpp index 751f7c5b85..b37d0e50a8 100644 --- a/tests/strings/vsnprintf.cpp +++ b/tests/strings/vsnprintf.cpp @@ -34,7 +34,6 @@ // http://www.gnu.org/software/libc/manual/html_node/Formatted-Output.html - // ---------------------------------------------------------------------------- // global utilities for testing // ---------------------------------------------------------------------------- @@ -73,6 +72,12 @@ int r; CPPUNIT_ASSERT_EQUAL( r, wxStrlen(buf) ); \ ASSERT_STR_EQUAL( wxT(expected), buf ); +#define CMP3i(expected, fmt, y) \ + r=wxSnprintf(buf, MAX_TEST_LEN, wxT(fmt), y); \ + CPPUNIT_ASSERT_EQUAL( r, wxStrlen(buf) ); \ + WX_ASSERT_MESSAGE( ("Expected \"%s\", got \"%s\"", expected, buf), \ + wxStricmp(expected, buf) == 0 ); + #define CMP2(expected, fmt) \ r=wxSnprintf(buf, MAX_TEST_LEN, wxT(fmt)); \ CPPUNIT_ASSERT_EQUAL( r, wxStrlen(buf) ); \ @@ -139,10 +144,10 @@ private: #endif CPPUNIT_TEST( BigToSmallBuffer ); -#if wxUSE_WXVSNPRINTF CPPUNIT_TEST( WrongFormatStrings ); -#endif // wxUSE_WXVSNPRINTF CPPUNIT_TEST( Miscellaneous ); + CPPUNIT_TEST( GlibcMisc1 ); + CPPUNIT_TEST( GlibcMisc2 ); CPPUNIT_TEST_SUITE_END(); void C(); @@ -166,9 +171,7 @@ private: void DoBigToSmallBuffer(T *buffer, int size); void BigToSmallBuffer(); -#if wxUSE_WXVSNPRINTF void WrongFormatStrings(); -#endif // wxUSE_WXVSNPRINTF // compares the expectedString and the result of wxVsnprintf() char by char // for all its lenght (not only for first expectedLen chars) and also @@ -177,13 +180,16 @@ private: size_t max, const wxChar *format, ...); void Miscellaneous(); + void GlibcMisc1(); + void GlibcMisc2(); + DECLARE_NO_COPY_CLASS(VsnprintfTestCase) }; // register in the unnamed registry so that these tests are run by default CPPUNIT_TEST_SUITE_REGISTRATION( VsnprintfTestCase ); -// also include in it's own registry so that these tests can be run alone +// also include in its own registry so that these tests can be run alone CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( VsnprintfTestCase, "VsnprintfTestCase" ); void VsnprintfTestCase::setUp() @@ -230,24 +236,31 @@ void VsnprintfTestCase::O() void VsnprintfTestCase::P() { - // WARNING: printing of pointers is not fully standard. - // GNU prints them as %#x except for NULL pointers which are - // printed as '(nil)'. - // MSVC always print them as %8X on 32 bit systems and as %16X - // on 64 bit systems - // mingw32 uses MSVC CRT by default so uses the same rules -#if defined(__VISUALC__) || (defined(__MINGW32__) && !__USE_MINGW_ANSI_STDIO) + // The exact format used for "%p" is not specified by the standard and so + // varies among different platforms, so we need to expect different results + // here (remember that while we test our own wxPrintf() code here, it uses + // the system sprintf() for actual formatting so the results are still + // different under different systems). + +#ifdef wxUSING_VC_CRT_IO + // MSVC always prints pointers as %8X on 32 bit systems and as %16X on 64 + // bit systems. #if SIZEOF_VOID_P == 4 - CMP3("00ABCDEF", "%p", (void*)0xABCDEF); + CMP3i("00ABCDEF", "%p", (void*)0xABCDEF); CMP3("00000000", "%p", (void*)NULL); #elif SIZEOF_VOID_P == 8 - CMP3("0000ABCDEFABCDEF", "%p", (void*)0xABCDEFABCDEF); + CMP3i("0000ABCDEFABCDEF", "%p", (void*)0xABCDEFABCDEF); CMP3("0000000000000000", "%p", (void*)NULL); #endif #elif defined(__MINGW32__) + // mingw32 uses MSVC CRT in old versions but is own implementation now + // which is somewhere in the middle as it uses %8x, so to catch both cases + // we use case-insensitive comparison here. CMP3("0xabcdef", "%p", (void*)0xABCDEF); CMP3("0", "%p", (void*)NULL); #elif defined(__GNUG__) + // glibc prints pointers as %#x except for NULL pointers which are printed + // as '(nil)'. CMP3("0xabcdef", "%p", (void*)0xABCDEF); CMP3("(nil)", "%p", (void*)NULL); #endif @@ -257,7 +270,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 ); } @@ -412,19 +425,13 @@ void VsnprintfTestCase::LongLong() CMP3("123456789", "%llu", (wxULongLong_t)123456789); -#ifdef __WXMSW__ +#ifdef __WINDOWS__ CMP3("123456789", "%I64d", (wxLongLong_t)123456789); CMP3("123456789abcdef", "%I64x", wxLL(0x123456789abcdef)); #endif } #endif -// this test is only for our own implementation, the system implementation -// doesn't always give errors for invalid format strings (e.g. glibc doesn't) -// and as it's not required too (the behaviour is "undefined" according to the -// spec), there is really no sense in testing for it -#if wxUSE_WXVSNPRINTF - void VsnprintfTestCase::WrongFormatStrings() { // test how wxVsnprintf() behaves with wrong format string: @@ -442,18 +449,15 @@ void VsnprintfTestCase::WrongFormatStrings() CPPUNIT_ASSERT(r != -1); #endif - // a missing positional arg: this should result in an error but not all - // implementations detect it (e.g. glibc doesn't) - r = wxSnprintf(buf, MAX_TEST_LEN, wxT("%1$d %3$d"), 1, 2, 3); - CPPUNIT_ASSERT_EQUAL(-1, r); + // a missing positional arg should result in an assert + WX_ASSERT_FAILS_WITH_ASSERT( + wxSnprintf(buf, MAX_TEST_LEN, wxT("%1$d %3$d"), 1, 2, 3) ); // positional and non-positionals in the same format string: r = wxSnprintf(buf, MAX_TEST_LEN, wxT("%1$d %d %3$d"), 1, 2, 3); CPPUNIT_ASSERT_EQUAL(-1, r); } -#endif // wxUSE_WXVSNPRINTF - // BigToSmallBuffer() test case helper: template void VsnprintfTestCase::DoBigToSmallBuffer(T *buffer, int size) @@ -497,7 +501,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); @@ -556,10 +560,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()); @@ -599,4 +603,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); +#ifdef wxUSING_VC_CRT_IO + // 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 +