MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
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);