async-disposable-stack-defer-dispose.js (1759B)
1 // |jit-test| skip-if: !getBuildConfiguration("explicit-resource-management"); --enable-explicit-resource-management 2 3 load(libdir + "asserts.js"); 4 5 // |jit-test| skip-if: !getBuildConfiguration("explicit-resource-management"); --enable-explicit-resource-management 6 7 load(libdir + "asserts.js"); 8 9 { 10 const disposed = []; 11 const stack = new AsyncDisposableStack(); 12 assertEq(stack.defer(() => disposed.push(1)), undefined); 13 stack.defer(() => disposed.push(2)); 14 assertEq(stack.disposed, false); 15 stack.disposeAsync(); 16 drainJobQueue(); 17 assertEq(stack.disposed, true); 18 assertArrayEq(disposed, [2, 1]); 19 stack.disposeAsync(); 20 drainJobQueue(); 21 assertArrayEq(disposed, [2, 1]); 22 assertThrowsInstanceOf(() => stack.defer(() => disposed.push(3)), ReferenceError); 23 assertArrayEq(disposed, [2, 1]); 24 } 25 26 { 27 const values = []; 28 const stack = new AsyncDisposableStack(); 29 stack.defer(() => values.push(1)); 30 stack.defer(() => values.push(2)); 31 assertEq(stack.disposed, false); 32 async function testDisposalsWithAwaitUsing() { 33 { 34 await using stk = stack; 35 stk.use({ 36 [Symbol.asyncDispose]() { 37 values.push(3); 38 }, 39 }); 40 stk.adopt(4, (v) => values.push(v)); 41 stk.defer(() => values.push(5)); 42 } 43 } 44 testDisposalsWithAwaitUsing(); 45 drainJobQueue(); 46 assertEq(stack.disposed, true); 47 assertArrayEq(values, [5, 4, 3, 2, 1]); 48 } 49 50 { 51 assertThrowsInstanceOf(() => { 52 const stack = new AsyncDisposableStack(); 53 stack.defer(undefined); 54 }, TypeError); 55 56 assertThrowsInstanceOf(() => { 57 const stack = new AsyncDisposableStack(); 58 stack.defer(null); 59 }, TypeError); 60 61 assertThrowsInstanceOf(() => { 62 const stack = new AsyncDisposableStack(); 63 stack.defer(1); 64 }, TypeError); 65 }