Applied patch [ 853850 ] Fixes for wxFormatConverter
(M.J.Wetherell) Added wxConvertFormat function in debug mode to allow for unit testing Added tests/formatconverter git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25116 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -752,7 +752,11 @@ wxFormatConverter::wxFormatConverter(const wxChar *format)
|
|||||||
// precision?
|
// precision?
|
||||||
if ( *format == _T('.') )
|
if ( *format == _T('.') )
|
||||||
{
|
{
|
||||||
SkipDigits(&format);
|
CopyFmtChar(*format++);
|
||||||
|
if ( *format == _T('*') )
|
||||||
|
CopyFmtChar(*format++);
|
||||||
|
else
|
||||||
|
SkipDigits(&format);
|
||||||
}
|
}
|
||||||
|
|
||||||
// next we can have a size modifier
|
// next we can have a size modifier
|
||||||
@@ -799,23 +803,14 @@ wxFormatConverter::wxFormatConverter(const wxChar *format)
|
|||||||
case _T('c'):
|
case _T('c'):
|
||||||
case _T('s'):
|
case _T('s'):
|
||||||
// %c -> %lc but %hc stays %hc and %lc is still %lc
|
// %c -> %lc but %hc stays %hc and %lc is still %lc
|
||||||
switch ( size )
|
if ( size == Default)
|
||||||
{
|
InsertFmtChar(_T('l'));
|
||||||
case Default:
|
|
||||||
InsertFmtChar(_T('l'));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Short:
|
|
||||||
CopyFmtChar(_T('h'));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Long:
|
|
||||||
;
|
|
||||||
}
|
|
||||||
// fall through
|
// fall through
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// nothing special to do
|
// nothing special to do
|
||||||
|
if ( size != Default )
|
||||||
|
CopyFmtChar(*(format - 1));
|
||||||
CopyFmtChar(*format++);
|
CopyFmtChar(*format++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -827,6 +822,14 @@ wxFormatConverter::wxFormatConverter(const wxChar *format)
|
|||||||
#define wxFormatConverter(x) (x)
|
#define wxFormatConverter(x) (x)
|
||||||
#endif // wxNEED_PRINTF_CONVERSION/!wxNEED_PRINTF_CONVERSION
|
#endif // wxNEED_PRINTF_CONVERSION/!wxNEED_PRINTF_CONVERSION
|
||||||
|
|
||||||
|
#ifdef __WXDEBUG__
|
||||||
|
// For testing the format converter
|
||||||
|
wxString wxConvertFormat(const wxChar *format)
|
||||||
|
{
|
||||||
|
return wxString(wxFormatConverter(format));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxPrintf(), wxScanf() and relatives
|
// wxPrintf(), wxScanf() and relatives
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
47
tests/formatconverter/formats.pl
Normal file
47
tests/formatconverter/formats.pl
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
#
|
||||||
|
# Prints test formats for wxFormatConverter. The output is in two columns (tab
|
||||||
|
# separated), the first is the test input and the second is the expected
|
||||||
|
# output.
|
||||||
|
#
|
||||||
|
# run the output thought formattest like this:
|
||||||
|
# ./formats.pl | ./formattest
|
||||||
|
#
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
my %transform = (
|
||||||
|
s => [ 'l', 's' ],
|
||||||
|
S => [ '', 's' ],
|
||||||
|
hS => [ '', 's' ],
|
||||||
|
lS => [ 'l', 's' ],
|
||||||
|
c => [ 'l', 'c' ],
|
||||||
|
C => [ '', 'c' ],
|
||||||
|
hC => [ '', 'c' ],
|
||||||
|
lC => [ 'l', 'c' ]
|
||||||
|
);
|
||||||
|
|
||||||
|
print "%%\t%%\n";
|
||||||
|
|
||||||
|
for my $type ('d', 's', 'S', 'c', 'C')
|
||||||
|
{
|
||||||
|
for my $mod ('', 'h', 'l', 'hh', 'll', 'j') #, 'z', 't', 'L')
|
||||||
|
{
|
||||||
|
for my $prec ('', '.*', '.10')
|
||||||
|
{
|
||||||
|
for my $width ('', '*', '10')
|
||||||
|
{
|
||||||
|
for my $flag ('', '#') #, '0', '-', ' ', '+' )
|
||||||
|
{
|
||||||
|
my ($newmod, $newtype) = ($mod, $type);
|
||||||
|
|
||||||
|
if ($transform{$mod.$type}) {
|
||||||
|
($newmod, $newtype) = @{$transform{$mod.$type}};
|
||||||
|
}
|
||||||
|
|
||||||
|
print "%$flag$width$prec$mod$type\t".
|
||||||
|
"%$flag$width$prec$newmod$newtype\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
tests/formatconverter/formats2.pl
Normal file
26
tests/formatconverter/formats2.pl
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
#
|
||||||
|
# Creates longer test formats for wxFormatConverter, containing two '%'s. The
|
||||||
|
# output is basically the cross product of the output of two './formats.pl's.
|
||||||
|
#
|
||||||
|
# ./formats2.pl | ./formattest
|
||||||
|
#
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
open IN, './formats.pl |';
|
||||||
|
|
||||||
|
while (<IN>) {
|
||||||
|
chomp;
|
||||||
|
my ($format, $expected) = split "\t";
|
||||||
|
open IN2, './formats.pl |';
|
||||||
|
|
||||||
|
while (<IN2>) {
|
||||||
|
chomp;
|
||||||
|
my ($format2, $expected2) = split "\t";
|
||||||
|
print "$format $format2\t$expected $expected2\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
close IN2;
|
||||||
|
}
|
||||||
|
|
||||||
|
close IN;
|
58
tests/formatconverter/formattest.cpp
Normal file
58
tests/formatconverter/formattest.cpp
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Tester for wxFormatConverter, by M. J. Wetherell
|
||||||
|
*
|
||||||
|
* Reads stdin, expects two column input (as produced by formats.pl or
|
||||||
|
* formats2.pl), the first column contains the test pattern, the second
|
||||||
|
* the expected result.
|
||||||
|
*
|
||||||
|
* The output is any patterns that wxFormatConveter doesn't transform to the
|
||||||
|
* expected value, in three columns: input, expected, output.
|
||||||
|
*
|
||||||
|
* ./formats.pl | ./formattest
|
||||||
|
* ./formats2.pl | ./formattest
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <wx/wx.h>
|
||||||
|
#include <wx/wfstream.h>
|
||||||
|
#include <wx/txtstrm.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
/* This function is in wxchar.cpp to give access to wxFormatConverter,
|
||||||
|
* but only in debug mode.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __WXDEBUG__
|
||||||
|
extern wxString wxConvertFormat(const wxChar *format);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class TestApp : public wxAppConsole
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int OnRun();
|
||||||
|
};
|
||||||
|
|
||||||
|
IMPLEMENT_APP_CONSOLE(TestApp)
|
||||||
|
|
||||||
|
int TestApp::OnRun()
|
||||||
|
{
|
||||||
|
#ifdef __WXDEBUG__
|
||||||
|
wxFFileInputStream in(stdin);
|
||||||
|
wxTextInputStream txt(in, _T("\t"));
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
wxString format = txt.ReadWord();
|
||||||
|
wxString expected = txt.ReadWord();
|
||||||
|
if (!in) break;
|
||||||
|
wxString converted = wxConvertFormat(format);
|
||||||
|
|
||||||
|
if (converted != expected)
|
||||||
|
std::cout << "'" << format.mb_str() << "'\t"
|
||||||
|
<< "'" << expected.mb_str() << "'\t"
|
||||||
|
<< "'" << converted.mb_str() << "'\n";
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
std::cout << "Please compile this test program in debug mode.\n";
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
8
tests/formatconverter/readme.txt
Normal file
8
tests/formatconverter/readme.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
Tests for wxFormatConverter by M. J. Wetherell
|
||||||
|
|
||||||
|
The Perl scripts generate test patterns;
|
||||||
|
formattest.cpp reads this file and checks
|
||||||
|
the converted pattern matches the expected
|
||||||
|
pattern.
|
||||||
|
|
Reference in New Issue
Block a user