blob: b1f6c9d5b9ddaa6b6ca4f1ce09f9209ecf466184 [file] [log] [blame]
/*
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 4823811 8008577
* @summary Confirm that text which includes numbers with a trailing minus sign is parsed correctly.
* @modules jdk.localedata
* @run main/othervm -Duser.timezone=GMT+09:00 -Djava.locale.providers=JRE,SPI Bug4823811
*/
import java.text.*;
import java.util.*;
public class Bug4823811 {
private static Locale localeEG = new Locale("ar", "EG");
private static Locale localeUS = Locale.US;
private static String JuneInArabic = "\u064a\u0648\u0646\u064a\u0648";
private static String JulyInArabic = "\u064a\u0648\u0644\u064a\u0648";
private static String JuneInEnglish = "June";
private static String JulyInEnglish = "July";
private static String BORDER =
"============================================================";
/*
* I don't use static import here intentionally so that this test program
* can be run on JDK 1.4.2.
*/
private static int ERA = Calendar.ERA;
private static int BC = GregorianCalendar.BC;
// private static int JAN = Calendar.JANUARY;
// private static int FEB = Calendar.FEBRUARY;
// private static int MAR = Calendar.MARCH;
private static int APR = Calendar.APRIL;
private static int MAY = Calendar.MAY;
private static int JUN = Calendar.JUNE;
private static int JUL = Calendar.JULY;
// private static int AUG = Calendar.AUGUST;
// private static int SEP = Calendar.SEPTEMBER;
// private static int OCT = Calendar.OCTOBER;
// private static int NOV = Calendar.NOVEMBER;
// private static int DEC = Calendar.DECEMBER;
private static String[] patterns = {
"yyyy MMMM d H m s",
"yyyy MM dd hh mm ss",
/*
* Because 1-based HOUR_OF_DAY, 1-based HOUR, MONTH, and YEAR fields
* are parsed using different code from the code for other numeric
* fields, I prepared YEAR-preceding patterns and SECOND-preceding
* patterns.
*/
"yyyy M d h m s",
" yyyy M d h m s",
"yyyy M d h m s ",
"s m h d M yyyy",
" s m h d M yyyy",
"s m h d M yyyy ",
};
private static char originalMinusSign1 = ':';
private static char originalMinusSign2 = '\uff0d'; // fullwidth minus
private static String[] delimiters = {"-", "/", ":", "/", "\uff0d", "/"};
private static String[][] specialDelimiters = {
// for Arabic formatter and modified English formatter
{"--", "-/", "::", ":/", "\uff0d\uff0d", "\uff0d/"},
// for English formatter and modified Arabic formatter
{"--", "/-", "::", "/:", "\uff0d\uff0d", "/\uff0d"},
};
/*
* Format:
* +-------------------------------------------------------------------+
* | Input | Output |
* +---------------------+---------------------------------------------|
* | datesEG & datesUS | formattedDatesEG & formattedDatesUS |
* +-------------------------------------------------------------------+
*
* Parse:
* +-------------------------------------------------------------------+
* | Input | Output |
* |---------------------+---------------------------------------------|
* | datesToParse | datesEG & datesUS |
* +-------------------------------------------------------------------+
*/
private static String[][] datesToParse = {
// "JUNE" and "JULY" are replaced with a localized month name later.
{"2008 JULY 20 3 12 83",
"2008 JULY 20 3 12 83",
"2008 JULY 20 3 12 83"},
{"2008 07 20 03 12 83",
"2008 07 20 03 12 83",
"2008 07 20 03 12 83"},
{"2008 7 20 3 12 83",
"2008 7 20 3 12 83",
"2008 7 20 3 12 83"},
{" 2008 7 20 3 12 83",
" 2008 7 20 3 12 83",
" 2008 7 20 3 12 83",
"2008 7 20 3 12 83"},
{"2008 7 20 3 12 83 ",
"2008 7 20 3 12 83 ",
"2008 7 20 3 12 83"},
{"83 12 3 20 7 2008",
"83 12 3 20 7 2008",
"83 12 3 20 7 2008"},
{" 83 12 3 20 7 2008",
" 83 12 3 20 7 2008",
" 83 12 3 20 7 2008",
"83 12 3 20 7 2008"},
{"83 12 3 20 7 2008 ",
"83 12 3 20 7 2008 ",
"83 12 3 20 7 2008"},
};
// For formatting
private static String[][] formattedDatesEG = {
{"2008 JULY 20 3 13 23",
"2009 JULY 20 3 13 23",
null},
{"2008 07 20 03 13 23",
"2009 07 20 03 13 23",
"2007 05 20 03 13 23"},
{"2008 7 20 3 13 23",
"2009 6 10 3 13 23",
"2007 4 10 3 13 23"},
{" 2008 7 20 3 13 23",
null,
" 2009 7 20 3 13 23",
null},
{"2008 7 20 3 13 23 ",
"2008 7 20 3 10 37 ",
null},
{"23 13 3 20 7 2008",
"37 10 9 19 7 2008",
"23 49 8 19 7 2008"},
{" 23 13 3 20 7 2008",
null,
" 37 10 3 20 7 2008",
null},
{"23 13 3 20 7 2008 ",
"23 13 3 20 7 2009 ",
null},
};
private static String[][] formattedDatesUS = {
{"2008 JULY 20 3 13 23",
null,
"2008 JUNE 10 3 13 23"},
{"2008 07 20 03 13 23",
"2007 05 20 03 13 23",
"2008 06 10 03 13 23"},
{"2008 7 20 3 13 23",
"2007 5 19 9 13 23",
"2008 6 9 9 13 23"},
{" 2008 7 20 3 13 23",
" 2009 7 20 3 13 23",
" 2007 5 20 3 13 23",
null},
{"2008 7 20 3 13 23 ",
"2008 7 20 3 13 23 ",
null},
{"23 13 3 20 7 2008",
"23 49 2 10 6 2008",
"23 13 9 9 6 2008"},
{" 23 13 3 20 7 2008",
" 37 10 3 20 7 2008",
" 23 49 2 20 7 2008",
null},
{"23 13 3 20 7 2008 ",
"23 13 3 20 7 2008 ",
null},
};
private static GregorianCalendar[][] datesEG = {
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar(-2008, JUL, 20, 3, 12, 83),
null},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar(-2008, JUL, 20, 3, 12, 83),
new GregorianCalendar( 2007, MAY, 20, 3, 12, 83)},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar(-2008, JUL, -20, 3, 12, 83),
new GregorianCalendar( 2007, APR, 10, 3, 12, 83)},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
null,
new GregorianCalendar(-2008, JUL, 20, 3, 12, 83),
null},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar( 2008, JUL, 20, 3, 12, -83),
null},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar( 2008, JUL, 20, -3, 12, -83),
new GregorianCalendar( 2008, JUL, 20, -3, -12, 83)},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
null,
new GregorianCalendar( 2008, JUL, 20, 3, 12, -83),
null},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar(-2008, JUL, 20, 3, 12, 83),
null},
};
private static GregorianCalendar[][] datesUS = {
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
null,
new GregorianCalendar( 2008, JUN, 10, 3, 12, 83)},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar( 2007, MAY, 20, 3, 12, 83),
new GregorianCalendar( 2008, JUN, 10, 3, 12, 83)},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar( 2007, MAY, 20, -3, 12, 83),
new GregorianCalendar( 2008, JUL, -20, -3, 12, 83)},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar(-2008, JUL, 20, 3, 12, 83),
new GregorianCalendar( 2007, MAY, 20, 3, 12, 83),
null},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
null},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar( 2008, JUL, -20, 3, -12, 83),
new GregorianCalendar( 2008, JUL, -20, -3, 12, 83)},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar( 2008, JUL, 20, 3, 12, -83),
new GregorianCalendar( 2008, JUL, 20, 3, -12, 83),
null},
{new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
new GregorianCalendar( 2008, JUL, 20, 3, 12, 83),
null},
};
/* flags */
private static boolean err = false;
private static boolean verbose = false;
public static void main(String[] args) {
if (args.length == 1 && args[0].equals("-v")) {
verbose = true;
}
Locale defaultLocale = Locale.getDefault();
TimeZone defaultTimeZone = TimeZone.getDefault();
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo"));
try {
/*
* Test SimpleDateFormat.parse() and format() for original
* SimpleDateFormat instances
*/
testDateFormat1();
/*
* Test SimpleDateFormat.parse() and format() for modified
* SimpleDateFormat instances using an original minus sign,
* pattern, and diffenrent month names in DecimalFormat
*/
testDateFormat2();
/*
* Test SimpleDateFormat.parse() and format() for modified
* SimpleDateFormat instances using a fullwidth minus sign
*/
testDateFormat3();
/*
* Just to confirm that regressions aren't introduced in
* DecimalFormat. This cannot happen, though. Because I didn't
* change DecimalFormat at all.
*/
testNumberFormat();
}
catch (Exception e) {
err = true;
System.err.println("Unexpected exception: " + e);
}
finally {
Locale.setDefault(defaultLocale);
TimeZone.setDefault(defaultTimeZone);
if (err) {
System.err.println(BORDER + " Test failed.");
throw new RuntimeException("Date/Number formatting/parsing error.");
} else {
System.out.println(BORDER + " Test passed.");
}
}
}
//
// DateFormat test
//
private static void testDateFormat1() {
for (int i = 0; i < patterns.length; i++) {
System.out.println(BORDER);
for (int j = 0; j <= 1; j++) {
// Generate a pattern
String pattern = patterns[i].replaceAll(" ", delimiters[j]);
System.out.println("Pattern=\"" + pattern + "\"");
System.out.println("*** DateFormat.format test in ar_EG");
testDateFormatFormattingInRTL(pattern, i, j, null, localeEG, false);
System.out.println("*** DateFormat.parse test in ar_EG");
testDateFormatParsingInRTL(pattern, i, j, null, localeEG, false);
System.out.println("*** DateFormat.format test in en_US");
testDateFormatFormattingInLTR(pattern, i, j, null, localeUS, true);
System.out.println("*** DateFormat.parse test in en_US");
testDateFormatParsingInLTR(pattern, i, j, null, localeUS, true);
}
}
}
private static void testDateFormat2() {
/*
* modified ar_EG Date&Time formatter :
* minus sign: ':'
* pattern: "#,##0.###"
* month names: In Arabic
*
* modified en_US Date&Time formatter :
* minus sign: ':'
* pattern: "#,##0.###;#,##0.###-"
* month names: In English
*/
DecimalFormat dfEG = (DecimalFormat)NumberFormat.getInstance(localeEG);
DecimalFormat dfUS = (DecimalFormat)NumberFormat.getInstance(localeUS);
DecimalFormatSymbols dfsEG = dfEG.getDecimalFormatSymbols();
DecimalFormatSymbols dfsUS = dfUS.getDecimalFormatSymbols();
dfsEG.setMinusSign(originalMinusSign1);
dfsUS.setMinusSign(originalMinusSign1);
dfEG.setDecimalFormatSymbols(dfsUS);
dfUS.setDecimalFormatSymbols(dfsEG);
String patternEG = dfEG.toPattern();
String patternUS = dfUS.toPattern();
dfEG.applyPattern(patternUS);
dfUS.applyPattern(patternEG);
for (int i = 0; i < patterns.length; i++) {
System.out.println(BORDER);
for (int j = 2; j <= 3; j++) {
// Generate a pattern
String pattern = patterns[i].replaceAll(" ", delimiters[j]);
System.out.println("Pattern=\"" + pattern + "\"");
System.out.println("*** DateFormat.format test in modified en_US");
testDateFormatFormattingInRTL(pattern, i, j, dfUS, localeUS, true);
System.out.println("*** DateFormat.parse test in modified en_US");
testDateFormatParsingInRTL(pattern, i, j, dfUS, localeUS, true);
System.out.println("*** DateFormat.format test in modified ar_EG");
testDateFormatFormattingInLTR(pattern, i, j, dfEG, localeEG, false);
System.out.println("*** DateFormat.parse test in modified ar_EG");
testDateFormatParsingInLTR(pattern, i, j, dfEG, localeEG, false);
}
}
}
private static void testDateFormat3() {
/*
* modified ar_EG Date&Time formatter :
* minus sign: '\uff0d' // fullwidth minus
* pattern: "#,##0.###;#,##0.###-"
* month names: In Arabic
*
* modified en_US Date&Time formatter :
* minus sign: '\uff0d' // fullwidth minus
* pattern: "#,##0.###"
* month names: In English
*/
DecimalFormat dfEG = (DecimalFormat)NumberFormat.getInstance(localeEG);
DecimalFormat dfUS = (DecimalFormat)NumberFormat.getInstance(localeUS);
DecimalFormatSymbols dfsEG = dfEG.getDecimalFormatSymbols();
DecimalFormatSymbols dfsUS = dfUS.getDecimalFormatSymbols();
dfsEG.setMinusSign(originalMinusSign2);
dfsUS.setMinusSign(originalMinusSign2);
dfEG.setDecimalFormatSymbols(dfsEG);
dfUS.setDecimalFormatSymbols(dfsUS);
for (int i = 0; i < patterns.length; i++) {
System.out.println(BORDER);
for (int j = 4; j <= 5; j++) {
// Generate a pattern
String pattern = patterns[i].replaceAll(" ", delimiters[j]);
System.out.println("Pattern=\"" + pattern + "\"");
System.out.println("*** DateFormat.format test in modified ar_EG");
testDateFormatFormattingInRTL(pattern, i, j, dfEG, localeEG, false);
System.out.println("*** DateFormat.parse test in modified ar_EG");
testDateFormatParsingInRTL(pattern, i, j, dfEG, localeEG, false);
System.out.println("*** DateFormat.format test in modified en_US");
testDateFormatFormattingInLTR(pattern, i, j, dfUS, localeUS, true);
System.out.println("*** DateFormat.parse test in modified en_US");
testDateFormatParsingInLTR(pattern, i, j, dfUS, localeUS, true);
}
}
}
private static void testDateFormatFormattingInRTL(String pattern,
int basePattern,
int delimiter,
NumberFormat nf,
Locale locale,
boolean useEnglishMonthName) {
Locale.setDefault(locale);
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
if (nf != null) {
sdf.setNumberFormat(nf);
}
for (int i = 0; i < datesToParse[basePattern].length; i++) {
if (datesEG[basePattern][i] == null) {
continue;
}
String expected = formattedDatesEG[basePattern][i]
.replaceAll("JUNE", (useEnglishMonthName ?
JuneInEnglish : JuneInArabic))
.replaceAll("JULY", (useEnglishMonthName ?
JulyInEnglish : JulyInArabic))
.replaceAll(" ", delimiters[delimiter]);
testDateFormatFormatting(sdf, pattern, datesEG[basePattern][i],
expected, locale.toString());
}
}
private static void testDateFormatFormattingInLTR(String pattern,
int basePattern,
int delimiter,
NumberFormat nf,
Locale locale,
boolean useEnglishMonthName) {
Locale.setDefault(locale);
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
if (nf != null) {
sdf.setNumberFormat(nf);
}
for (int i = 0; i < datesToParse[basePattern].length; i++) {
if (datesUS[basePattern][i] == null) {
continue;
}
String expected = formattedDatesUS[basePattern][i]
.replaceAll("JUNE", (useEnglishMonthName ?
JuneInEnglish : JuneInArabic))
.replaceAll("JULY", (useEnglishMonthName ?
JulyInEnglish : JulyInArabic))
.replaceAll(" ", delimiters[delimiter]);
testDateFormatFormatting(sdf, pattern, datesUS[basePattern][i],
expected, locale.toString());
}
}
private static void testDateFormatFormatting(SimpleDateFormat sdf,
String pattern,
GregorianCalendar givenGC,
String expected,
String locale) {
Date given = givenGC.getTime();
String str = sdf.format(given);
if (expected.equals(str)) {
if (verbose) {
System.out.print(" Passed: SimpleDateFormat(");
System.out.print(locale + ", \"" + pattern + "\").format(");
System.out.println(given + ")");
System.out.print(" ---> \"" + str + "\" ");
System.out.println((givenGC.get(ERA) == BC) ? "(BC)" : "(AD)");
}
} else {
err = true;
System.err.print(" Failed: Unexpected SimpleDateFormat(");
System.out.print(locale + ", \"" + pattern + "\").format(");
System.out.println(given + ") result.");
System.out.println(" Expected: \"" + expected + "\"");
System.out.print(" Got: \"" + str + "\" ");
System.out.println((givenGC.get(ERA) == BC) ? "(BC)" : "(AD)");
}
}
private static void testDateFormatParsingInRTL(String pattern,
int basePattern,
int delimiter,
NumberFormat nf,
Locale locale,
boolean useEnglishMonthName) {
Locale.setDefault(locale);
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
if (nf != null) {
sdf.setNumberFormat(nf);
}
for (int i = 0; i < datesToParse[basePattern].length; i++) {
String given = datesToParse[basePattern][i]
.replaceAll(" ", specialDelimiters[0][delimiter])
.replaceAll(" ", delimiters[delimiter]);
testDateFormatParsing(sdf, pattern,
given.replaceAll("JULY", (useEnglishMonthName ?
JulyInEnglish : JulyInArabic)),
datesEG[basePattern][i], locale.toString());
}
}
private static void testDateFormatParsingInLTR(String pattern,
int basePattern,
int delimiter,
NumberFormat nf,
Locale locale,
boolean useEnglishMonthName) {
Locale.setDefault(locale);
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
if (nf != null) {
sdf.setNumberFormat(nf);
}
for (int i = 0; i < datesToParse[basePattern].length; i++) {
String given = datesToParse[basePattern][i]
.replaceAll(" ", specialDelimiters[1][delimiter])
.replaceAll(" ", delimiters[delimiter]);
testDateFormatParsing(sdf, pattern,
given.replaceAll("JULY", (useEnglishMonthName ?
JulyInEnglish : JulyInArabic)),
datesUS[basePattern][i], locale.toString());
}
}
private static void testDateFormatParsing(SimpleDateFormat sdf,
String pattern,
String given,
GregorianCalendar expectedGC,
String locale) {
try {
Date d = sdf.parse(given);
if (expectedGC == null) {
err = true;
System.err.print(" Failed: SimpleDateFormat(" + locale);
System.err.print(", \"" + pattern + "\").parse(\"" + given);
System.err.println("\") should have thrown ParseException");
} else if (expectedGC.getTime().equals(d)) {
if (verbose) {
System.out.print(" Passed: SimpleDateFormat(" + locale);
System.out.print(", \"" + pattern + "\").parse(\"" + given);
System.out.println("\")");
System.out.print(" ---> " + d + " (" + d.getTime());
System.out.println(")");
}
} else {
err = true;
System.err.print(" Failed: SimpleDateFormat(" + locale);
System.err.print(", \"" + pattern + "\").parse(\"" + given);
System.err.println("\")");
System.err.print(" Expected: " + expectedGC.getTime());
System.err.println(" (" + d.getTime() + ")");
System.err.print(" Got: " + d + " (" + d.getTime());
System.err.println(")");
System.err.print(" Pattern: \"");
System.err.print(((DecimalFormat)sdf.getNumberFormat()).toPattern());
System.err.println("\"");
}
}
catch (ParseException pe) {
if (expectedGC == null) {
if (verbose) {
System.out.print(" Passed: SimpleDateFormat(" + locale);
System.out.print(", \"" + pattern + "\").parse(\"" + given);
System.out.println("\")");
System.out.println(" threw ParseException as expected");
}
} else {
err = true;
System.err.println(" Failed: Unexpected exception with");
System.err.print(" SimpleDateFormat(" + locale);
System.err.print(", \"" + pattern + "\").parse(\"");
System.err.println(given + "\"):");
System.err.println(" " + pe);
System.err.print(" Pattern: \"");
System.err.print(((DecimalFormat)sdf.getNumberFormat()).toPattern());
System.err.println("\"");
System.err.print(" Month 0: ");
System.err.println(sdf.getDateFormatSymbols().getMonths()[0]);
}
}
}
//
// NumberFormat test
//
private static void testNumberFormat() {
NumberFormat nfEG = NumberFormat.getInstance(localeEG);
NumberFormat nfUS = NumberFormat.getInstance(localeUS);
System.out.println("*** DecimalFormat.format test in ar_EG");
testNumberFormatFormatting(nfEG, -123456789, "123,456,789-", "ar_EG");
testNumberFormatFormatting(nfEG, -456, "456-", "ar_EG");
System.out.println("*** DecimalFormat.parse test in ar_EG");
testNumberFormatParsing(nfEG, "123-", -123L, "ar_EG");
testNumberFormatParsing(nfEG, "123--",-123L, "ar_EG");
testNumberFormatParsingCheckException(nfEG, "-123", 0, "ar_EG");
System.out.println("*** DecimalFormat.format test in en_US");
testNumberFormatFormatting(nfUS, -123456789, "-123,456,789", "en_US");
testNumberFormatFormatting(nfUS, -456, "-456", "en_US");
System.out.println("*** DecimalFormat.parse test in en_US");
testNumberFormatParsing(nfUS, "123-", 123L, "en_US");
testNumberFormatParsing(nfUS, "-123",-123L, "en_US");
testNumberFormatParsingCheckException(nfUS, "--123", 0, "en_US");
}
private static void testNumberFormatFormatting(NumberFormat nf,
int given,
String expected,
String locale) {
String str = nf.format(given);
if (expected.equals(str)) {
if (verbose) {
System.out.print(" Passed: NumberFormat(" + locale);
System.out.println(").format(" + given + ")");
System.out.println(" ---> \"" + str + "\"");
}
} else {
err = true;
System.err.print(" Failed: Unexpected NumberFormat(" + locale);
System.err.println(").format(" + given + ") result.");
System.err.println(" Expected: \"" + expected + "\"");
System.err.println(" Got: \"" + str + "\"");
}
}
private static void testNumberFormatParsing(NumberFormat nf,
String given,
Number expected,
String locale) {
try {
Number n = nf.parse(given);
if (n.equals(expected)) {
if (verbose) {
System.out.print(" Passed: NumberFormat(" + locale);
System.out.println(").parse(\"" + given + "\")");
System.out.println(" ---> " + n);
}
} else {
err = true;
System.err.print(" Failed: Unexpected NumberFormat(" + locale);
System.err.println(").parse(\"" + given + "\") result.");
System.err.println(" Expected: " + expected);
System.err.println(" Got: " + n);
}
}
catch (ParseException pe) {
err = true;
System.err.print(" Failed: Unexpected exception with NumberFormat(");
System.err.println(locale + ").parse(\"" + given + "\") :");
System.err.println(" " + pe);
}
}
private static void testNumberFormatParsingCheckException(NumberFormat nf,
String given,
int expected,
String locale) {
try {
Number n = nf.parse(given);
err = true;
System.err.print(" Failed: NumberFormat(" + locale);
System.err.println(").parse(\"" + given + "\")");
System.err.println(" should have thrown ParseException");
}
catch (ParseException pe) {
int errorOffset = pe.getErrorOffset();
if (errorOffset == expected) {
if (verbose) {
System.out.print(" Passed: NumberFormat(" + locale);
System.out.println(").parse(\"" + given + "\")");
System.out.print(" threw ParseException as expected, and its errorOffset was correct: ");
System.out.println(errorOffset);
}
} else {
err = true;
System.err.print(" Failed: NumberFormat(" + locale);
System.err.println(").parse(\"" + given + "\")");
System.err.print(" threw ParseException as expected, but its errorOffset was incorrect: ");
System.err.println(errorOffset);
}
}
}
}