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