alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Java example source code file (RoundingAndPropertyTest.java)

This example Java source code file (RoundingAndPropertyTest.java) is included in the alvinalexander.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Learn more about this Java project at its project page.

Java - Java tags/keywords

checking, currency, decimalformat, decimalformatsymbols, error, exact, expected, locale, math, numberformat, output, roundingmode, string, text, the, there, util

The RoundingAndPropertyTest.java Java example source code

/*
 * 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).");
        }
    }
}

Other Java examples (source code examples)

Here is a short list of links related to this Java RoundingAndPropertyTest.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.