1826
|
1 |
/*
|
5506
|
2 |
* Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
|
1826
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
4 |
*
|
|
5 |
* This code is free software; you can redistribute it and/or modify it
|
|
6 |
* under the terms of the GNU General Public License version 2 only, as
|
|
7 |
* published by the Free Software Foundation.
|
|
8 |
*
|
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that
|
|
13 |
* accompanied this code).
|
|
14 |
*
|
|
15 |
* You should have received a copy of the GNU General Public License version
|
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
18 |
*
|
5506
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
20 |
* or visit www.oracle.com if you need additional information or have any
|
|
21 |
* questions.
|
1826
|
22 |
*/
|
|
23 |
|
|
24 |
/*
|
|
25 |
* @test
|
|
26 |
* @bug 4160406 4705734 4707389
|
|
27 |
* @summary Tests for Float.parseFloat method
|
|
28 |
*/
|
|
29 |
|
|
30 |
public class ParseFloat {
|
|
31 |
|
|
32 |
private static void check(String val, float expected) {
|
|
33 |
float n = Float.parseFloat(val);
|
|
34 |
if (n != expected)
|
|
35 |
throw new RuntimeException("Float.parseFloat failed. String:" +
|
|
36 |
val + " Result:" + n);
|
|
37 |
}
|
|
38 |
|
|
39 |
private static void rudimentaryTest() {
|
|
40 |
check(new String(""+Float.MIN_VALUE), Float.MIN_VALUE);
|
|
41 |
check(new String(""+Float.MAX_VALUE), Float.MAX_VALUE);
|
|
42 |
|
|
43 |
check("10", (float) 10.0);
|
|
44 |
check("10.0", (float) 10.0);
|
|
45 |
check("10.01", (float) 10.01);
|
|
46 |
|
|
47 |
check("-10", (float) -10.0);
|
|
48 |
check("-10.00", (float) -10.0);
|
|
49 |
check("-10.01", (float) -10.01);
|
|
50 |
}
|
|
51 |
|
|
52 |
static String badStrings[] = {
|
|
53 |
"",
|
|
54 |
"+",
|
|
55 |
"-",
|
|
56 |
"+e",
|
|
57 |
"-e",
|
|
58 |
"+e170",
|
|
59 |
"-e170",
|
|
60 |
|
|
61 |
// Make sure intermediate white space is not deleted.
|
|
62 |
"1234 e10",
|
|
63 |
"-1234 e10",
|
|
64 |
|
|
65 |
// Control characters in the interior of a string are not legal
|
|
66 |
"1\u0007e1",
|
|
67 |
"1e\u00071",
|
|
68 |
|
|
69 |
// NaN and infinity can't have trailing type suffices or exponents
|
|
70 |
"NaNf",
|
|
71 |
"NaNF",
|
|
72 |
"NaNd",
|
|
73 |
"NaND",
|
|
74 |
"-NaNf",
|
|
75 |
"-NaNF",
|
|
76 |
"-NaNd",
|
|
77 |
"-NaND",
|
|
78 |
"+NaNf",
|
|
79 |
"+NaNF",
|
|
80 |
"+NaNd",
|
|
81 |
"+NaND",
|
|
82 |
"Infinityf",
|
|
83 |
"InfinityF",
|
|
84 |
"Infinityd",
|
|
85 |
"InfinityD",
|
|
86 |
"-Infinityf",
|
|
87 |
"-InfinityF",
|
|
88 |
"-Infinityd",
|
|
89 |
"-InfinityD",
|
|
90 |
"+Infinityf",
|
|
91 |
"+InfinityF",
|
|
92 |
"+Infinityd",
|
|
93 |
"+InfinityD",
|
|
94 |
|
|
95 |
"NaNe10",
|
|
96 |
"-NaNe10",
|
|
97 |
"+NaNe10",
|
|
98 |
"Infinitye10",
|
|
99 |
"-Infinitye10",
|
|
100 |
"+Infinitye10",
|
|
101 |
|
|
102 |
// Non-ASCII digits are not recognized
|
|
103 |
"\u0661e\u0661", // 1e1 in Arabic-Indic digits
|
|
104 |
"\u06F1e\u06F1", // 1e1 in Extended Arabic-Indic digits
|
|
105 |
"\u0967e\u0967" // 1e1 in Devanagari digits
|
|
106 |
};
|
|
107 |
|
|
108 |
static String goodStrings[] = {
|
|
109 |
"NaN",
|
|
110 |
"+NaN",
|
|
111 |
"-NaN",
|
|
112 |
"Infinity",
|
|
113 |
"+Infinity",
|
|
114 |
"-Infinity",
|
|
115 |
"1.1e-23f",
|
|
116 |
".1e-23f",
|
|
117 |
"1e-23",
|
|
118 |
"1f",
|
|
119 |
"1",
|
|
120 |
"2",
|
|
121 |
"1234",
|
|
122 |
"-1234",
|
|
123 |
"+1234",
|
|
124 |
"2147483647", // Integer.MAX_VALUE
|
|
125 |
"2147483648",
|
|
126 |
"-2147483648", // Integer.MIN_VALUE
|
|
127 |
"-2147483649",
|
|
128 |
|
|
129 |
"16777215",
|
|
130 |
"16777216", // 2^24
|
|
131 |
"16777217",
|
|
132 |
|
|
133 |
"-16777215",
|
|
134 |
"-16777216", // -2^24
|
|
135 |
"-16777217",
|
|
136 |
|
|
137 |
"9007199254740991",
|
|
138 |
"9007199254740992", // 2^53
|
|
139 |
"9007199254740993",
|
|
140 |
|
|
141 |
"-9007199254740991",
|
|
142 |
"-9007199254740992", // -2^53
|
|
143 |
"-9007199254740993",
|
|
144 |
|
|
145 |
"9223372036854775807",
|
|
146 |
"9223372036854775808", // Long.MAX_VALUE
|
|
147 |
"9223372036854775809",
|
|
148 |
|
|
149 |
"-9223372036854775808",
|
|
150 |
"-9223372036854775809", // Long.MIN_VALUE
|
|
151 |
"-9223372036854775810"
|
|
152 |
};
|
|
153 |
|
|
154 |
static String paddedBadStrings[];
|
|
155 |
static String paddedGoodStrings[];
|
|
156 |
static {
|
|
157 |
String pad = " \t\n\r\f\u0001\u000b\u001f";
|
|
158 |
paddedBadStrings = new String[badStrings.length];
|
|
159 |
for(int i = 0 ; i < badStrings.length; i++)
|
|
160 |
paddedBadStrings[i] = pad + badStrings[i] + pad;
|
|
161 |
|
|
162 |
paddedGoodStrings = new String[goodStrings.length];
|
|
163 |
for(int i = 0 ; i < goodStrings.length; i++)
|
|
164 |
paddedGoodStrings[i] = pad + goodStrings[i] + pad;
|
|
165 |
|
|
166 |
}
|
|
167 |
|
|
168 |
/*
|
|
169 |
* Throws an exception if <code>Input</code> is
|
|
170 |
* <code>exceptionalInput</code> and {@link Float.parseFloat
|
|
171 |
* parseFloat} does <em>not</em> throw an exception or if
|
|
172 |
* <code>Input</code> is not <code>exceptionalInput</code> and
|
|
173 |
* <code>parseFloat</code> throws an exception. This method does
|
|
174 |
* not attempt to test whether the string is converted to the
|
|
175 |
* proper value; just whether the input is accepted appropriately
|
|
176 |
* or not.
|
|
177 |
*/
|
|
178 |
private static void testParsing(String [] input,
|
|
179 |
boolean exceptionalInput) {
|
|
180 |
for(int i = 0; i < input.length; i++) {
|
|
181 |
double d;
|
|
182 |
|
|
183 |
try {
|
|
184 |
d = Float.parseFloat(input[i]);
|
|
185 |
}
|
|
186 |
catch (NumberFormatException e) {
|
|
187 |
if (! exceptionalInput) {
|
|
188 |
throw new RuntimeException("Float.parseFloat rejected " +
|
|
189 |
"good string `" + input[i] +
|
|
190 |
"'.");
|
|
191 |
}
|
|
192 |
break;
|
|
193 |
}
|
|
194 |
if (exceptionalInput) {
|
|
195 |
throw new RuntimeException("Float.parseFloat accepted " +
|
|
196 |
"bad string `" + input[i] +
|
|
197 |
"'.");
|
|
198 |
}
|
|
199 |
}
|
|
200 |
}
|
|
201 |
|
|
202 |
public static void main(String[] args) throws Exception {
|
|
203 |
rudimentaryTest();
|
|
204 |
|
|
205 |
testParsing(goodStrings, false);
|
|
206 |
testParsing(paddedGoodStrings, false);
|
|
207 |
testParsing(badStrings, true);
|
|
208 |
testParsing(paddedBadStrings, true);
|
|
209 |
}
|
|
210 |
}
|