--- /dev/null Mon Jan 26 16:11:53 2009 +++ new/test/java/lang/Float/ParseFloat.java Mon Jan 26 16:11:52 2009 @@ -0,0 +1,210 @@ +/* + * Copyright 1998-2003 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4160406 4705734 4707389 + * @summary Tests for Float.parseFloat method + */ + +public class ParseFloat { + + private static void check(String val, float expected) { + float n = Float.parseFloat(val); + if (n != expected) + throw new RuntimeException("Float.parseFloat failed. String:" + + val + " Result:" + n); + } + + private static void rudimentaryTest() { + check(new String(""+Float.MIN_VALUE), Float.MIN_VALUE); + check(new String(""+Float.MAX_VALUE), Float.MAX_VALUE); + + check("10", (float) 10.0); + check("10.0", (float) 10.0); + check("10.01", (float) 10.01); + + check("-10", (float) -10.0); + check("-10.00", (float) -10.0); + check("-10.01", (float) -10.01); + } + + static String badStrings[] = { + "", + "+", + "-", + "+e", + "-e", + "+e170", + "-e170", + + // Make sure intermediate white space is not deleted. + "1234 e10", + "-1234 e10", + + // Control characters in the interior of a string are not legal + "1\u0007e1", + "1e\u00071", + + // NaN and infinity can't have trailing type suffices or exponents + "NaNf", + "NaNF", + "NaNd", + "NaND", + "-NaNf", + "-NaNF", + "-NaNd", + "-NaND", + "+NaNf", + "+NaNF", + "+NaNd", + "+NaND", + "Infinityf", + "InfinityF", + "Infinityd", + "InfinityD", + "-Infinityf", + "-InfinityF", + "-Infinityd", + "-InfinityD", + "+Infinityf", + "+InfinityF", + "+Infinityd", + "+InfinityD", + + "NaNe10", + "-NaNe10", + "+NaNe10", + "Infinitye10", + "-Infinitye10", + "+Infinitye10", + + // Non-ASCII digits are not recognized + "\u0661e\u0661", // 1e1 in Arabic-Indic digits + "\u06F1e\u06F1", // 1e1 in Extended Arabic-Indic digits + "\u0967e\u0967" // 1e1 in Devanagari digits + }; + + static String goodStrings[] = { + "NaN", + "+NaN", + "-NaN", + "Infinity", + "+Infinity", + "-Infinity", + "1.1e-23f", + ".1e-23f", + "1e-23", + "1f", + "1", + "2", + "1234", + "-1234", + "+1234", + "2147483647", // Integer.MAX_VALUE + "2147483648", + "-2147483648", // Integer.MIN_VALUE + "-2147483649", + + "16777215", + "16777216", // 2^24 + "16777217", + + "-16777215", + "-16777216", // -2^24 + "-16777217", + + "9007199254740991", + "9007199254740992", // 2^53 + "9007199254740993", + + "-9007199254740991", + "-9007199254740992", // -2^53 + "-9007199254740993", + + "9223372036854775807", + "9223372036854775808", // Long.MAX_VALUE + "9223372036854775809", + + "-9223372036854775808", + "-9223372036854775809", // Long.MIN_VALUE + "-9223372036854775810" + }; + + static String paddedBadStrings[]; + static String paddedGoodStrings[]; + static { + String pad = " \t\n\r\f\u0001\u000b\u001f"; + paddedBadStrings = new String[badStrings.length]; + for(int i = 0 ; i < badStrings.length; i++) + paddedBadStrings[i] = pad + badStrings[i] + pad; + + paddedGoodStrings = new String[goodStrings.length]; + for(int i = 0 ; i < goodStrings.length; i++) + paddedGoodStrings[i] = pad + goodStrings[i] + pad; + + } + + /* + * Throws an exception if Input is + * exceptionalInput and {@link Float.parseFloat + * parseFloat} does not throw an exception or if + * Input is not exceptionalInput and + * parseFloat throws an exception. This method does + * not attempt to test whether the string is converted to the + * proper value; just whether the input is accepted appropriately + * or not. + */ + private static void testParsing(String [] input, + boolean exceptionalInput) { + for(int i = 0; i < input.length; i++) { + double d; + + try { + d = Float.parseFloat(input[i]); + } + catch (NumberFormatException e) { + if (! exceptionalInput) { + throw new RuntimeException("Float.parseFloat rejected " + + "good string `" + input[i] + + "'."); + } + break; + } + if (exceptionalInput) { + throw new RuntimeException("Float.parseFloat accepted " + + "bad string `" + input[i] + + "'."); + } + } + } + + public static void main(String[] args) throws Exception { + rudimentaryTest(); + + testParsing(goodStrings, false); + testParsing(paddedGoodStrings, false); + testParsing(badStrings, true); + testParsing(paddedBadStrings, true); + } +}