]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/icu/dev/test/format/NumberFormatRegressionTest.java
c873876e6ee99b53a570975cae6d35ff97b889ab
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / dev / test / format / NumberFormatRegressionTest.java
1 //##header\r
2 /*\r
3  *******************************************************************************\r
4  * Copyright (C) 2001-2009, International Business Machines Corporation and    *\r
5  * others. All Rights Reserved.                                                *\r
6  *******************************************************************************\r
7  */\r
8 \r
9 /** \r
10  * Port From:   ICU4C v1.8.1 : format : NumberFormatRegressionTest\r
11  * Source File: $ICU4CRoot/source/test/intltest/numrgts.cpp\r
12  **/\r
13 \r
14 package com.ibm.icu.dev.test.format;\r
15 \r
16 import com.ibm.icu.text.*;\r
17 import com.ibm.icu.util.*;\r
18 import java.util.Locale;\r
19 import java.util.Date;\r
20 import java.text.ParseException;\r
21 import java.io.*;\r
22 \r
23 /** \r
24  * Performs regression test for MessageFormat\r
25  **/\r
26 public class NumberFormatRegressionTest extends com.ibm.icu.dev.test.TestFmwk {\r
27     \r
28     public static void main(String[] args) throws Exception{\r
29         new NumberFormatRegressionTest().run(args);\r
30     }\r
31     \r
32     /**\r
33      * alphaWorks upgrade\r
34      */\r
35     public void Test4161100() {\r
36         NumberFormat nf = NumberFormat.getInstance(Locale.US);\r
37         nf.setMinimumFractionDigits(1);\r
38         nf.setMaximumFractionDigits(1);\r
39         double a = -0.09;\r
40         String s = nf.format(a);\r
41         logln(a + " x " +\r
42               ((DecimalFormat) nf).toPattern() + " = " + s);\r
43         if (!s.equals("-0.1")) {\r
44             errln("FAIL");\r
45         }\r
46     }\r
47     \r
48     /**\r
49      * DateFormat should call setIntegerParseOnly(TRUE) on adopted\r
50      * NumberFormat objects.\r
51      */\r
52     public void TestJ691() {\r
53         \r
54         Locale loc = new Locale("fr", "CH");\r
55     \r
56         // set up the input date string & expected output\r
57         String udt = "11.10.2000";\r
58         String exp = "11.10.00";\r
59     \r
60         // create a Calendar for this locale\r
61         Calendar cal = Calendar.getInstance(loc);\r
62     \r
63         // create a NumberFormat for this locale\r
64         NumberFormat nf = NumberFormat.getInstance(loc);\r
65     \r
66         // *** Here's the key: We don't want to have to do THIS:\r
67         //nf.setParseIntegerOnly(true);\r
68     \r
69         // create the DateFormat\r
70         DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, loc);\r
71     \r
72         df.setCalendar(cal);\r
73         df.setNumberFormat(nf);\r
74     \r
75         // set parsing to lenient & parse\r
76         Date ulocdat = new Date();\r
77         df.setLenient(true);\r
78         try {\r
79             ulocdat = df.parse(udt);\r
80         } catch (java.text.ParseException pe) {\r
81             errln(pe.getMessage());\r
82         }\r
83         // format back to a string\r
84         String outString = df.format(ulocdat);\r
85     \r
86         if (!outString.equals(exp)) {\r
87             errln("FAIL: " + udt + " => " + outString);\r
88         }\r
89     }\r
90     \r
91     /**\r
92      * Test getIntegerInstance();\r
93      */\r
94     public void Test4408066() {\r
95         \r
96         NumberFormat nf1 = NumberFormat.getIntegerInstance();\r
97         NumberFormat nf2 = NumberFormat.getIntegerInstance(Locale.CHINA);\r
98     \r
99         //test isParseIntegerOnly\r
100         if (!nf1.isParseIntegerOnly() || !nf2.isParseIntegerOnly()) {\r
101             errln("Failed : Integer Number Format Instance should set setParseIntegerOnly(true)");\r
102         }\r
103     \r
104         //Test format\r
105         {\r
106             double[] data = {\r
107                 -3.75, -2.5, -1.5, \r
108                 -1.25, 0,    1.0, \r
109                 1.25,  1.5,  2.5, \r
110                 3.75,  10.0, 255.5\r
111                 };\r
112             String[] expected = {\r
113                 "-4", "-2", "-2",\r
114                 "-1", "0",  "1",\r
115                 "1",  "2",  "2",\r
116                 "4",  "10", "256"\r
117                 };\r
118     \r
119             for (int i = 0; i < data.length; ++i) {\r
120                 String result = nf1.format(data[i]);\r
121                 if (!result.equals(expected[i])) {\r
122                     errln("Failed => Source: " + Double.toString(data[i]) \r
123                         + ";Formatted : " + result\r
124                         + ";but expectted: " + expected[i]);\r
125                 }\r
126             }\r
127         }\r
128         //Test parse, Parsing should stop at "."\r
129         {\r
130             String data[] = {\r
131                 "-3.75", "-2.5", "-1.5", \r
132                 "-1.25", "0",    "1.0", \r
133                 "1.25",  "1.5",  "2.5", \r
134                 "3.75",  "10.0", "255.5"\r
135                 };\r
136             long[] expected = {\r
137                 -3, -2, -1,\r
138                 -1, 0,  1,\r
139                 1,  1,  2,\r
140                 3,  10, 255\r
141                 };\r
142             \r
143             for (int i = 0; i < data.length; ++i) {\r
144                 Number n = null;\r
145                 try {\r
146                     n = nf1.parse(data[i]);\r
147                 } catch (ParseException e) {\r
148                     errln("Failed: " + e.getMessage());\r
149                 }\r
150                 if (!(n instanceof Long) || (n instanceof Integer)) {\r
151                     errln("Failed: Integer Number Format should parse string to Long/Integer");\r
152                 }\r
153                 if (n.longValue() != expected[i]) {\r
154                     errln("Failed=> Source: " + data[i] \r
155                         + ";result : " + n.toString()\r
156                         + ";expected :" + Long.toString(expected[i]));\r
157                 }\r
158             }\r
159         }\r
160     }\r
161     \r
162     //Test New serialized DecimalFormat(2.0) read old serialized forms of DecimalFormat(1.3.1.1)\r
163     public void TestSerialization() throws IOException{\r
164 //#if defined(FOUNDATION10) || defined(J2SE13)\r
165 //#else\r
166         byte[][] contents = NumberFormatSerialTestData.getContent();\r
167         double data = 1234.56;\r
168         String[] expected = {\r
169             "1,234.56", "$1,234.56", "123,456%", "1.23456E3"};\r
170         for (int i = 0; i < 4; ++i) {\r
171             ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(contents[i]));\r
172             try {\r
173                 NumberFormat format = (NumberFormat) ois.readObject();\r
174                 String result = format.format(data);\r
175                 if (result.equals(expected[i])) {\r
176                     logln("OK: Deserialized bogus NumberFormat(new version read old version)");\r
177                 } else {\r
178                     errln("FAIL: the test data formats are not euqal");\r
179                 }\r
180             } catch (Exception e) {\r
181                 warnln("FAIL: " + e.getMessage());\r
182             }\r
183         }\r
184 //#endif\r
185     }\r
186 \r
187     /*\r
188      * Test case for JB#5509, strict parsing issue\r
189      */\r
190     public void TestJB5509() {\r
191         String[] data = {\r
192                 "1,2",\r
193                 "1.2",\r
194                 "1,2.5",\r
195                 "1,23.5",\r
196                 "1,234.5",\r
197                 "1,234",\r
198                 "1,234,567",\r
199                 "1,234,567.8",\r
200                 "1,234,5",\r
201                 "1,234,5.6",\r
202                 "1,234,56.7"\r
203         };\r
204         boolean[] expected = { // false for expected parse failure\r
205                 false,\r
206                 true,\r
207                 false,\r
208                 false,\r
209                 true,\r
210                 true,\r
211                 true,\r
212                 true,\r
213                 false,\r
214                 false,\r
215                 false,\r
216                 false\r
217         };\r
218 \r
219         DecimalFormat df = new DecimalFormat("#,##0.###", new DecimalFormatSymbols(new ULocale("en_US")));\r
220         df.setParseStrict(true);\r
221         for (int i = 0; i < data.length; i++) {\r
222             try {\r
223                 df.parse(data[i]);\r
224                 if (!expected[i]) {\r
225                     errln("Failed: ParseException must be thrown for string " + data[i]);\r
226                 }\r
227             } catch (ParseException pe) {\r
228                 if (expected[i]) {\r
229                     errln("Failed: ParseException must not be thrown for string " + data[i]);\r
230                 }\r
231             }\r
232         }\r
233     }\r
234 \r
235     /*\r
236      * Test case for ticket#5698 - parsing extremely large/small values\r
237      */\r
238     public void TestT5698() {\r
239         final String[] data = {\r
240                 "12345679E66666666666666666",\r
241                 "-12345679E66666666666666666",\r
242                 ".1E2147483648", // exponent > max int\r
243                 ".1E2147483647", // exponent == max int\r
244                 ".1E-2147483648", // exponent == min int\r
245                 ".1E-2147483649", // exponent < min int\r
246                 "1.23E350", // value > max double\r
247                 "1.23E300", // value < max double\r
248                 "-1.23E350", // value < min double\r
249                 "-1.23E300", // value > min double\r
250                 "4.9E-324", // value = smallest non-zero double\r
251                 "1.0E-325", // 0 < value < smallest non-zero positive double0\r
252                 "-1.0E-325", // 0 > value > largest non-zero negative double\r
253         };\r
254         final double[] expected = {\r
255                 Double.POSITIVE_INFINITY,\r
256                 Double.NEGATIVE_INFINITY,\r
257                 Double.POSITIVE_INFINITY,\r
258                 Double.POSITIVE_INFINITY,\r
259                 0.0,\r
260                 0.0,\r
261                 Double.POSITIVE_INFINITY,\r
262                 1.23e300d,\r
263                 Double.NEGATIVE_INFINITY,\r
264                 -1.23e300d,\r
265                 4.9e-324d,\r
266                 0.0,\r
267                 -0.0,\r
268         };\r
269 \r
270         NumberFormat nfmt = NumberFormat.getInstance();\r
271 \r
272         for (int i = 0; i < data.length; i++) {\r
273             try {\r
274                 Number n = nfmt.parse(data[i]);\r
275                 if (expected[i] != n.doubleValue()) {\r
276                     errln("Failed: Parsed result for " + data[i] + ": " \r
277                             + n.doubleValue() + " / expected: " + expected[i]);\r
278                 }\r
279             } catch (ParseException pe) {\r
280                 errln("Failed: ParseException is thrown for " + data[i]);\r
281             }\r
282         }\r
283     }\r
284     \r
285     void checkNBSPPatternRtNum(String testcase, NumberFormat nf, double myNumber) {\r
286         String myString = nf.format(myNumber);\r
287         \r
288             double aNumber;\r
289             try {\r
290                 aNumber = nf.parse(myString).doubleValue();\r
291             } catch (ParseException e) {\r
292                 // TODO Auto-generated catch block\r
293                 errln("FAIL: " + testcase +" - failed to parse. " + e.toString());\r
294                 return;\r
295             }\r
296             if(Math.abs(aNumber-myNumber)>.001) {\r
297             errln("FAIL: "+testcase+": formatted "+myNumber+", parsed into "+aNumber+"\n");\r
298         } else {\r
299             logln("PASS: "+testcase+": formatted "+myNumber+", parsed into "+aNumber+"\n");\r
300         }\r
301     }\r
302 \r
303     void checkNBSPPatternRT(String testcase, NumberFormat nf) {\r
304         checkNBSPPatternRtNum(testcase, nf, 12345.);\r
305         checkNBSPPatternRtNum(testcase, nf, -12345.);\r
306     }\r
307 \r
308     public void TestNBSPInPattern() {\r
309     NumberFormat nf = null;\r
310     String testcase;\r
311     \r
312     \r
313     testcase="ar_AE UNUM_CURRENCY";\r
314     nf = NumberFormat.getCurrencyInstance(new ULocale("ar_AE"));\r
315     checkNBSPPatternRT(testcase, nf);\r
316     // if we don't have CLDR 1.6 data, bring out the problem anyways \r
317     \r
318     String SPECIAL_PATTERN = "\u00A4\u00A4'\u062f.\u0625.\u200f\u00a0'###0.00";\r
319     testcase = "ar_AE special pattern: " + SPECIAL_PATTERN;\r
320     nf = new DecimalFormat();\r
321     ((DecimalFormat)nf).applyPattern(SPECIAL_PATTERN);\r
322     checkNBSPPatternRT(testcase, nf);\r
323     \r
324     }\r
325     \r
326 }\r