/* * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * @test * @summary round trip test NumberFormat * @library /java/text/testlib * @key randomness */ import java.text.*; import java.util.*; /** * This class tests the round-trip behavior of NumberFormat, DecimalFormat, and DigitList. * Round-trip behavior is tested by taking a numeric value and formatting it, then * parsing the resulting string, and comparing this result with the original value. * Two tests are applied: String preservation, and numeric preservation. String * preservation is exact; numeric preservation is not. However, numeric preservation * should extend to the few least-significant bits. * //bug472 */ public class NumberRoundTrip extends IntlTest { static final boolean STRING_COMPARE = true; static final boolean EXACT_NUMERIC_COMPARE = false; static final double MAX_ERROR = 1e-14; static boolean DEBUG = false; static double max_numeric_error = 0; static double min_numeric_error = 1; String localeName, formatName; public static void main(String[] args) throws Exception { if (args.length > 0 && args[0].equals("-debug")) { DEBUG = true; String[] newargs = new String[args.length - 1]; System.arraycopy(args, 1, newargs, 0, newargs.length); args = newargs; } new NumberRoundTrip().run(args); } public void TestNumberFormatRoundTrip() { logln("Default Locale"); localeName = "Default Locale"; formatName = "getInstance"; doTest(NumberFormat.getInstance()); formatName = "getNumberInstance"; doTest(NumberFormat.getNumberInstance()); formatName = "getCurrencyInstance"; doTest(NumberFormat.getCurrencyInstance()); formatName = "getPercentInstance"; doTest(NumberFormat.getPercentInstance()); Locale[] loc = NumberFormat.getAvailableLocales(); for (int i=0; i " + escape(s)); n = fmt.parse(s); if (DEBUG) logln(" " + escape(s) + " P> " + n); s2 = fmt.format(n); if (DEBUG) logln(" " + n + " F> " + escape(s2)); if (STRING_COMPARE) { if (!s.equals(s2)) { if (fmt instanceof DecimalFormat) { logln("Text mismatch: expected: " + s + ", got: " + s2 + " --- Try BigDecimal parsing."); ((DecimalFormat)fmt).setParseBigDecimal(true); n = fmt.parse(s); if (DEBUG) logln(" " + escape(s) + " P> " + n); s2 = fmt.format(n); if (DEBUG) logln(" " + n + " F> " + escape(s2)); ((DecimalFormat)fmt).setParseBigDecimal(false); if (!s.equals(s2)) { err = "STRING ERROR(DecimalFormat): "; } } else { err = "STRING ERROR(NumberFormat): "; } } } if (EXACT_NUMERIC_COMPARE) { if (value.doubleValue() != n.doubleValue()) { err += "NUMERIC ERROR: "; } } else { // Compute proportional error double error = proportionalError(value, n); if (error > MAX_ERROR) { err += "NUMERIC ERROR " + error + ": "; } if (error > max_numeric_error) max_numeric_error = error; if (error < min_numeric_error) min_numeric_error = error; } String message = value + typeOf(value) + " F> " + escape(s) + " P> " + n + typeOf(n) + " F> " + escape(s2); if (err.length() > 0) { errln("*** " + err + " with " + formatName + " in " + localeName + " " + message); } else { logln(message); } } catch (ParseException e) { errln("*** " + e.toString() + " with " + formatName + " in " + localeName); } } static String typeOf(Number n) { if (n instanceof Long) return " Long"; if (n instanceof Double) return " Double"; return " Number"; } static String escape(String s) { StringBuffer buf = new StringBuffer(); for (int i=0; i> 12)); buf.append(Integer.toHexString((c & 0x0F00) >> 8)); buf.append(Integer.toHexString((c & 0x00F0) >> 4)); buf.append(Integer.toHexString(c & 0x000F)); } } return buf.toString(); } }