From: Francesco Montorsi Date: Wed, 2 Jun 2010 14:42:26 +0000 (+0000) Subject: Move some wxPrintf() tests (taken from glibc) to VsnprintfTestCase. Other tests are... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/3634064463a7d1a54c49be03c5894db9fed02552?ds=inline Move some wxPrintf() tests (taken from glibc) to VsnprintfTestCase. Other tests are more difficult to convert in CppUnit style and not worth the effort (since now we don't use wx's own vsnprintf implementation anymore typically). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64468 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/samples/console/console.cpp b/samples/console/console.cpp index 0a7d991fe8..29bdee5627 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -119,8 +119,6 @@ #define TEST_MIME #define TEST_MODULE #define TEST_PATHLIST - #define TEST_PRINTF - #define TEST_REGEX #else // #if TEST_ALL #define TEST_DATETIME #define TEST_VOLUME @@ -128,6 +126,7 @@ #define TEST_STACKWALKER #define TEST_FTP #define TEST_SNGLINST + #define TEST_REGEX #endif // some tests are interactive, define this to run them @@ -1551,380 +1550,6 @@ static void TestRegExInteractive() #endif // TEST_REGEX -// ---------------------------------------------------------------------------- -// printf() tests -// ---------------------------------------------------------------------------- - -/* - NB: this stuff was taken from the glibc test suite and modified to build - in wxWidgets: if I read the copyright below properly, this shouldn't - be a problem - */ - -#ifdef TEST_PRINTF - -#ifdef wxTEST_PRINTF - // use our functions from wxchar.cpp - #undef wxPrintf - #undef wxSprintf - - // NB: do _not_ use WX_ATTRIBUTE_PRINTF here, we have some invalid formats - // in the tests below - int wxPrintf( const wxChar *format, ... ); - int wxSprintf( wxChar *str, const wxChar *format, ... ); -#endif - -#include "wx/longlong.h" - -#include - -static void rfg1 (void); -static void rfg2 (void); - - -static void -fmtchk (const wxChar *fmt) -{ - (void) wxPrintf(wxT("%s:\t`"), fmt); - (void) wxPrintf(fmt, 0x12); - (void) wxPrintf(wxT("'\n")); -} - -static void -fmtst1chk (const wxChar *fmt) -{ - (void) wxPrintf(wxT("%s:\t`"), fmt); - (void) wxPrintf(fmt, 4, 0x12); - (void) wxPrintf(wxT("'\n")); -} - -static void -fmtst2chk (const wxChar *fmt) -{ - (void) wxPrintf(wxT("%s:\t`"), fmt); - (void) wxPrintf(fmt, 4, 4, 0x12); - (void) wxPrintf(wxT("'\n")); -} - -/* This page is covered by the following copyright: */ - -/* (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. - */ - -/* - * Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans. - */ - -#define DEC -123 -#define INT 255 -#define UNS (~0) - -/* Formatted Output Test - * - * This exercises the output formatting code. - */ - -wxChar *PointerNull = NULL; - -static void -fp_test (void) -{ - int i, j, k, l; - wxChar buf[7]; - wxChar *prefix = buf; - wxChar tp[20]; - - wxPuts(wxT("\nFormatted output test")); - wxPrintf(wxT("prefix 6d 6o 6x 6X 6u\n")); - wxStrcpy(prefix, wxT("%")); - for (i = 0; i < 2; i++) { - for (j = 0; j < 2; j++) { - for (k = 0; k < 2; k++) { - for (l = 0; l < 2; l++) { - wxStrcpy(prefix, wxT("%")); - if (i == 0) wxStrcat(prefix, wxT("-")); - if (j == 0) wxStrcat(prefix, wxT("+")); - if (k == 0) wxStrcat(prefix, wxT("#")); - if (l == 0) wxStrcat(prefix, wxT("0")); - wxPrintf(wxT("%5s |"), prefix); - wxStrcpy(tp, prefix); - wxStrcat(tp, wxT("6d |")); - wxPrintf(tp, DEC); - wxStrcpy(tp, prefix); - wxStrcat(tp, wxT("6o |")); - wxPrintf(tp, INT); - wxStrcpy(tp, prefix); - wxStrcat(tp, wxT("6x |")); - wxPrintf(tp, INT); - wxStrcpy(tp, prefix); - wxStrcat(tp, wxT("6X |")); - wxPrintf(tp, INT); - wxStrcpy(tp, prefix); - wxStrcat(tp, wxT("6u |")); - wxPrintf(tp, UNS); - wxPrintf(wxT("\n")); - } - } - } - } - wxPrintf(wxT("%10s\n"), PointerNull); - wxPrintf(wxT("%-10s\n"), PointerNull); -} - -static void TestPrintf() -{ - static wxChar shortstr[] = wxT("Hi, Z."); - static wxChar longstr[] = wxT("Good morning, Doctor Chandra. This is Hal. \ -I am ready for my first lesson today."); - int result = 0; - wxString test_format; - - fmtchk(wxT("%.4x")); - fmtchk(wxT("%04x")); - fmtchk(wxT("%4.4x")); - fmtchk(wxT("%04.4x")); - fmtchk(wxT("%4.3x")); - fmtchk(wxT("%04.3x")); - - fmtst1chk(wxT("%.*x")); - fmtst1chk(wxT("%0*x")); - fmtst2chk(wxT("%*.*x")); - fmtst2chk(wxT("%0*.*x")); - - wxString bad_format = wxT("bad format:\t\"%b\"\n"); - wxPrintf(bad_format.c_str()); - wxPrintf(wxT("nil pointer (padded):\t\"%10p\"\n"), (void *) NULL); - - wxPrintf(wxT("decimal negative:\t\"%d\"\n"), -2345); - wxPrintf(wxT("octal negative:\t\"%o\"\n"), -2345); - wxPrintf(wxT("hex negative:\t\"%x\"\n"), -2345); - wxPrintf(wxT("long decimal number:\t\"%ld\"\n"), -123456L); - wxPrintf(wxT("long octal negative:\t\"%lo\"\n"), -2345L); - wxPrintf(wxT("long unsigned decimal number:\t\"%lu\"\n"), -123456L); - wxPrintf(wxT("zero-padded LDN:\t\"%010ld\"\n"), -123456L); - test_format = wxT("left-adjusted ZLDN:\t\"%-010ld\"\n"); - wxPrintf(test_format.c_str(), -123456); - wxPrintf(wxT("space-padded LDN:\t\"%10ld\"\n"), -123456L); - wxPrintf(wxT("left-adjusted SLDN:\t\"%-10ld\"\n"), -123456L); - - test_format = wxT("zero-padded string:\t\"%010s\"\n"); - wxPrintf(test_format.c_str(), shortstr); - test_format = wxT("left-adjusted Z string:\t\"%-010s\"\n"); - wxPrintf(test_format.c_str(), shortstr); - wxPrintf(wxT("space-padded string:\t\"%10s\"\n"), shortstr); - wxPrintf(wxT("left-adjusted S string:\t\"%-10s\"\n"), shortstr); - wxPrintf(wxT("null string:\t\"%s\"\n"), PointerNull); - wxPrintf(wxT("limited string:\t\"%.22s\"\n"), longstr); - - wxPrintf(wxT("e-style >= 1:\t\"%e\"\n"), 12.34); - wxPrintf(wxT("e-style >= .1:\t\"%e\"\n"), 0.1234); - wxPrintf(wxT("e-style < .1:\t\"%e\"\n"), 0.001234); - wxPrintf(wxT("e-style big:\t\"%.60e\"\n"), 1e20); - wxPrintf(wxT("e-style == .1:\t\"%e\"\n"), 0.1); - wxPrintf(wxT("f-style >= 1:\t\"%f\"\n"), 12.34); - wxPrintf(wxT("f-style >= .1:\t\"%f\"\n"), 0.1234); - wxPrintf(wxT("f-style < .1:\t\"%f\"\n"), 0.001234); - wxPrintf(wxT("g-style >= 1:\t\"%g\"\n"), 12.34); - wxPrintf(wxT("g-style >= .1:\t\"%g\"\n"), 0.1234); - wxPrintf(wxT("g-style < .1:\t\"%g\"\n"), 0.001234); - wxPrintf(wxT("g-style big:\t\"%.60g\"\n"), 1e20); - - wxPrintf (wxT(" %6.5f\n"), .099999999860301614); - wxPrintf (wxT(" %6.5f\n"), .1); - wxPrintf (wxT("x%5.4fx\n"), .5); - - wxPrintf (wxT("%#03x\n"), 1); - - //wxPrintf (wxT("something really insane: %.10000f\n"), 1.0); - - { - double d = FLT_MIN; - int niter = 17; - - while (niter-- != 0) - wxPrintf (wxT("%.17e\n"), d / 2); - fflush (stdout); - } - -#ifndef __WATCOMC__ - // Open Watcom cause compiler error here - // Error! E173: col(24) floating-point constant too small to represent - wxPrintf (wxT("%15.5e\n"), 4.9406564584124654e-324); -#endif - -#define FORMAT wxT("|%12.4f|%12.4e|%12.4g|\n") - wxPrintf (FORMAT, 0.0, 0.0, 0.0); - wxPrintf (FORMAT, 1.0, 1.0, 1.0); - wxPrintf (FORMAT, -1.0, -1.0, -1.0); - wxPrintf (FORMAT, 100.0, 100.0, 100.0); - wxPrintf (FORMAT, 1000.0, 1000.0, 1000.0); - wxPrintf (FORMAT, 10000.0, 10000.0, 10000.0); - wxPrintf (FORMAT, 12345.0, 12345.0, 12345.0); - wxPrintf (FORMAT, 100000.0, 100000.0, 100000.0); - wxPrintf (FORMAT, 123456.0, 123456.0, 123456.0); -#undef FORMAT - - { - wxChar buf[20]; - int rc = wxSnprintf (buf, WXSIZEOF(buf), wxT("%30s"), wxT("foo")); - - wxPrintf(wxT("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n"), - rc, WXSIZEOF(buf), buf); -#if 0 - wxChar buf2[512]; - wxPrintf ("snprintf (\"%%.999999u\", 10)\n", - wxSnprintf(buf2, WXSIZEOFbuf2), "%.999999u", 10)); -#endif - } - - fp_test (); - - wxPrintf (wxT("%e should be 1.234568e+06\n"), 1234567.8); - wxPrintf (wxT("%f should be 1234567.800000\n"), 1234567.8); - wxPrintf (wxT("%g should be 1.23457e+06\n"), 1234567.8); - wxPrintf (wxT("%g should be 123.456\n"), 123.456); - wxPrintf (wxT("%g should be 1e+06\n"), 1000000.0); - wxPrintf (wxT("%g should be 10\n"), 10.0); - wxPrintf (wxT("%g should be 0.02\n"), 0.02); - - { - double x=1.0; - wxPrintf(wxT("%.17f\n"),(1.0/x/10.0+1.0)*x-x); - } - - { - wxChar buf[200]; - - wxSprintf(buf,wxT("%*s%*s%*s"),-1,wxT("one"),-20,wxT("two"),-30,wxT("three")); - - result |= wxStrcmp (buf, - wxT("onetwo three ")); - - wxPuts (result != 0 ? wxT("Test failed!") : wxT("Test ok.")); - } - -#ifdef wxLongLong_t - { - wxChar buf[200]; - - wxSprintf(buf, "%07" wxLongLongFmtSpec "o", wxLL(040000000000)); - #if 0 - // for some reason below line fails under Borland - wxPrintf (wxT("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf); - #endif - - if (wxStrcmp (buf, wxT("40000000000")) != 0) - { - result = 1; - wxPuts (wxT("\tFAILED")); - } - wxUnusedVar(result); - wxPuts (wxEmptyString); - } -#endif // wxLongLong_t - - wxPrintf (wxT("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX + 2, UCHAR_MAX + 2); - wxPrintf (wxT("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX + 2, USHRT_MAX + 2); - - wxPuts (wxT("--- Should be no further output. ---")); - rfg1 (); - rfg2 (); - -#if 0 - { - wxChar bytes[7]; - wxChar buf[20]; - - memset (bytes, '\xff', sizeof bytes); - wxSprintf (buf, wxT("foo%hhn\n"), &bytes[3]); - if (bytes[0] != '\xff' || bytes[1] != '\xff' || bytes[2] != '\xff' - || bytes[4] != '\xff' || bytes[5] != '\xff' || bytes[6] != '\xff') - { - wxPuts (wxT("%hhn overwrite more bytes")); - result = 1; - } - if (bytes[3] != 3) - { - wxPuts (wxT("%hhn wrote incorrect value")); - result = 1; - } - } -#endif -} - -static void -rfg1 (void) -{ - wxChar buf[100]; - - wxSprintf (buf, wxT("%5.s"), wxT("xyz")); - if (wxStrcmp (buf, wxT(" ")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT(" ")); - wxSprintf (buf, wxT("%5.f"), 33.3); - if (wxStrcmp (buf, wxT(" 33")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT(" 33")); - wxSprintf (buf, wxT("%8.e"), 33.3e7); - if (wxStrcmp (buf, wxT(" 3e+08")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT(" 3e+08")); - wxSprintf (buf, wxT("%8.E"), 33.3e7); - if (wxStrcmp (buf, wxT(" 3E+08")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT(" 3E+08")); - wxSprintf (buf, wxT("%.g"), 33.3); - if (wxStrcmp (buf, wxT("3e+01")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT("3e+01")); - wxSprintf (buf, wxT("%.G"), 33.3); - if (wxStrcmp (buf, wxT("3E+01")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT("3E+01")); -} - -static void -rfg2 (void) -{ - int prec; - wxChar buf[100]; - wxString test_format; - - prec = 0; - wxSprintf (buf, wxT("%.*g"), prec, 3.3); - if (wxStrcmp (buf, wxT("3")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT("3")); - prec = 0; - wxSprintf (buf, wxT("%.*G"), prec, 3.3); - if (wxStrcmp (buf, wxT("3")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT("3")); - prec = 0; - wxSprintf (buf, wxT("%7.*G"), prec, 3.33); - if (wxStrcmp (buf, wxT(" 3")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT(" 3")); - prec = 3; - test_format = wxT("%04.*o"); - wxSprintf (buf, test_format.c_str(), prec, 33); - if (wxStrcmp (buf, wxT(" 041")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT(" 041")); - prec = 7; - test_format = wxT("%09.*u"); - wxSprintf (buf, test_format.c_str(), prec, 33); - if (wxStrcmp (buf, wxT(" 0000033")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT(" 0000033")); - prec = 3; - test_format = wxT("%04.*x"); - wxSprintf (buf, test_format.c_str(), prec, 33); - if (wxStrcmp (buf, wxT(" 021")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT(" 021")); - prec = 3; - test_format = wxT("%04.*X"); - wxSprintf (buf, test_format.c_str(), prec, 33); - if (wxStrcmp (buf, wxT(" 021")) != 0) - wxPrintf (wxT("got: '%s', expected: '%s'\n"), buf, wxT(" 021")); -} - -#endif // TEST_PRINTF - // ---------------------------------------------------------------------------- // FTP // ---------------------------------------------------------------------------- diff --git a/tests/strings/vsnprintf.cpp b/tests/strings/vsnprintf.cpp index c34f8fa061..142884e66f 100644 --- a/tests/strings/vsnprintf.cpp +++ b/tests/strings/vsnprintf.cpp @@ -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) }; @@ -599,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 +