//@ runBigIntEnabled

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");

// 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(9007199254740992);
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);
}

