| /* |
| * Copyright (c) 2001, 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 4428772 |
| * @summary Testing recognition of "NaN" and "Infinity" strings |
| * @author Joseph D. Darcy |
| */ |
| |
| |
| public class NaNInfinityParsing { |
| /* |
| * Regression tests for: |
| * 4428772 -- Establish invariant for Float & Double classes and |
| * their string representations |
| * |
| * Added capability for parse{Float, Double} and related methods |
| * to recognize "NaN" and "Infinity" strings so that |
| * parseFloat(toString(d)) will always return the original |
| * floating-point value. |
| */ |
| |
| static String NaNStrings[] = { |
| "NaN", |
| "+NaN", |
| "-NaN" |
| }; |
| |
| static String infinityStrings[] = { |
| "Infinity", |
| "+Infinity", |
| "-Infinity", |
| }; |
| |
| static String invalidStrings[] = { |
| "+", |
| "-", |
| "@", |
| "N", |
| "Na", |
| "Nan", |
| "NaNf", |
| "NaNd", |
| "NaNF", |
| "NaND", |
| "+N", |
| "+Na", |
| "+Nan", |
| "+NaNf", |
| "+NaNd", |
| "+NaNF", |
| "+NaND", |
| "-N", |
| "-Na", |
| "-Nan", |
| "-NaNf", |
| "-NaNd", |
| "-NaNF", |
| "-NaND", |
| "I", |
| "In", |
| "Inf", |
| "Infi", |
| "Infin", |
| "Infini", |
| "Infinit", |
| "InfinitY", |
| "Infinityf", |
| "InfinityF", |
| "Infinityd", |
| "InfinityD", |
| "+I", |
| "+In", |
| "+Inf", |
| "+Infi", |
| "+Infin", |
| "+Infini", |
| "+Infinit", |
| "+InfinitY", |
| "+Infinityf", |
| "+InfinityF", |
| "+Infinityd", |
| "+InfinityD", |
| "-I", |
| "-In", |
| "-Inf", |
| "-Infi", |
| "-Infin", |
| "-Infini", |
| "-Infinit", |
| "-InfinitY", |
| "-Infinityf", |
| "-InfinityF", |
| "-Infinityd", |
| "-InfinityD", |
| "NaNInfinity", |
| "InfinityNaN", |
| "nan", |
| "infinity" |
| }; |
| |
| public static void main(String [] argv) throws Exception { |
| int i; |
| float d; |
| |
| // Test valid NaN strings |
| for(i = 0; i < NaNStrings.length; i++) { |
| if(!Float.isNaN(d=Float.parseFloat(NaNStrings[i]))) { |
| throw new RuntimeException("NaN string ``" + NaNStrings[i] |
| + "'' did not parse as a NaN; returned " + |
| d + " instead."); |
| } |
| } |
| |
| // Test valid Infinity strings |
| for(i = 0; i < infinityStrings.length; i++) { |
| if(!Float.isInfinite(d=Float.parseFloat(infinityStrings[i]))) { |
| throw new RuntimeException("Infinity string ``" + |
| infinityStrings[i] + |
| "'' did not parse as infinity; returned " + |
| d + "instead."); |
| } |
| // check sign of result |
| |
| boolean negative = (infinityStrings[i].charAt(0) == '-'); |
| if(d != (negative?Float.NEGATIVE_INFINITY: |
| Float.POSITIVE_INFINITY)) |
| throw new RuntimeException("Infinity has wrong sign;" + |
| (negative?"positive instead of negative.": |
| "negative instead of positive.")); |
| } |
| |
| // Test almost valid strings |
| for(i = 0; i < invalidStrings.length; i++) { |
| try { |
| float result; |
| d = Float.parseFloat(invalidStrings[i]); |
| throw new RuntimeException("Invalid string ``" + |
| invalidStrings[i] |
| +"'' parsed as " + d + "."); |
| } |
| catch(NumberFormatException e) { |
| // expected |
| } |
| } |
| |
| } |
| } |