Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/java/math/BigDecimal/StringConstructor.java
38811 views
1
/*
2
* Copyright (c) 1999, 2005, Oracle and/or its affiliates. All rights reserved.
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
*
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.
22
*/
23
24
/*
25
* @test
26
* @bug 4103117 4331084 4488017 4490929 6255285 6268365
27
* @summary Tests the BigDecimal string constructor.
28
* @key randomness
29
*/
30
31
import java.math.*;
32
import java.util.Random;
33
34
public class StringConstructor {
35
36
private static int seed = new Random().nextInt();
37
private static Random rnd = new Random(seed);
38
39
public static void main(String[] args) throws Exception {
40
constructWithError("");
41
constructWithError("+");
42
constructWithError("-");
43
constructWithError("+e");
44
constructWithError("-e");
45
constructWithError("e+");
46
constructWithError("1.-0");
47
constructWithError(".-123");
48
constructWithError("-");
49
constructWithError("--1.1");
50
constructWithError("-+1.1");
51
constructWithError("+-1.1");
52
constructWithError("1-.1");
53
constructWithError("1+.1");
54
constructWithError("1.111+1");
55
constructWithError("1.111-1");
56
constructWithError("11.e+");
57
constructWithError("11.e-");
58
constructWithError("11.e+-");
59
constructWithError("11.e-+");
60
constructWithError("11.e-+1");
61
constructWithError("11.e+-1");
62
63
// Range checks
64
constructWithError("1e"+Integer.MIN_VALUE);
65
constructWithError("10e"+Integer.MIN_VALUE);
66
constructWithError("0.01e"+Integer.MIN_VALUE);
67
constructWithError("1e"+((long)Integer.MIN_VALUE-1));
68
constructWithError("1e"+((long)Integer.MAX_VALUE + 1));
69
70
leadingExponentZeroTest();
71
nonAsciiZeroTest();
72
73
// Roundtrip tests
74
for (int i=0; i<100; i++) {
75
int size = rnd.nextInt(100) + 1;
76
BigInteger bi = new BigInteger(size, rnd);
77
if (rnd.nextBoolean())
78
bi = bi.negate();
79
int decimalLength = bi.toString().length();
80
int scale = rnd.nextInt(decimalLength);
81
BigDecimal bd = new BigDecimal(bi, scale);
82
String bdString = bd.toString();
83
// System.err.println("bi" + bi.toString() + "\tscale " + scale);
84
// System.err.println("bd string: " + bdString);
85
BigDecimal bdDoppel = new BigDecimal(bdString);
86
if (!bd.equals(bdDoppel)) {
87
System.err.println("Random number seed = " + seed);
88
System.err.println("bd string: scale: " + bd.scale() +
89
"\t" + bdString);
90
System.err.println("bd doppel: scale: " + bdDoppel.scale() +
91
"\t" + bdDoppel.toString());
92
throw new RuntimeException("String constructor failure.");
93
}
94
}
95
}
96
97
98
/*
99
* Verify precision is set properly if the significand has
100
* non-ASCII leading zeros.
101
*/
102
private static void nonAsciiZeroTest() {
103
String values[] = {
104
"00004e5",
105
"\u0660\u0660\u0660\u06604e5",
106
};
107
108
BigDecimal expected = new BigDecimal("4e5");
109
110
for(String s : values) {
111
BigDecimal tmp = new BigDecimal(s);
112
// System.err.println("Testing " + s);
113
if (! expected.equals(tmp) || tmp.precision() != 1) {
114
System.err.println("Bad conversion of " + s + "got " +
115
tmp + "precision = " + tmp.precision());
116
throw new RuntimeException("String constructor failure.");
117
}
118
}
119
120
}
121
122
private static void leadingExponentZeroTest() {
123
BigDecimal twelve = new BigDecimal("12");
124
BigDecimal onePointTwo = new BigDecimal("1.2");
125
126
String start = "1.2e0";
127
String end = "1";
128
String middle = "";
129
130
// Test with more excess zeros than the largest number of
131
// decimal digits needed to represent a long
132
int limit = ((int)Math.log10(Long.MAX_VALUE)) + 6;
133
for(int i = 0; i < limit; i++, middle += "0") {
134
String t1 = start + middle;
135
String t2 = t1 + end;
136
137
// System.out.println(i + "\t" + t1 + "\t" + t2);
138
testString(t1, onePointTwo);
139
testString(t2, twelve);
140
}
141
}
142
143
private static void testString(String s, BigDecimal expected) {
144
testString0(s, expected);
145
testString0(switchZero(s), expected);
146
}
147
148
private static void testString0(String s, BigDecimal expected) {
149
if (!expected.equals(new BigDecimal(s)))
150
throw new RuntimeException(s + " is not equal to " + expected);
151
}
152
153
private static String switchZero(String s) {
154
return s.replace('0', '\u0660'); // Arabic-Indic zero
155
}
156
157
private static void constructWithError(String badString) {
158
try {
159
BigDecimal d = new BigDecimal(badString);
160
throw new RuntimeException(badString + " accepted");
161
} catch(NumberFormatException e) {
162
}
163
}
164
}
165
166