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