809N/A/*
2362N/A * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
809N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
809N/A *
809N/A * This code is free software; you can redistribute it and/or modify it
809N/A * under the terms of the GNU General Public License version 2 only, as
809N/A * published by the Free Software Foundation.
809N/A *
809N/A * This code is distributed in the hope that it will be useful, but WITHOUT
809N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
809N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
809N/A * version 2 for more details (a copy is included in the LICENSE file that
809N/A * accompanied this code).
809N/A *
809N/A * You should have received a copy of the GNU General Public License version
809N/A * 2 along with this work; if not, write to the Free Software Foundation,
809N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
809N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
809N/A */
809N/A
809N/A/*
809N/A * @test
809N/A * @bug 4160406 4705734 4707389
809N/A * @summary Tests for Float.parseFloat method
809N/A */
809N/A
809N/Apublic class ParseFloat {
809N/A
809N/A private static void check(String val, float expected) {
809N/A float n = Float.parseFloat(val);
809N/A if (n != expected)
809N/A throw new RuntimeException("Float.parseFloat failed. String:" +
809N/A val + " Result:" + n);
809N/A }
809N/A
809N/A private static void rudimentaryTest() {
809N/A check(new String(""+Float.MIN_VALUE), Float.MIN_VALUE);
809N/A check(new String(""+Float.MAX_VALUE), Float.MAX_VALUE);
809N/A
809N/A check("10", (float) 10.0);
809N/A check("10.0", (float) 10.0);
809N/A check("10.01", (float) 10.01);
809N/A
809N/A check("-10", (float) -10.0);
809N/A check("-10.00", (float) -10.0);
809N/A check("-10.01", (float) -10.01);
809N/A }
809N/A
809N/A static String badStrings[] = {
809N/A "",
809N/A "+",
809N/A "-",
809N/A "+e",
809N/A "-e",
809N/A "+e170",
809N/A "-e170",
809N/A
809N/A // Make sure intermediate white space is not deleted.
809N/A "1234 e10",
809N/A "-1234 e10",
809N/A
809N/A // Control characters in the interior of a string are not legal
809N/A "1\u0007e1",
809N/A "1e\u00071",
809N/A
809N/A // NaN and infinity can't have trailing type suffices or exponents
809N/A "NaNf",
809N/A "NaNF",
809N/A "NaNd",
809N/A "NaND",
809N/A "-NaNf",
809N/A "-NaNF",
809N/A "-NaNd",
809N/A "-NaND",
809N/A "+NaNf",
809N/A "+NaNF",
809N/A "+NaNd",
809N/A "+NaND",
809N/A "Infinityf",
809N/A "InfinityF",
809N/A "Infinityd",
809N/A "InfinityD",
809N/A "-Infinityf",
809N/A "-InfinityF",
809N/A "-Infinityd",
809N/A "-InfinityD",
809N/A "+Infinityf",
809N/A "+InfinityF",
809N/A "+Infinityd",
809N/A "+InfinityD",
809N/A
809N/A "NaNe10",
809N/A "-NaNe10",
809N/A "+NaNe10",
809N/A "Infinitye10",
809N/A "-Infinitye10",
809N/A "+Infinitye10",
809N/A
809N/A // Non-ASCII digits are not recognized
809N/A "\u0661e\u0661", // 1e1 in Arabic-Indic digits
809N/A "\u06F1e\u06F1", // 1e1 in Extended Arabic-Indic digits
809N/A "\u0967e\u0967" // 1e1 in Devanagari digits
809N/A };
809N/A
809N/A static String goodStrings[] = {
809N/A "NaN",
809N/A "+NaN",
809N/A "-NaN",
809N/A "Infinity",
809N/A "+Infinity",
809N/A "-Infinity",
809N/A "1.1e-23f",
809N/A ".1e-23f",
809N/A "1e-23",
809N/A "1f",
809N/A "1",
809N/A "2",
809N/A "1234",
809N/A "-1234",
809N/A "+1234",
809N/A "2147483647", // Integer.MAX_VALUE
809N/A "2147483648",
809N/A "-2147483648", // Integer.MIN_VALUE
809N/A "-2147483649",
809N/A
809N/A "16777215",
809N/A "16777216", // 2^24
809N/A "16777217",
809N/A
809N/A "-16777215",
809N/A "-16777216", // -2^24
809N/A "-16777217",
809N/A
809N/A "9007199254740991",
809N/A "9007199254740992", // 2^53
809N/A "9007199254740993",
809N/A
809N/A "-9007199254740991",
809N/A "-9007199254740992", // -2^53
809N/A "-9007199254740993",
809N/A
809N/A "9223372036854775807",
809N/A "9223372036854775808", // Long.MAX_VALUE
809N/A "9223372036854775809",
809N/A
809N/A "-9223372036854775808",
809N/A "-9223372036854775809", // Long.MIN_VALUE
809N/A "-9223372036854775810"
809N/A };
809N/A
809N/A static String paddedBadStrings[];
809N/A static String paddedGoodStrings[];
809N/A static {
809N/A String pad = " \t\n\r\f\u0001\u000b\u001f";
809N/A paddedBadStrings = new String[badStrings.length];
809N/A for(int i = 0 ; i < badStrings.length; i++)
809N/A paddedBadStrings[i] = pad + badStrings[i] + pad;
809N/A
809N/A paddedGoodStrings = new String[goodStrings.length];
809N/A for(int i = 0 ; i < goodStrings.length; i++)
809N/A paddedGoodStrings[i] = pad + goodStrings[i] + pad;
809N/A
809N/A }
809N/A
809N/A /*
809N/A * Throws an exception if <code>Input</code> is
809N/A * <code>exceptionalInput</code> and {@link Float.parseFloat
809N/A * parseFloat} does <em>not</em> throw an exception or if
809N/A * <code>Input</code> is not <code>exceptionalInput</code> and
809N/A * <code>parseFloat</code> throws an exception. This method does
809N/A * not attempt to test whether the string is converted to the
809N/A * proper value; just whether the input is accepted appropriately
809N/A * or not.
809N/A */
809N/A private static void testParsing(String [] input,
809N/A boolean exceptionalInput) {
809N/A for(int i = 0; i < input.length; i++) {
809N/A double d;
809N/A
809N/A try {
809N/A d = Float.parseFloat(input[i]);
809N/A }
809N/A catch (NumberFormatException e) {
809N/A if (! exceptionalInput) {
809N/A throw new RuntimeException("Float.parseFloat rejected " +
809N/A "good string `" + input[i] +
809N/A "'.");
809N/A }
809N/A break;
809N/A }
809N/A if (exceptionalInput) {
809N/A throw new RuntimeException("Float.parseFloat accepted " +
809N/A "bad string `" + input[i] +
809N/A "'.");
809N/A }
809N/A }
809N/A }
809N/A
809N/A public static void main(String[] args) throws Exception {
809N/A rudimentaryTest();
809N/A
809N/A testParsing(goodStrings, false);
809N/A testParsing(paddedGoodStrings, false);
809N/A testParsing(badStrings, true);
809N/A testParsing(paddedBadStrings, true);
809N/A }
809N/A}