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