Unreviewed, rolling out r226937.
[WebKit-https.git] / JSTests / stress / big-int-constructor.js
1 //@ runBigIntEnabled
2
3 function assert(a) {
4     if (!a)
5         throw new Error("Bad assertion");
6 }
7
8 function assertThrowSyntaxError(input) {
9     try {
10         let n = BigInt(input);
11         assert(false);
12     } catch (e) {
13         assert(e instanceof SyntaxError);
14     }
15 }
16
17 function assertThrowRangeError(input) {
18     try {
19         let n = BigInt(input);
20         assert(false);
21     } catch (e) {
22         assert(e instanceof RangeError);
23     }
24 }
25
26 function assertThrowTypeError(input) {
27     try {
28         let n = BigInt(input);
29         assert(false);
30     } catch (e) {
31         assert(e instanceof TypeError);
32     }
33 }
34
35 // Test 0 conversions
36 let n = BigInt("");
37 assert(n.toString() === "0");
38
39 n = BigInt("  ");
40 assert(n.toString() === "0");
41
42 n = BigInt("0");
43 assert(n.toString() === "0");
44
45 n = BigInt("+0");
46 assert(n.toString() === "0");
47
48 n = BigInt("-0");
49 assert(n.toString() === "0");
50
51 n = BigInt("  0");
52 assert(n.toString() === "0");
53
54 n = BigInt("0  ");
55 assert(n.toString() === "0");
56
57 n = BigInt("  0  ");
58 assert(n.toString() === "0");
59
60 n = BigInt("00000");
61 assert(n.toString() === "0");
62
63 let giantTrailingString = "0";
64 for (let i = 0; i < 10000; i++)
65     giantTrailingString += " ";
66
67 n = BigInt(giantTrailingString);
68 assert(n.toString() === "0");
69
70 // Binary representation
71
72 n = BigInt("0b1111");
73 assert(n.toString() === "15");
74
75 n = BigInt("0b10");
76 assert(n.toString() === "2");
77
78 n = BigInt("0b10");
79 assert(n.toString() === "2");
80
81 let binaryString = "0b1";
82 for (let i = 0; i < 128; i++)
83     binaryString += "0";
84
85 n = BigInt(binaryString);
86 assert(n.toString() === "340282366920938463463374607431768211456");
87
88 n = BigInt("0B1111");
89 assert(n.toString() === "15");
90
91 n = BigInt("0B10");
92 assert(n.toString() === "2");
93
94 n = BigInt("0B10");
95 assert(n.toString() === "2");
96
97 binaryString = "0B1";
98 for (let i = 0; i < 128; i++)
99     binaryString += "0";
100
101 n = BigInt(binaryString);
102 assert(n.toString() === "340282366920938463463374607431768211456");
103
104 // Octal representation
105  
106 n = BigInt("0o7");
107 assert(n.toString() === "7");
108
109 n = BigInt("0o10");
110 assert(n.toString() === "8");
111
112 n = BigInt("0o20");
113 assert(n.toString() === "16");
114
115 n = BigInt("   0o20");
116 assert(n.toString() === "16");
117
118 n = BigInt("   0o20  ");
119 assert(n.toString() === "16");
120
121 n = BigInt("0O7");
122 assert(n.toString() === "7");
123
124 n = BigInt("0O10");
125 assert(n.toString() === "8");
126
127 n = BigInt("0O20");
128 assert(n.toString() === "16");
129
130 n = BigInt("   0O20");
131 assert(n.toString() === "16");
132
133 n = BigInt("   0O20  ");
134 assert(n.toString() === "16");
135
136 // Hexadecimal representation
137
138 n = BigInt("0xa");
139 assert(n.toString() === "10");
140
141 n = BigInt("0xff");
142 assert(n.toString() === "255");
143
144 n = BigInt("  0xff  ");
145 assert(n.toString() === "255");
146
147 n = BigInt("  0xfabc  ");
148 assert(n.toString() === "64188");
149
150 // Number conversion
151
152 n = BigInt(3245);
153 assert(n.toString() === "3245");
154
155 n = BigInt(-2147483648)
156 assert(n.toString() === "-2147483648");
157
158 n = BigInt(0);
159 assert(n.toString() === "0");
160
161 n = BigInt(-46781);
162 assert(n.toString() === "-46781");
163
164 // Int53
165 n = BigInt(4503599627370490);
166 assert(n.toString() === "4503599627370490");
167
168 n = BigInt(-4503599627370490);
169 assert(n.toString() === "-4503599627370490");
170
171 n = BigInt(-4503599627370496);
172 assert(n.toString() === "-4503599627370496");
173
174 // Boolean conversion
175 n = BigInt(true);
176 assert(n.toString() === "1");
177
178 n = BigInt(false);
179 assert(n.toString() === "0");
180
181 // Objects
182 let o = {
183     valueOf: function () {
184         return 3;
185     }
186 }
187
188 n = BigInt(o);
189 assert(n.toString() === "3");
190
191 o = {
192     valueOf: function () {
193         return "54";
194     }
195 }
196
197 n = BigInt(o);
198 assert(n.toString() === "54");
199
200 o = {
201     toString: function () {
202         return "5489543";
203     }
204 }
205
206 n = BigInt(o);
207 assert(n.toString() === "5489543");
208
209 o = {
210     toString: function () {
211         return 135489543;
212     }
213 }
214
215 n = BigInt(o);
216 assert(n.toString() === "135489543");
217
218 o = {
219     valueOf: function () {
220         return 3256;
221     },
222
223     toString: function () {
224         return "563737";
225     }
226 }
227
228 n = BigInt(o);
229 assert(n.toString() === "3256");
230
231 // Assertion thows
232
233 assertThrowSyntaxError("aba");
234 assertThrowSyntaxError("-0x1");
235 assertThrowSyntaxError("-0XFFab");
236 assertThrowSyntaxError("0o78");
237 assertThrowSyntaxError("0oa");
238 assertThrowSyntaxError("000 12");
239 assertThrowSyntaxError("0o");
240 assertThrowSyntaxError("0b");
241 assertThrowSyntaxError("0x");
242 assertThrowSyntaxError("00o");
243 assertThrowSyntaxError("00b");
244 assertThrowSyntaxError("00x");
245 assertThrowTypeError(null);
246 assertThrowTypeError(undefined);
247 assertThrowTypeError(Symbol("a"));
248 assertThrowRangeError(0.5);
249 assertThrowRangeError(-.5);
250 assertThrowRangeError(9007199254740992);
251 assertThrowRangeError(Infinity);
252 assertThrowRangeError(-Infinity);
253 assertThrowRangeError(NaN);
254
255 // Object throwing error
256
257 o = {
258     valueOf: function () {
259         throw new Error("MyError");
260     }
261 }
262
263 try {
264     n = BigInt(o);
265     assert(false);
266 } catch(e) {
267     assert(e.message === "MyError");
268 }
269
270 try {
271     n = BigInt();
272     assert(false);
273 } catch(e) {
274     assert(e instanceof TypeError);
275 }
276