<!DOCTYPE html>
<meta charset=utf-8>
<title>Test Error Scopes.</title>
<body>
<script src="js/webgpu-functions.js"></script>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script>
let tests = {};

tests["Capture a single GPUValidation error."] = async device => {
    device.pushErrorScope("validation");
    causeValidationError(device);
    return popValidationError(device);
};

tests["Capture a single GPUOutOfMemory error."] = async device => {
    device.pushErrorScope("out-of-memory");
    causeMemoryError(device);
    return popMemoryError(device);
};

tests["Ignore errors past the first."] = async device => {
    device.pushErrorScope("validation");
    device.pushErrorScope("validation");
    causeValidationError(device);
    causeValidationError(device);
    
    const error = await device.popErrorScope();
    assertValidationError(error);

    return popNullError(device);
};

tests["Captured errors match error scope filter."] = async device => {
    device.pushErrorScope("validation");
    device.pushErrorScope("out-of-memory");
    causeValidationError(device);

    const shouldBeNull = await device.popErrorScope();
    assertNull(shouldBeNull);

    return popValidationError(device);
};

tests["Reject popErrorScope if no scope exists."] = async device => {
    const promise = device.popErrorScope().then(() => assert_unreached(), async e => {
        assert_false(e === undefined);
        // Pop the extra 'none' scope.
        await popNullError(device);
    });
    // 'promise' should still reject if a scope is pushed here.
    device.pushErrorScope("none");
    return promise;
};

tests["Filter 'none' should capture but not report errors."] = async device => {
    device.pushErrorScope("out-of-memory");
    device.pushErrorScope("none");
    causeMemoryError(device);

    const shouldBeNull = await device.popErrorScope();
    assertNull(shouldBeNull);

    return popNullError(device);
};

tests["Push and pop many error scopes with no rejections."] = async device => {
    const numIterations = 128;
    for (let i = 0; i < numIterations; ++i)
        device.pushErrorScope("out-of-memory");
    
    for (let i = 0; i < numIterations - 1; ++i)
        await popNullError(device);

    return popNullError(device);
};

tests["Catch many errors in nested scopes."] = async device => {
    const numIterations = 128;
    for (let i = 0; i < numIterations; ++i) {
        device.pushErrorScope("validation");
        causeValidationError(device);
    }

    for (let i = 0; i < numIterations - 1; ++i)
        await popValidationError(device);

    return popValidationError(device);
};

runTestsWithDevice(tests);

/* Helper Functions */

const causeValidationError = device => device.createBuffer({ size: 4, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.MAP_WRITE });
const causeMemoryError = device => device.createBuffer({ size: 99999999999, usage: GPUBufferUsage.NONE });

</script>
</body>