blob: ec2b0e374f5117585fab8b337c099c1b0f8d87c1 [file] [log] [blame]
function assert(a) {
if (!a)
throw new Error("Bad assertion");
}
function assertThrowSyntaxError(input) {
try {
let n = BigInt(input);
assert(false);
} catch (e) {
assert(e instanceof SyntaxError);
}
}
function assertThrowRangeError(input) {
try {
let n = BigInt(input);
assert(false);
} catch (e) {
assert(e instanceof RangeError);
}
}
function assertThrowTypeError(input) {
try {
let n = BigInt(input);
assert(false);
} catch (e) {
assert(e instanceof TypeError);
}
}
// Test 0 conversions
let n = BigInt("");
assert(n.toString() === "0");
n = BigInt(" ");
assert(n.toString() === "0");
n = BigInt("0");
assert(n.toString() === "0");
n = BigInt("+0");
assert(n.toString() === "0");
n = BigInt("-0");
assert(n.toString() === "0");
n = BigInt(" 0");
assert(n.toString() === "0");
n = BigInt("0 ");
assert(n.toString() === "0");
n = BigInt(" 0 ");
assert(n.toString() === "0");
n = BigInt("00000");
assert(n.toString() === "0");
let giantTrailingString = "0";
for (let i = 0; i < 10000; i++)
giantTrailingString += " ";
n = BigInt(giantTrailingString);
assert(n.toString() === "0");
// Binary representation
n = BigInt("0b1111");
assert(n.toString() === "15");
n = BigInt("0b10");
assert(n.toString() === "2");
n = BigInt("0b10");
assert(n.toString() === "2");
let binaryString = "0b1";
for (let i = 0; i < 128; i++)
binaryString += "0";
n = BigInt(binaryString);
assert(n.toString() === "340282366920938463463374607431768211456");
n = BigInt("0B1111");
assert(n.toString() === "15");
n = BigInt("0B10");
assert(n.toString() === "2");
n = BigInt("0B10");
assert(n.toString() === "2");
binaryString = "0B1";
for (let i = 0; i < 128; i++)
binaryString += "0";
n = BigInt(binaryString);
assert(n.toString() === "340282366920938463463374607431768211456");
// Octal representation
n = BigInt("0o7");
assert(n.toString() === "7");
n = BigInt("0o10");
assert(n.toString() === "8");
n = BigInt("0o20");
assert(n.toString() === "16");
n = BigInt(" 0o20");
assert(n.toString() === "16");
n = BigInt(" 0o20 ");
assert(n.toString() === "16");
n = BigInt("0O7");
assert(n.toString() === "7");
n = BigInt("0O10");
assert(n.toString() === "8");
n = BigInt("0O20");
assert(n.toString() === "16");
n = BigInt(" 0O20");
assert(n.toString() === "16");
n = BigInt(" 0O20 ");
assert(n.toString() === "16");
// Hexadecimal representation
n = BigInt("0xa");
assert(n.toString() === "10");
n = BigInt("0xff");
assert(n.toString() === "255");
n = BigInt(" 0xff ");
assert(n.toString() === "255");
n = BigInt(" 0xfabc ");
assert(n.toString() === "64188");
// Number conversion
n = BigInt(3245);
assert(n.toString() === "3245");
n = BigInt(-2147483648)
assert(n.toString() === "-2147483648");
n = BigInt(0);
assert(n.toString() === "0");
n = BigInt(-46781);
assert(n.toString() === "-46781");
// Int53
n = BigInt(4503599627370490);
assert(n.toString() === "4503599627370490");
n = BigInt(-4503599627370490);
assert(n.toString() === "-4503599627370490");
n = BigInt(-4503599627370496);
assert(n.toString() === "-4503599627370496");
// Boolean conversion
n = BigInt(true);
assert(n.toString() === "1");
n = BigInt(false);
assert(n.toString() === "0");
// Objects
let o = {
valueOf: function () {
return 3;
}
}
n = BigInt(o);
assert(n.toString() === "3");
o = {
valueOf: function () {
return "54";
}
}
n = BigInt(o);
assert(n.toString() === "54");
o = {
toString: function () {
return "5489543";
}
}
n = BigInt(o);
assert(n.toString() === "5489543");
o = {
toString: function () {
return 135489543;
}
}
n = BigInt(o);
assert(n.toString() === "135489543");
o = {
valueOf: function () {
return 3256;
},
toString: function () {
return "563737";
}
}
n = BigInt(o);
assert(n.toString() === "3256");
o = {
[Symbol.toPrimitive](hint) {
this.toPrimitiveHint = hint;
return 42;
}
}
n = BigInt(o);
assert(o.toPrimitiveHint === "number");
// Assertion thows
assertThrowSyntaxError("aba");
assertThrowSyntaxError("-0x1");
assertThrowSyntaxError("-0XFFab");
assertThrowSyntaxError("0o78");
assertThrowSyntaxError("0oa");
assertThrowSyntaxError("000 12");
assertThrowSyntaxError("0o");
assertThrowSyntaxError("0b");
assertThrowSyntaxError("0x");
assertThrowSyntaxError("00o");
assertThrowSyntaxError("00b");
assertThrowSyntaxError("00x");
assertThrowTypeError(null);
assertThrowTypeError(undefined);
assertThrowTypeError(Symbol("a"));
assertThrowRangeError(0.5);
assertThrowRangeError(-.5);
assertThrowRangeError(Infinity);
assertThrowRangeError(-Infinity);
assertThrowRangeError(NaN);
// Object throwing error
o = {
valueOf: function () {
throw new Error("MyError");
}
}
try {
n = BigInt(o);
assert(false);
} catch(e) {
assert(e.message === "MyError");
}
try {
n = BigInt();
assert(false);
} catch(e) {
assert(e instanceof TypeError);
}