disposable-stack-use-dispose.js (2854B)
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 const stack = new DisposableStack(); 8 const obj = { 9 [Symbol.dispose]() { 10 disposed.push(1); 11 }, 12 }; 13 stack.use(obj); 14 assertEq(stack.disposed, false); 15 assertEq(stack.dispose(), undefined); 16 assertEq(stack.disposed, true); 17 assertArrayEq(disposed, [1]); 18 assertThrowsInstanceOf(() => stack.use(obj), ReferenceError); 19 } 20 21 { 22 const disposed = []; 23 const stack = new DisposableStack(); 24 for (let i = 0; i < 5; i++) { 25 stack.use({ 26 [Symbol.dispose]() { 27 disposed.push(i); 28 }, 29 }); 30 } 31 assertEq(stack.disposed, false); 32 stack.dispose(); 33 assertEq(stack.disposed, true); 34 assertArrayEq(disposed, [4, 3, 2, 1, 0]); 35 stack.dispose(); 36 assertArrayEq(disposed, [4, 3, 2, 1, 0]); 37 } 38 39 { 40 const disposed = []; 41 const stack = new DisposableStack(); 42 for (let i = 0; i < 5; i++) { 43 stack.use({ 44 [Symbol.dispose]() { 45 disposed.push(i); 46 }, 47 }); 48 } 49 assertEq(stack.disposed, false); 50 { 51 using stk = stack; 52 } 53 assertEq(stack.disposed, true); 54 assertArrayEq(disposed, [4, 3, 2, 1, 0]); 55 { 56 using stk2 = stack; 57 } 58 assertArrayEq(disposed, [4, 3, 2, 1, 0]); 59 } 60 61 { 62 const disposed = []; 63 const stack = new DisposableStack(); 64 for (let i = 0; i < 5; i++) { 65 stack.use({ 66 [Symbol.dispose]() { 67 disposed.push(i); 68 }, 69 }); 70 } 71 assertEq(stack.disposed, false); 72 { 73 using z = stack; 74 z.use({ 75 [Symbol.dispose]() { 76 disposed.push(5); 77 }, 78 }); 79 assertEq(stack.disposed, false); 80 } 81 assertEq(stack.disposed, true); 82 assertArrayEq(disposed, [5, 4, 3, 2, 1, 0]); 83 } 84 85 { 86 const disposed = []; 87 const stack = new DisposableStack(); 88 stack.use(undefined); 89 stack.use(null); 90 stack.use({ 91 [Symbol.dispose]() { 92 disposed.push(1); 93 } 94 }); 95 stack.dispose(); 96 assertArrayEq(disposed, [1]); 97 } 98 99 { 100 const disposed = []; 101 const stack = new DisposableStack(); 102 stack.use({ 103 [Symbol.dispose]() { 104 disposed.push(1); 105 stack.use({ 106 [Symbol.dispose]() { 107 disposed.push(2); 108 }, 109 }); 110 } 111 }); 112 assertThrowsInstanceOf(() => stack.dispose(), ReferenceError); 113 } 114 115 { 116 assertThrowsInstanceOf(() => { 117 const stack = new DisposableStack(); 118 stack.use(1); 119 }, TypeError); 120 } 121 122 { 123 assertThrowsInstanceOf(() => { 124 const stack = new DisposableStack(); 125 stack.use({ 126 [Symbol.dispose]: undefined 127 }); 128 }, TypeError); 129 130 assertThrowsInstanceOf(() => { 131 const stack = new DisposableStack(); 132 stack.use({ 133 [Symbol.dispose]: null 134 }); 135 }, TypeError); 136 137 assertThrowsInstanceOf(() => { 138 const stack = new DisposableStack(); 139 stack.use({ 140 [Symbol.dispose]: 1 141 }); 142 }, TypeError); 143 }