await-using-causes-awaits.js (1951B)
1 // |jit-test| skip-if: !getBuildConfiguration("explicit-resource-management"); --enable-explicit-resource-management 2 3 load(libdir + "asserts.js"); 4 5 { 6 const disposed = []; 7 let wasStartedBeforeAwait = false; 8 let didEvaluatePrecedingBlockStatementsBeforeAwait = false; 9 let didEvaluateFollowingBlockStatementsBeforeAwait = false; 10 let allStatementsRanBeforeAwait = false; 11 12 async function testAwaitUsingCausesAnAwait(evaluateAwaitUsing) { 13 let isRunningBeforeAwait = true; 14 15 async function f() { 16 wasStartedBeforeAwait = isRunningBeforeAwait; 17 outer: { 18 didEvaluatePrecedingBlockStatementsBeforeAwait = isRunningBeforeAwait; 19 if (!evaluateAwaitUsing) break outer; 20 await using _ = { 21 [Symbol.asyncDispose]() { 22 disposed.push(1); 23 } 24 }; 25 didEvaluateFollowingBlockStatementsBeforeAwait = isRunningBeforeAwait; 26 } 27 allStatementsRanBeforeAwait = isRunningBeforeAwait; 28 } 29 30 let p = f(); 31 isRunningBeforeAwait = false; 32 await p; 33 } 34 testAwaitUsingCausesAnAwait(false); 35 drainJobQueue(); 36 assertEq(wasStartedBeforeAwait, true); 37 assertEq(didEvaluatePrecedingBlockStatementsBeforeAwait, true); 38 assertEq(allStatementsRanBeforeAwait, true); 39 assertArrayEq(disposed, []); 40 41 wasStartedBeforeAwait = false; 42 didEvaluatePrecedingBlockStatementsBeforeAwait = false; 43 didEvaluateFollowingBlockStatementsBeforeAwait = false; 44 allStatementsRanBeforeAwait = false; 45 testAwaitUsingCausesAnAwait(true); 46 drainJobQueue(); 47 assertEq(wasStartedBeforeAwait, true); 48 // the await using statement is supposed to cause an await right before the scope 49 // end thus the block statements should be evaluated synchronously until the scope end. 50 assertEq(didEvaluatePrecedingBlockStatementsBeforeAwait, true); 51 assertEq(didEvaluateFollowingBlockStatementsBeforeAwait, true); 52 assertEq(allStatementsRanBeforeAwait, false); 53 assertArrayEq(disposed, [1]); 54 }