// Any copyright is dedicated to the Public Domain.
// https://creativecommons.org/licenses/publicdomain/

function test(thunk, result) {
    let val, err;
    try {
        val = thunk();
    } catch (e) {
        err = e;
    }
    if (err) {
        assertEq(err instanceof RangeError, true);
    } else {
        assertEq(val, result);
    }
}

const UINT32_MAX = 2**32-1;

// Check that BigInt.asIntN and BigInt.asUintN either return correct results or
// throw RangeErrors for large |bits| arguments. GMP uses a type equivalent to
// 'unsigned long' for bit counts, which may be too small to represent all JS
// integer indexes.
for (let bits of [UINT32_MAX-1, UINT32_MAX, UINT32_MAX+1, Number.MAX_SAFE_INTEGER]) {
    test(() => BigInt.asIntN(bits, 1n), 1n);
    test(() => BigInt.asIntN(bits, 0n), 0n);
    test(() => BigInt.asIntN(bits, -1n), -1n);
    test(() => BigInt.asUintN(bits, 1n), 1n);
    test(() => BigInt.asUintN(bits, 0n), 0n);
    // Skip testing asUintN with negative BigInts since it could OOM.
}

reportCompare(true, true);
