ICU-3089 add generic legal/illegal pattern test; disallow unquoted specials in suffix
X-SVN-Rev: 14556
This commit is contained in:
parent
d0393ac474
commit
c01a6bdc37
@ -66,6 +66,7 @@ void NumberFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &n
|
|||||||
CASE(24,TestInt64);
|
CASE(24,TestInt64);
|
||||||
|
|
||||||
CASE(25,TestPerMill);
|
CASE(25,TestPerMill);
|
||||||
|
CASE(26,TestIllegalPatterns);
|
||||||
|
|
||||||
default: name = ""; break;
|
default: name = ""; break;
|
||||||
}
|
}
|
||||||
@ -1026,13 +1027,13 @@ void NumberFormatTest::TestPad(void) {
|
|||||||
int32_t(0), "^^^^0", status);
|
int32_t(0), "^^^^0", status);
|
||||||
expect2(new DecimalFormat("*^##.##", US, status),
|
expect2(new DecimalFormat("*^##.##", US, status),
|
||||||
-1.3, "^-1.3", status);
|
-1.3, "^-1.3", status);
|
||||||
expect2(new DecimalFormat("##0.0####E0*_ g-m/s^2", US, status),
|
expect2(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status),
|
||||||
int32_t(0), "0.0E0______ g-m/s^2", status);
|
int32_t(0), "0.0E0______ g-m/s^2", status);
|
||||||
expect(new DecimalFormat("##0.0####E0*_ g-m/s^2", US, status),
|
expect(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US, status),
|
||||||
1.0/3, "333.333E-3_ g-m/s^2", status);
|
1.0/3, "333.333E-3_ g-m/s^2", status);
|
||||||
expect2(new DecimalFormat("##0.0####*_ g-m/s^2", US, status),
|
expect2(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status),
|
||||||
int32_t(0), "0.0______ g-m/s^2", status);
|
int32_t(0), "0.0______ g-m/s^2", status);
|
||||||
expect(new DecimalFormat("##0.0####*_ g-m/s^2", US, status),
|
expect(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US, status),
|
||||||
1.0/3, "0.33333__ g-m/s^2", status);
|
1.0/3, "0.33333__ g-m/s^2", status);
|
||||||
|
|
||||||
// Test padding before a sign
|
// Test padding before a sign
|
||||||
@ -1218,16 +1219,16 @@ void NumberFormatTest::TestSurrogateSupport(void) {
|
|||||||
expect2(new DecimalFormat("##.##", custom, status),
|
expect2(new DecimalFormat("##.##", custom, status),
|
||||||
-1.3, " minus 1decimal3", status);
|
-1.3, " minus 1decimal3", status);
|
||||||
status = U_ZERO_ERROR;
|
status = U_ZERO_ERROR;
|
||||||
expect2(new DecimalFormat("##0.0####E0 g'-'m/s^2", custom, status),
|
expect2(new DecimalFormat("##0.0####E0 'g-m/s^2'", custom, status),
|
||||||
int32_t(0), "0decimal0exponent0 g-m/s^2", status);
|
int32_t(0), "0decimal0exponent0 g-m/s^2", status);
|
||||||
status = U_ZERO_ERROR;
|
status = U_ZERO_ERROR;
|
||||||
expect(new DecimalFormat("##0.0####E0 g'-'m/s^2", custom, status),
|
expect(new DecimalFormat("##0.0####E0 'g-m/s^2'", custom, status),
|
||||||
1.0/3, "333decimal333exponent minus 3 g-m/s^2", status);
|
1.0/3, "333decimal333exponent minus 3 g-m/s^2", status);
|
||||||
status = U_ZERO_ERROR;
|
status = U_ZERO_ERROR;
|
||||||
expect2(new DecimalFormat("##0.0#### g'-'m/s^2", custom, status),
|
expect2(new DecimalFormat("##0.0#### 'g-m/s^2'", custom, status),
|
||||||
int32_t(0), "0decimal0 g-m/s^2", status);
|
int32_t(0), "0decimal0 g-m/s^2", status);
|
||||||
status = U_ZERO_ERROR;
|
status = U_ZERO_ERROR;
|
||||||
expect(new DecimalFormat("##0.0#### g'-'m/s^2", custom, status),
|
expect(new DecimalFormat("##0.0#### 'g-m/s^2'", custom, status),
|
||||||
1.0/3, "0decimal33333 g-m/s^2", status);
|
1.0/3, "0decimal33333 g-m/s^2", status);
|
||||||
|
|
||||||
UnicodeString zero((UChar32)0x10000);
|
UnicodeString zero((UChar32)0x10000);
|
||||||
@ -1490,6 +1491,36 @@ void NumberFormatTest::TestPerMill() {
|
|||||||
"485.7m", fmt2.format(0.4857, str));
|
"485.7m", fmt2.format(0.4857, str));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic test for patterns that should be legal/illegal.
|
||||||
|
*/
|
||||||
|
void NumberFormatTest::TestIllegalPatterns() {
|
||||||
|
// Test cases:
|
||||||
|
// Prefix with "-:" for illegal patterns
|
||||||
|
// Prefix with "+:" for legal patterns
|
||||||
|
const char* DATA[] = {
|
||||||
|
// Unquoted special characters in the suffix are illegal
|
||||||
|
"-:000.000|###",
|
||||||
|
"+:000.000'|###'",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
for (int32_t i=0; DATA[i]; ++i) {
|
||||||
|
const char* pat=DATA[i];
|
||||||
|
UBool valid = (*pat) == '+';
|
||||||
|
pat += 2;
|
||||||
|
UErrorCode ec = U_ZERO_ERROR;
|
||||||
|
DecimalFormat fmt(pat, ec); // locale doesn't matter here
|
||||||
|
if (U_SUCCESS(ec) == valid) {
|
||||||
|
logln("Ok: pattern \"%s\": %s",
|
||||||
|
pat, u_errorName(ec));
|
||||||
|
} else {
|
||||||
|
errln("FAIL: pattern \"%s\" should have %s; got %s",
|
||||||
|
pat, (valid?"succeeded":"failed"),
|
||||||
|
u_errorName(ec));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// Support methods
|
// Support methods
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
@ -106,6 +106,8 @@ class NumberFormatTest: public CalendarTimeZoneTest {
|
|||||||
|
|
||||||
void TestPerMill(void);
|
void TestPerMill(void);
|
||||||
|
|
||||||
|
void TestIllegalPatterns(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
static UBool equalValue(const Formattable& a, const Formattable& b);
|
static UBool equalValue(const Formattable& a, const Formattable& b);
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
*
|
*
|
||||||
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/test/format/BigNumberFormatTest.java,v $
|
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/test/format/BigNumberFormatTest.java,v $
|
||||||
* $Date: 2003/06/03 18:49:29 $
|
* $Date: 2004/02/20 19:40:16 $
|
||||||
* $Revision: 1.16 $
|
* $Revision: 1.17 $
|
||||||
*
|
*
|
||||||
*****************************************************************************************
|
*****************************************************************************************
|
||||||
*/
|
*/
|
||||||
@ -264,12 +264,12 @@ public class BigNumberFormatTest extends TestFmwk {
|
|||||||
new Double(-1.3), "^-1.3",
|
new Double(-1.3), "^-1.3",
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
expect(new DecimalFormat("##0.0####E0*_ g-m/s^2", US),
|
expect(new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US),
|
||||||
new Object[] { new Long(0), "0.0E0______ g-m/s^2",
|
new Object[] { new Long(0), "0.0E0______ g-m/s^2",
|
||||||
new Double(1.0/3), "333.333E-3_ g-m/s^2",
|
new Double(1.0/3), "333.333E-3_ g-m/s^2",
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
expect(new DecimalFormat("##0.0####*_ g-m/s^2", US),
|
expect(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US),
|
||||||
new Object[] { new Long(0), "0.0______ g-m/s^2",
|
new Object[] { new Long(0), "0.0______ g-m/s^2",
|
||||||
new Double(1.0/3), "0.33333__ g-m/s^2",
|
new Double(1.0/3), "0.33333__ g-m/s^2",
|
||||||
}
|
}
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
* others. All Rights Reserved. *
|
* others. All Rights Reserved. *
|
||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/test/format/NumberFormatTest.java,v $
|
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/test/format/NumberFormatTest.java,v $
|
||||||
* $Date: 2004/02/12 01:10:19 $
|
* $Date: 2004/02/20 19:40:31 $
|
||||||
* $Revision: 1.22 $
|
* $Revision: 1.23 $
|
||||||
*
|
*
|
||||||
*****************************************************************************************
|
*****************************************************************************************
|
||||||
*/
|
*/
|
||||||
@ -336,7 +336,7 @@ public class NumberFormatTest extends com.ibm.icu.dev.test.TestFmwk {
|
|||||||
double aNumber = 0l;
|
double aNumber = 0l;
|
||||||
try {
|
try {
|
||||||
aNumber = format.parse(arg).doubleValue();
|
aNumber = format.parse(arg).doubleValue();
|
||||||
} catch (java.text.ParseException e) {
|
} catch (ParseException e) {
|
||||||
System.out.println(e);
|
System.out.println(e);
|
||||||
}
|
}
|
||||||
logln("parse(" + arg + ") = " + aNumber);
|
logln("parse(" + arg + ") = " + aNumber);
|
||||||
@ -573,16 +573,16 @@ public class NumberFormatTest extends com.ibm.icu.dev.test.TestFmwk {
|
|||||||
expect2(new DecimalFormat("*^##.##", US), 0, "^^^^0");
|
expect2(new DecimalFormat("*^##.##", US), 0, "^^^^0");
|
||||||
expect2(new DecimalFormat("*^##.##", US), -1.3, "^-1.3");
|
expect2(new DecimalFormat("*^##.##", US), -1.3, "^-1.3");
|
||||||
expect2(
|
expect2(
|
||||||
new DecimalFormat("##0.0####E0*_ g-m/s^2", US),
|
new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US),
|
||||||
0,
|
0,
|
||||||
"0.0E0______ g-m/s^2");
|
"0.0E0______ g-m/s^2");
|
||||||
expect(
|
expect(
|
||||||
new DecimalFormat("##0.0####E0*_ g-m/s^2", US),
|
new DecimalFormat("##0.0####E0*_ 'g-m/s^2'", US),
|
||||||
1.0 / 3,
|
1.0 / 3,
|
||||||
"333.333E-3_ g-m/s^2");
|
"333.333E-3_ g-m/s^2");
|
||||||
expect2(new DecimalFormat("##0.0####*_ g-m/s^2", US), 0, "0.0______ g-m/s^2");
|
expect2(new DecimalFormat("##0.0####*_ 'g-m/s^2'", US), 0, "0.0______ g-m/s^2");
|
||||||
expect(
|
expect(
|
||||||
new DecimalFormat("##0.0####*_ g-m/s^2", US),
|
new DecimalFormat("##0.0####*_ 'g-m/s^2'", US),
|
||||||
1.0 / 3,
|
1.0 / 3,
|
||||||
"0.33333__ g-m/s^2");
|
"0.33333__ g-m/s^2");
|
||||||
|
|
||||||
@ -941,6 +941,36 @@ public class NumberFormatTest extends com.ibm.icu.dev.test.TestFmwk {
|
|||||||
"485.7m", fmt2.format(0.4857));
|
"485.7m", fmt2.format(0.4857));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void TestIllegalPatterns() {
|
||||||
|
// Test cases:
|
||||||
|
// Prefix with "-:" for illegal patterns
|
||||||
|
// Prefix with "+:" for legal patterns
|
||||||
|
String DATA[] = {
|
||||||
|
// Unquoted special characters in the suffix are illegal
|
||||||
|
"-:000.000|###",
|
||||||
|
"+:000.000'|###'",
|
||||||
|
};
|
||||||
|
for (int i=0; i<DATA.length; ++i) {
|
||||||
|
String pat=DATA[i];
|
||||||
|
boolean valid = pat.charAt(0) == '+';
|
||||||
|
pat = pat.substring(2);
|
||||||
|
IllegalArgumentException e = null;
|
||||||
|
try {
|
||||||
|
// locale doesn't matter here
|
||||||
|
new DecimalFormat(pat);
|
||||||
|
} catch (IllegalArgumentException e1) {
|
||||||
|
e = e1;
|
||||||
|
}
|
||||||
|
String msg = (e==null) ? "success" : e.getMessage();
|
||||||
|
if ((e==null) == valid) {
|
||||||
|
logln("Ok: pattern \"" + pat + "\": " + msg);
|
||||||
|
} else {
|
||||||
|
errln("FAIL: pattern \"" + pat + "\" should have " +
|
||||||
|
(valid?"succeeded":"failed") + "; got " + msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
// Support methods
|
// Support methods
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
@ -984,7 +1014,7 @@ public class NumberFormatTest extends com.ibm.icu.dev.test.TestFmwk {
|
|||||||
errln("FAIL \"" + exp + "\" => " + n2 +
|
errln("FAIL \"" + exp + "\" => " + n2 +
|
||||||
" => \"" + saw2 + '"');
|
" => \"" + saw2 + '"');
|
||||||
}
|
}
|
||||||
} catch (java.text.ParseException e) {
|
} catch (ParseException e) {
|
||||||
errln(e.getMessage());
|
errln(e.getMessage());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1016,7 +1046,7 @@ public class NumberFormatTest extends com.ibm.icu.dev.test.TestFmwk {
|
|||||||
Number num = null;
|
Number num = null;
|
||||||
try {
|
try {
|
||||||
num = (Number) fmt.parse(str);
|
num = (Number) fmt.parse(str);
|
||||||
} catch (java.text.ParseException e) {
|
} catch (ParseException e) {
|
||||||
errln(e.getMessage());
|
errln(e.getMessage());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
*
|
*
|
||||||
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/text/DecimalFormat.java,v $
|
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/text/DecimalFormat.java,v $
|
||||||
* $Date: 2004/02/19 01:11:46 $
|
* $Date: 2004/02/20 19:40:16 $
|
||||||
* $Revision: 1.44 $
|
* $Revision: 1.45 $
|
||||||
*
|
*
|
||||||
*****************************************************************************************
|
*****************************************************************************************
|
||||||
*/
|
*/
|
||||||
@ -3109,6 +3109,10 @@ public class DecimalFormat extends NumberFormat {
|
|||||||
// Process the prefix / suffix characters
|
// Process the prefix / suffix characters
|
||||||
// Process unquoted characters seen in prefix or suffix
|
// Process unquoted characters seen in prefix or suffix
|
||||||
// subpart.
|
// subpart.
|
||||||
|
|
||||||
|
// Several syntax characters implicitly begins the
|
||||||
|
// next subpart if we are in the prefix; otherwise
|
||||||
|
// they are illegal if unquoted.
|
||||||
if (ch == digit ||
|
if (ch == digit ||
|
||||||
ch == groupingSeparator ||
|
ch == groupingSeparator ||
|
||||||
ch == decimalSeparator ||
|
ch == decimalSeparator ||
|
||||||
@ -3131,13 +3135,13 @@ public class DecimalFormat extends NumberFormat {
|
|||||||
if ((pos+1) < pattern.length() &&
|
if ((pos+1) < pattern.length() &&
|
||||||
pattern.charAt(pos+1) == QUOTE) {
|
pattern.charAt(pos+1) == QUOTE) {
|
||||||
++pos;
|
++pos;
|
||||||
// Fall through to append(ch)
|
affix.append(ch);
|
||||||
} else {
|
} else {
|
||||||
subpart += 2; // open quote
|
subpart += 2; // open quote
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
// Fall through to append(ch)
|
throw new IllegalArgumentException("Unquoted special character");
|
||||||
} else if (ch == CURRENCY_SIGN) {
|
} else if (ch == CURRENCY_SIGN) {
|
||||||
// Use lookahead to determine if the currency sign is
|
// Use lookahead to determine if the currency sign is
|
||||||
// doubled or not.
|
// doubled or not.
|
||||||
|
Loading…
Reference in New Issue
Block a user