17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2001-2012, International Business Machines Corporation and    *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Port From:   ICU4C v1.8.1 : format : NumberFormatRegressionTest
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Source File: $ICU4CRoot/source/test/intltest/numrgts.cpp
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ByteArrayInputStream;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.IOException;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ObjectInputStream;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParseException;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParsePosition;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DateFormat;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormat;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat;
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Calendar;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Performs regression test for MessageFormat
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class NumberFormatRegressionTest extends com.ibm.icu.dev.test.TestFmwk {
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] args) throws Exception{
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new NumberFormatRegressionTest().run(args);
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * alphaWorks upgrade
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4161100() {
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = NumberFormat.getInstance(Locale.US);
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMinimumFractionDigits(1);
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMaximumFractionDigits(1);
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double a = -0.09;
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s = nf.format(a);
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(a + " x " +
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              ((DecimalFormat) nf).toPattern() + " = " + s);
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!s.equals("-0.1")) {
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL");
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * DateFormat should call setIntegerParseOnly(TRUE) on adopted
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * NumberFormat objects.
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestJ691() {
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale loc = new Locale("fr", "CH");
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // set up the input date string & expected output
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String udt = "11.10.2000";
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String exp = "11.10.00";
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // create a Calendar for this locale
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = Calendar.getInstance(loc);
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // create a NumberFormat for this locale
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = NumberFormat.getInstance(loc);
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // *** Here's the key: We don't want to have to do THIS:
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //nf.setParseIntegerOnly(true);
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // create the DateFormat
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, loc);
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setCalendar(cal);
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setNumberFormat(nf);
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // set parsing to lenient & parse
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date ulocdat = new Date();
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setLenient(true);
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ulocdat = df.parse(udt);
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (java.text.ParseException pe) {
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln(pe.getMessage());
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // format back to a string
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String outString = df.format(ulocdat);
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!outString.equals(exp)) {
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: " + udt + " => " + outString);
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test getIntegerInstance();
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4408066() {
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf1 = NumberFormat.getIntegerInstance();
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf2 = NumberFormat.getIntegerInstance(Locale.CHINA);
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //test isParseIntegerOnly
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!nf1.isParseIntegerOnly() || !nf2.isParseIntegerOnly()) {
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Failed : Integer Number Format Instance should set setParseIntegerOnly(true)");
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //Test format
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double[] data = {
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                -3.75, -2.5, -1.5,
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                -1.25, 0,    1.0,
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1.25,  1.5,  2.5,
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                3.75,  10.0, 255.5
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                };
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] expected = {
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-4", "-2", "-2",
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-1", "0",  "1",
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1",  "2",  "2",
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "4",  "10", "256"
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                };
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < data.length; ++i) {
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String result = nf1.format(data[i]);
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!result.equals(expected[i])) {
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Failed => Source: " + Double.toString(data[i])
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + ";Formatted : " + result
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + ";but expectted: " + expected[i]);
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //Test parse, Parsing should stop at "."
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String data[] = {
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-3.75", "-2.5", "-1.5",
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-1.25", "0",    "1.0",
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1.25",  "1.5",  "2.5",
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "3.75",  "10.0", "255.5"
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                };
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            long[] expected = {
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                -3, -2, -1,
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                -1, 0,  1,
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1,  1,  2,
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                3,  10, 255
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                };
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < data.length; ++i) {
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number n = null;
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    n = nf1.parse(data[i]);
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (ParseException e) {
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Failed: " + e.getMessage());
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!(n instanceof Long) || (n instanceof Integer)) {
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Failed: Integer Number Format should parse string to Long/Integer");
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (n.longValue() != expected[i]) {
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Failed=> Source: " + data[i]
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + ";result : " + n.toString()
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + ";expected :" + Long.toString(expected[i]));
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //Test New serialized DecimalFormat(2.0) read old serialized forms of DecimalFormat(1.3.1.1)
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSerialization() throws IOException{
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        byte[][] contents = NumberFormatSerialTestData.getContent();
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double data = 1234.56;
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] expected = {
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "1,234.56", "$1,234.56", "123,456%", "1.23456E3"};
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 4; ++i) {
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(contents[i]));
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat format = (NumberFormat) ois.readObject();
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String result = format.format(data);
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (result.equals(expected[i])) {
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("OK: Deserialized bogus NumberFormat(new version read old version)");
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: the test data formats are not euqal");
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                warnln("FAIL: " + e.getMessage());
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test case for JB#5509, strict parsing issue
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestJB5509() {
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] data = {
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,2",
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1.2",
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,2.5",
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,23.5",
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234.5",
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234",
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234,567",
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234,567.8",
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234,5",
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234,5.6",
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1,234,56.7"
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean[] expected = { // false for expected parse failure
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                false,
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                true,
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                false,
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                false,
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                true,
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                true,
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                true,
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                true,
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                false,
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                false,
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                false,
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                false
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DecimalFormat df = new DecimalFormat("#,##0.###", new DecimalFormatSymbols(new ULocale("en_US")));
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setParseStrict(true);
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < data.length; i++) {
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                df.parse(data[i]);
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!expected[i]) {
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Failed: ParseException must be thrown for string " + data[i]);
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException pe) {
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (expected[i]) {
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Failed: ParseException must not be thrown for string " + data[i]);
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test case for ticket#5698 - parsing extremely large/small values
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestT5698() {
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String[] data = {
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "12345679E66666666666666666",
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-12345679E66666666666666666",
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ".1E2147483648", // exponent > max int
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ".1E2147483647", // exponent == max int
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ".1E-2147483648", // exponent == min int
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ".1E-2147483649", // exponent < min int
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1.23E350", // value > max double
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1.23E300", // value < max double
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-1.23E350", // value < min double
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-1.23E300", // value > min double
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "4.9E-324", // value = smallest non-zero double
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1.0E-325", // 0 < value < smallest non-zero positive double0
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-1.0E-325", // 0 > value > largest non-zero negative double
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final double[] expected = {
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Double.POSITIVE_INFINITY,
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Double.NEGATIVE_INFINITY,
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Double.POSITIVE_INFINITY,
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Double.POSITIVE_INFINITY,
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.0,
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.0,
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Double.POSITIVE_INFINITY,
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1.23e300d,
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Double.NEGATIVE_INFINITY,
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                -1.23e300d,
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                4.9e-324d,
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.0,
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                -0.0,
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nfmt = NumberFormat.getInstance();
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < data.length; i++) {
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number n = nfmt.parse(data[i]);
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (expected[i] != n.doubleValue()) {
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Failed: Parsed result for " + data[i] + ": "
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + n.doubleValue() + " / expected: " + expected[i]);
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException pe) {
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Failed: ParseException is thrown for " + data[i]);
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSurrogatesParsing() { // Test parsing of numbers that use digits from the supplemental planes.
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String[] data = {
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1\ud801\udca2,3\ud801\udca45.67", //
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "\ud801\udca1\ud801\udca2,\ud801\udca3\ud801\udca4\ud801\udca5.\ud801\udca6\ud801\udca7\ud801\udca8", //
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "\ud835\udfd2.\ud835\udfd7E-\ud835\udfd1",
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "\ud835\udfd3.8E-0\ud835\udfd0"
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                };
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final double[] expected = {
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                12345.67,
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                12345.678,
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.0049,
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0.058
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nfmt = NumberFormat.getInstance();
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < data.length; i++) {
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Number n = nfmt.parse(data[i]);
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (expected[i] != n.doubleValue()) {
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Failed: Parsed result for " + data[i] + ": "
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + n.doubleValue() + " / expected: " + expected[i]);
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException pe) {
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Failed: ParseException is thrown for " + data[i]);
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void checkNBSPPatternRtNum(String testcase, NumberFormat nf, double myNumber) {
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String myString = nf.format(myNumber);
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double aNumber;
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                aNumber = nf.parse(myString).doubleValue();
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // TODO Auto-generated catch block
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: " + testcase +" - failed to parse. " + e.toString());
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return;
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(Math.abs(aNumber-myNumber)>.001) {
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: "+testcase+": formatted "+myNumber+", parsed into "+aNumber+"\n");
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("PASS: "+testcase+": formatted "+myNumber+", parsed into "+aNumber+"\n");
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void checkNBSPPatternRT(String testcase, NumberFormat nf) {
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkNBSPPatternRtNum(testcase, nf, 12345.);
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkNBSPPatternRtNum(testcase, nf, -12345.);
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNBSPInPattern() {
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    NumberFormat nf = null;
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    String testcase;
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    testcase="ar_AE UNUM_CURRENCY";
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    nf = NumberFormat.getCurrencyInstance(new ULocale("ar_AE"));
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    checkNBSPPatternRT(testcase, nf);
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // if we don't have CLDR 1.6 data, bring out the problem anyways
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    String SPECIAL_PATTERN = "\u00A4\u00A4'\u062f.\u0625.\u200f\u00a0'###0.00";
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    testcase = "ar_AE special pattern: " + SPECIAL_PATTERN;
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    nf = new DecimalFormat();
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    ((DecimalFormat)nf).applyPattern(SPECIAL_PATTERN);
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    checkNBSPPatternRT(testcase, nf);
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test case for #9293
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Parsing currency in strict mode
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestT9293() {
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat fmt = NumberFormat.getCurrencyInstance();
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.setParseStrict(true);
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final int val = 123456;
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String txt = fmt.format(123456);
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition pos = new ParsePosition(0);
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number num = fmt.parse(txt, pos);
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pos.getErrorIndex() >= 0) {
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Parsing " + txt + " - error index: " + pos.getErrorIndex());
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else if (val != num.intValue()) {
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Parsed result: " + num + " - expected: " + val);
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
379