Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !getBuildConfiguration("explicit-resource-management"); --enable-explicit-resource-management
load(libdir + "asserts.js");
class CustomError extends Error {}
{
const disposed = [];
let caught = false;
async function testDisposedWhenFunctionThrows() {
await using a = {
[Symbol.asyncDispose]: () => disposed.push("a")
};
{
await using b = {
[Symbol.asyncDispose]: () => disposed.push("b")
};
throw new CustomError();
}
await using c = {
[Symbol.asyncDispose]: () => disposed.push("c")
};
}
testDisposedWhenFunctionThrows().catch((e) => {
caught = true;
assertEq(e instanceof CustomError, true);
});
drainJobQueue();
assertArrayEq(disposed, ["b", "a"]);
assertEq(caught, true);
}
{
const disposed = [];
let caught = false;
async function testDisposedWhenAsyncDisposalInAwaitUsingMethodThrows() {
await using a = {
[Symbol.asyncDispose]: () => disposed.push("a")
};
{
await using b = {
[Symbol.asyncDispose]: () => {
disposed.push("b");
throw new CustomError();
}
};
}
}
testDisposedWhenAsyncDisposalInAwaitUsingMethodThrows().catch((e) => {
caught = true;
assertEq(e instanceof CustomError, true);
});
drainJobQueue();
assertArrayEq(disposed, ["b", "a"]);
assertEq(caught, true);
}
{
const disposed = [];
let caught = false;
async function testDisposedWhenSyncDisposalInAwaitUsingMethodThrows() {
await using a = {
[Symbol.asyncDispose]: () => disposed.push("a")
};
{
await using b = {
[Symbol.dispose]: () => {
disposed.push("b");
throw new CustomError();
}
};
}
}
testDisposedWhenSyncDisposalInAwaitUsingMethodThrows().catch((e) => {
caught = true;
assertEq(e instanceof CustomError, true);
});
drainJobQueue();
assertArrayEq(disposed, ["b", "a"]);
assertEq(caught, true);
}
{
const disposed = [];
async function testDisposedWhenSyncDisposalInUsingMethodThrows() {
await using a = {
[Symbol.asyncDispose]: () => disposed.push("a")
};
{
await using b = {
[Symbol.dispose]: () => {
disposed.push("b");
}
};
using c = {
[Symbol.dispose]: () => {
disposed.push("c");
throw new CustomError();
}
}
}
}
testDisposedWhenSyncDisposalInUsingMethodThrows().catch((e) => {
caught = true;
assertEq(e instanceof CustomError, true);
});
drainJobQueue();
assertArrayEq(disposed, ["c", "b", "a"]);
assertEq(caught, true);
}