MIRROR: javascript for 🐜's, a tiny runtime with big ambitions
1// test_closure.js - Test closure scoping across async boundaries
2
3let results = [];
4
5// Test 1: Sync push
6results.push('1. sync');
7
8// Test 2: setTimeout with closure
9setTimeout(() => {
10 results.push('4. timeout 50ms');
11}, 50);
12
13setTimeout(() => {
14 results.push('3. timeout 10ms');
15}, 10);
16
17// Test 3: Promise with closure
18Promise.resolve('2. promise').then(v => {
19 results.push(v);
20});
21
22// Test 4: queueMicrotask with closure
23queueMicrotask(() => {
24 results.push('2. microtask');
25});
26
27// Test 5: Nested closure
28const outer = 'outer-value';
29setTimeout(() => {
30 const inner = 'inner-value';
31 setTimeout(() => {
32 results.push(`5. nested: ${outer}, ${inner}`);
33 }, 10);
34}, 60);
35
36// Final timeout to print results
37setTimeout(() => {
38 console.log('Results length:', results.length);
39 console.log('Results:');
40 for (let i = 0; i < results.length; i++) {
41 console.log(' ', results[i]);
42 }
43
44 // Expected order:
45 // 1. sync
46 // 2. promise (microtask)
47 // 2. microtask (microtask)
48 // 3. timeout 10ms
49 // 4. timeout 50ms
50 // 5. nested: outer-value, inner-value
51
52 console.log('\nExpected 6 items, got:', results.length);
53 if (results.length === 6) {
54 console.log('✓ PASS: All closures captured correctly');
55 } else {
56 console.log('✗ FAIL: Missing items - closure bug');
57 }
58}, 200);