From 78388c5ac257d0b57f50921c4718e41c6181c2d6 Mon Sep 17 00:00:00 2001 From: Leo Balter <leonardo.balter@gmail.com> Date: Mon, 27 Mar 2017 20:38:14 -0400 Subject: [PATCH] Add cases for abrupt completions in yield* in async generator - getting iterator Closes #873 --- .../yield-star-expr-abrupt.case | 36 +++++++++++ .../yield-star-getiter-async-get-abrupt.case | 59 +++++++++++++++++ ...iter-async-not-callable-boolean-throw.case | 58 +++++++++++++++++ ...titer-async-not-callable-number-throw.case | 58 +++++++++++++++++ ...titer-async-not-callable-object-throw.case | 58 +++++++++++++++++ ...titer-async-not-callable-string-throw.case | 58 +++++++++++++++++ ...titer-async-not-callable-symbol-throw.case | 58 +++++++++++++++++ ...ar-getiter-async-null-sync-get-abrupt.case | 64 +++++++++++++++++++ ...eld-star-getiter-async-returns-abrupt.case | 55 ++++++++++++++++ ...r-getiter-async-returns-boolean-throw.case | 54 ++++++++++++++++ ...star-getiter-async-returns-null-throw.case | 54 ++++++++++++++++ ...ar-getiter-async-returns-number-throw.case | 54 ++++++++++++++++ ...ar-getiter-async-returns-string-throw.case | 54 ++++++++++++++++ ...ar-getiter-async-returns-symbol-throw.case | 54 ++++++++++++++++ ...getiter-async-returns-undefined-throw.case | 54 ++++++++++++++++ ...titer-async-undefined-sync-get-abrupt.case | 64 +++++++++++++++++++ .../yield-star-getiter-sync-get-abrupt.case | 58 +++++++++++++++++ ...titer-sync-not-callable-boolean-throw.case | 56 ++++++++++++++++ ...etiter-sync-not-callable-number-throw.case | 56 ++++++++++++++++ ...etiter-sync-not-callable-object-throw.case | 56 ++++++++++++++++ ...etiter-sync-not-callable-string-throw.case | 56 ++++++++++++++++ ...etiter-sync-not-callable-symbol-throw.case | 57 +++++++++++++++++ ...ield-star-getiter-sync-returns-abrupt.case | 51 +++++++++++++++ ...ar-getiter-sync-returns-boolean-throw.case | 55 ++++++++++++++++ ...-star-getiter-sync-returns-null-throw.case | 55 ++++++++++++++++ ...tar-getiter-sync-returns-number-throw.case | 55 ++++++++++++++++ ...tar-getiter-sync-returns-string-throw.case | 55 ++++++++++++++++ ...tar-getiter-sync-returns-symbol-throw.case | 55 ++++++++++++++++ ...-getiter-sync-returns-undefined-throw.case | 55 ++++++++++++++++ 29 files changed, 1612 insertions(+) create mode 100644 src/async-generators/yield-star-expr-abrupt.case create mode 100644 src/async-generators/yield-star-getiter-async-get-abrupt.case create mode 100644 src/async-generators/yield-star-getiter-async-not-callable-boolean-throw.case create mode 100644 src/async-generators/yield-star-getiter-async-not-callable-number-throw.case create mode 100644 src/async-generators/yield-star-getiter-async-not-callable-object-throw.case create mode 100644 src/async-generators/yield-star-getiter-async-not-callable-string-throw.case create mode 100644 src/async-generators/yield-star-getiter-async-not-callable-symbol-throw.case create mode 100644 src/async-generators/yield-star-getiter-async-null-sync-get-abrupt.case create mode 100644 src/async-generators/yield-star-getiter-async-returns-abrupt.case create mode 100644 src/async-generators/yield-star-getiter-async-returns-boolean-throw.case create mode 100644 src/async-generators/yield-star-getiter-async-returns-null-throw.case create mode 100644 src/async-generators/yield-star-getiter-async-returns-number-throw.case create mode 100644 src/async-generators/yield-star-getiter-async-returns-string-throw.case create mode 100644 src/async-generators/yield-star-getiter-async-returns-symbol-throw.case create mode 100644 src/async-generators/yield-star-getiter-async-returns-undefined-throw.case create mode 100644 src/async-generators/yield-star-getiter-async-undefined-sync-get-abrupt.case create mode 100644 src/async-generators/yield-star-getiter-sync-get-abrupt.case create mode 100644 src/async-generators/yield-star-getiter-sync-not-callable-boolean-throw.case create mode 100644 src/async-generators/yield-star-getiter-sync-not-callable-number-throw.case create mode 100644 src/async-generators/yield-star-getiter-sync-not-callable-object-throw.case create mode 100644 src/async-generators/yield-star-getiter-sync-not-callable-string-throw.case create mode 100644 src/async-generators/yield-star-getiter-sync-not-callable-symbol-throw.case create mode 100644 src/async-generators/yield-star-getiter-sync-returns-abrupt.case create mode 100644 src/async-generators/yield-star-getiter-sync-returns-boolean-throw.case create mode 100644 src/async-generators/yield-star-getiter-sync-returns-null-throw.case create mode 100644 src/async-generators/yield-star-getiter-sync-returns-number-throw.case create mode 100644 src/async-generators/yield-star-getiter-sync-returns-string-throw.case create mode 100644 src/async-generators/yield-star-getiter-sync-returns-symbol-throw.case create mode 100644 src/async-generators/yield-star-getiter-sync-returns-undefined-throw.case diff --git a/src/async-generators/yield-star-expr-abrupt.case b/src/async-generators/yield-star-expr-abrupt.case new file mode 100644 index 0000000000..905b88b0c5 --- /dev/null +++ b/src/async-generators/yield-star-expr-abrupt.case @@ -0,0 +1,36 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Abrupt completion while getting yield* operand +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + ... +flags: [async] +---*/ + +//- setup +var obj = {}; +var abrupt = function() { + throw obj; +}; + +//- body + yield* abrupt(); + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v, obj, "reject reason"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-get-abrupt.case b/src/async-generators/yield-star-getiter-async-get-abrupt.case new file mode 100644 index 0000000000..d1e7117173 --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-get-abrupt.case @@ -0,0 +1,59 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Abrupt completion while getting [Symbol.asyncIterator] +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var reason = {}; +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + get [Symbol.asyncIterator]() { + throw reason; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v, reason, "reject reason"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-not-callable-boolean-throw.case b/src/async-generators/yield-star-getiter-async-not-callable-boolean-throw.case new file mode 100644 index 0000000000..305d7f26cd --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-not-callable-boolean-throw.case @@ -0,0 +1,58 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Throws a TypeError on a non-callable [Symbol.asyncIterator] (boolean) +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + 3. If func is either undefined or null, return undefined. + 4. If IsCallable(func) is false, throw a TypeError exception. + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + [Symbol.asyncIterator]: false +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-not-callable-number-throw.case b/src/async-generators/yield-star-getiter-async-not-callable-number-throw.case new file mode 100644 index 0000000000..f228a1526e --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-not-callable-number-throw.case @@ -0,0 +1,58 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Throws a TypeError on a non-callable [Symbol.asyncIterator] (number) +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + 3. If func is either undefined or null, return undefined. + 4. If IsCallable(func) is false, throw a TypeError exception. + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + [Symbol.asyncIterator]: 0 +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-not-callable-object-throw.case b/src/async-generators/yield-star-getiter-async-not-callable-object-throw.case new file mode 100644 index 0000000000..b968bc9f15 --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-not-callable-object-throw.case @@ -0,0 +1,58 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Throws a TypeError on a non-callable [Symbol.asyncIterator] (object) +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + 3. If func is either undefined or null, return undefined. + 4. If IsCallable(func) is false, throw a TypeError exception. + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + [Symbol.asyncIterator]: {} +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-not-callable-string-throw.case b/src/async-generators/yield-star-getiter-async-not-callable-string-throw.case new file mode 100644 index 0000000000..f2a05a682c --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-not-callable-string-throw.case @@ -0,0 +1,58 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Throws a TypeError on a non-callable [Symbol.asyncIterator] (string) +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + 3. If func is either undefined or null, return undefined. + 4. If IsCallable(func) is false, throw a TypeError exception. + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + [Symbol.asyncIterator]: '' +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-not-callable-symbol-throw.case b/src/async-generators/yield-star-getiter-async-not-callable-symbol-throw.case new file mode 100644 index 0000000000..67bdece9a1 --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-not-callable-symbol-throw.case @@ -0,0 +1,58 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Throws a TypeError on a non-callable [Symbol.asyncIterator] (symbol) +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + 3. If func is either undefined or null, return undefined. + 4. If IsCallable(func) is false, throw a TypeError exception. + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + [Symbol.asyncIterator]: Symbol.asyncIterator +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-null-sync-get-abrupt.case b/src/async-generators/yield-star-getiter-async-null-sync-get-abrupt.case new file mode 100644 index 0000000000..66e9c850bd --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-null-sync-get-abrupt.case @@ -0,0 +1,64 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Abrupt completion while getting @@iterator after null @@asyncIterator +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + b. If method is undefined, + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var calls = 0; +var reason = {}; +var obj = { + get [Symbol.iterator]() { + throw reason; + }, + get [Symbol.asyncIterator]() { + calls += 1; + return null; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v, reason, 'reject reason'); + assert.sameValue(calls, 1); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-returns-abrupt.case b/src/async-generators/yield-star-getiter-async-returns-abrupt.case new file mode 100644 index 0000000000..cb12840d80 --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-returns-abrupt.case @@ -0,0 +1,55 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Abrupt completion while calling [Symbol.asyncIterator] +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + 6. Let iterator be ? Call(method, obj). + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var reason = {}; +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + [Symbol.asyncIterator]() { + throw reason; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v, reason, "reject reason"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-returns-boolean-throw.case b/src/async-generators/yield-star-getiter-async-returns-boolean-throw.case new file mode 100644 index 0000000000..3a80b2347b --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-returns-boolean-throw.case @@ -0,0 +1,54 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Non object returned by [Symbol.asyncIterator]() - boolean +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + 6. Let iterator be ? Call(method, obj). + 7. If Type(iterator) is not Object, throw a TypeError exception. + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + [Symbol.asyncIterator]() { + return true; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-returns-null-throw.case b/src/async-generators/yield-star-getiter-async-returns-null-throw.case new file mode 100644 index 0000000000..4609d9a8d1 --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-returns-null-throw.case @@ -0,0 +1,54 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Non object returned by [Symbol.asyncIterator]() - null +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + 6. Let iterator be ? Call(method, obj). + 7. If Type(iterator) is not Object, throw a TypeError exception. + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + [Symbol.asyncIterator]() { + return null; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-returns-number-throw.case b/src/async-generators/yield-star-getiter-async-returns-number-throw.case new file mode 100644 index 0000000000..fea570eddd --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-returns-number-throw.case @@ -0,0 +1,54 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Non object returned by [Symbol.asyncIterator]() - number +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + 6. Let iterator be ? Call(method, obj). + 7. If Type(iterator) is not Object, throw a TypeError exception. + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + [Symbol.asyncIterator]() { + return 42; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-returns-string-throw.case b/src/async-generators/yield-star-getiter-async-returns-string-throw.case new file mode 100644 index 0000000000..b28633e67e --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-returns-string-throw.case @@ -0,0 +1,54 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Non object returned by [Symbol.asyncIterator]() - string +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + 6. Let iterator be ? Call(method, obj). + 7. If Type(iterator) is not Object, throw a TypeError exception. + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + [Symbol.asyncIterator]() { + return '42'; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-returns-symbol-throw.case b/src/async-generators/yield-star-getiter-async-returns-symbol-throw.case new file mode 100644 index 0000000000..ce720f70cc --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-returns-symbol-throw.case @@ -0,0 +1,54 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Non object returned by [Symbol.asyncIterator]() - symbol +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + 6. Let iterator be ? Call(method, obj). + 7. If Type(iterator) is not Object, throw a TypeError exception. + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + [Symbol.asyncIterator]() { + return Symbol.asyncIterator; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-returns-undefined-throw.case b/src/async-generators/yield-star-getiter-async-returns-undefined-throw.case new file mode 100644 index 0000000000..97f9c57294 --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-returns-undefined-throw.case @@ -0,0 +1,54 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Non object returned by [Symbol.asyncIterator]() - undefined +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + ... + 6. Let iterator be ? Call(method, obj). + 7. If Type(iterator) is not Object, throw a TypeError exception. + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var obj = { + get [Symbol.iterator]() { + throw new Test262Error('it should not get Symbol.iterator'); + }, + [Symbol.asyncIterator]() { + return undefined; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-async-undefined-sync-get-abrupt.case b/src/async-generators/yield-star-getiter-async-undefined-sync-get-abrupt.case new file mode 100644 index 0000000000..2812dcdd5c --- /dev/null +++ b/src/async-generators/yield-star-getiter-async-undefined-sync-get-abrupt.case @@ -0,0 +1,64 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Abrupt completion while getting @@iterator after undefined @@asyncIterator +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + b. If method is undefined, + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var calls = 0; +var reason = {}; +var obj = { + get [Symbol.iterator]() { + throw reason; + }, + get [Symbol.asyncIterator]() { + calls += 1; + return undefined; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v, reason, 'reject reason'); + assert.sameValue(calls, 1); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-get-abrupt.case b/src/async-generators/yield-star-getiter-sync-get-abrupt.case new file mode 100644 index 0000000000..968d4d3075 --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-get-abrupt.case @@ -0,0 +1,58 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Abrupt completion while getting [Symbol.iterator] +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + b. If method is undefined, + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var reason = {}; +var obj = { + get [Symbol.iterator]() { + throw reason; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v, reason, "reject reason"); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-not-callable-boolean-throw.case b/src/async-generators/yield-star-getiter-sync-not-callable-boolean-throw.case new file mode 100644 index 0000000000..2c0575d961 --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-not-callable-boolean-throw.case @@ -0,0 +1,56 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Throws a TypeError on a non-callable [Symbol.iterator] (boolean) +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + b. If method is undefined, + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + ... + 4. If IsCallable(func) is false, throw a TypeError exception. + ... + +flags: [async] +---*/ + +//- setup +var obj = { + [Symbol.iterator]: false +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-not-callable-number-throw.case b/src/async-generators/yield-star-getiter-sync-not-callable-number-throw.case new file mode 100644 index 0000000000..6146b9ced1 --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-not-callable-number-throw.case @@ -0,0 +1,56 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Throws a TypeError on a non-callable [Symbol.iterator] (number) +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + b. If method is undefined, + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + ... + 4. If IsCallable(func) is false, throw a TypeError exception. + ... + +flags: [async] +---*/ + +//- setup +var obj = { + [Symbol.iterator]: 0 +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-not-callable-object-throw.case b/src/async-generators/yield-star-getiter-sync-not-callable-object-throw.case new file mode 100644 index 0000000000..80a72246af --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-not-callable-object-throw.case @@ -0,0 +1,56 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Throws a TypeError on a non-callable [Symbol.iterator] (object) +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + b. If method is undefined, + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + ... + 4. If IsCallable(func) is false, throw a TypeError exception. + ... + +flags: [async] +---*/ + +//- setup +var obj = { + [Symbol.iterator]: {} +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-not-callable-string-throw.case b/src/async-generators/yield-star-getiter-sync-not-callable-string-throw.case new file mode 100644 index 0000000000..357ed99872 --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-not-callable-string-throw.case @@ -0,0 +1,56 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Throws a TypeError on a non-callable [Symbol.iterator] (string) +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + b. If method is undefined, + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + ... + 4. If IsCallable(func) is false, throw a TypeError exception. + ... + +flags: [async] +---*/ + +//- setup +var obj = { + [Symbol.iterator]: '' +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-not-callable-symbol-throw.case b/src/async-generators/yield-star-getiter-sync-not-callable-symbol-throw.case new file mode 100644 index 0000000000..f8ac1218fe --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-not-callable-symbol-throw.case @@ -0,0 +1,57 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Throws a TypeError on a non-callable [Symbol.iterator] (symbol) +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + b. If method is undefined, + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ... + + GetMethod ( V, P ) + + ... + 2. Let func be ? GetV(V, P). + ... + 4. If IsCallable(func) is false, throw a TypeError exception. + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var obj = { + [Symbol.iterator]: Symbol.iterator +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions + +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-returns-abrupt.case b/src/async-generators/yield-star-getiter-sync-returns-abrupt.case new file mode 100644 index 0000000000..3ae44f9d82 --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-returns-abrupt.case @@ -0,0 +1,51 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Abrupt completion while calling [Symbol.iterator] +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ii. Let syncIterator be ? Call(syncMethod, obj). + ... + +features: [Symbol.asyncIterator] +flags: [async] +---*/ + +//- setup +var reason = {}; +var obj = { + [Symbol.iterator]() { + throw reason; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v, reason, "reject reason"); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-returns-boolean-throw.case b/src/async-generators/yield-star-getiter-sync-returns-boolean-throw.case new file mode 100644 index 0000000000..ddc7a0fdde --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-returns-boolean-throw.case @@ -0,0 +1,55 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Non object returned by [Symbol.iterator]() - boolean +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ii. Let syncIterator be ? Call(syncMethod, obj). + iii. Return ? CreateAsyncFromSyncIterator(syncIterator). + ... + + CreateAsyncFromSyncIterator(syncIterator) + + 1. If Type(syncIterator) is not Object, throw a TypeError exception. + ... + +flags: [async] +---*/ + +//- setup +var obj = { + [Symbol.iterator]() { + return true; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-returns-null-throw.case b/src/async-generators/yield-star-getiter-sync-returns-null-throw.case new file mode 100644 index 0000000000..d3ba975ec0 --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-returns-null-throw.case @@ -0,0 +1,55 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Non object returned by [Symbol.iterator]() - null +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ii. Let syncIterator be ? Call(syncMethod, obj). + iii. Return ? CreateAsyncFromSyncIterator(syncIterator). + ... + + CreateAsyncFromSyncIterator(syncIterator) + + 1. If Type(syncIterator) is not Object, throw a TypeError exception. + ... + +flags: [async] +---*/ + +//- setup +var obj = { + [Symbol.iterator]() { + return null; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-returns-number-throw.case b/src/async-generators/yield-star-getiter-sync-returns-number-throw.case new file mode 100644 index 0000000000..f41db30cf3 --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-returns-number-throw.case @@ -0,0 +1,55 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Non object returned by [Symbol.iterator]() - number +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ii. Let syncIterator be ? Call(syncMethod, obj). + iii. Return ? CreateAsyncFromSyncIterator(syncIterator). + ... + + CreateAsyncFromSyncIterator(syncIterator) + + 1. If Type(syncIterator) is not Object, throw a TypeError exception. + ... + +flags: [async] +---*/ + +//- setup +var obj = { + [Symbol.iterator]() { + return 0; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-returns-string-throw.case b/src/async-generators/yield-star-getiter-sync-returns-string-throw.case new file mode 100644 index 0000000000..bf26f22c71 --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-returns-string-throw.case @@ -0,0 +1,55 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Non object returned by [Symbol.iterator]() - string +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ii. Let syncIterator be ? Call(syncMethod, obj). + iii. Return ? CreateAsyncFromSyncIterator(syncIterator). + ... + + CreateAsyncFromSyncIterator(syncIterator) + + 1. If Type(syncIterator) is not Object, throw a TypeError exception. + ... + +flags: [async] +---*/ + +//- setup +var obj = { + [Symbol.iterator]() { + return ''; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-returns-symbol-throw.case b/src/async-generators/yield-star-getiter-sync-returns-symbol-throw.case new file mode 100644 index 0000000000..466f456a98 --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-returns-symbol-throw.case @@ -0,0 +1,55 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Non object returned by [Symbol.iterator]() - symbol +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ii. Let syncIterator be ? Call(syncMethod, obj). + iii. Return ? CreateAsyncFromSyncIterator(syncIterator). + ... + + CreateAsyncFromSyncIterator(syncIterator) + + 1. If Type(syncIterator) is not Object, throw a TypeError exception. + ... + +flags: [async] +---*/ + +//- setup +var obj = { + [Symbol.iterator]() { + return Symbol.iterator; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); diff --git a/src/async-generators/yield-star-getiter-sync-returns-undefined-throw.case b/src/async-generators/yield-star-getiter-sync-returns-undefined-throw.case new file mode 100644 index 0000000000..320fd56a37 --- /dev/null +++ b/src/async-generators/yield-star-getiter-sync-returns-undefined-throw.case @@ -0,0 +1,55 @@ +// Copyright 2017 Tooru Fujisawa. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +template: default +desc: Non object returned by [Symbol.iterator]() - undefined +info: | + YieldExpression: yield * AssignmentExpression + + 1. Let exprRef be the result of evaluating AssignmentExpression. + 2. Let value be ? GetValue(exprRef). + 3. Let generatorKind be ! GetGeneratorKind(). + 4. Let iterator be ? GetIterator(value, generatorKind). + ... + + GetIterator ( obj [ , hint ] ) + + ... + 3. If hint is async, + a. Set method to ? GetMethod(obj, @@asyncIterator). + i. Let syncMethod be ? GetMethod(obj, @@iterator). + ii. Let syncIterator be ? Call(syncMethod, obj). + iii. Return ? CreateAsyncFromSyncIterator(syncIterator). + ... + + CreateAsyncFromSyncIterator(syncIterator) + + 1. If Type(syncIterator) is not Object, throw a TypeError exception. + ... + +flags: [async] +---*/ + +//- setup +var obj = { + [Symbol.iterator]() { + return undefined; + } +}; + +//- body + yield* obj; + throw new Test262Error('abrupt completion closes iter'); + +//- assertions +iter.next().then(() => { + throw new Test262Error('Promise incorrectly fulfilled.'); +}, v => { + assert.sameValue(v.constructor, TypeError, "TypeError"); + + 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); -- GitLab