MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at master 188 lines 4.5 kB view raw
1import { test, summary } from './helpers.js'; 2 3console.log('Async/Await Tests\n'); 4 5let results = {}; 6 7async function basicAsync() { 8 return 42; 9} 10basicAsync().then(v => { 11 results.basic = v; 12}); 13test('async functions have no prototype property', basicAsync.hasOwnProperty('prototype'), false); 14test('async function prototype Symbol.toStringTag', Object.getPrototypeOf(async function () {})[Symbol.toStringTag], 'AsyncFunction'); 15test('async function no line break before function', (() => { 16 try { 17 Function('async\n function a() {await 0}')(); 18 return false; 19 } catch (e) { 20 return true; 21 } 22})(), true); 23test('async function cannot await in parameters', (() => { 24 try { 25 Function('(async function a(b = await Promise.resolve()) {}())')(); 26 return false; 27 } catch (e) { 28 return true; 29 } 30})(), true); 31 32const arrowAsync = async () => 'arrow result'; 33arrowAsync().then(v => { 34 results.arrow = v; 35}); 36 37const singleParam = async x => x * 2; 38singleParam(21).then(v => { 39 results.singleParam = v; 40}); 41 42const multiParam = async (a, b) => a + b; 43multiParam(10, 32).then(v => { 44 results.multiParam = v; 45}); 46 47async function withPromise() { 48 return Promise.resolve('promise from async'); 49} 50withPromise().then(v => { 51 results.withPromise = v; 52}); 53 54async function conditional(flag) { 55 if (flag) return 'true branch'; 56 return 'false branch'; 57} 58conditional(true).then(v => { 59 results.condTrue = v; 60}); 61conditional(false).then(v => { 62 results.condFalse = v; 63}); 64 65const obj = { 66 value: 100, 67 asyncMethod: async function () { 68 return this.value; 69 } 70}; 71obj.asyncMethod().then(v => { 72 results.objMethod = v; 73}); 74 75Promise.resolve(1) 76 .then(v => v + 1) 77 .then(v => v + 1) 78 .then(v => v + 1) 79 .then(v => { 80 results.chain = v; 81 }); 82 83async function awaiter() { 84 const a = await Promise.resolve(1); 85 const b = await Promise.resolve(2); 86 return a + b; 87} 88awaiter().then(v => { 89 results.awaiter = v; 90}); 91 92async function awaitValue() { 93 return await 42; 94} 95awaitValue().then(v => { 96 results.awaitValue = v; 97}); 98 99let finallyCalledResolve = false; 100Promise.resolve('original') 101 .finally(() => { 102 finallyCalledResolve = true; 103 return 'ignored'; 104 }) 105 .then(v => { 106 results.finallyNoChange = v; 107 }); 108 109let finallyCalledReject = false; 110Promise.reject('rejected reason') 111 .finally(() => { 112 finallyCalledReject = true; 113 return 'also ignored'; 114 }) 115 .catch(e => { 116 results.finallyRejectPass = e; 117 }); 118 119Promise.reject('foobar') 120 .finally(() => { 121 throw new Error('bar'); 122 }) 123 .catch(e => { 124 results.finallyThrowError = e.message; 125 }); 126 127Promise.reject('foobar') 128 .finally(() => { 129 return Promise.reject('changed'); 130 }) 131 .catch(e => { 132 results.finallyRejectChange = e; 133 }); 134 135async function awaitLoop() { 136 let sum = 0; 137 for (let i = 0; i < 3; i++) { 138 sum += await Promise.resolve(i); 139 } 140 return sum; 141} 142awaitLoop().then(v => { 143 results.awaitLoop = v; 144}); 145 146async function inner() { 147 return await Promise.resolve(10); 148} 149async function outer() { 150 return (await inner()) + (await inner()); 151} 152outer().then(v => { 153 results.nestedAsync = v; 154}); 155 156async function sequential() { 157 const a = await Promise.resolve(1); 158 const b = await Promise.resolve(2); 159 const c = await Promise.resolve(3); 160 return a + b + c; 161} 162sequential().then(v => { 163 results.sequential = v; 164}); 165 166setTimeout(() => { 167 test('basic async', results.basic, 42); 168 test('arrow async', results.arrow, 'arrow result'); 169 test('single param async', results.singleParam, 42); 170 test('multi param async', results.multiParam, 42); 171 test('with promise', results.withPromise, 'promise from async'); 172 test('conditional true', results.condTrue, 'true branch'); 173 test('conditional false', results.condFalse, 'false branch'); 174 test('object method', results.objMethod, 100); 175 test('promise chain', results.chain, 4); 176 test('awaiter sum', results.awaiter, 3); 177 test('await value', results.awaitValue, 42); 178 test('finally no change resolve', results.finallyNoChange, 'original'); 179 test('finally called on resolve', finallyCalledResolve, true); 180 test('finally passes rejection', results.finallyRejectPass, 'rejected reason'); 181 test('finally called on reject', finallyCalledReject, true); 182 test('finally throw changes rejection', results.finallyThrowError, 'bar'); 183 test('finally reject changes rejection', results.finallyRejectChange, 'changed'); 184 test('await in loop', results.awaitLoop, 3); 185 test('nested async', results.nestedAsync, 20); 186 test('sequential awaits', results.sequential, 6); 187 summary(); 188}, 50);