17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2008-2012, International Business Machines Corporation and * 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved. * 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.localespi; 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.math.BigDecimal; 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.math.BigInteger; 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.NumberFormat; 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParseException; 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale; 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk; 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale; 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class NumberFormatTest extends TestFmwk { 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static void main(String[] args) throws Exception { 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new NumberFormatTest().run(args); 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final int DEFAULT_TYPE = 0; 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final int NUMBER_TYPE = 1; 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final int INTEGER_TYPE = 2; 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final int PERCENT_TYPE = 3; 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final int CURRENCY_TYPE = 4; 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Check if getInstance returns the ICU implementation. 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestGetInstance() { 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (Locale loc : NumberFormat.getAvailableLocales()) { 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (TestUtil.isProblematicIBMLocale(loc)) { 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Skipped " + loc); 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkGetInstance(DEFAULT_TYPE, loc); 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkGetInstance(NUMBER_TYPE, loc); 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkGetInstance(INTEGER_TYPE, loc); 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkGetInstance(PERCENT_TYPE, loc); 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert checkGetInstance(CURRENCY_TYPE, loc); 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private void checkGetInstance(int type, Locale loc) { 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf; 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] method = new String[1]; 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf = getJDKInstance(type, loc, method); 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean isIcuImpl = (nf instanceof com.ibm.icu.impl.jdkadapter.DecimalFormatICU) 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert || (nf instanceof com.ibm.icu.impl.jdkadapter.NumberFormatICU); 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (TestUtil.isICUExtendedLocale(loc)) { 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!isIcuImpl) { 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + method[0] + " returned JDK NumberFormat for locale " + loc); 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (isIcuImpl) { 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("INFO: " + method[0] + " returned ICU NumberFormat for locale " + loc); 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale iculoc = TestUtil.toICUExtendedLocale(loc); 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nfIcu = null; 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nfIcu = getJDKInstance(type, iculoc, null); 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (isIcuImpl) { 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!nf.equals(nfIcu)) { 667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + method[0] + " returned ICU NumberFormat for locale " + loc 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ", but different from the one for locale " + iculoc); 687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!(nfIcu instanceof com.ibm.icu.impl.jdkadapter.DecimalFormatICU) 717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert && !(nfIcu instanceof com.ibm.icu.impl.jdkadapter.NumberFormatICU)) { 727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: " + method[0] + " returned JDK NumberFormat for locale " + iculoc); 737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private NumberFormat getJDKInstance(int type, Locale loc, String[] methodName) { 797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = null; 807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String method = null; 817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert switch (type) { 837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case DEFAULT_TYPE: 847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf = NumberFormat.getInstance(loc); 857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert method = "getInstance"; 867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case NUMBER_TYPE: 887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf = NumberFormat.getNumberInstance(loc); 897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert method = "getNumberInstance"; 907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case INTEGER_TYPE: 927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf = NumberFormat.getIntegerInstance(loc); 937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert method = "getIntegerInstance"; 947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case PERCENT_TYPE: 967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf = NumberFormat.getPercentInstance(loc); 977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert method = "getPercentInstance"; 987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case CURRENCY_TYPE: 1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert nf = NumberFormat.getCurrencyInstance(loc); 1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert method = "getCurrencyInstance"; 1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (methodName != null) { 1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert methodName[0] = method; 1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return nf; 1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private com.ibm.icu.text.NumberFormat getICUInstance(int type, Locale loc, String[] methodName) { 1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert com.ibm.icu.text.NumberFormat icunf = null; 1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String method = null; 1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert switch (type) { 1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case DEFAULT_TYPE: 1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert icunf = com.ibm.icu.text.NumberFormat.getInstance(loc); 1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert method = "getInstance"; 1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case NUMBER_TYPE: 1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert icunf = com.ibm.icu.text.NumberFormat.getNumberInstance(loc); 1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert method = "getNumberInstance"; 1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case INTEGER_TYPE: 1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert icunf = com.ibm.icu.text.NumberFormat.getIntegerInstance(loc); 1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert method = "getIntegerInstance"; 1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case PERCENT_TYPE: 1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert icunf = com.ibm.icu.text.NumberFormat.getPercentInstance(loc); 1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert method = "getPercentInstance"; 1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert case CURRENCY_TYPE: 1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert icunf = com.ibm.icu.text.NumberFormat.getCurrencyInstance(loc); 1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert method = "getCurrencyInstance"; 1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (methodName != null) { 1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert methodName[0] = method; 1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return icunf; 1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Testing the behavior of number format between ICU instance and its 1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * equivalent created via the Locale SPI framework. 1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestICUEquivalent() { 1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale[] TEST_LOCALES = { 1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Locale("en", "US"), 1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Locale("de", "DE"), 1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new Locale("zh"), 1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long[] TEST_LONGS = { 1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 40L, 1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert -1578L, 1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 112233445566778899L, 1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert double[] TEST_DOUBLES = { 1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 0.0451D, 1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert -1.679D, 1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 124578.369D, 1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Object[] TEST_NUMBERS = { 1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Byte.valueOf((byte)13), 1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Integer.valueOf(3961), 1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Long.valueOf(-3451237890000L), 1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Float.valueOf(1.754F), 1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Double.valueOf(-129.942362353D), 1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new BigInteger("-15253545556575859505"), 1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new BigDecimal("3.14159265358979323846264338"), 1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] methodName = new String[1]; 1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (Locale loc : TEST_LOCALES) { 1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int type = 0; type <= 4; type++) { 1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale iculoc = TestUtil.toICUExtendedLocale(loc); 1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat nf = getJDKInstance(type, iculoc, methodName); 1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert com.ibm.icu.text.NumberFormat icunf = getICUInstance(type, loc, null); 1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s1, s2; 1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Number n1, n2; 1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean pe1, pe2; 1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (long l : TEST_LONGS) { 1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s1 = nf.format(l); 1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s2 = icunf.format(l); 1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s1.equals(s2)) { 1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Different results for formatting long " + l + " by NumberFormat(" 1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + methodName[0] + ") in locale " + loc + " - JDK:" + s1 + " ICU:" + s2); 1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pe1 = false; 1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n1 = n2 = null; 1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n1 = nf.parse(s1); 1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pe1 = true; 2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pe2 = false; 2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n2 = icunf.parse(s2); 2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pe2 = true; 2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((pe1 && !pe2) || (!pe1 && pe2)) { 2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: ParseException thrown by " + (pe1 ? "JDK" : "ICU") 2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + " NumberFormat(" + methodName[0] + ") for parsing long" + l 2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + " in locale " + loc); 2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (!pe1 && !pe2 && !n1.equals(n2)) { 2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Different results for parsing long " + l + " by NumberFormat(" 2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + methodName[0] + ") in locale " + loc + " - JDK:" + n1 + " ICU:" + n2); 2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (pe1 && pe2) { 2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("INFO: ParseException thrown by both JDK and ICU NumberFormat(" 2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + methodName[0] + ") for parsing long " + l + " in locale " + loc); 2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (double d : TEST_DOUBLES) { 2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s1 = nf.format(d); 2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s2 = icunf.format(d); 2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s1.equals(s2)) { 2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Different results for formatting double " + d + " by NumberFormat(" 2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + methodName[0] + ") in locale " + loc + " - JDK:" + s1 + " ICU:" + s2); 2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pe1 = false; 2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n1 = n2 = null; 2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n1 = nf.parse(s1); 2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pe1 = true; 2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pe2 = false; 2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n2 = icunf.parse(s2); 2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pe2 = true; 2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((pe1 && !pe2) || (!pe1 && pe2)) { 2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: ParseException thrown by " + (pe1 ? "JDK" : "ICU") 2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + " NumberFormat(" + methodName[0] + ") for parsing double" + d 2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + " in locale " + loc); 2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (!pe1 && !pe2 && !n1.equals(n2)) { 2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Different results for parsing double " + d + " by NumberFormat(" 2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + methodName[0] + ") in locale " + loc + " - JDK:" + n1 + " ICU:" + n2); 2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (pe1 && pe2) { 2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("INFO: ParseException thrown by both JDK and ICU NumberFormat(" 2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + methodName[0] + ") for parsing double " + d + " in locale " + loc); 2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (Object o : TEST_NUMBERS) { 2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s1 = nf.format(o); 2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s2 = icunf.format(o); 2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!s1.equals(s2)) { 2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Different results for formatting " + o.getClass().getName() + " by NumberFormat(" 2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + methodName[0] + ") in locale " + loc + " - JDK:" + s1 + " ICU:" + s2); 2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pe1 = false; 2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n1 = n2 = null; 2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n1 = nf.parse(s1); 2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pe1 = true; 2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pe2 = false; 2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert n2 = icunf.parse(s2); 2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (ParseException e) { 2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pe2 = true; 2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if ((pe1 && !pe2) || (!pe1 && pe2)) { 2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: ParseException thrown by " + (pe1 ? "JDK" : "ICU") 2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + " NumberFormat(" + methodName[0] + ") for parsing " + o.getClass().getName() 2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + " in locale " + loc); 2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (!pe1 && !pe2 && !n1.equals(n2)) { 2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: Different results for parsing " + o.getClass().getName() + " by NumberFormat(" 2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + methodName[0] + ") in locale " + loc + " - JDK:" + n1 + " ICU:" + n2); 2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (pe1 && pe2) { 2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("INFO: ParseException thrown by both JDK and ICU NumberFormat(" 2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + methodName[0] + ") for parsing " + o.getClass().getName() + " in locale " + loc); 2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestKeywords() { 2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // ICU provider variant is appended 2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale uloc0 = new ULocale("en_US_" + TestUtil.ICU_VARIANT + "@numbers=Arab;currency=EUR"); 2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Locale loc = uloc0.toLocale(); 2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // On Java 7+, locale extension is preserved 2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale uloc = ULocale.forLocale(loc); 2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String nsType = uloc.getKeywordValue("numbers"); 3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (nsType == null) { 3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Java 6 - skip this test 3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return; 3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert NumberFormat jdkNfmt = NumberFormat.getCurrencyInstance(loc); 3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert com.ibm.icu.text.NumberFormat icuNfmt = com.ibm.icu.text.NumberFormat.getCurrencyInstance(uloc); 3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final double num = 12345.67d; 3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String jdkOut = jdkNfmt.format(num); 3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String icuOut = icuNfmt.format(num); 3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!jdkOut.equals(icuOut)) { 3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("FAIL: JDK number format with Locale " + loc + " is " + jdkOut + ", expected: " + icuOut); 3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 317