Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(290)

Unified Diff: test/mjsunit/harmony/for-await-of.js

Issue 2637403008: [async-iteration] add support for for-await-of loops in Async Functions (Closed)
Patch Set: rebase Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/parsing/parser-base.h ('K') | « test/cctest/test-parsing.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/mjsunit/harmony/for-await-of.js
diff --git a/test/mjsunit/harmony/for-await-of.js b/test/mjsunit/harmony/for-await-of.js
new file mode 100644
index 0000000000000000000000000000000000000000..e1102d79baeb32cd202df9cd0c9f2014a092ddc0
--- /dev/null
+++ b/test/mjsunit/harmony/for-await-of.js
@@ -0,0 +1,724 @@
+// Copyright 2016 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-async-iteration --allow-natives-syntax
+
+let testFailed = false;
+let testFailure;
+(async function() {
+ const kNext = 1;
+ const kThrow = 2;
+ const kReturn = 4;
+
+ function async(iterable, features = kNext, log = []) {
+ // Helper to turn a synchronous iterable into an asynchronous iterable,
+ // without using the [Async-from-Sync Iterator].
+ let it = iterable[Symbol.iterator]();
+ let methods = {
+ next(sentValue) {
+ return new Promise(function(resolve, reject) {
+ let {value, done} = it.next(sentValue);
+ Promise.resolve(value).then(function(value) {
+ log.push(".next() -> resolved " + value);
+ resolve({value, done});
+ }, function(value) {
+ log.push(".next() -> rejected " + value);
+ reject(value);
+ });
+ });
+ },
+
+ throw(sentValue) {
+ return new Promise(function(resolve, reject) {
+ let throwMethod = it.throw;
+ if (typeof throwMethod !== "function") {
+ log.push(".throw(" + sentValue + ")");
+ return reject(sentValue);
+ }
+
+ let {value, done} = throwMethod.call(it, sentValue);
+ Promise.resolve(value).then(function(value) {
+ log.push(".throw() -> resolved " + value);
+ resolve({ value, done });
+ }, function(value) {
+ log.push(".throw() -> rejected " + value);
+ reject(value);
+ });
+ });
+ },
+
+ return(sentValue) {
+ return new Promise(function(resolve, reject) {
+ let returnMethod = it.return;
+ if (typeof returnMethod !== "function") {
+ log.push(".return(" + sentValue + ")");
+ return resolve({value: sentValue, done: true});
+ }
+
+ let {value, done} = returnMethod.call(it, sentValue);
+ Promise.resolve(value).then(function(value) {
+ log.push(".return() -> resolved " + value);
+ resolve({ value, done });
+ }, function(value) {
+ log.push(".return() -> rejected " + value);
+ reject(value);
+ });
+ });
+ }
+ };
+
+
+ return {
+ [Symbol.asyncIterator]() {
+ log.push("[Symbol.asyncIterator]()")
+ return this;
+ },
+
+ next: (features & kNext) ? methods.next : undefined,
+ throw: (features & kThrow) ? methods.throw : undefined,
+ return: (features & kReturn) ? methods.return : undefined
+ };
+ }
+
+ let testDone;
+ let test;
+ async function testBindingIdentifierVarDeclarationStatement() {
+ let sum = 0;
+ testDone = false;
+ for await(var value of async([100, 200, 300, 400, 500])) sum += value;
+ testDone = true;
+ return sum;
+ }
+
+ test = testBindingIdentifierVarDeclarationStatement();
+ assertFalse(testDone);
+ assertEquals(1500, await test);
+ assertTrue(testDone);
+
+ async function testBindingIdentifierVarDeclarationBlockStatement() {
+ let sum = 0;
+ testDone = false;
+ for await(var value of async([100, 200, 300, 400, 500])) {
+ 'use strict';
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ sum += value;
+ }
+ testDone = true;
+ return sum;
+ }
+
+ test = testBindingIdentifierVarDeclarationBlockStatement();
+ assertFalse(testDone);
+ assertEquals(1500, await test);
+ assertTrue(testDone);
+
+ async function testObjectBindingPatternVarDeclarationStatement() {
+ let sum = 0, keys = [];
+ let collection = [
+ {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
+ {key: 'last', value: 40}
+ ];
+ testDone = false;
+ for await(var {key = 'unknown', value} of async(collection))
+ keys.push(key), sum += value;
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testObjectBindingPatternVarDeclarationStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
+ assertTrue(testDone);
+
+ async function testObjectBindingPatternVarDeclarationBlockStatement() {
+ let sum = 0, keys = [];
+ let collection = [
+ {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
+ {key: 'last', value: 40}
+ ];
+ testDone = false;
+ for await(var {key = 'unknown', value} of async(collection)) {
+ 'use strict';
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ keys.push(key);
+ sum += value;
+ }
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testObjectBindingPatternVarDeclarationBlockStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
+ assertTrue(testDone);
+
+ async function testArrayBindingPatternVarDeclarationStatement() {
+ let sum = 0, keys = [];
+ let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
+ testDone = false;
+ for await(var [key = 'unknown', value] of async(collection))
+ keys.push(key), sum += value;
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testArrayBindingPatternVarDeclarationStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
+ assertTrue(testDone);
+
+ async function testArrayBindingPatternVarDeclarationBlockStatement() {
+ let sum = 0, keys = [];
+ let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
+ testDone = false;
+ for await(var [key = 'unknown', value] of async(collection)) {
+ 'use strict';
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ keys.push(key);
+ sum += value;
+ }
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testArrayBindingPatternVarDeclarationBlockStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
+ assertTrue(testDone);
+
+ // --------------------------------------------------------------------------
+
+ async function testBindingIdentifierLetDeclarationStatement() {
+ let sum = 0;
+ testDone = false;
+ for await(let value of async([100, 200, 300, 400, 500])) sum += value;
+ testDone = true;
+ return sum;
+ }
+
+ test = testBindingIdentifierLetDeclarationStatement();
+ assertFalse(testDone);
+ assertEquals(1500, await test);
+ assertTrue(testDone);
+
+ async function testBindingIdentifierLetDeclarationBlockStatement() {
+ let sum = 0;
+ testDone = false;
+ for await(let value of async([100, 200, 300, 400, 500])) {
+ 'use strict';
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ sum += value;
+ }
+ testDone = true;
+ return sum;
+ }
+
+ test = testBindingIdentifierLetDeclarationBlockStatement();
+ assertFalse(testDone);
+ assertEquals(1500, await test);
+ assertTrue(testDone);
+
+ async function testObjectBindingPatternLetDeclarationStatement() {
+ let sum = 0, keys = [];
+ let collection = [
+ {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
+ {key: 'last', value: 40}
+ ];
+ testDone = false;
+ for await(let {key = 'unknown', value} of async(collection))
+ keys.push(key), sum += value;
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testObjectBindingPatternLetDeclarationStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
+ assertTrue(testDone);
+
+ async function testObjectBindingPatternLetDeclarationBlockStatement() {
+ let sum = 0, keys = [];
+ let collection = [
+ {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
+ {key: 'last', value: 40}
+ ];
+ testDone = false;
+ for await(let {key = 'unknown', value} of async(collection)) {
+ 'use strict';
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ keys.push(key);
+ sum += value;
+ }
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testObjectBindingPatternLetDeclarationBlockStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
+ assertTrue(testDone);
+
+ async function testArrayBindingPatternLetDeclarationStatement() {
+ let sum = 0, keys = [];
+ let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
+ testDone = false;
+ for await(let [key = 'unknown', value] of async(collection))
+ keys.push(key), sum += value;
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testArrayBindingPatternLetDeclarationStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
+ assertTrue(testDone);
+
+ async function testArrayBindingPatternLetDeclarationBlockStatement() {
+ let sum = 0, keys = [];
+ let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
+ testDone = false;
+ for await(let [key = 'unknown', value] of async(collection)) {
+ 'use strict';
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ keys.push(key);
+ sum += value;
+ }
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testArrayBindingPatternLetDeclarationBlockStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
+ assertTrue(testDone);
+
+ // --------------------------------------------------------------------------
+
+ async function testBindingIdentifierConstDeclarationStatement() {
+ let sum = 0;
+ testDone = false;
+ for await(let value of async([100, 200, 300, 400, 500])) sum += value;
+ testDone = true;
+ return sum;
+ }
+
+ test = testBindingIdentifierConstDeclarationStatement();
+ assertFalse(testDone);
+ assertEquals(1500, await test);
+ assertTrue(testDone);
+
+ async function testBindingIdentifierConstDeclarationBlockStatement() {
+ let sum = 0;
+ testDone = false;
+ for await(const value of async([100, 200, 300, 400, 500])) {
+ 'use strict';
+ // Ensure strict mode applies to block with use-strict-directive
neis 2017/01/24 12:49:19 Fix or remove comment.
caitp 2017/01/24 22:51:55 removed
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ sum += value;
+ }
+ testDone = true;
+ return sum;
+ }
+
+ test = testBindingIdentifierConstDeclarationBlockStatement();
+ assertFalse(testDone);
+ assertEquals(1500, await test);
+ assertTrue(testDone);
+
+ async function testObjectBindingPatternConstDeclarationStatement() {
+ let sum = 0, keys = [];
+ let collection = [
+ {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
+ {key: 'last', value: 40}
+ ];
+ testDone = false;
+ for await(const {key = 'unknown', value} of async(collection))
+ keys.push(key), sum += value;
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testObjectBindingPatternConstDeclarationStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
+ assertTrue(testDone);
+
+ async function testObjectBindingPatternConstDeclarationBlockStatement() {
+ let sum = 0, keys = [];
+ let collection = [
+ {key: 'first', value: 10}, {key: undefined, value: 20}, {value: 30},
+ {key: 'last', value: 40}
+ ];
+ testDone = false;
+ for await(const {key = 'unknown', value} of async(collection)) {
+ 'use strict';
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ keys.push(key);
+ sum += value;
+ }
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testObjectBindingPatternConstDeclarationBlockStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
+ assertTrue(testDone);
+
+ async function testArrayBindingPatternConstDeclarationStatement() {
+ let sum = 0, keys = [];
+ let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
+ testDone = false;
+ for await(const [key = 'unknown', value] of async(collection))
+ keys.push(key), sum += value;
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testArrayBindingPatternConstDeclarationStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
+ assertTrue(testDone);
+
+ async function testArrayBindingPatternConstDeclarationBlockStatement() {
+ let sum = 0, keys = [];
+ let collection = [['first', 10], [undefined, 20], [, 30], ['last', 40]];
+ testDone = false;
+ for await(const [key = 'unknown', value] of async(collection)) {
+ 'use strict';
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ keys.push(key);
+ sum += value;
+ }
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testArrayBindingPatternLetDeclarationBlockStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 100}, await test);
+ assertTrue(testDone);
+
+ // --------------------------------------------------------------------------
+
+ async function testBindingIdentifierLHSStatement() {
+ let sum = 0;
+ let value;
+ testDone = false;
+ for await(value of async([100, 200, 300, 400, 500])) sum += value;
+ testDone = true;
+ return sum;
+ }
+
+ test = testBindingIdentifierLHSStatement();
+ assertFalse(testDone);
+ assertEquals(1500, await test);
+ assertTrue(testDone);
+
+ async function testBindingIdentifierLHSBlockStatement() {
+ let sum = 0;
+ let value;
+ testDone = false;
+ for await(value of async([100, 200, 300, 400, 500])) {
+ 'use strict';
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ sum += value;
+ }
+ testDone = true;
+ return sum;
+ }
+
+ test = testBindingIdentifierLHSStatement();
+ assertFalse(testDone);
+ assertEquals(1500, await test);
+ assertTrue(testDone);
+
+ async function testObjectBindingPatternLHSStatement() {
+ let sum = 0;
+ let keys = [];
+ let value;
+ let key;
+ let collection = [
+ {key: 'first', value: 1}, {key: undefined, value: 2}, {value: 3},
+ {key: 'last', value: 4}
+ ];
+ testDone = false;
+ for await({key = 'unknown', value} of async(collection))
+ keys.push(key), sum += value;
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testObjectBindingPatternLHSStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
+ assertTrue(testDone);
+
+ async function testObjectBindingPatternLHSBlockStatement() {
+ let sum = 0;
+ let keys = [];
+ let value;
+ let key;
+ let collection = [
+ {key: 'first', value: 1}, {key: undefined, value: 2}, {value: 3},
+ {key: 'last', value: 4}
+ ];
+ testDone = false;
+ for await({key = 'unknown', value} of async(collection)) {
+ 'use strict';
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ keys.push(key);
+ sum += value;
+ }
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testObjectBindingPatternLHSBlockStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
+ assertTrue(testDone);
+
+ async function testArrayBindingPatternLHSStatement() {
+ let sum = 0;
+ let keys = [];
+ let value;
+ let key;
+ let collection = [['first', 1], [undefined, 2], [, 3], ['last', 4]];
+ testDone = false;
+ for await([key = 'unknown', value] of async(collection)) {
+ 'use strict';
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ keys.push(key);
+ sum += value;
+ }
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testArrayBindingPatternLHSStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
+ assertTrue(testDone);
+
+ async function testArrayBindingPatternLHSBlockStatement() {
+ let sum = 0;
+ let keys = [];
+ let value;
+ let key;
+ let collection = [
+ {key: 'first', value: 1}, {key: undefined, value: 2}, {value: 3},
+ {key: 'last', value: 4}
+ ];
+ testDone = false;
+ for await({key = 'unknown', value} of async(collection)) {
+ 'use strict';
+ let strict = (function() { return this === undefined; })();
+ assertFalse(strict);
+ keys.push(key);
+ sum += value;
+ }
+ testDone = true;
+ return {keys, sum};
+ }
+
+ test = testArrayBindingPatternLHSBlockStatement();
+ assertFalse(testDone);
+ assertEquals(
+ {keys: ['first', 'unknown', 'unknown', 'last'], sum: 10}, await test);
+ assertTrue(testDone);
+
+ // --------------------------------------------------------------------------
+
+ async function testBreakStatementReturnMethodNotPresent() {
+ let log = [];
+ let collection = [1, 2, 3, 4, 5];
+ let sum = 0;
+ let i = 0;
+ testDone = false;
+ for await (var x of async(collection, kNext, log)) {
+ sum += x;
+ if (++i === 3) break;
+ }
+ testDone = true;
+ return { sum, log };
+ }
+
+ test = testBreakStatementReturnMethodNotPresent();
+ assertFalse(testDone);
+ assertEquals({sum: 6, log: ["[Symbol.asyncIterator]()",
+ ".next() -> resolved 1",
+ ".next() -> resolved 2",
+ ".next() -> resolved 3"]},
+ await test);
+ assertTrue(testDone);
+
+ async function testBreakStatementReturnMethodPresent() {
+ let log = [];
+ let collection = [1, 2, 3, 4, 5];
+ let sum = 0;
+ let i = 0;
+ testDone = false;
+ for await (var x of async(collection, kNext|kReturn, log)) {
+ sum += x;
+ if (++i === 2) break;
+ }
+ testDone = true;
+ return { sum, log };
+ }
+
+ test = testBreakStatementReturnMethodPresent();
+ assertFalse(testDone);
+ assertEquals({sum: 3, log: ["[Symbol.asyncIterator]()",
+ ".next() -> resolved 1",
+ ".next() -> resolved 2",
+ ".return(undefined)"]},
+ await test);
+ assertTrue(testDone);
+
+ async function testReturnStatementReturnMethodNotPresent() {
+ let log = [];
+ let collection = [1, 2, 3, 4, 5];
+ let sum = 0;
+ let i = 0;
+ testDone = false;
+ for await (var x of async(collection, kNext, log)) {
+ sum += x;
+ if (++i === 3) {
+ testDone = true;
+ return { sum, log };
+ }
+ }
+ }
+
+ test = testReturnStatementReturnMethodNotPresent();
+ assertFalse(testDone);
+ assertEquals({sum: 6, log: ["[Symbol.asyncIterator]()",
+ ".next() -> resolved 1",
+ ".next() -> resolved 2",
+ ".next() -> resolved 3"]},
+ await test);
+ assertTrue(testDone);
+
+ async function testReturnStatementReturnMethodPresent() {
+ let log = [];
+ let collection = [1, 2, 3, 4, 5];
+ let sum = 0;
+ let i = 0;
+ testDone = false;
+ for await (var x of async(collection, kNext|kReturn, log)) {
+ sum += x;
+ if (++i === 2) {
+ testDone = true;
+ return { sum, log };
+ }
+ }
+ }
+
+ test = testReturnStatementReturnMethodPresent();
+ assertFalse(testDone);
+ assertEquals({sum: 3, log: ["[Symbol.asyncIterator]()",
+ ".next() -> resolved 1",
+ ".next() -> resolved 2",
+ ".return(undefined)"]},
+ await test);
+ assertTrue(testDone);
+
+ async function testThrowStatementReturnMethodNotPresent() {
+ let log = [];
+ let collection = [1, 2, 3, 4, 5];
+ let sum = 0;
+ let i = 0;
+ testDone = false;
+ for await (var x of async(collection, kNext|kThrow, log)) {
+ sum += x;
+ if (++i === 3) {
+ testDone = true;
+ throw { sum, log, toString() { return "TestError"; } };
+ }
+ }
+ return { sum, log };
+ }
+
+ test = testThrowStatementReturnMethodNotPresent();
+ assertFalse(testDone);
+ try {
+ await test;
+ assertUnreachable("Awaited Promise should be rejected");
+ } catch (e) {
+ assertEquals("TestError", e.toString());
+ assertEquals(6, e.sum);
+ assertEquals(["[Symbol.asyncIterator]()", ".next() -> resolved 1",
+ ".next() -> resolved 2", ".next() -> resolved 3"
+ ], e.log);
+ assertTrue(testDone);
+ }
+
+ async function testThrowStatementReturnMethodPresent() {
+ let log = [];
+ let collection = [1, 2, 3, 4, 5];
+ let sum = 0;
+ let i = 0;
+ testDone = false;
+ for await (var x of async(collection, kNext|kThrow|kReturn, log)) {
+ sum += x;
+ if (++i === 2) {
+ testDone = true;
+ throw { sum, log, toString() { return "TestError2"; } };
+ }
+ }
+ return { sum, log };
+ }
+
+ test = testThrowStatementReturnMethodPresent();
+ assertFalse(testDone);
+ try {
+ await test;
+ assertUnreachable("Awaited Promise should be rejected");
+ } catch (e) {
+ assertEquals("TestError2", e.toString());
+ assertEquals(3, e.sum);
+ assertEquals(["[Symbol.asyncIterator]()", ".next() -> resolved 1",
+ ".next() -> resolved 2", ".return(undefined)"
+ ], e.log);
+ assertTrue(testDone);
+ }
+
+})().then(undefined, function(error) {
+ testFailed = true;
+ testFailure = error;
+});
+
+%RunMicrotasks();
+
+if (testFailed) {
+ throw testFailure;
+}
« src/parsing/parser-base.h ('K') | « test/cctest/test-parsing.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698