diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-poisoned-done.js b/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-poisoned-done.js new file mode 100644 index 0000000000..58dd2b6e32 --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-poisoned-done.js @@ -0,0 +1,52 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.next +description: next() will reject promise if getter `done` abrupt completes +info: | + %AsyncFromSyncIteratorPrototype%.next ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let nextResult be IteratorNext(syncIteratorRecord, value). + 6. IfAbruptRejectPromise(nextResult, promiseCapability). + 7. Let nextDone be IteratorComplete(nextResult). + 8. IfAbruptRejectPromise(nextDone, promiseCapability). + ... + 18. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Catch me."); + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { + get done() { + throw thrownError; + }, + value: 1 + } + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +asyncg().next().then( + function (result) { + throw new Test262Error("Promise should be rejected."); + }, + function (err) { + assert.sameValue(err, thrownError, "Promise should be rejected with thrown error"); + } +).then($DONE, $DONE); + diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-poisoned-value.js b/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-poisoned-value.js new file mode 100644 index 0000000000..ba76169daf --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-poisoned-value.js @@ -0,0 +1,54 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.next +description: next() will reject promise if getter `value` abrupt completes +info: | + %AsyncFromSyncIteratorPrototype%.next ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let nextResult be IteratorNext(syncIteratorRecord, value). + 6. IfAbruptRejectPromise(nextResult, promiseCapability). + 7. Let nextDone be IteratorComplete(nextResult). + 8. If AbruptRejectPromise(nextDone, promiseCapability). + 9. Let nextValue be IteratorValue(nextResult). + 10. IfAbruptRejectPromise(nextValue, promiseCapability). + ... + 18. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Catch me."); + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { + get value() { + throw thrownError; + }, + done: false + } + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +asyncg().next().then( + function (result) { + throw new Test262Error("Promise should be rejected."); + }, + function (err) { + assert.sameValue(err, thrownError, "Promise should be rejected with thrown error"); + } +).then($DONE, $DONE); + diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-prototype.js b/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-prototype.js new file mode 100644 index 0000000000..06ebc60d80 --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-prototype.js @@ -0,0 +1,42 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.next +description: next() returns a promise for an IteratorResult object +info: | + %AsyncFromSyncIteratorPrototype%.next ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let nextResult be IteratorNext(syncIteratorRecord, value). + 6. IfAbruptRejectPromise(nextResult, promiseCapability). + 7. Let nextDone be IteratorComplete(nextResult). + 8. If AbruptRejectPromise(nextDone, promiseCapability). + 9. Let nextValue be IteratorValue(nextResult). + 10. IfAbruptRejectPromise(nextValue, promiseCapability). + ... + 14. Let steps be the algorithm steps defined in Async-from-Sync Iterator Value Unwrap Functions. + + Async-from-Sync Iterator Value Unwrap Functions + 1. Return ! CreateIterResultObject(value, F.[[Done]]). + +flags: [async] +features: [async-iteration] +---*/ + +function* g() {} + +async function* asyncg() { + yield* g(); +} + +asyncg().next().then(function (result) { + assert( + Object.hasOwnProperty.call(result, 'value'), 'Has "own" property `value`' + ); + assert( + Object.hasOwnProperty.call(result, 'done'), 'Has "own" property `done`' + ); + assert.sameValue(Object.getPrototypeOf(result), Object.prototype); +}).then($DONE, $DONE); diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-rejected.js b/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-rejected.js new file mode 100644 index 0000000000..2aa943188d --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-rejected.js @@ -0,0 +1,43 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.next +description: next() will reject promise if sync iterator next() function returns an aburpt completion +info: | + %AsyncFromSyncIteratorPrototype%.next ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let nextResult be IteratorNext(syncIteratorRecord, value). + 6. IfAbruptRejectPromise(nextResult, promiseCapability). + 7. Let nextDone be IteratorComplete(nextResult). + 8. If AbruptRejectPromise(nextDone, promiseCapability). + 9. Let nextValue be IteratorValue(nextResult). + 10. IfAbruptRejectPromise(nextValue, promiseCapability). + ... + 18. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Catch me."); + +function* g() { + throw thrownError; +} + +async function* asyncg() { + yield* g(); +} + +asyncg().next().then( + function (result) { + throw new Test262Error("Promise should be rejected."); + }, + function (err) { + assert.sameValue(err, thrownError, "Promise should be rejected with thrown error"); + } +).then($DONE, $DONE); + diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-unwrap-promise.js b/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-unwrap-promise.js new file mode 100644 index 0000000000..d3ccdcaebc --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/next/iterator-result-unwrap-promise.js @@ -0,0 +1,43 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.next +description: next() will unwrap a Promise value return by the sync iterator +info: | + %AsyncFromSyncIteratorPrototype%.next ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let nextResult be IteratorNext(syncIteratorRecord, value). + 6. IfAbruptRejectPromise(nextResult, promiseCapability). + 7. Let nextDone be IteratorComplete(nextResult). + 8. If AbruptRejectPromise(nextDone, promiseCapability). + 9. Let nextValue be IteratorValue(nextResult). + 10. IfAbruptRejectPromise(nextValue, promiseCapability). + ... + 14. Let steps be the algorithm steps defined in Async-from-Sync Iterator Value Unwrap Functions. + + Async-from-Sync Iterator Value Unwrap Functions + An async-from-sync iterator value unwrap function is an anonymous built-in + function that is used by methods of %AsyncFromSyncIteratorPrototype% when + processing the value field of an IteratorResult object, in order to wait for + its value if it is a promise and re-package the result in a new "unwrapped" + IteratorResult object. Each async iterator value unwrap function has a + [[Done]] internal slot. + +flags: [async] +features: [async-iteration] +---*/ + +function* g() { + yield Promise.resolve(1); +} + +async function* asyncg() { + yield* g(); +} + +asyncg().next().then(function (result) { + assert.sameValue(result.value, 1, "result.value should be unwrapped promise, got: " + result.value) +}).then($DONE, $DONE); diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/next/return-promise.js b/test/built-ins/AsyncFromSyncIteratorPrototype/next/return-promise.js new file mode 100644 index 0000000000..d3bb1be2f4 --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/next/return-promise.js @@ -0,0 +1,27 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.next +description: > + "next" returns a promise for an IteratorResult object +info: | + %AsyncFromSyncIteratorPrototype%.next ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 18. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +function* g() { +} + +async function* asyncg() { + yield* g(); +} + +var result = asyncg().next(); +assert(result instanceof Promise) diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result-poisoned-done.js b/test/built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result-poisoned-done.js new file mode 100644 index 0000000000..e3c4c09b65 --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result-poisoned-done.js @@ -0,0 +1,70 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.return +description: return() will reject promise if getter `done` abrupt completes +info: | + %AsyncFromSyncIteratorPrototype%.return ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let return be GetMethod(syncIterator, "return"). + ... + 8. Let returnResult be Call(return, syncIterator, « value »). + 9. IfAbruptRejectPromise(returnResult, promiseCapability). + ... + 11. Let returnDone be IteratorComplete(returnResult). + 12. IfAbruptRejectPromise(returnDone, promiseCapability). + 13. Let returnValue be IteratorValue(returnResult). + 14. IfAbruptRejectPromise(returnValue, promiseCapability). + ... + 22. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Catch me."); + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + }, + return() { + return { + get done() { + throw thrownError; + }, + value: 1 + } + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + iter.return().then( + function (result) { + throw new Test262Error("Promise should be rejected, got: " + result.value); + }, + function (err) { + assert.sameValue(err, thrownError, "Promise should be rejected with thrown error"); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); + +}).catch($DONE); diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result-poisoned-value.js b/test/built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result-poisoned-value.js new file mode 100644 index 0000000000..181d8aa99f --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result-poisoned-value.js @@ -0,0 +1,70 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.return +description: return() will reject promise if getter `value` abrupt completes +info: | + %AsyncFromSyncIteratorPrototype%.return ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let return be GetMethod(syncIterator, "return"). + ... + 8. Let returnResult be Call(return, syncIterator, « value »). + 9. IfAbruptRejectPromise(returnResult, promiseCapability). + ... + 11. Let returnDone be IteratorComplete(returnResult). + 12. IfAbruptRejectPromise(returnDone, promiseCapability). + 13. Let returnValue be IteratorValue(returnResult). + 14. IfAbruptRejectPromise(returnValue, promiseCapability). + ... + 22. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + + +var thrownError = new Error("Catch me."); +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + }, + return() { + return { + get value() { + throw thrownError; + }, + done: false + } + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + iter.return().then( + function (result) { + throw new Test262Error("Promise should be rejected, got: " + result.value); + }, + function (err) { + assert.sameValue(err, thrownError, "Promise should be rejected with thrown error"); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); + +}).catch($DONE); diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result-unwrap-promise.js b/test/built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result-unwrap-promise.js new file mode 100644 index 0000000000..08ed58ec30 --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result-unwrap-promise.js @@ -0,0 +1,63 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.return +description: return() will unwrap a Promise value return by the sync iterator +info: | + %AsyncFromSyncIteratorPrototype%.return ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let return be GetMethod(syncIterator, "return"). + ... + 17. Let steps be the algorithm steps defined in Async-from-Sync Iterator Value Unwrap Functions. + ... + 22. Return promiseCapability.[[Promise]]. + + Async-from-Sync Iterator Value Unwrap Functions + An async-from-sync iterator value unwrap function is an anonymous built-in + function that is used by methods of %AsyncFromSyncIteratorPrototype% when + processing the value field of an IteratorResult object, in order to wait for + its value if it is a promise and re-package the result in a new "unwrapped" + IteratorResult object. Each async iterator value unwrap function has a + [[Done]] internal slot. + +flags: [async] +features: [async-iteration] +---*/ + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + }, + return() { + return { + value: Promise.resolve(42), + done: true + }; + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +let iter = asyncg(); + +iter.next().then(function (result) { + iter.return().then( + function (result) { + assert.sameValue(result.value, 42, "Result.value should be unwrapped, got: " + result.value); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); +}).then($DONE, $DONE); diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result.js b/test/built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result.js new file mode 100644 index 0000000000..9b4cbd2c0c --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/return/iterator-result.js @@ -0,0 +1,55 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.return +description: return() will return a iterator result object when built-in sync throw is called +info: | + %AsyncFromSyncIteratorPrototype%.return ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let return be GetMethod(syncIterator, "return"). + ... + 8. Let returnResult be Call(return, syncIterator, « value »). + ... + 22. Return promiseCapability.[[Promise]]. + + Generator.prototype.return ( value ) + 1. Let g be the this value. + 2. Let C be Completion{[[Type]]: return, [[Value]]: value, [[Target]]: empty}. + 3. Return ? GeneratorResumeAbrupt(g, C). + +flags: [async] +features: [async-iteration] +---*/ + +function* g() { + yield 42; + throw new Test262Error('return closes iter'); + yield 43; +} + +async function* asyncg() { + yield* g(); +} + +var iter = asyncg(); +var val = 'some specific return value' + +iter.next().then(function(result) { + + // return will call sync generator prototype built-in function return + iter.return(val).then(function(result) { + + assert.sameValue(result.done, true, 'the iterator is completed'); + assert.sameValue(result.value, val, 'expect agrument to `return`'); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + + }).catch($DONE); + +}).catch($DONE); diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/return/poisoned-get-return.js b/test/built-ins/AsyncFromSyncIteratorPrototype/return/poisoned-get-return.js new file mode 100644 index 0000000000..01dd66eb4a --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/return/poisoned-get-return.js @@ -0,0 +1,59 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.return +description: return() will return rejected promise if getter of `return` abrupt completes +info: | + %AsyncFromSyncIteratorPrototype%.return ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let return be GetMethod(syncIterator, "return"). + 6. IfAbruptRejectPromise(return, promiseCapability). + ... + 22. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Catch me."); + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + }, + get return() { + throw thrownError; + } + } + } +}; + +async function* asyncg() { + yield* obj; +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + iter.return().then( + function (result) { + throw new Test262Error("Promise should be rejected, got: " + result.value); + }, + function (err) { + assert.sameValue(err, thrownError, "Promise should be rejected with thrown error"); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); + +}).catch($DONE); + diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/return/poisoned-return.js b/test/built-ins/AsyncFromSyncIteratorPrototype/return/poisoned-return.js new file mode 100644 index 0000000000..4616739ce1 --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/return/poisoned-return.js @@ -0,0 +1,65 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.return +description: return() will return rejected promise if getter of `return` abrupt completes +info: | + %AsyncFromSyncIteratorPrototype%.return ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let return be GetMethod(syncIterator, "return"). + 6. IfAbruptRejectPromise(return, promiseCapability). + ... + 8. Let returnResult be Call(return, syncIterator, « value »). + ... + 10. If Type(returnResult) is not Object, + a. Perform ! Call(promiseCapability.[[Reject]], undefined, « a TypeError exception »). + b. Return promiseCapability.[[Promise]]. + ... + 22. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Catch me."); + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + }, + return() { + throw thrownError; + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + iter.return().then( + function (result) { + throw new Test262Error("Promise should be rejected, got: " + result.value); + }, + function (err) { + assert.sameValue(err, thrownError, "Promise should be rejected with thrown error"); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); + +}).catch($DONE); + diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/return/result-object-error.js b/test/built-ins/AsyncFromSyncIteratorPrototype/return/result-object-error.js new file mode 100644 index 0000000000..9014adafbe --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/return/result-object-error.js @@ -0,0 +1,64 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.return +description: return() will return rejected promise if getter of `return` abrupt completes +info: | + %AsyncFromSyncIteratorPrototype%.return ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let return be GetMethod(syncIterator, "return"). + 6. IfAbruptRejectPromise(return, promiseCapability). + ... + 8. Let returnResult be Call(return, syncIterator, « value »). + ... + 10. If Type(returnResult) is not Object, + a. Perform ! Call(promiseCapability.[[Reject]], undefined, « a TypeError exception »). + b. Return promiseCapability.[[Promise]]. + ... + 22. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + }, + return() { + return 1; + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + iter.return().then( + function (result) { + throw new Test262Error("Promise should be rejected, got: " + result.value); + }, + function (err) { + let typeerror = err instanceof TypeError; + assert(typeerror, "Expect TypeError, got: " + err); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); + +}).catch($DONE); + diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/return/return-undefined.js b/test/built-ins/AsyncFromSyncIteratorPrototype/return/return-undefined.js new file mode 100644 index 0000000000..5e7243eae7 --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/return/return-undefined.js @@ -0,0 +1,54 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.throw +description: return() will return value undefined if sync `return` is undefined +info: | + %AsyncFromSyncIteratorPrototype%.return ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let return be GetMethod(syncIterator, "return"). + 6. IfAbruptRejectPromise(return, promiseCapability). + 7. If return is undefined, then + a. Let iterResult be ! CreateIterResultObject(value, true). + b. Perform ! Call(promiseCapability.[[Resolve]], undefined, « iterResult »). + c. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + iter.return().then(function(result) { + + assert.sameValue(result.done, true, 'the iterator is completed'); + assert.sameValue(result.value, undefined, 'expect value to be undefined'); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + + }).catch($DONE); + +}).catch($DONE); diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result-poisoned-done.js b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result-poisoned-done.js new file mode 100644 index 0000000000..0bae74492e --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result-poisoned-done.js @@ -0,0 +1,69 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.throw +description: throw() will reject promise if getter `done` abrupt completes +info: | + %AsyncFromSyncIteratorPrototype%.throw ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let throw be GetMethod(syncIterator, "throw"). + ... + 8. Let throwResult be Call(throw, syncIterator, « value »). + ... + 11. Let throwDone be IteratorComplete(throwResult). + 12. IfAbruptRejectPromise(throwDone, promiseCapability). + 13. Let throwValue be IteratorValue(throwResult). + 14. IfAbruptRejectPromise(throwValue, promiseCapability). + ... + 20. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Catch me."); + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + }, + throw() { + return { + get done() { + throw thrownError; + }, + value: 1 + } + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + iter.throw().then( + function (result) { + throw new Test262Error("Promise should be rejected, got: " + result.value); + }, + function (err) { + assert.sameValue(err, thrownError, "Promise should be rejected with thrown error"); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); + +}).catch($DONE); diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result-poisoned-value.js b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result-poisoned-value.js new file mode 100644 index 0000000000..a04f988a2d --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result-poisoned-value.js @@ -0,0 +1,69 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.throw +description: throw() will reject promise if getter `value` abrupt completes +info: | + %AsyncFromSyncIteratorPrototype%.throw ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let throw be GetMethod(syncIterator, "throw"). + ... + 8. Let throwResult be Call(throw, syncIterator, « value »). + ... + 11. Let throwDone be IteratorComplete(throwResult). + 12. IfAbruptRejectPromise(throwDone, promiseCapability). + 13. Let throwValue be IteratorValue(throwResult). + 14. IfAbruptRejectPromise(throwValue, promiseCapability). + ... + 20. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Catch me."); + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + }, + throw() { + return { + get value() { + throw thrownError; + }, + done: false + } + } + } + } +}; + +async function* asyncg() { + yield* obj; +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + iter.throw().then( + function (result) { + throw new Test262Error("Promise should be rejected, got: " + result.value); + }, + function (err) { + assert.sameValue(err, thrownError, "Promise should be rejected with thrown error"); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); + +}).catch($DONE); diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result-unwrap-promise.js b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result-unwrap-promise.js new file mode 100644 index 0000000000..521f513111 --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result-unwrap-promise.js @@ -0,0 +1,65 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.throw +description: throw() will unwrap a Promise value return by the sync iterator +info: | + %AsyncFromSyncIteratorPrototype%.throw ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let throw be GetMethod(syncIterator, "throw"). + ... + 17. Let steps be the algorithm steps defined in Async-from-Sync Iterator Value Unwrap Functions. + ... + 20. Return promiseCapability.[[Promise]]. + + Async-from-Sync Iterator Value Unwrap Functions + An async-from-sync iterator value unwrap function is an anonymous built-in + function that is used by methods of %AsyncFromSyncIteratorPrototype% when + processing the value field of an IteratorResult object, in order to wait for + its value if it is a promise and re-package the result in a new "unwrapped" + IteratorResult object. Each async iterator value unwrap function has a + [[Done]] internal slot. + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Don't catch me.") + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + }, + throw() { + return { + value: Promise.resolve(42), + done: true + }; + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +let iter = asyncg(); + +iter.next().then(function (result) { + iter.throw(thrownError).then( + function (result) { + assert.sameValue(result.value, 42, "Result.value should be unwrapped, got: " + result.value); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); +}).then($DONE, $DONE); diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result.js b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result.js new file mode 100644 index 0000000000..041ca20099 --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/iterator-result.js @@ -0,0 +1,59 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.throw +description: throw() will call default sync throw +info: | + %AsyncFromSyncIteratorPrototype%.throw ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let throw be GetMethod(syncIterator, "throw"). + ... + 8. Let throwResult be Call(throw, syncIterator, « value ») + 9. IfAbruptRejectPromise(throwResult, promiseCapability). + ... + 22. Return promiseCapability.[[Promise]]. + + Generator.prototype.throw ( exception ) + 1. Let g be the this value. + 2. Let C be Completion{[[Type]]: throw, [[Value]]: exception, [[Target]]: empty}. + 3. Return ? GeneratorResumeAbrupt(g, C). + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Catch me.") + +function* g() { + yield 42; + throw new Test262Error('throw closes iter'); + yield 43; +} + +async function* asyncg() { + yield* g(); +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + // throw will call sync generator prototype built-in function throw + iter.throw(thrownError).then( + function(result) { + throw new Test262Error('throw should cause rejection of promise'); + }, + function(err) { + assert.sameValue(err, thrownError, "promise should be reject with custom error, got: " + err) + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); + +}).catch($DONE); diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/throw/poisoned-get-throw.js b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/poisoned-get-throw.js new file mode 100644 index 0000000000..87609bebbb --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/poisoned-get-throw.js @@ -0,0 +1,59 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.throw +description: throw() will return rejected promise if getter of `throw` abrupt completes +info: | + %AsyncFromSyncIteratorPrototype%.return ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let return be GetMethod(syncIterator, "throw"). + 6. IfAbruptRejectPromise(throw, promiseCapability). + ... + 22. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Catch me."); + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + }, + get throw() { + throw thrownError; + } + } + } +}; + +async function* asyncg() { + yield* obj; +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + iter.throw().then( + function (result) { + throw new Test262Error("Promise should be rejected, got: " + result.value); + }, + function (err) { + assert.sameValue(err, thrownError, "Promise should be rejected with thrown error"); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); + +}).catch($DONE); + diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/throw/poisoned-throw.js b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/poisoned-throw.js new file mode 100644 index 0000000000..25bfc5b286 --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/poisoned-throw.js @@ -0,0 +1,61 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.throw +description: throw() will return rejected promise if getter of `throw` abrupt completes +info: | + %AsyncFromSyncIteratorPrototype%.throw ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let throw be GetMethod(syncIterator, "throw"). + 6. IfAbruptRejectPromise(throw, promiseCapability). + ... + 8. Let throwResult be Call(throw, syncIterator, « value »). + 9. IfAbruptRejectPromise(throwResult, promiseCapability). + ... + 22. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Catch me."); + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + }, + throw() { + throw thrownError; + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + iter.throw().then( + function (result) { + throw new Test262Error("Promise should be rejected, got: " + result.value); + }, + function (err) { + assert.sameValue(err, thrownError, "Promise should be rejected with thrown error"); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); + +}).catch($DONE); diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/throw/result-object-error.js b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/result-object-error.js new file mode 100644 index 0000000000..35e9f8336f --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/result-object-error.js @@ -0,0 +1,64 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.throw +description: throw() will return rejected promise if getter of `throw` abrupt completes +info: | + %AsyncFromSyncIteratorPrototype%.throw ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let throw be GetMethod(syncIterator, "throw"). + 6. IfAbruptRejectPromise(thow, promiseCapability). + ... + 8. Let throwResult be Call(throw, syncIterator, « value »). + ... + 10. If Type(throwResult) is not Object, + a. Perform ! Call(promiseCapability.[[Reject]], undefined, « a TypeError exception »). + b. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var thrownError = new Error("Don't catch me.") + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + }, + throw() { + return 1; + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + iter.throw(thrownError).then( + function (result) { + throw new Test262Error("Promise should be rejected, got: " + result.value); + }, + function (err) { + let typeerror = err instanceof TypeError; + assert(typeerror, "Expect TypeError, got: " + err); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); + +}).catch($DONE); + diff --git a/test/built-ins/AsyncFromSyncIteratorPrototype/throw/throw-undefined.js b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/throw-undefined.js new file mode 100644 index 0000000000..94863e2c5a --- /dev/null +++ b/test/built-ins/AsyncFromSyncIteratorPrototype/throw/throw-undefined.js @@ -0,0 +1,55 @@ +// Copyright (C) 2018 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%asyncfromsynciteratorprototype%.throw +description: throw() will return rejected promise if sync `throw` undefined +info: | + %AsyncFromSyncIteratorPrototype%.throw ( value ) + ... + 2. Let promiseCapability be ! NewPromiseCapability(%Promise%). + ... + 5. Let return be GetMethod(syncIterator, "throw"). + 6. IfAbruptRejectPromise(throw, promiseCapability). + 7. If throw is undefined, then + a. Perform ! Call(promiseCapability.[[Reject]], undefined, « value »). + b. Return promiseCapability.[[Promise]]. + +flags: [async] +features: [async-iteration] +---*/ + +var obj = { + [Symbol.iterator]() { + return { + next() { + return { value: 1, done: false }; + } + }; + } +}; + +async function* asyncg() { + yield* obj; +} + +var iter = asyncg(); + +iter.next().then(function(result) { + + iter.throw().then( + function (result) { + throw new Test262Error("Promise should be rejected, got: " + result.value); + }, + function (err) { + assert.sameValue(err, undefined, "Promise should be rejected with undefined"); + + iter.next().then(({ done, value }) => { + assert.sameValue(done, true, 'the iterator is completed'); + assert.sameValue(value, undefined, 'value is undefined'); + }).then($DONE, $DONE); + } + ).catch($DONE); + +}).catch($DONE); +