9622de2aa8
Reviewed-by: naoto
187 lines
7.5 KiB
Java
187 lines
7.5 KiB
Java
/*
|
|
* Copyright (c) 2003, 2023, 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 Confirm that the decimal separator is shown when explicitly requested
|
|
* (or not shown if not requested). Tests against double, long, BigDecimal,
|
|
* and BigInteger with a combination of different patterns.
|
|
* @bug 4208135
|
|
* @run junit Bug4208135
|
|
*/
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigInteger;
|
|
import java.text.DecimalFormat;
|
|
import java.util.Locale;
|
|
import java.util.stream.Stream;
|
|
|
|
import org.junit.jupiter.api.AfterAll;
|
|
import org.junit.jupiter.api.BeforeAll;
|
|
import org.junit.jupiter.params.ParameterizedTest;
|
|
import org.junit.jupiter.params.provider.Arguments;
|
|
import org.junit.jupiter.params.provider.MethodSource;
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
|
public class Bug4208135 {
|
|
|
|
private static DecimalFormat df;
|
|
// Save JVM default Locale
|
|
private static final Locale savedLocale = Locale.getDefault();
|
|
|
|
// Set JVM default locale to US
|
|
@BeforeAll
|
|
static void init() {
|
|
Locale.setDefault(Locale.US);
|
|
}
|
|
|
|
// Restore JVM default locale
|
|
@AfterAll
|
|
static void tearDown() {
|
|
Locale.setDefault(savedLocale);
|
|
}
|
|
|
|
// Confirm that decimal separator shown when formatting a number
|
|
@ParameterizedTest
|
|
@MethodSource("fractionalDigitsWithSeparatorProvider")
|
|
public void fractionalDigitsWithSeparatorTest(Number num, String expected) {
|
|
df = getDF("0.#E0", true);
|
|
String actualFormatted = df.format(num);
|
|
assertEquals(expected, actualFormatted, getErrMsg("0.#E0", true));
|
|
}
|
|
|
|
// Combination of numbers and a fractional exponent pattern with a separator
|
|
private static Stream<Arguments> fractionalDigitsWithSeparatorProvider() {
|
|
return Stream.of(
|
|
Arguments.of(0.0, "0.E0"),
|
|
Arguments.of(10.0, "1.E1"),
|
|
Arguments.of(1000.0, "1.E3"),
|
|
Arguments.of(0L, "0.E0"),
|
|
Arguments.of(10L, "1.E1"),
|
|
Arguments.of(1000L, "1.E3"),
|
|
Arguments.of(new BigDecimal("0.0"), "0.E0"),
|
|
Arguments.of(new BigDecimal("10.0"), "1.E1"),
|
|
Arguments.of(new BigDecimal("1000.0"), "1.E3"),
|
|
Arguments.of(new BigInteger("00"), "0.E0"),
|
|
Arguments.of(new BigInteger("10"), "1.E1"),
|
|
Arguments.of(new BigInteger("1000"), "1.E3")
|
|
);
|
|
}
|
|
|
|
// Confirm that decimal separator not shown when formatting a number
|
|
@ParameterizedTest
|
|
@MethodSource("fractionalDigitsNoSeparatorProvider")
|
|
public void fractionalDigitsNoSeparatorTest(Number num, String expected) {
|
|
df = getDF("0.#E0", false);
|
|
String actualFormatted = df.format(num);
|
|
assertEquals(expected, actualFormatted, getErrMsg("0.#E0", false));
|
|
}
|
|
|
|
// Combination of numbers and a fractional exponent pattern with no separator
|
|
private static Stream<Arguments> fractionalDigitsNoSeparatorProvider() {
|
|
return Stream.of(
|
|
Arguments.of(0.0, "0E0"),
|
|
Arguments.of(10.0, "1E1"),
|
|
Arguments.of(1000.0, "1E3"),
|
|
Arguments.of(0L, "0E0"),
|
|
Arguments.of(10L, "1E1"),
|
|
Arguments.of(1000L, "1E3"),
|
|
Arguments.of(new BigDecimal("0.0"), "0E0"),
|
|
Arguments.of(new BigDecimal("10.0"), "1E1"),
|
|
Arguments.of(new BigDecimal("1000.0"), "1E3"),
|
|
Arguments.of(new BigInteger("00"), "0E0"),
|
|
Arguments.of(new BigInteger("10"), "1E1"),
|
|
Arguments.of(new BigInteger("1000"), "1E3")
|
|
);
|
|
}
|
|
|
|
// Confirm that decimal separator shown when formatting a number
|
|
@ParameterizedTest
|
|
@MethodSource("noFractionalDigitsWithSeparatorProvider")
|
|
public void noFractionalDigitsWithSeparatorTest(Number num, String expected) {
|
|
df = getDF("0.###", true);
|
|
String actualFormatted = df.format(num);
|
|
assertEquals(expected, actualFormatted, getErrMsg("0.###", true));
|
|
}
|
|
|
|
// Combination of numbers and a non-fractional exponent pattern with a separator
|
|
private static Stream<Arguments> noFractionalDigitsWithSeparatorProvider() {
|
|
return Stream.of(
|
|
Arguments.of(0.0, "0."),
|
|
Arguments.of(10.0, "10."),
|
|
Arguments.of(1000.0, "1000."),
|
|
Arguments.of(0L, "0."),
|
|
Arguments.of(10L, "10."),
|
|
Arguments.of(1000L, "1000."),
|
|
Arguments.of(new BigDecimal("0.0"), "0."),
|
|
Arguments.of(new BigDecimal("10.0"), "10."),
|
|
Arguments.of(new BigDecimal("1000.0"), "1000."),
|
|
Arguments.of(new BigInteger("00"), "0."),
|
|
Arguments.of(new BigInteger("10"), "10."),
|
|
Arguments.of(new BigInteger("1000"), "1000.")
|
|
);
|
|
}
|
|
|
|
// Confirm that decimal separator not shown when formatting a number
|
|
@ParameterizedTest
|
|
@MethodSource("noFractionalDigitsNoSeparatorProvider")
|
|
public void noFractionalDigitsNoSeparatorTest(Number num, String expected) {
|
|
df = getDF("0.###", false);
|
|
String actualFormatted = df.format(num);
|
|
assertEquals(expected, actualFormatted, getErrMsg("0.###", false));
|
|
}
|
|
|
|
// Combination of numbers and a non-fractional exponent pattern with no separator
|
|
private static Stream<Arguments> noFractionalDigitsNoSeparatorProvider() {
|
|
return Stream.of(
|
|
Arguments.of(0.0, "0"),
|
|
Arguments.of(10.0, "10"),
|
|
Arguments.of(1000.0, "1000"),
|
|
Arguments.of(0L, "0"),
|
|
Arguments.of(10L, "10"),
|
|
Arguments.of(1000L, "1000"),
|
|
Arguments.of(new BigDecimal("0.0"), "0"),
|
|
Arguments.of(new BigDecimal("10.0"), "10"),
|
|
Arguments.of(new BigDecimal("1000.0"), "1000"),
|
|
Arguments.of(new BigInteger("00"), "0"),
|
|
Arguments.of(new BigInteger("10"), "10"),
|
|
Arguments.of(new BigInteger("1000"), "1000")
|
|
);
|
|
}
|
|
|
|
// Creates clean DF and sets the pattern and separatorShown value
|
|
private static DecimalFormat getDF(String pattern, boolean separatorShown) {
|
|
df = new DecimalFormat();
|
|
df.applyPattern(pattern);
|
|
df.setDecimalSeparatorAlwaysShown(separatorShown);
|
|
return df;
|
|
}
|
|
|
|
// Utility to get a helpful error message when values are not as expected
|
|
private static String getErrMsg(String pattern, boolean separatorShown) {
|
|
return String.format("Fails with pattern= %s, with separatorShown = %s",
|
|
pattern, separatorShown);
|
|
}
|
|
}
|