// These should all succeed.
var bi64a = new BigInt64Array(new SharedArrayBuffer(128));
var bu64a = new BigUint64Array(new SharedArrayBuffer(128));

function shouldFail(f, name)
{
    try {
        f();
    } catch (e) {
        if (e.name == name.name)
            return;
        throw new Error(f + " threw the wrong error: " + e);
    }
    throw new Error(f + " succeeded!");
}

function shouldSucceed(f)
{
    f();
}

for (bad of [bu64a]) {
    shouldFail(() => Atomics.notify(bad, 0, 0n), TypeError);
    shouldFail(() => Atomics.wait(bad, 0, 0n), TypeError);
}

for (idx of [-1, -1000000000000, 10000, 10000000000000]) {
    for (a of [bi64a, bu64a]) {
        shouldFail(() => Atomics.add(a, idx, 0n), RangeError);
        shouldFail(() => Atomics.and(a, idx, 0n), RangeError);
        shouldFail(() => Atomics.compareExchange(a, idx, 0n, 0n), RangeError);
        shouldFail(() => Atomics.exchange(a, idx, 0n), RangeError);
        shouldFail(() => Atomics.load(a, idx), RangeError);
        shouldFail(() => Atomics.or(a, idx, 0n), RangeError);
        shouldFail(() => Atomics.store(a, idx, 0n), RangeError);
        shouldFail(() => Atomics.sub(a, idx, 0n), RangeError);
        shouldFail(() => Atomics.xor(a, idx, 0n), RangeError);
    }
    shouldFail(() => Atomics.notify(bi64a, idx, 0n), RangeError);
    shouldFail(() => Atomics.wait(bi64a, idx, 0n), RangeError);
}

for (idx of ["hello"]) {
    for (a of [bi64a, bu64a]) {
        shouldSucceed(() => Atomics.add(a, idx, 0n));
        shouldSucceed(() => Atomics.and(a, idx, 0n));
        shouldSucceed(() => Atomics.compareExchange(a, idx, 0n, 0n));
        shouldSucceed(() => Atomics.exchange(a, idx, 0n));
        shouldSucceed(() => Atomics.load(a, idx));
        shouldSucceed(() => Atomics.or(a, idx, 0n));
        shouldSucceed(() => Atomics.store(a, idx, 0n));
        shouldSucceed(() => Atomics.sub(a, idx, 0n));
        shouldSucceed(() => Atomics.xor(a, idx, 0n));
    }
    shouldSucceed(() => Atomics.notify(bi64a, idx, 0));
    shouldSucceed(() => Atomics.wait(bi64a, idx, 0n, 1));
}

function runAtomic(array, index, init, name, args, expectedResult, expectedOutcome)
{
    array[index] = init;
    var result = Atomics[name](array, index, ...args);
    if (result != expectedResult)
        throw new Error("Expected Atomics." + name + "(array, " + index + ", " + args.join(", ") + ") to return " + expectedResult + " but returned " + result + " for " + Object.prototype.toString.apply(array));
    if (array[index] !== expectedOutcome)
        throw new Error("Expected Atomics." + name + "(array, " + index + ", " + args.join(", ") + ") to result in array[" + index + "] = " + expectedOutcome + " but got " + array[index] + " for " + Object.prototype.toString.apply(array));
}

for (a of [bi64a, bu64a]) {
    runAtomic(a, 0, 13n, "add", [42n], 13n, 55n);
    runAtomic(a, 0, 13n, "and", [42n], 13n, 8n);
    runAtomic(a, 0, 13n, "compareExchange", [25n, 42n], 13n, 13n);
    runAtomic(a, 0, 13n, "compareExchange", [13n, 42n], 13n, 42n);
    runAtomic(a, 0, 13n, "exchange", [42n], 13n, 42n);
    runAtomic(a, 0, 13n, "load", [], 13n, 13n);
    runAtomic(a, 0, 13n, "or", [42n], 13n, 47n);
    runAtomic(a, 0, 13n, "store", [42n], 42n, 42n);
    runAtomic(a, 0, 42n, "sub", [13n], 42n, 29n);
    runAtomic(a, 0, 13n, "xor", [42n], 13n, 39n);
}

bi64a[0] = 0n;
var result = Atomics.wait(bi64a, 0, 1n);
if (result != "not-equal")
    throw "Error: bad result from Atomics.wait: " + result;
for (timeout of [0, 1, 10]) {
    var result = Atomics.wait(bi64a, 0, 0n, timeout);
    if (result != "timed-out")
        throw "Error: bad result from Atomics.wait: " + result;
}
