async-eval-state.js (4807B)
1 // Test module fields related to asynchronous evaluation. 2 3 const UNSET = -1; 4 const DONE = -2; 5 6 { 7 let m = parseModule(''); 8 assertEq(m.status, "New"); 9 10 moduleLink(m); 11 assertEq(m.asyncEvaluationOrder, UNSET); 12 assertEq(m.status, "Linked"); 13 14 moduleEvaluate(m); 15 assertEq(m.asyncEvaluationOrder, UNSET); 16 assertEq(m.status, "Evaluated"); 17 } 18 19 { 20 let m = parseModule('await 1;'); 21 22 moduleLink(m); 23 assertEq(m.asyncEvaluationOrder, UNSET); 24 25 moduleEvaluate(m); 26 assertEq(m.status, "EvaluatingAsync"); 27 assertEq(m.asyncEvaluationOrder, 0); 28 29 drainJobQueue(); 30 assertEq(m.status, "Evaluated"); 31 assertEq(m.asyncEvaluationOrder, DONE); 32 } 33 34 { 35 let m = parseModule('await 1; throw 2;'); 36 37 moduleLink(m); 38 moduleEvaluate(m).catch(() => 0); 39 assertEq(m.status, "EvaluatingAsync"); 40 assertEq(m.asyncEvaluationOrder, 0); 41 42 drainJobQueue(); 43 assertEq(m.status, "Evaluated"); 44 assertEq(m.evaluationError, 2); 45 assertEq(m.asyncEvaluationOrder, DONE); 46 } 47 48 { 49 let m = parseModule('throw 1; await 2;'); 50 moduleLink(m); 51 moduleEvaluate(m).catch(() => 0); 52 assertEq(m.status, "EvaluatingAsync"); 53 assertEq(m.asyncEvaluationOrder, 0); 54 55 drainJobQueue(); 56 assertEq(m.status, "Evaluated"); 57 assertEq(m.evaluationError, 1); 58 assertEq(m.asyncEvaluationOrder, DONE); 59 } 60 61 { 62 clearModules(); 63 let a = registerModule('a', parseModule('')); 64 let b = registerModule('b', parseModule('import {} from "a"; await 1;')); 65 66 moduleLink(b); 67 moduleEvaluate(b); 68 assertEq(a.status, "Evaluated"); 69 assertEq(a.asyncEvaluationOrder, UNSET); 70 assertEq(b.status, "EvaluatingAsync"); 71 assertEq(b.asyncEvaluationOrder, 0); 72 73 drainJobQueue(); 74 assertEq(a.status, "Evaluated"); 75 assertEq(a.asyncEvaluationOrder, UNSET); 76 assertEq(b.status, "Evaluated"); 77 assertEq(b.asyncEvaluationOrder, DONE); 78 } 79 80 { 81 clearModules(); 82 let a = registerModule('a', parseModule('await 1;')); 83 let b = registerModule('b', parseModule('import {} from "a";')); 84 85 moduleLink(b); 86 moduleEvaluate(b); 87 assertEq(a.status, "EvaluatingAsync"); 88 assertEq(a.asyncEvaluationOrder, 0); 89 assertEq(b.status, "EvaluatingAsync"); 90 assertEq(b.asyncEvaluationOrder, 1); 91 92 drainJobQueue(); 93 assertEq(a.status, "Evaluated"); 94 assertEq(a.asyncEvaluationOrder, DONE); 95 assertEq(b.status, "Evaluated"); 96 assertEq(b.asyncEvaluationOrder, DONE); 97 } 98 99 { 100 clearModules(); 101 let resolve; 102 var promise = new Promise(r => { resolve = r; }); 103 let a = registerModule('a', parseModule('await promise;')); 104 let b = registerModule('b', parseModule('await 2;')); 105 let c = registerModule('c', parseModule('import {} from "a"; import {} from "b";')); 106 107 moduleLink(c); 108 moduleEvaluate(c); 109 assertEq(a.status, "EvaluatingAsync"); 110 assertEq(a.asyncEvaluationOrder, 0); 111 assertEq(b.status, "EvaluatingAsync"); 112 assertEq(b.asyncEvaluationOrder, 1); 113 assertEq(c.status, "EvaluatingAsync"); 114 assertEq(c.asyncEvaluationOrder, 2); 115 116 resolve(1); 117 drainJobQueue(); 118 assertEq(a.status, "Evaluated"); 119 assertEq(a.asyncEvaluationOrder, DONE); 120 assertEq(b.status, "Evaluated"); 121 assertEq(b.asyncEvaluationOrder, DONE); 122 assertEq(c.status, "Evaluated"); 123 assertEq(c.asyncEvaluationOrder, DONE); 124 } 125 126 { 127 clearModules(); 128 let a = registerModule('a', parseModule('throw 1;')); 129 let b = registerModule('b', parseModule('import {} from "a"; await 2;')); 130 131 moduleLink(b); 132 moduleEvaluate(b).catch(() => 0); 133 assertEq(a.status, "Evaluated"); 134 assertEq(a.asyncEvaluationOrder, UNSET); 135 assertEq(a.evaluationError, 1); 136 assertEq(b.status, "Evaluated"); 137 assertEq(b.asyncEvaluationOrder, UNSET); 138 assertEq(b.evaluationError, 1); 139 } 140 141 { 142 clearModules(); 143 let a = registerModule('a', parseModule('throw 1; await 2;')); 144 let b = registerModule('b', parseModule('import {} from "a";')); 145 146 moduleLink(b); 147 moduleEvaluate(b).catch(() => 0); 148 assertEq(a.asyncEvaluationOrder, 0); 149 assertEq(a.status, "EvaluatingAsync"); 150 assertEq(b.asyncEvaluationOrder, 1); 151 assertEq(b.status, "EvaluatingAsync"); 152 153 drainJobQueue(); 154 assertEq(a.status, "Evaluated"); 155 assertEq(a.evaluationError, 1); 156 assertEq(a.asyncEvaluationOrder, DONE); 157 assertEq(b.status, "Evaluated"); 158 assertEq(b.evaluationError, 1); 159 assertEq(b.asyncEvaluationOrder, DONE); 160 } 161 162 { 163 clearModules(); 164 let a = registerModule('a', parseModule('await 1; throw 2;')); 165 let b = registerModule('b', parseModule('import {} from "a";')); 166 167 moduleLink(b); 168 moduleEvaluate(b).catch(() => 0); 169 assertEq(a.status, "EvaluatingAsync"); 170 assertEq(a.asyncEvaluationOrder, 0); 171 assertEq(b.status, "EvaluatingAsync"); 172 assertEq(b.asyncEvaluationOrder, 1); 173 174 drainJobQueue(); 175 assertEq(a.status, "Evaluated"); 176 assertEq(a.evaluationError, 2); 177 assertEq(a.asyncEvaluationOrder, DONE); 178 assertEq(b.status, "Evaluated"); 179 assertEq(b.evaluationError, 2); 180 assertEq(b.asyncEvaluationOrder, DONE); 181 }