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 0000000000000000000000000000000000000000..905b88b0c5e2337ab5473cc74001b363511efbbb --- /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 0000000000000000000000000000000000000000..d1e711717343400393d50d97777a79aa21af4535 --- /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 0000000000000000000000000000000000000000..305d7f26cd2a654b16015e1d1c1283b1ba10a9f5 --- /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 0000000000000000000000000000000000000000..f228a1526e68e0af3060b6d6dd117c662814b00e --- /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 0000000000000000000000000000000000000000..b968bc9f1588346db73abdbf04b83b7c06c41871 --- /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 0000000000000000000000000000000000000000..f2a05a682c476715fae98c9d919839a27af42846 --- /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 0000000000000000000000000000000000000000..67bdece9a1f05b5c1c217987d860e2669eb31e69 --- /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 0000000000000000000000000000000000000000..66e9c850bd8676df2c0dc2a3ac70d44d3315fd22 --- /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 0000000000000000000000000000000000000000..cb12840d80650d74b5e3a53b21fd98d75f2c0336 --- /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 0000000000000000000000000000000000000000..3a80b2347bd02cedf7b39d43d5333aaefb9995c3 --- /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 0000000000000000000000000000000000000000..4609d9a8d1ba40213581f748101988800639d67c --- /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 0000000000000000000000000000000000000000..fea570eddd29494edf95f31c81f0b52114322dd0 --- /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 0000000000000000000000000000000000000000..b28633e67e05d83722a6528c345c65fee253b875 --- /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 0000000000000000000000000000000000000000..ce720f70ccf220b682fac17a82b2c8706f6fce85 --- /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 0000000000000000000000000000000000000000..97f9c57294807a6c7527ecdd69156992211e0a18 --- /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 0000000000000000000000000000000000000000..2812dcdd5c8768bbd77a37f259e11aaf7c6fc729 --- /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 0000000000000000000000000000000000000000..968d4d3075586ee82c55635359109bd4f5e894ff --- /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 0000000000000000000000000000000000000000..2c0575d9610ccd8a1a17e4cb1d230cb4003ee1be --- /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 0000000000000000000000000000000000000000..6146b9ced16312b101c050003def784ba74a6703 --- /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 0000000000000000000000000000000000000000..80a72246af77a248853194ba03af18836029750f --- /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 0000000000000000000000000000000000000000..357ed9987249d9ed7840086a177d1b190a520cb5 --- /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 0000000000000000000000000000000000000000..f8ac1218fe273381d44e12aa43bff99d4532d6b9 --- /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 0000000000000000000000000000000000000000..3ae44f9d82aef07db6ef64d65ade293548113343 --- /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 0000000000000000000000000000000000000000..ddc7a0fdde2425236dcad8932e8b909c902c1534 --- /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 0000000000000000000000000000000000000000..d3ba975ec02fb8f0a0a1b76119270b0010b4c6f3 --- /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 0000000000000000000000000000000000000000..f41db30cf35211a4f2f8efc15f2f5b85113fa146 --- /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 0000000000000000000000000000000000000000..bf26f22c715a9f692a7db905f2dcad07237b0298 --- /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 0000000000000000000000000000000000000000..466f456a980e1816ae9aaded65b4bc06884777d8 --- /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 0000000000000000000000000000000000000000..320fd56a371d8398a8e7f6d0ccb6b55e46f4448f --- /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);