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