| var assert = function (result, expected, message = "") { |
| if (result !== expected) { |
| throw new Error('Error in assert. Expected "' + expected + '" but was "' + result + '":' + message ); |
| } |
| }; |
| var result = 0; |
| async function * foo() { yield 1; yield Promise.resolve(2); return 3;}; |
| |
| async function boo () { |
| for await (const value of foo()) { |
| result = result + value; |
| } |
| } |
| |
| boo(); |
| |
| drainMicrotasks(); |
| |
| assert(result, 3); |
| |
| result = 0; |
| |
| { |
| const boo = async function () { |
| for await (const val of foo()) { |
| result = result + val; |
| } |
| } |
| |
| boo(); |
| |
| drainMicrotasks(); |
| |
| assert(result, 3); |
| } |
| |
| { |
| result = 0; |
| const boo = async function () { |
| for await (const val of [1, 2, 3]) { |
| result = result + val; |
| } |
| } |
| |
| boo(); |
| |
| drainMicrotasks(); |
| |
| assert(result, 6); |
| } |
| |
| { |
| let error = false; |
| |
| const boo = async function () { |
| for await (const val of 1) { |
| result = result + val; |
| } |
| } |
| |
| boo().catch(raisedError => error = raisedError instanceof TypeError); |
| |
| drainMicrotasks(); |
| |
| assert(error, true); |
| } |
| |
| { |
| let conter = 0; |
| const o = { |
| [Symbol.asyncIterator]() { |
| return this |
| }, |
| next(args) { |
| return { done: true } |
| } |
| } |
| |
| result = -1; |
| const boo = async function () { |
| for await (const val of o) { |
| conter++; |
| result = val; |
| } |
| } |
| |
| boo(); |
| |
| drainMicrotasks(); |
| |
| assert(conter, 0); |
| assert(result, -1); |
| } |
| |
| { |
| let conter = 0; |
| const o = { |
| [Symbol.asyncIterator]() { |
| this.index = 0; |
| return this |
| }, |
| next(args) { |
| this.index++; |
| if (this.index <= 10) |
| return { done: false, value: this.index }; |
| else |
| return { done: true, value: this.index }; |
| } |
| } |
| |
| result = 0; |
| const boo = async function () { |
| for await (const val of o) { |
| conter++; |
| result += val; |
| } |
| } |
| |
| boo(); |
| |
| drainMicrotasks(); |
| |
| assert(conter, 10); |
| assert(result, 55); |
| } |
| |
| { |
| let conter = 0; |
| let error = false; |
| |
| const o = { |
| [Symbol.asyncIterator]() { |
| this.index = 0; |
| return this |
| }, |
| next(args) { |
| this.index++; |
| if (this.index <= 10) |
| return { done: false, value: this.index }; |
| else |
| throw new Error('some error'); |
| } |
| } |
| |
| result = 0; |
| const boo = async function () { |
| for await (const val of o) { |
| conter++; |
| result += val; |
| } |
| } |
| |
| boo().catch(e => { error = e instanceof Error && e.message === 'some error'; }); |
| |
| drainMicrotasks(); |
| |
| assert(conter, 10); |
| assert(result, 55); |
| assert(error, true); |
| } |
| |
| { |
| let conter = 0; |
| let error = false; |
| let emptyParam = false; |
| |
| const o = { |
| [Symbol.asyncIterator]() { |
| this.index = 0; |
| return this |
| }, |
| next(args) { |
| emptyParam = args === undefined; |
| this.index++; |
| if (this.index <= 10) |
| return { done: false, value: this.index }; |
| else |
| throw new Error('some error'); |
| } |
| } |
| |
| result = 0; |
| const boo = async function () { |
| try { |
| for await (const val of o) { |
| conter++; |
| result += val; |
| } |
| } catch (e) { |
| error = e instanceof Error && e.message === 'some error'; |
| } |
| } |
| |
| boo(); |
| |
| drainMicrotasks(); |
| |
| assert(conter, 10); |
| assert(result, 55); |
| assert(error, true); |
| assert(emptyParam, true); |
| } |
| |
| { |
| let conter = 0; |
| let error = false; |
| |
| const o = { |
| [Symbol.asyncIterator]() { |
| this.index = 0; |
| return this |
| }, |
| next(args) { |
| this.index++; |
| if (this.index <= 10) |
| return { done: false, value: this.index }; |
| else |
| return { done: true, value: this.index }; |
| } |
| } |
| |
| result = 0; |
| const boo = async function () { |
| if (true) { |
| for await (const val of o) { |
| conter++; |
| result += val; |
| } |
| } |
| } |
| |
| boo(); |
| |
| drainMicrotasks(); |
| |
| assert(conter, 10); |
| assert(result, 55); |
| } |
| |
| { |
| let conter = 0; |
| let error = false; |
| let emptyParam = false; |
| |
| const o = { |
| [Symbol.iterator]() { |
| this.index = 0; |
| return this |
| }, |
| next(args) { |
| emptyParam = args === undefined; |
| this.index++; |
| if (this.index <= 10) |
| return { done: false, value: this.index }; |
| else |
| throw new Error('some error'); |
| } |
| } |
| |
| result = 0; |
| const boo = async function () { |
| try { |
| for await (const val of o) { |
| conter++; |
| result += val; |
| } |
| } catch (e) { |
| error = e instanceof Error && e.message === 'some error'; |
| } |
| } |
| |
| boo(); |
| |
| drainMicrotasks(); |
| |
| assert(conter, 10); |
| assert(result, 55); |
| assert(error, true); |
| assert(emptyParam, true); |
| } |