2 *******************************************************************************
\r
3 * Copyright (C) 2001-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
9 * Porting From: ICU4C v1.8.1 : format : NumberFormatRoundTripTest
\r
10 * Source File: $ICU4CRoot/source/test/intltest/nmfmtrt.cpp
\r
13 package com.ibm.icu.dev.test.format;
\r
15 import java.util.Locale;
\r
16 import java.util.Random;
\r
18 import com.ibm.icu.text.DecimalFormat;
\r
19 import com.ibm.icu.text.NumberFormat;
\r
22 * Performs round-trip tests for NumberFormat
\r
24 public class NumberFormatRoundTripTest extends com.ibm.icu.dev.test.TestFmwk {
\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
35 public static void main(String[] args) throws Exception {
\r
36 new NumberFormatRoundTripTest().run(args);
\r
39 public void TestNumberFormatRoundTrip() {
\r
41 NumberFormat fmt = null;
\r
43 logln("Default Locale");
\r
45 logln("Default Number format");
\r
46 fmt = NumberFormat.getInstance();
\r
49 logln("Currency Format");
\r
50 fmt = NumberFormat.getCurrencyInstance();
\r
53 logln("Percent Format");
\r
54 fmt = NumberFormat.getPercentInstance();
\r
59 final Locale[] loc = NumberFormat.getAvailableLocales();
\r
63 logln("Quick mode: only _testing first 5 Locales");
\r
65 for(int i = 0; i < locCount; ++i) {
\r
66 logln(loc[i].getDisplayName());
\r
68 fmt = NumberFormat.getInstance(loc[i]);
\r
71 fmt = NumberFormat.getCurrencyInstance(loc[i]);
\r
74 fmt = NumberFormat.getPercentInstance(loc[i]);
\r
78 logln("Numeric error " + min_numeric_error + " to " + max_numeric_error);
\r
82 * Return a random value from -range..+range.
\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
89 return random.nextDouble() * range;
\r
92 public void _test(NumberFormat fmt) {
\r
94 _test(fmt, Double.NaN);
\r
95 _test(fmt, Double.POSITIVE_INFINITY);
\r
96 _test(fmt, Double.NEGATIVE_INFINITY);
\r
102 double negZero = 0.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
109 // _test(fmt, 6.212122845281909E48d);
\r
110 for (int i = 0; i < 10; ++i) {
\r
112 _test(fmt, randomDouble(1));
\r
114 _test(fmt, randomDouble(10000));
\r
116 _test(fmt, Math.floor((randomDouble(10000))));
\r
118 _test(fmt, randomDouble(1e50));
\r
120 _test(fmt, randomDouble(1e-50));
\r
122 _test(fmt, randomDouble(1e100));
\r
124 _test(fmt, randomDouble(1e75));
\r
126 _test(fmt, randomDouble(1e308) / ((DecimalFormat) fmt).getMultiplier());
\r
128 _test(fmt, randomDouble(1e75) / ((DecimalFormat) fmt).getMultiplier());
\r
130 _test(fmt, randomDouble(1e65) / ((DecimalFormat) fmt).getMultiplier());
\r
132 _test(fmt, randomDouble(1e-292));
\r
134 _test(fmt, randomDouble(1e-78));
\r
136 _test(fmt, randomDouble(1e-323));
\r
138 _test(fmt, randomDouble(1e-100));
\r
140 _test(fmt, randomDouble(1e-78));
\r
144 public void _test(NumberFormat fmt, double value) {
\r
145 _test(fmt, new Double(value));
\r
148 public void _test(NumberFormat fmt, long value) {
\r
149 _test(fmt, new Long(value));
\r
152 public void _test(NumberFormat fmt, Number value) {
\r
153 logln("test data = " + value);
\r
154 fmt.setMaximumFractionDigits(999);
\r
156 if (value.getClass().getName().equalsIgnoreCase("java.lang.Double"))
\r
157 s = fmt.format(value.doubleValue());
\r
159 s = fmt.format(value.longValue());
\r
161 Number n = new Double(0);
\r
162 boolean show = verbose;
\r
165 /*value.getString(temp) +*/ " F> " + s);
\r
168 } catch (java.text.ParseException e) {
\r
169 System.out.println(e);
\r
173 logln(s + " P> " /*+ n.getString(temp)*/);
\r
175 if (value.getClass().getName().equalsIgnoreCase("java.lang.Double"))
\r
176 s2 = fmt.format(n.doubleValue());
\r
178 s2 = fmt.format(n.longValue());
\r
181 logln(/*n.getString(temp) +*/ " F> " + s2);
\r
183 if (STRING_COMPARE) {
\r
184 if (!s.equals(s2)) {
\r
185 errln("*** STRING ERROR \"" + s + "\" != \"" + s2 + "\"");
\r
190 if (EXACT_NUMERIC_COMPARE) {
\r
192 errln("*** NUMERIC ERROR");
\r
196 // Compute proportional error
\r
197 double error = proportionalError(value, n);
\r
199 if (error > MAX_ERROR) {
\r
200 errln("*** NUMERIC ERROR " + error);
\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
212 /*value.getString(temp) +*/ value.getClass().getName() + " F> " + s + " P> " +
\r
213 /*n.getString(temp) +*/ n.getClass().getName() + " F> " + s2);
\r
217 public double proportionalError(Number a, Number b) {
\r
220 if(a.getClass().getName().equalsIgnoreCase("java.lang.Double"))
\r
221 aa = a.doubleValue();
\r
223 aa = a.longValue();
\r
225 if(a.getClass().getName().equalsIgnoreCase("java.lang.Double"))
\r
226 bb = b.doubleValue();
\r
228 bb = b.longValue();
\r
230 double error = aa - bb;
\r
231 if(aa != 0 && bb != 0)
\r
234 return Math.abs(error);
\r