/* * Copyright (c) 2012, 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 * @bug 7050528 * @summary Test java.text.DecimalFormat fast-path for format(double...) * @author Olivier Lagneau * @run main RoundingAndPropertyTest * */ /* ----------------------------------------------------------------------------- * Note : * Since fast-path algorithm does not modify any feature of DecimalFormat, * some tests or values in this program may have to be adapted/added/removed * when any change has been done in the fast-path source code, because the * conditions for exercising fast-path may change. * * This is specially true if the set of constraints to fall in the fast-path * case is relaxed in any manner. * * Usage : * - Run main without any argument to test against a set of golden values and * associated results hard-coded in the source code. That will do the tests * described below * See below comment section named "Description". * * or * * - Run main with string argument "-gengold" to output source code of * GoldenFormattedValues.java class file with the jdk version used while * generating the code. * See below comment section named : "Modifying Golden Values". * * In case of error while running the test, a Runtime exception is generated * providing the numbers of errors detected (format of golden values checks and * property changes checks), and the program exit. * * Description : * * This test first checks that localization of digits is done correctly when * calling DecimalFormat.format() on the array of values DecimalLocalizationValues * found in GoldenDoubleValues, using the locale FullLocalizationTestLocale * (from GoldenDoubleValues) that implies localization of digits. it checks the * the results against expected returned string. In case of formatting error, * it provides a message informing which value was wrongly formatted. * * Then it checks the results of calling NumberFormat.format(double) on a set * of predefined golden values and checks results against expected returned * string. It does this both for the decimal case, with an instance returned * NumberFormat.getInstance() call and for the currency case, with an instance * returned by NumberFormat.getCurrencyInstance(). Almost all the tested double * values satisfy the constraints assumed by the fast-path algorithm for * format(double ...). Some are voluntarily outside the scope of fast-path to * check that the algorithm correctly eliminate them. In case of formatting * error a message provides information on the golden value raising the error * (value, exact decimal value (using BidDecimal), expected result, formatted result). * * Last the test checks the status and behavior of a DecimalFormat instance * when changing properties that make this instance satisfy/invalidate its * fast-path status, depending on the predefined set of fast-path constraints. * * The golden results are predefined arrays of int[] containing the unicode * ints of the chars in the expected formatted string, when using locale * provided in GoldenDoubleValues class. The results are those obtained by * using a reference jdk version (for example one that does not contains the * DecimalFormat fast-path algorithm, like jdk80-b25). * * The double values from which we get golden results are stored inside two * arrays of double values: * - DecimalGoldenValues for testing NumberFormat.getInstance(). * - CurrencyGoldenValues for testing NumberFormat.getCurrencyInstance(). * These arrays are located in GoldenDoubleValues.java source file. * * For each double value in the arrays above, there is an associated golden * result. These results are stored in arrays of int[]: * - DecimalGoldenFormattedValues for expected decimal golden results. * - CurrencyGoldenFormattedValues for expected currency golden results. * - DecimalDigitsLocalizedFormattedValues for expected localized digit results. * * We store the results in int[] arrays containing the expected unicode values * because the compiler that will compile the containing java file may use a * different locale than the one registered in GoldenDoubleValues.java. These * arrays are located in a separate GoldenFormattedValues.java source file * that is generated by RoundingAndPropertyTest using "-gengold" parameter. * See below "Modifying Golden Values". * * The golden value arrays can be expanded, modified ... to test additional * or different double values. In that case, the source file of class * GoldenFormattedValues must be regenerated to replace the existing one.. * * Modifying Golden Values : * * In order to ease further modification of the list of double values checked * and associated golden results, the test includes the method * generatesGoldenFormattedValuesClass() that writes on standard output stream * the source code for GoldenFormattedValues class that includes the expected * results arrays. * * Here are the steps to follow for updating/modifying golden values and results: * 1- Edit GoldenDoubleValues.java to add/remove/modify golden or localization * values. * 2- Run main with "-gengold" string argument with a target jdk. * (at the creation of this test file, the target jdk used was jdk1.8.0-ea). * 2- Copy this java code that has been writen on standard output and replace * GoldenFormattedValues.java contents by the generated output. * 3- Check that this updated code compiles. * [4]- If needed replaces existing GoldenDoubleValues and GoldenFormattedValues * files in jdk/test section, respectively by the one modified at step 1 and * generated at step 2. * ----------------------------------------------------------------------------- */ import java.util.*; import java.text.NumberFormat; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.math.RoundingMode; import java.math.BigDecimal; public class RoundingAndPropertyTest { // Prints on standard output stream the unicode values of chars as a // comma-separated list of int values private static void printUnicodeValuesArray(char[] chars) { for (int i = 0; i < chars.length; i++) { System.out.print((int) chars[i]); if (i != (chars.length - 1)) System.out.print(", "); } } // Converts given array of unicode values as an array of chars. // Returns this converted array. private static char[] getCharsFromUnicodeArray(int[] unicodeValues) { char[] chars = new char[unicodeValues.length]; for (int i = 0; i < unicodeValues.length; i++) { chars[i] = (char) unicodeValues[i]; } return chars; } /* Prints on standard output stream the java code of resulting * GoldenFormattedValues class for the golden values found in * class GoldenDoubleValues. */ private static void generatesGoldenFormattedValuesClass() { String fourWhiteSpaces = " "; String eightWhiteSpaces = " "; // Prints header without Copyright header. System.out.println("/* This is a machine generated file - Please DO NOT EDIT !"); System.out.println(" * Change RoundingAndPropertyTest instead,"); System.out.println(" * and run with \"-gengold\" argument to regenerate (without copyright header)."); System.out.println(" */"); System.out.println(); System.out.println("/* This file contains the set of result Strings expected from calling inside"); System.out.println(" * RoundingAndPropertyTest the method NumberFormat.format() upon the set of"); System.out.println(" * double values provided in GoldenDoubleValues.java. It contains three arrays,"); System.out.println(" * each containing arrays of unicode values representing the expected string"); System.out.println(" * result when calling format() on the corresponding (i.e. same index) double"); System.out.println(" * value found in GoldenDoubleValues arrays :"); System.out.println(" * - DecimalDigitsLocalizedFormattedValues corresponds to DecimalLocalizationValues,"); System.out.println(" * when using FullLocalizationTestLocale to format."); System.out.println(" * - DecimalGoldenFormattedValues corresponds to DecimalGoldenValues, when used"); System.out.println(" * in the decimal pattern case together with TestLocale."); System.out.println(" * - CurrencyGoldenFormattedValues corresponds to CurrencyGoldenValues. when used"); System.out.println(" * in the currency pattern case together with TestLocale."); System.out.println(" * Please see documentation in RoundingAndPropertyTest.java for more details."); System.out.println(" *"); System.out.println(" * This file generated by running RoundingAndPropertyTest with \"-gengold\" argument."); System.out.println(" */"); System.out.println(); // Prints beginning of class GoldenFormattedValues. System.out.println("class GoldenFormattedValues {"); System.out.println(); System.out.println( fourWhiteSpaces + "// The formatted values below were generated from golden values"); System.out.print( fourWhiteSpaces + "// listed in GoldenDoubleValues.java,"); System.out.println(" using the following jvm version :"); System.out.println( fourWhiteSpaces + "// " + System.getProperty("java.vendor") + " " + System.getProperty("java.vm.name") + " " + System.getProperty("java.version")); System.out.println( fourWhiteSpaces + "// locale for golden double values : " + GoldenDoubleValues.TestLocale); System.out.println( fourWhiteSpaces + "// locale for testing digit localization : " + GoldenDoubleValues.FullLocalizationTestLocale); System.out.println(); // Prints the expected results when digit localization happens System.out.println( fourWhiteSpaces + "// The array of int[] unicode values storing the expected results"); System.out.print( fourWhiteSpaces + "// when experiencing full localization of digits"); System.out.println(" on DecimalLocalizationValues."); System.out.println( fourWhiteSpaces + "static int[][] DecimalDigitsLocalizedFormattedValues = {"); NumberFormat df = NumberFormat.getInstance(GoldenDoubleValues.FullLocalizationTestLocale); for (int i = 0; i < GoldenDoubleValues.DecimalLocalizationValues.length; i++) { double d = GoldenDoubleValues.DecimalLocalizationValues[i]; String formatted = df.format(d); char[] decFmtChars = formatted.toCharArray(); System.out.print(eightWhiteSpaces + "{ "); printUnicodeValuesArray(decFmtChars); System.out.println(" },"); } System.out.println(fourWhiteSpaces + "};"); System.out.println(); // Prints the golden expected results for the decimal pattern case System.out.println( fourWhiteSpaces + "// The array of int[] unicode values storing the expected results"); System.out.print( fourWhiteSpaces + "// when calling Decimal.format(double)"); System.out.println(" on the decimal GoldenDoubleValues."); System.out.println( fourWhiteSpaces + "static int[][] DecimalGoldenFormattedValues = {"); df = NumberFormat.getInstance(GoldenDoubleValues.TestLocale); for (int i = 0; i < GoldenDoubleValues.DecimalGoldenValues.length; i++) { double d = GoldenDoubleValues.DecimalGoldenValues[i]; String formatted = df.format(d); char[] decFmtChars = formatted.toCharArray(); System.out.print(eightWhiteSpaces + "{ "); printUnicodeValuesArray(decFmtChars); System.out.println(" },"); } System.out.println(fourWhiteSpaces + "};"); System.out.println(); // Prints the golden expected results for the currency pattern case System.out.println( fourWhiteSpaces + "// The array of int[] unicode values storing the expected results"); System.out.print( fourWhiteSpaces + "// when calling Decimal.format(double)"); System.out.println(" on the currency GoldenDoubleValues."); System.out.println( fourWhiteSpaces + "static int[][] CurrencyGoldenFormattedValues = {"); NumberFormat cf = NumberFormat.getCurrencyInstance(GoldenDoubleValues.TestLocale); for (int i = 0; i < GoldenDoubleValues.CurrencyGoldenValues.length; i++) { double d = GoldenDoubleValues.CurrencyGoldenValues[i]; String formatted = cf.format(d); char[] decFmtChars = formatted.toCharArray(); System.out.print(eightWhiteSpaces + "{ "); printUnicodeValuesArray(decFmtChars); System.out.println(" },"); } System.out.println(fourWhiteSpaces + "};"); System.out.println(); // Prints end of GoldenFormattedValues class. System.out.println("}"); } private static int testLocalizationValues() { DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(GoldenDoubleValues.FullLocalizationTestLocale); double[] localizationValues = GoldenDoubleValues.DecimalLocalizationValues; int size = localizationValues.length; int successCounter = 0; int failureCounter = 0; for (int i = 0; i < size; i++) { double d = localizationValues[i]; String formatted = df.format(d); char[] expectedUnicodeArray = getCharsFromUnicodeArray( GoldenFormattedValues.DecimalDigitsLocalizedFormattedValues[i]); String expected = new String(expectedUnicodeArray); if (!formatted.equals(expected)) { failureCounter++; System.out.println( "--- Localization error for value d = " + d + ". Exact value = " + new BigDecimal(d).toString() + ". Expected result = " + expected + ". Output result = " + formatted); } else successCounter++; } System.out.println("Checked positively " + successCounter + " golden decimal values out of " + size + " tests. There were " + failureCounter + " format failure"); return failureCounter; } private static int testGoldenValues(java.text.DecimalFormat df, java.text.DecimalFormat cf) { double[] goldenDecimalValues = GoldenDoubleValues.DecimalGoldenValues; int decimalSize = goldenDecimalValues.length; int decimalSuccessCounter = 0; int decimalFailureCounter = 0; for (int i = 0; i < decimalSize; i++) { double d = goldenDecimalValues[i]; String formatted = df.format(d); char[] expectedUnicodeArray = getCharsFromUnicodeArray( GoldenFormattedValues.DecimalGoldenFormattedValues[i]); String expected = new String(expectedUnicodeArray); if (!formatted.equals(expected)) { decimalFailureCounter++; System.out.println( "--- Error for golden value d = " + d + ". Exact value = " + new BigDecimal(d).toString() + ". Expected result = " + expected + ". Output result = " + formatted); } else decimalSuccessCounter++; } System.out.println("Checked positively " + decimalSuccessCounter + " golden decimal values out of " + decimalSize + " tests. There were " + decimalFailureCounter + " format failure"); double[] goldenCurrencyValues = GoldenDoubleValues.CurrencyGoldenValues; int currencySize = goldenCurrencyValues.length; int currencySuccessCounter = 0; int currencyFailureCounter = 0; for (int i = 0; i < currencySize; i++) { double d = goldenCurrencyValues[i]; String formatted = cf.format(d); char[] expectedUnicodeArray = getCharsFromUnicodeArray( GoldenFormattedValues.CurrencyGoldenFormattedValues[i]); String expected = new String(expectedUnicodeArray); if (!formatted.equals(expected)) { currencyFailureCounter++; System.out.println( "--- Error for golden value d = " + d + ". Exact value = " + new BigDecimal(d).toString() + ". Expected result = " + expected + ". Output result = " + formatted); } else currencySuccessCounter++; } System.out.println("Checked positively " + currencySuccessCounter + " golden currency values out of " + currencySize + " tests. There were " + currencyFailureCounter + " format failure"); return (decimalFailureCounter + currencyFailureCounter); } // Checks that the two passed s1 and s2 string are equal, and prints // out message in case of error. private static boolean resultsEqual(String propertyName, String s1, String s2) { boolean equality = s1.equals(s2); if (!equality) System.out.println( "\n*** Error while reverting to default " + propertyName + " property.\n" + " initial output = " + s1 + ". reverted output = " + s2 + "."); else System.out.println(" Test passed."); return equality; } /* This methods checks the behaviour of the management of properties * of a DecimalFormat instance that satisfies fast-path constraints. * * It does this by comparing the results of the format(double) output * obtained from initial fast-path state with the output provided by * the same instance that has been pushed and exercised outside * fast-path rules and finally "reverted" to its initial fast-path state. * * The schema of actions is this : * - Call format(double) on a known DecimalFormat fast-path instance, * and store this result. * - Record the current state of a given property. * - Change the property to invalidate the fast-path state. * - Call again format(double) on the instance. * - Revert state of property to validate again fast-path context. * - Call format(double) again. * - Check that first and last call to format(double) provide same result * - Record failure if any. * - Do the same for another property with the same instance. * So all the property changes are chained one after the other on only the * same instance. * * Some properties that currently do not influence the fast-path state * are also tested. This is not useful with current fast-path source * but is here for testing the whole set of properties. This is the case * for prefixes and suffixes, and parseBigDecimal properties. */ private static int testSettersAndFastPath(DecimalFormat df, boolean isCurrency) { final double d1 = GoldenDoubleValues.PROPERTY_CHECK_POSITIVE_VALUE; final double d2 = GoldenDoubleValues.PROPERTY_CHECK_NEGATIVE_VALUE; int errors = 0; boolean testSucceeded = false; String firstFormatResult; String secondFormatResult; String propertyName; // ---- positivePrefix property test ---- testSucceeded = false; propertyName = "positivePrefix"; System.out.print("Checking " + propertyName + " property."); String initialPrefix = df.getPositivePrefix(); firstFormatResult = df.format(d1); df.setPositivePrefix("positivePrefix:"); df.format(d1); df.setPositivePrefix(initialPrefix); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- positiveSuffix property test ---- testSucceeded = false; propertyName = "positiveSuffix"; System.out.print("Checking " + propertyName + " property."); String initialSuffix = df.getPositiveSuffix(); firstFormatResult = df.format(d1); df.setPositiveSuffix("positiveSuffix:"); df.format(d1); df.setPositiveSuffix(initialSuffix); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName,firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- negativePrefix property test ---- testSucceeded = false; propertyName = "negativePrefix"; System.out.print("Checking " + propertyName + " property."); initialPrefix = df.getNegativePrefix(); firstFormatResult = df.format(d1); df.setNegativePrefix("negativePrefix:"); df.format(d1); df.setNegativePrefix(initialPrefix); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- negativeSuffix property test ---- testSucceeded = false; propertyName = "negativeSuffix"; System.out.print("Checking " + propertyName + " property."); initialSuffix = df.getNegativeSuffix(); firstFormatResult = df.format(d1); df.setNegativeSuffix("negativeSuffix:"); df.format(d1); df.setNegativeSuffix(initialSuffix); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- multiplier property test ---- testSucceeded = false; propertyName = "multiplier"; System.out.print("Checking " + propertyName + " property."); int initialMultiplier = df.getMultiplier(); firstFormatResult = df.format(d1); df.setMultiplier(10); df.format(d1); df.setMultiplier(initialMultiplier); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- groupingUsed property test ---- testSucceeded = false; propertyName = "groupingUsed"; System.out.print("Checking " + propertyName + " property."); boolean initialGroupingUsed = df.isGroupingUsed(); firstFormatResult = df.format(d1); df.setGroupingUsed(!initialGroupingUsed); df.format(d1); df.setGroupingUsed(initialGroupingUsed); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- groupingSize property test ---- testSucceeded = false; propertyName = "groupingSize"; System.out.print("Checking " + propertyName + " property."); int initialGroupingSize = df.getGroupingSize(); firstFormatResult = df.format(d1); df.setGroupingSize(initialGroupingSize + 1); df.format(d1); df.setGroupingSize(initialGroupingSize); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- decimalSeparatorAlwaysShown property test ---- testSucceeded = false; propertyName = "decimalSeparatorAlwaysShown"; System.out.print("Checking " + propertyName + " property."); boolean initialDSShown = df.isDecimalSeparatorAlwaysShown(); firstFormatResult = df.format(d1); df.setDecimalSeparatorAlwaysShown(!initialDSShown); df.format(d1); df.setDecimalSeparatorAlwaysShown(initialDSShown); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- parseBigDecimal property test ---- testSucceeded = false; propertyName = "parseBigDecimal"; System.out.print("Checking " + propertyName + " property."); boolean initialParseBigdecimal = df.isParseBigDecimal(); firstFormatResult = df.format(d1); df.setParseBigDecimal(!initialParseBigdecimal); df.format(d1); df.setParseBigDecimal(initialParseBigdecimal); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- maximumIntegerDigits property test ---- testSucceeded = false; propertyName = "maximumIntegerDigits"; System.out.print("Checking " + propertyName + " property."); int initialMaxIDs = df.getMaximumIntegerDigits(); firstFormatResult = df.format(d1); df.setMaximumIntegerDigits(8); df.format(d1); df.setMaximumIntegerDigits(initialMaxIDs); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- minimumIntegerDigits property test ---- testSucceeded = false; propertyName = "minimumIntegerDigits"; System.out.print("Checking " + propertyName + " property."); int initialMinIDs = df.getMinimumIntegerDigits(); firstFormatResult = df.format(d1); df.setMinimumIntegerDigits(2); df.format(d1); df.setMinimumIntegerDigits(initialMinIDs); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- maximumFractionDigits property test ---- testSucceeded = false; propertyName = "maximumFractionDigits"; System.out.print("Checking " + propertyName + " property."); firstFormatResult = df.format(d1); df.setMaximumFractionDigits(8); df.format(d1); if (isCurrency) { df.setMinimumFractionDigits(2); df.setMaximumFractionDigits(2); } else { df.setMinimumFractionDigits(0); df.setMaximumFractionDigits(3); } secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- minimumFractionDigits property test ---- testSucceeded = false; propertyName = "minimumFractionDigits"; System.out.print("Checking " + propertyName + " property."); firstFormatResult = df.format(d1); df.setMinimumFractionDigits(1); df.format(d1); if (isCurrency) { df.setMinimumFractionDigits(2); df.setMaximumFractionDigits(2); } else { df.setMinimumFractionDigits(0); df.setMaximumFractionDigits(3); } secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- currency property test ---- testSucceeded = false; propertyName = "currency"; System.out.print("Checking " + propertyName + " property."); Currency initialCurrency = df.getCurrency(); Currency japanCur = java.util.Currency.getInstance(Locale.JAPAN); firstFormatResult = df.format(d1); df.setCurrency(japanCur); df.format(d1); df.setCurrency(initialCurrency); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- roundingMode property test ---- testSucceeded = false; propertyName = "roundingMode"; System.out.print("Checking " + propertyName + " property."); RoundingMode initialRMode = df.getRoundingMode(); firstFormatResult = df.format(d1); df.setRoundingMode(RoundingMode.HALF_UP); df.format(d1); df.setRoundingMode(RoundingMode.HALF_EVEN); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; // ---- decimalFormatSymbols property test ---- testSucceeded = false; propertyName = "decimalFormatSymbols"; System.out.print("Checking " + propertyName + " property."); DecimalFormatSymbols initialDecimalFormatSymbols = df.getDecimalFormatSymbols(); firstFormatResult = df.format(d1); Locale bizarreLocale = new Locale("fr", "FR"); DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(bizarreLocale); unusualSymbols.setDecimalSeparator('@'); unusualSymbols.setGroupingSeparator('|'); df.setDecimalFormatSymbols(unusualSymbols); df.format(d1); df.setDecimalFormatSymbols(initialDecimalFormatSymbols); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; testSucceeded = false; System.out.print("Checking " + propertyName + " property."); initialDecimalFormatSymbols = df.getDecimalFormatSymbols(); firstFormatResult = df.format(d1); Locale japanLocale = Locale.JAPAN; unusualSymbols = new DecimalFormatSymbols(japanLocale); unusualSymbols.setDecimalSeparator('9'); unusualSymbols.setGroupingSeparator('0'); df.setDecimalFormatSymbols(unusualSymbols); df.format(d1); df.setDecimalFormatSymbols(initialDecimalFormatSymbols); secondFormatResult = df.format(d1); testSucceeded = resultsEqual(propertyName, firstFormatResult, secondFormatResult); if (!testSucceeded) errors++; return errors; } // Main for RoundingAndPropertyTest. We test first the golden values, // and then the property setters and getters. public static void main(String[] args) { if ((args.length >= 1) && (args[0].equals("-gengold"))) generatesGoldenFormattedValuesClass(); else { System.out.println("\nChecking correctness of formatting with digit localization."); System.out.println("============================================================="); int localizationErrors = testLocalizationValues(); if (localizationErrors != 0) System.out.println("*** Failure in localization tests : " + localizationErrors + " errors detected "); else System.out.println(" Tests for full localization of digits all passed."); DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(GoldenDoubleValues.TestLocale); DecimalFormat cf = (DecimalFormat) NumberFormat.getCurrencyInstance(GoldenDoubleValues.TestLocale); System.out.println("\nChecking correctness of formating for golden values."); System.out.println("============================================================="); int goldenValuesErrors = testGoldenValues(df,cf); if (goldenValuesErrors != 0) System.out.println("*** Failure in goldenValues tests : " + goldenValuesErrors + " errors detected "); else System.out.println(" Tests for golden values all passed."); System.out.println("\nChecking behavior of property changes for decimal case."); System.out.println("============================================================="); int decimalTestsErrors = testSettersAndFastPath(df, false); if (decimalTestsErrors != 0) System.out.println("*** Failure in decimal property changes tests : " + decimalTestsErrors + " errors detected "); else System.out.println(" Tests for decimal property changes all passed."); System.out.println("\nChecking behavior of property changes for currency case."); System.out.println("============================================================="); int currencyTestsErrors = testSettersAndFastPath(cf, true); if (currencyTestsErrors != 0) System.out.println("*** Failure in currency property changes tests : " + currencyTestsErrors + " errors detected "); else System.out.println(" Tests for currency property chamges all passed."); if ((localizationErrors > 0) || (goldenValuesErrors > 0) || (decimalTestsErrors > 0) || (currencyTestsErrors > 0)) throw new RuntimeException( "Failed with " + (localizationErrors + goldenValuesErrors + decimalTestsErrors + currencyTestsErrors) + " error(s)."); } } }