]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/icu/dev/test/format/NumberFormatRoundTripTest.java
icu4jsrc
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / dev / test / format / NumberFormatRoundTripTest.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2001-2004, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 \r
8 /** \r
9  * Porting From: ICU4C v1.8.1 : format : NumberFormatRoundTripTest\r
10  * Source File: $ICU4CRoot/source/test/intltest/nmfmtrt.cpp\r
11  **/\r
12 \r
13 package com.ibm.icu.dev.test.format;\r
14 \r
15 import com.ibm.icu.text.*;\r
16 import java.util.Locale;\r
17 import java.util.Random;\r
18 \r
19 /** \r
20  * Performs round-trip tests for NumberFormat\r
21  **/\r
22 public class NumberFormatRoundTripTest extends com.ibm.icu.dev.test.TestFmwk {\r
23     \r
24     public double MAX_ERROR = 1e-14;\r
25     public double max_numeric_error = 0.0;\r
26     public double min_numeric_error = 1.0;\r
27     public boolean verbose = false;\r
28     public boolean STRING_COMPARE = false;\r
29     public boolean EXACT_NUMERIC_COMPARE = false;\r
30     public boolean DEBUG = false;\r
31     public boolean quick = true;\r
32     \r
33     public static void main(String[] args) throws Exception {\r
34         new NumberFormatRoundTripTest().run(args);\r
35     }\r
36     \r
37     public void TestNumberFormatRoundTrip() {\r
38     \r
39         NumberFormat fmt = null;\r
40     \r
41         logln("Default Locale");\r
42         \r
43         logln("Default Number format");\r
44         fmt = NumberFormat.getInstance();\r
45         _test(fmt);\r
46     \r
47         logln("Currency Format");\r
48         fmt = NumberFormat.getCurrencyInstance();\r
49         _test(fmt);\r
50     \r
51         logln("Percent Format");\r
52         fmt = NumberFormat.getPercentInstance();\r
53         _test(fmt);\r
54     \r
55     \r
56         int locCount = 0;\r
57         final Locale[] loc = NumberFormat.getAvailableLocales();\r
58         if(quick) {\r
59             if(locCount > 5)\r
60                 locCount = 5;\r
61             logln("Quick mode: only _testing first 5 Locales");\r
62         }\r
63         for(int i = 0; i < locCount; ++i) {\r
64             logln(loc[i].getDisplayName());\r
65     \r
66             fmt = NumberFormat.getInstance(loc[i]);\r
67             _test(fmt);\r
68         \r
69             fmt = NumberFormat.getCurrencyInstance(loc[i]);\r
70             _test(fmt);\r
71         \r
72             fmt = NumberFormat.getPercentInstance(loc[i]);\r
73             _test(fmt);\r
74         }\r
75     \r
76         logln("Numeric error " + min_numeric_error + " to " + max_numeric_error);\r
77     }\r
78     \r
79     /**\r
80      * Return a random value from -range..+range.\r
81      */\r
82     private Random random;\r
83     public double randomDouble(double range) {\r
84         if (random == null) {\r
85             random = createRandom(); // use test framework's random seed\r
86         }\r
87         return  random.nextDouble() * range;\r
88     } \r
89     \r
90     public void _test(NumberFormat fmt) {\r
91     \r
92         _test(fmt, Double.NaN);\r
93         _test(fmt, Double.POSITIVE_INFINITY);\r
94         _test(fmt, Double.NEGATIVE_INFINITY);\r
95     \r
96         _test(fmt, 500);\r
97         _test(fmt, 0);\r
98         _test(fmt, -0);\r
99         _test(fmt, 0.0);\r
100         double negZero = 0.0;\r
101         negZero /= -1.0;\r
102         _test(fmt, negZero);\r
103         _test(fmt, 9223372036854775808.0d);\r
104         _test(fmt, -9223372036854775809.0d);\r
105         //_test(fmt, 6.936065876100493E74d);\r
106         \r
107     //    _test(fmt, 6.212122845281909E48d);\r
108         for (int i = 0; i < 10; ++i) {\r
109     \r
110             _test(fmt, randomDouble(1));\r
111             \r
112             _test(fmt, randomDouble(10000));\r
113     \r
114             _test(fmt, Math.floor((randomDouble(10000))));\r
115     \r
116             _test(fmt, randomDouble(1e50));\r
117     \r
118             _test(fmt, randomDouble(1e-50));\r
119     \r
120             _test(fmt, randomDouble(1e100));\r
121     \r
122             _test(fmt, randomDouble(1e75));\r
123     \r
124             _test(fmt, randomDouble(1e308) / ((DecimalFormat) fmt).getMultiplier());\r
125     \r
126             _test(fmt, randomDouble(1e75) / ((DecimalFormat) fmt).getMultiplier());\r
127     \r
128             _test(fmt, randomDouble(1e65) / ((DecimalFormat) fmt).getMultiplier());\r
129     \r
130             _test(fmt, randomDouble(1e-292));\r
131     \r
132             _test(fmt, randomDouble(1e-78));\r
133     \r
134             _test(fmt, randomDouble(1e-323));\r
135     \r
136             _test(fmt, randomDouble(1e-100));\r
137     \r
138             _test(fmt, randomDouble(1e-78));\r
139         }\r
140     }\r
141     \r
142     public void _test(NumberFormat fmt, double value) {\r
143         _test(fmt, new Double(value));\r
144     }\r
145     \r
146     public void _test(NumberFormat fmt, long value) {\r
147         _test(fmt, new Long(value));\r
148     }\r
149     \r
150     public void _test(NumberFormat fmt, Number value) {\r
151         logln("test data = " + value);\r
152         fmt.setMaximumFractionDigits(999);\r
153         String s, s2;\r
154         if (value.getClass().getName().equalsIgnoreCase("java.lang.Double"))\r
155             s = fmt.format(value.doubleValue());\r
156         else\r
157             s = fmt.format(value.longValue());\r
158     \r
159         Number n = new Double(0);\r
160         boolean show = verbose;\r
161         if (DEBUG)\r
162             logln(\r
163             /*value.getString(temp) +*/ " F> " + s);\r
164         try {\r
165             n = fmt.parse(s);\r
166         } catch (java.text.ParseException e) {\r
167             System.out.println(e);\r
168         }\r
169     \r
170         if (DEBUG)\r
171             logln(s + " P> " /*+ n.getString(temp)*/);\r
172     \r
173         if (value.getClass().getName().equalsIgnoreCase("java.lang.Double"))\r
174             s2 = fmt.format(n.doubleValue());\r
175         else\r
176             s2 = fmt.format(n.longValue());\r
177     \r
178         if (DEBUG)\r
179             logln(/*n.getString(temp) +*/ " F> " + s2);\r
180     \r
181         if (STRING_COMPARE) {\r
182             if (!s.equals(s2)) {\r
183                 errln("*** STRING ERROR \"" + s + "\" != \"" + s2 + "\"");\r
184                 show = true;\r
185             }\r
186         }\r
187     \r
188         if (EXACT_NUMERIC_COMPARE) {\r
189             if (value != n) {\r
190                 errln("*** NUMERIC ERROR");\r
191                 show = true;\r
192             }\r
193         } else {\r
194             // Compute proportional error\r
195             double error = proportionalError(value, n);\r
196     \r
197             if (error > MAX_ERROR) {\r
198                 errln("*** NUMERIC ERROR " + error);\r
199                 show = true;\r
200             }\r
201     \r
202             if (error > max_numeric_error)\r
203                 max_numeric_error = error;\r
204             if (error < min_numeric_error)\r
205                 min_numeric_error = error;\r
206         }\r
207     \r
208         if (show)\r
209             logln(\r
210             /*value.getString(temp) +*/ value.getClass().getName() + " F> " + s + " P> " +\r
211             /*n.getString(temp) +*/ n.getClass().getName() + " F> " + s2);\r
212     \r
213     }\r
214         \r
215     public double proportionalError(Number a, Number b) {\r
216         double aa,bb;\r
217         \r
218         if(a.getClass().getName().equalsIgnoreCase("java.lang.Double"))\r
219             aa = a.doubleValue();\r
220         else\r
221             aa = a.longValue();\r
222     \r
223         if(a.getClass().getName().equalsIgnoreCase("java.lang.Double"))\r
224             bb = b.doubleValue();\r
225         else\r
226             bb = b.longValue();\r
227     \r
228         double error = aa - bb;\r
229         if(aa != 0 && bb != 0) \r
230             error /= aa;\r
231            \r
232         return Math.abs(error);\r
233     }   \r
234 }\r