12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert**********************************************************************
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Copyright (c) 2005-2011, International Business Machines
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Corporation and others.  All Rights Reserved.
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert**********************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Author: Alan Liu
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Created: April 12, 2004
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Since: ICU 3.0
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert**********************************************************************
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * MessageRegressionTest.java
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @test 1.29 01/03/12
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @bug 4031438 4058973 4074764 4094906 4104976 4105380 4106659 4106660 4106661
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 4111739 4112104 4113018 4114739 4114743 4116444 4118592 4118594 4120552
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 4142938 4169959 4232154 4293229
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @summary Regression tests for MessageFormat and associated classes
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert(C) Copyright Taligent, Inc. 1996 - All Rights Reserved
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert(C) Copyright IBM Corp. 1996 - All Rights Reserved
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  The original version of this source code and documentation is copyrighted and
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertowned by Taligent, Inc., a wholly-owned subsidiary of IBM. These materials are
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertprovided under terms of a License Agreement between Taligent and Sun. This
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Rouberttechnology is protected by multiple US and International patents. This notice and
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertattribution to Taligent may not be removed.
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  Taligent is a registered trademark of Taligent, Inc.
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format;
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ByteArrayInputStream;
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ByteArrayOutputStream;
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.IOException;
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ObjectInputStream;
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ObjectOutputStream;
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ChoiceFormat;
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParsePosition;
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date;
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.HashMap;
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Iterator;
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Map;
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test;
492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.MessageFormat;
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat;
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertpublic class MessageRegressionTest extends com.ibm.icu.dev.test.TestFmwk {
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4074764
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Null exception when formatting pattern with MessageFormat
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * with no parameters.
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4074764() {
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] pattern = {"Message without param",
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "Message with param:{0}",
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "Longer Message with param {0}"};
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //difference between the two param strings are that
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //in the first one, the param position is within the
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //length of the string without param while it is not so
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //in the other case.
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat messageFormatter = new MessageFormat("");
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //Apply pattern with param and print the result
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            messageFormatter.applyPattern(pattern[1]);
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Object[] paramArray = {new String("BUG"), new Date()};
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String tempBuffer = messageFormatter.format(paramArray);
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tempBuffer.equals("Message with param:BUG"))
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("MessageFormat with one param test failed.");
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Formatted with one extra param : " + tempBuffer);
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //Apply pattern without param and print the result
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            messageFormatter.applyPattern(pattern[0]);
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tempBuffer = messageFormatter.format(null);
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tempBuffer.equals("Message without param"))
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("MessageFormat with no param test failed.");
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Formatted with no params : " + tempBuffer);
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             tempBuffer = messageFormatter.format(paramArray);
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             if (!tempBuffer.equals("Message without param"))
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Formatted with arguments > subsitution failed. result = " + tempBuffer.toString());
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             logln("Formatted with extra params : " + tempBuffer);
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //This statement gives an exception while formatting...
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //If we use pattern[1] for the message with param,
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //we get an NullPointerException in MessageFormat.java(617)
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //If we use pattern[2] for the message with param,
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //we get an StringArrayIndexOutOfBoundsException in MessageFormat.java(614)
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //Both are due to maxOffset not being reset to -1
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //in applyPattern() when the pattern does not
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //contain any param.
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception foo) {
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Exception when formatting with no params.");
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4058973
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * MessageFormat.toPattern has weird rounding behavior.
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * ICU 4.8: This test is commented out because toPattern() has been changed to return
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the original pattern string, rather than reconstituting a new (equivalent) one.
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * This trivially eliminates issues with rounding or any other pattern string differences.
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*public void Test4058973() {
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat fmt = new MessageFormat("{0,choice,0#no files|1#one file|1< {0,number,integer} files}");
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = fmt.toPattern();
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!pat.equals("{0,choice,0.0#no files|1.0#one file|1.0< {0,number,integer} files}")) {
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("MessageFormat.toPattern failed");
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }*/
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4031438
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * More robust message formats.
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4031438() {
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern1 = "Impossible {1} has occurred -- status code is {0} and message is {2}.";
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern2 = "Double '' Quotes {0} test and quoted '{1}' test plus 'other {2} stuff'.";
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat messageFormatter = new MessageFormat("");
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Apply with pattern : " + pattern1);
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            messageFormatter.applyPattern(pattern1);
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Object[] paramArray = {new Integer(7)};
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String tempBuffer = messageFormatter.format(paramArray);
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tempBuffer.equals("Impossible {1} has occurred -- status code is 7 and message is {2}."))
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Tests arguments < substitution failed");
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Formatted with 7 : " + tempBuffer);
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition status = new ParsePosition(0);
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Object[] objs = messageFormatter.parse(tempBuffer, status);
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (objs[paramArray.length] != null)
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Parse failed with more than expected arguments");
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < objs.length; i++) {
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (objs[i] != null && !objs[i].toString().equals(paramArray[i].toString())) {
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Parse failed on object " + objs[i] + " at index : " + i);
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tempBuffer = messageFormatter.format(null);
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tempBuffer.equals("Impossible {1} has occurred -- status code is {0} and message is {2}."))
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Tests with no arguments failed");
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Formatted with null : " + tempBuffer);
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Apply with pattern : " + pattern2);
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            messageFormatter.applyPattern(pattern2);
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tempBuffer = messageFormatter.format(paramArray);
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tempBuffer.equals("Double ' Quotes 7 test and quoted {1} test plus 'other {2} stuff'."))
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("quote format test (w/ params) failed.");
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Formatted with params : " + tempBuffer);
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tempBuffer = messageFormatter.format(null);
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tempBuffer.equals("Double ' Quotes {0} test and quoted {1} test plus 'other {2} stuff'."))
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("quote format test (w/ null) failed.");
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Formatted with null : " + tempBuffer);
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("toPattern : " + messageFormatter.toPattern());
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception foo) {
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            warnln("Exception when formatting in bug 4031438. "+foo.getMessage());
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4052223()
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition pos = new ParsePosition(0);
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pos.getErrorIndex() != -1) {
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ParsePosition.getErrorIndex initialization failed.");
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat fmt = new MessageFormat("There are {0} apples growing on the {1} tree.");
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = new String("There is one apple growing on the peach tree.");
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[] objs = fmt.parse(str, pos);
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("unparsable string , should fail at " + pos.getErrorIndex());
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pos.getErrorIndex() == -1)
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Bug 4052223 failed : parsing string " + str);
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos.setErrorIndex(4);
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pos.getErrorIndex() != 4)
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("setErrorIndex failed, got " + pos.getErrorIndex() + " instead of 4");
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (objs != null) {
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("objs should be null");
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ChoiceFormat f = new ChoiceFormat(
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "-1#are negative|0#are no or fraction|1#is one|1.0<is 1+|2#are two|2<are more than 2.");
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos.setIndex(0); pos.setErrorIndex(-1);
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Number obj = f.parse("are negative", pos);
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pos.getErrorIndex() != -1 && obj.doubleValue() == -1.0)
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Parse with \"are negative\" failed, at " + pos.getErrorIndex());
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos.setIndex(0); pos.setErrorIndex(-1);
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        obj = f.parse("are no or fraction ", pos);
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pos.getErrorIndex() != -1 && obj.doubleValue() == 0.0)
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Parse with \"are no or fraction\" failed, at " + pos.getErrorIndex());
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos.setIndex(0); pos.setErrorIndex(-1);
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        obj = f.parse("go postal", pos);
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pos.getErrorIndex() == -1 && !Double.isNaN(obj.doubleValue()))
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Parse with \"go postal\" failed, at " + pos.getErrorIndex());
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4104976
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * ChoiceFormat.equals(null) throws NullPointerException
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4104976()
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double[] limits = {1, 20};
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] formats = {"xyz", "abc"};
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ChoiceFormat cf = new ChoiceFormat(limits, formats);
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            log("Compares to null is always false, returned : ");
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(cf.equals(null) ? "TRUE" : "FALSE");
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception foo) {
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ChoiceFormat.equals(null) throws exception.");
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4106659
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * ChoiceFormat.ctor(double[], String[]) doesn't check
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * whether lengths of input arrays are equal.
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4106659()
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double[] limits = {1, 2, 3};
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] formats = {"one", "two"};
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ChoiceFormat cf = null;
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cf = new ChoiceFormat(limits, formats);
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception foo) {
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("ChoiceFormat constructor should check for the array lengths");
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cf = null;
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (cf != null) errln(cf.format(5));
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4106660
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * ChoiceFormat.ctor(double[], String[]) allows unordered double array.
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * This is not a bug, added javadoc to emphasize the use of limit
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * array must be in ascending order.
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4106660()
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double[] limits = {3, 1, 2};
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] formats = {"Three", "One", "Two"};
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ChoiceFormat cf = new ChoiceFormat(limits, formats);
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double d = 5.0;
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = cf.format(d);
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!str.equals("Two"))
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("format(" + d + ") = " + cf.format(d));
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4111739
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * MessageFormat is incorrectly serialized/deserialized.
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4111739()
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat format1 = null;
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat format2 = null;
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ObjectOutputStream ostream = null;
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ByteArrayOutputStream baos = null;
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ObjectInputStream istream = null;
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            baos = new ByteArrayOutputStream();
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ostream = new ObjectOutputStream(baos);
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(IOException e) {
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Unexpected exception : " + e.getMessage());
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            format1 = new MessageFormat("pattern{0}");
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ostream.writeObject(format1);
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ostream.flush();
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            byte bytes[] = baos.toByteArray();
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            istream = new ObjectInputStream(new ByteArrayInputStream(bytes));
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            format2 = (MessageFormat)istream.readObject();
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e) {
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Unexpected exception : " + e.getMessage());
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!format1.equals(format2)) {
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("MessageFormats before and after serialization are not" +
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                " equal\nformat1 = " + format1 + "(" + format1.toPattern() + ")\nformat2 = " +
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                format2 + "(" + format2.toPattern() + ")");
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Serialization for MessageFormat is OK.");
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4114743
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * MessageFormat.applyPattern allows illegal patterns.
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2962d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4114743()
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String originalPattern = "initial pattern";
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat mf = new MessageFormat(originalPattern);
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String illegalPattern = "ab { '}' de";
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            mf.applyPattern(illegalPattern);
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("illegal pattern: \"" + illegalPattern + "\"");
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException foo) {
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (illegalPattern.equals(mf.toPattern()))
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("pattern after: \"" + mf.toPattern() + "\"");
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4116444
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * MessageFormat.parse has different behavior in case of null.
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4116444()
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] patterns = {"", "one", "{0,date,short}"};
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat mf = new MessageFormat("");
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < patterns.length; i++) {
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pattern = patterns[i];
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            mf.applyPattern(pattern);
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Object[] array = mf.parse(null, new ParsePosition(0));
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("pattern: \"" + pattern + "\"");
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                log(" parsedObjects: ");
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (array != null) {
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    log("{");
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    for (int j = 0; j < array.length; j++) {
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (array[j] != null)
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            err("\"" + array[j].toString() + "\"");
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        else
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            log("null");
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (j < array.length - 1) log(",");
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    log("}") ;
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    log("null");
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("");
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("pattern: \"" + pattern + "\"");
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("  Exception: " + e.getMessage());
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4114739 (FIX and add javadoc)
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * MessageFormat.format has undocumented behavior about empty format objects.
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4114739()
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat mf = new MessageFormat("<{0}>");
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[] objs1 = null;
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[] objs2 = {};
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[] objs3 = {null};
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("pattern: \"" + mf.toPattern() + "\"");
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            log("format(null) : ");
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("\"" + mf.format(objs1) + "\"");
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            log("format({})   : ");
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("\"" + mf.format(objs2) + "\"");
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            log("format({null}) :");
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("\"" + mf.format(objs3) + "\"");
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Exception thrown for null argument tests.");
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4113018
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * MessageFormat.applyPattern works wrong with illegal patterns.
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4113018()
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String originalPattern = "initial pattern";
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat mf = new MessageFormat(originalPattern);
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String illegalPattern = "format: {0, xxxYYY}";
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("pattern before: \"" + mf.toPattern() + "\"");
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("illegal pattern: \"" + illegalPattern + "\"");
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            mf.applyPattern(illegalPattern);
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Should have thrown IllegalArgumentException for pattern : " + illegalPattern);
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException e) {
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (illegalPattern.equals(mf.toPattern()))
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("pattern after: \"" + mf.toPattern() + "\"");
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4106661
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * ChoiceFormat is silent about the pattern usage in javadoc.
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4106661()
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ChoiceFormat fmt = new ChoiceFormat(
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          "-1#are negative| 0#are no or fraction | 1#is one |1.0<is 1+ |2#are two |2<are more than 2.");
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Formatter Pattern : " + fmt.toPattern());
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with -INF : " + fmt.format(Double.NEGATIVE_INFINITY));
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with -1.0 : " + fmt.format(-1.0));
4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with 0 : " + fmt.format(0));
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with 0.9 : " + fmt.format(0.9));
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with 1.0 : " + fmt.format(1));
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with 1.5 : " + fmt.format(1.5));
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with 2 : " + fmt.format(2));
4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with 2.1 : " + fmt.format(2.1));
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with NaN : " + fmt.format(Double.NaN));
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with +INF : " + fmt.format(Double.POSITIVE_INFINITY));
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4094906
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * ChoiceFormat should accept \u221E as eq. to INF.
4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4094906()
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ChoiceFormat fmt = new ChoiceFormat(
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          "-\u221E<are negative|0<are no or fraction|1#is one|1.0<is 1+|\u221E<are many.");
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!fmt.toPattern().startsWith("-\u221E<are negative|0.0<are no or fraction|1.0#is one|1.0<is 1+|\u221E<are many."))
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Formatter Pattern : " + fmt.toPattern());
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with -INF : " + fmt.format(Double.NEGATIVE_INFINITY));
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with -1.0 : " + fmt.format(-1.0));
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with 0 : " + fmt.format(0));
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with 0.9 : " + fmt.format(0.9));
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with 1.0 : " + fmt.format(1));
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with 1.5 : " + fmt.format(1.5));
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with 2 : " + fmt.format(2));
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Format with +INF : " + fmt.format(Double.POSITIVE_INFINITY));
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4118592
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * MessageFormat.parse fails with ChoiceFormat.
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4352d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4118592()
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat mf = new MessageFormat("");
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = "{0,choice,1#YES|2#NO}";
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String prefix = "";
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 5; i++) {
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String formatted = prefix + "YES";
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            mf.applyPattern(prefix + pattern);
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            prefix += "x";
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Object[] objs = mf.parse(formatted, new ParsePosition(0));
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(i + ". pattern :\"" + mf.toPattern() + "\"");
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            log(" \"" + formatted + "\" parsed as ");
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (objs == null) logln("  null");
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else logln("  " + objs[0]);
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4118594
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * MessageFormat.parse fails for some patterns.
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4118594()
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat mf = new MessageFormat("{0}, {0}, {0}");
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String forParsing = "x, y, z";
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[] objs = mf.parse(forParsing, new ParsePosition(0));
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("pattern: \"" + mf.toPattern() + "\"");
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("text for parsing: \"" + forParsing + "\"");
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!objs[0].toString().equals("z"))
4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("argument0: \"" + objs[0] + "\"");
4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf.setLocale(Locale.US);
4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf.applyPattern("{0,number,#.##}, {0,number,#.#}");
4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[] oldobjs = {new Double(3.1415)};
4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result = mf.format( oldobjs );
4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("pattern: \"" + mf.toPattern() + "\"");
4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("text for parsing: \"" + result + "\"");
4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // result now equals "3.14, 3.1"
4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!result.equals("3.14, 3.1"))
4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("result = " + result);
4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[] newobjs = mf.parse(result, new ParsePosition(0));
4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // newobjs now equals {new Double(3.1)}
4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (((Number)newobjs[0]).doubleValue() != 3.1) // was (Double) [alan]
4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln( "newobjs[0] = " + newobjs[0]);
4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4105380
4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * When using ChoiceFormat, MessageFormat is not good for I18n.
4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4105380()
4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String patternText1 = "The disk \"{1}\" contains {0}.";
4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String patternText2 = "There are {0} on the disk \"{1}\"";
4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat form1 = new MessageFormat(patternText1);
4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat form2 = new MessageFormat(patternText2);
4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double[] filelimits = {0,1,2};
4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] filepart = {"no files","one file","{0,number} files"};
4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        form1.setFormat(1, fileform);
4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        form2.setFormat(0, fileform);
4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[] testArgs = {new Long(12373), "MyDisk"};
4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(form1.format(testArgs));
4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(form2.format(testArgs));
4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* @bug 4120552
4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * MessageFormat.parse incorrectly sets errorIndex.
5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
5012d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4120552()
5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat mf = new MessageFormat("pattern");
5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String texts[] = {"pattern", "pat", "1234"};
5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("pattern: \"" + mf.toPattern() + "\"");
5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < texts.length; i++) {
5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition pp = new ParsePosition(0);
5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Object[] objs = mf.parse(texts[i], pp);
5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            log("  text for parsing: \"" + texts[i] + "\"");
5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (objs == null) {
5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("  (incorrectly formatted string)");
5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (pp.getErrorIndex() == -1)
5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Incorrect error index: " + pp.getErrorIndex());
5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("  (correctly formatted string)");
5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4142938
5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * MessageFormat handles single quotes in pattern wrong.
5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * This is actually a problem in ChoiceFormat; it doesn't
5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * understand single quotes.
5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
5272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4142938() {
5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = "''Vous'' {0,choice,0#n''|1#}avez s\u00E9lectionne\u00E9 " +
5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "{0,choice,0#aucun|1#{0}} client{0,choice,0#s|1#|2#s} " +
5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "personnel{0,choice,0#s|1#|2#s}.";
5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat mf = new MessageFormat(pat);
5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] PREFIX = {
5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "'Vous' n'avez s\u00E9lectionne\u00E9 aucun clients personnels.",
5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "'Vous' avez s\u00E9lectionne\u00E9 ",
5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "'Vous' avez s\u00E9lectionne\u00E9 "
5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] SUFFIX = {
5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            null,
5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            " client personnel.",
5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            " clients personnels."
5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<3; i++) {
5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String out = mf.format(new Object[]{new Integer(i)});
5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (SUFFIX[i] == null) {
5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!out.equals(PREFIX[i]))
5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("" + i + ": Got \"" + out + "\"; Want \"" + PREFIX[i] + "\"");
5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else {
5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!out.startsWith(PREFIX[i]) ||
5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    !out.endsWith(SUFFIX[i]))
5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("" + i + ": Got \"" + out + "\"; Want \"" + PREFIX[i] + "\"...\"" +
5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          SUFFIX[i] + "\"");
5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4142938
5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test the applyPattern and toPattern handling of single quotes
5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * by ChoiceFormat.  (This is in here because this was a bug reported
5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * against MessageFormat.)  The single quote is used to quote the
5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * pattern characters '|', '#', '<', and '\u2264'.  Two quotes in a row
5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * is a quote literal.
5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
5682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestChoicePatternQuote() {
5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] DATA = {
5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Pattern                  0 value           1 value
5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "0#can''t|1#can",           "can't",          "can",
5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "0#'pound(#)=''#'''|1#xyz", "pound(#)='#'",   "xyz",
5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "0#'1<2 | 1\u22641'|1#''",  "1<2 | 1\u22641", "'",
5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<DATA.length; i+=3) {
5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ChoiceFormat cf = new ChoiceFormat(DATA[i]);
5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for (int j=0; j<=1; ++j) {
5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    String out = cf.format(j);
5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!out.equals(DATA[i+1+j]))
5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("Fail: Pattern \"" + DATA[i] + "\" x "+j+" -> " +
5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              out + "; want \"" + DATA[i+1+j] + '"');
5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String pat = cf.toPattern();
5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String pat2 = new ChoiceFormat(pat).toPattern();
5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!pat.equals(pat2))
5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Fail: Pattern \"" + DATA[i] + "\" x toPattern -> \"" + pat + '"');
5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                else
5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("Ok: Pattern \"" + DATA[i] + "\" x toPattern -> \"" + pat + '"');
5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            catch (IllegalArgumentException e) {
5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail: Pattern \"" + DATA[i] + "\" -> " + e);
5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4112104
6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * MessageFormat.equals(null) throws a NullPointerException.  The JLS states
6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * that it should return false.
6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
6032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4112104() {
6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat format = new MessageFormat("");
6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // This should NOT throw an exception
6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (format.equals(null)) {
6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // It also should return false
6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("MessageFormat.equals(null) returns false");
6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (NullPointerException e) {
6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("MessageFormat.equals(null) throws " + e);
6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4169959
6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * MessageFormat does not format null objects. CANNOT REPRODUCE THIS BUG.
6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
6222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4169959() {
6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // This works
6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(MessageFormat.format("This will {0}", new Object[]{"work"}));
6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // This fails
6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(MessageFormat.format("This will {0}", new Object[]{ null }));
6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void test4232154() {
6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean gotException = false;
6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new MessageFormat("The date is {0:date}");
6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            gotException = true;
6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!(e instanceof IllegalArgumentException)) {
6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                throw new RuntimeException("got wrong exception type");
6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ("argument number too large at ".equals(e.getMessage())) {
6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                throw new RuntimeException("got wrong exception message");
6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!gotException) {
6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new RuntimeException("didn't get exception for invalid input");
6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void test4293229() {
6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat format = new MessageFormat("'''{'0}'' '''{0}'''");
6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[] args = { null };
6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String expected = "'{0}' '{0}'";
6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result = format.format(args);
6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!result.equals(expected)) {
6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new RuntimeException("wrong format result - expected \"" +
6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    expected + "\", got \"" + result + "\"");
6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // This test basically ensures that the tests defined above also work with
6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // valid named arguments.
6642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testBugTestsWithNamesArguments() {
6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      { // Taken from Test4031438().
6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern1 = "Impossible {arg1} has occurred -- status code is {arg0} and message is {arg2}.";
6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern2 = "Double '' Quotes {ARG_ZERO} test and quoted '{ARG_ONE}' test plus 'other {ARG_TWO} stuff'.";
6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat messageFormatter = new MessageFormat("");
6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Apply with pattern : " + pattern1);
6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            messageFormatter.applyPattern(pattern1);
6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            HashMap paramsMap = new HashMap();
6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            paramsMap.put("arg0", new Integer(7));
6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String tempBuffer = messageFormatter.format(paramsMap);
6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tempBuffer.equals("Impossible {arg1} has occurred -- status code is 7 and message is {arg2}."))
6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Tests arguments < substitution failed");
6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Formatted with 7 : " + tempBuffer);
6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition status = new ParsePosition(0);
6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Map objs = messageFormatter.parseToMap(tempBuffer, status);
6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (objs.get("arg1") != null || objs.get("arg2") != null)
6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Parse failed with more than expected arguments");
6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (Iterator keyIter = objs.keySet().iterator();
6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                 keyIter.hasNext();) {
6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String key = (String) keyIter.next();
6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (objs.get(key) != null && !objs.get(key).toString().equals(paramsMap.get(key).toString())) {
6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Parse failed on object " + objs.get(key) + " with argument name : " + key );
6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tempBuffer = messageFormatter.format(null);
6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tempBuffer.equals("Impossible {arg1} has occurred -- status code is {arg0} and message is {arg2}."))
6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Tests with no arguments failed");
6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Formatted with null : " + tempBuffer);
6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Apply with pattern : " + pattern2);
6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            messageFormatter.applyPattern(pattern2);
6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            paramsMap.clear();
7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            paramsMap.put("ARG_ZERO", new Integer(7));
7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tempBuffer = messageFormatter.format(paramsMap);
7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tempBuffer.equals("Double ' Quotes 7 test and quoted {ARG_ONE} test plus 'other {ARG_TWO} stuff'."))
7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("quote format test (w/ params) failed.");
7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Formatted with params : " + tempBuffer);
7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            tempBuffer = messageFormatter.format(null);
7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!tempBuffer.equals("Double ' Quotes {ARG_ZERO} test and quoted {ARG_ONE} test plus 'other {ARG_TWO} stuff'."))
7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("quote format test (w/ null) failed.");
7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Formatted with null : " + tempBuffer);
7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("toPattern : " + messageFormatter.toPattern());
7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception foo) {
7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            warnln("Exception when formatting in bug 4031438. "+foo.getMessage());
7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }{ // Taken from Test4052223().
7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition pos = new ParsePosition(0);
7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pos.getErrorIndex() != -1) {
7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ParsePosition.getErrorIndex initialization failed.");
7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat fmt = new MessageFormat("There are {numberOfApples} apples growing on the {whatKindOfTree} tree.");
7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = new String("There is one apple growing on the peach tree.");
7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map objs = fmt.parseToMap(str, pos);
7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("unparsable string , should fail at " + pos.getErrorIndex());
7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pos.getErrorIndex() == -1)
7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Bug 4052223 failed : parsing string " + str);
7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos.setErrorIndex(4);
7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pos.getErrorIndex() != 4)
7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("setErrorIndex failed, got " + pos.getErrorIndex() + " instead of 4");
7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (objs != null)
7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("unparsable string, should return null");
7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }{ // Taken from Test4111739().
7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat format1 = null;
7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat format2 = null;
7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ObjectOutputStream ostream = null;
7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ByteArrayOutputStream baos = null;
7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ObjectInputStream istream = null;
7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            baos = new ByteArrayOutputStream();
7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ostream = new ObjectOutputStream(baos);
7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(IOException e) {
7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Unexpected exception : " + e.getMessage());
7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            format1 = new MessageFormat("pattern{argument}");
7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ostream.writeObject(format1);
7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ostream.flush();
7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            byte bytes[] = baos.toByteArray();
7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            istream = new ObjectInputStream(new ByteArrayInputStream(bytes));
7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            format2 = (MessageFormat)istream.readObject();
7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e) {
7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Unexpected exception : " + e.getMessage());
7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!format1.equals(format2)) {
7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("MessageFormats before and after serialization are not" +
7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                " equal\nformat1 = " + format1 + "(" + format1.toPattern() + ")\nformat2 = " +
7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                format2 + "(" + format2.toPattern() + ")");
7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Serialization for MessageFormat is OK.");
7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }{ // Taken from Test4116444().
7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] patterns = {"", "one", "{namedArgument,date,short}"};
7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat mf = new MessageFormat("");
7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < patterns.length; i++) {
7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String pattern = patterns[i];
7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            mf.applyPattern(pattern);
7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Map objs = mf.parseToMap(null, new ParsePosition(0));
7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("pattern: \"" + pattern + "\"");
7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                log(" parsedObjects: ");
7757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (objs != null) {
7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    log("{");
7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    for (Iterator keyIter = objs.keySet().iterator();
7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         keyIter.hasNext();) {
7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String key = (String)keyIter.next();
7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (objs.get(key) != null) {
7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            err("\"" + objs.get(key).toString() + "\"");
7827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        } else {
7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            log("null");
7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (keyIter.hasNext()) {
7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            log(",");
7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    log("}") ;
7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    log("null");
7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("");
7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("pattern: \"" + pattern + "\"");
7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("  Exception: " + e.getMessage());
7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }{ // Taken from Test4114739().
8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat mf = new MessageFormat("<{arg}>");
8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map objs1 = null;
8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map objs2 = new HashMap();
8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map objs3 = new HashMap();
8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        objs3.put("arg", null);
8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("pattern: \"" + mf.toPattern() + "\"");
8077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            log("format(null) : ");
8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("\"" + mf.format(objs1) + "\"");
8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            log("format({})   : ");
8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("\"" + mf.format(objs2) + "\"");
8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            log("format({null}) :");
8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("\"" + mf.format(objs3) + "\"");
8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Exception thrown for null argument tests.");
8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }{ // Taken from Test4118594().
8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String argName = "something_stupid";
8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat mf = new MessageFormat("{"+ argName + "}, {" + argName + "}, {" + argName + "}");
8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String forParsing = "x, y, z";
8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map objs = mf.parseToMap(forParsing, new ParsePosition(0));
8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("pattern: \"" + mf.toPattern() + "\"");
8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("text for parsing: \"" + forParsing + "\"");
8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!objs.get(argName).toString().equals("z"))
8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("argument0: \"" + objs.get(argName) + "\"");
8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf.setLocale(Locale.US);
8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf.applyPattern("{" + argName + ",number,#.##}, {" + argName + ",number,#.#}");
8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map oldobjs = new HashMap();
8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        oldobjs.put(argName, new Double(3.1415));
8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result = mf.format( oldobjs );
8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("pattern: \"" + mf.toPattern() + "\"");
8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("text for parsing: \"" + result + "\"");
8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // result now equals "3.14, 3.1"
8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!result.equals("3.14, 3.1"))
8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("result = " + result);
8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map newobjs = mf.parseToMap(result, new ParsePosition(0));
8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // newobjs now equals {new Double(3.1)}
8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (((Number)newobjs.get(argName)).doubleValue() != 3.1) // was (Double) [alan]
8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln( "newobjs.get(argName) = " + newobjs.get(argName));
8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }{ // Taken from Test4105380().
8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String patternText1 = "The disk \"{diskName}\" contains {numberOfFiles}.";
8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String patternText2 = "There are {numberOfFiles} on the disk \"{diskName}\"";
8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat form1 = new MessageFormat(patternText1);
8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat form2 = new MessageFormat(patternText2);
8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double[] filelimits = {0,1,2};
8457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] filepart = {"no files","one file","{numberOfFiles,number} files"};
8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        form1.setFormat(1, fileform);
8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        form2.setFormat(0, fileform);
8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map testArgs = new HashMap();
8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        testArgs.put("diskName", "MyDisk");
8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        testArgs.put("numberOfFiles", new Long(12373));
8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(form1.format(testArgs));
8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(form2.format(testArgs));
8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }{ // Taken from test4293229().
8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat format = new MessageFormat("'''{'myNamedArgument}'' '''{myNamedArgument}'''");
8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map args = new HashMap();
8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String expected = "'{myNamedArgument}' '{myNamedArgument}'";
8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result = format.format(args);
8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!result.equals(expected)) {
8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new RuntimeException("wrong format result - expected \"" +
8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    expected + "\", got \"" + result + "\"");
8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private MessageFormat serializeAndDeserialize(MessageFormat original) {
8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ByteArrayOutputStream baos = new ByteArrayOutputStream();
8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ObjectOutputStream ostream = new ObjectOutputStream(baos);
8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ostream.writeObject(original);
8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ostream.flush();
8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            byte bytes[] = baos.toByteArray();
8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ObjectInputStream istream = new ObjectInputStream(new ByteArrayInputStream(bytes));
8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MessageFormat reconstituted = (MessageFormat)istream.readObject();
8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return reconstituted;
8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(IOException e) {
8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new RuntimeException(e);
8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ClassNotFoundException e) {
8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new RuntimeException(e);
8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSerialization() {
8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat format1 = null;
8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MessageFormat format2 = null;
8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format1 = new MessageFormat("", ULocale.GERMAN);
8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format2 = serializeAndDeserialize(format1);
8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("MessageFormats (empty pattern) before and after serialization are not equal", format1, format2);
8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format1.applyPattern("ab{1}cd{0,number}ef{3,date}gh");
8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format1.setFormat(2, null);
8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format1.setFormatByArgumentIndex(1, NumberFormat.getInstance(ULocale.ENGLISH));
8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format2 = serializeAndDeserialize(format1);
8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("MessageFormats (with custom formats) before and after serialization are not equal", format1, format2);
8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
8997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "MessageFormat (with custom formats) does not "+
9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "format correctly after serialization",
9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "ab3.3cd4,4ef***gh",
9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                format2.format(new Object[] { 4.4, 3.3, "+++", "***" }));
9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
905