| Index: test/mjsunit/es8/async-function-try-finally.js
|
| diff --git a/test/mjsunit/es8/async-function-try-finally.js b/test/mjsunit/es8/async-function-try-finally.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0e10ff9d2d6a3847a82fa5240a7fd5e3f6df04e0
|
| --- /dev/null
|
| +++ b/test/mjsunit/es8/async-function-try-finally.js
|
| @@ -0,0 +1,177 @@
|
| +// Copyright 2017 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: --allow-natives-syntax
|
| +
|
| +function assertThrowsAsync(run, errorType, message) {
|
| + var actual;
|
| + var hadValue = false;
|
| + var hadError = false;
|
| + var promise = run();
|
| +
|
| + if (typeof promise !== "object" || typeof promise.then !== "function") {
|
| + throw new MjsUnitAssertionError(
|
| + "Expected " + run.toString() +
|
| + " to return a Promise, but it returned " + PrettyPrint(promise));
|
| + }
|
| +
|
| + promise.then(function(value) { hadValue = true; actual = value; },
|
| + function(error) { hadError = true; actual = error; });
|
| +
|
| + assertFalse(hadValue || hadError);
|
| +
|
| + %RunMicrotasks();
|
| +
|
| + if (!hadError) {
|
| + throw new MjsUnitAssertionError(
|
| + "Expected " + run + "() to throw " + errorType.name +
|
| + ", but did not throw.");
|
| + }
|
| + if (!(actual instanceof errorType))
|
| + throw new MjsUnitAssertionError(
|
| + "Expected " + run + "() to throw " + errorType.name +
|
| + ", but threw '" + actual + "'");
|
| + if (message !== void 0 && actual.message !== message)
|
| + throw new MjsUnitAssertionError(
|
| + "Expected " + run + "() to throw '" + message + "', but threw '" +
|
| + actual.message + "'");
|
| +};
|
| +
|
| +function assertEqualsAsync(expected, run, msg) {
|
| + var actual;
|
| + var hadValue = false;
|
| + var hadError = false;
|
| + var promise = run();
|
| +
|
| + if (typeof promise !== "object" || typeof promise.then !== "function") {
|
| + throw new MjsUnitAssertionError(
|
| + "Expected " + run.toString() +
|
| + " to return a Promise, but it returned " + PrettyPrint(promise));
|
| + }
|
| +
|
| + promise.then(function(value) { hadValue = true; actual = value; },
|
| + function(error) { hadError = true; actual = error; });
|
| +
|
| + assertFalse(hadValue || hadError);
|
| +
|
| + %RunMicrotasks();
|
| +
|
| + if (hadError) throw actual;
|
| +
|
| + assertTrue(
|
| + hadValue, "Expected '" + run.toString() + "' to produce a value");
|
| +
|
| + assertEquals(expected, actual, msg);
|
| +};
|
| +
|
| +function resolveLater(value) {
|
| + return new Promise(function(resolve) {
|
| + resolve(value);
|
| + });
|
| +}
|
| +
|
| +function rejectLater(reason) {
|
| + return new Promise(function(resolve, reject) {
|
| + reject(reason);
|
| + });
|
| +}
|
| +
|
| +class MyError extends Error {};
|
| +var AsyncFunction = async function() {}.constructor;
|
| +
|
| +assertEqualsAsync("finally-return (func-expr)", async function() {
|
| + try {
|
| + return "early-return (func-expr)";
|
| + } finally {
|
| + return "finally-return (func-expr)";
|
| + }
|
| +});
|
| +
|
| +assertEqualsAsync("finally-return (arrow)", async() => {
|
| + try {
|
| + return "early-return (arrow)";
|
| + } finally {
|
| + return "finally-return (arrow)";
|
| + }
|
| +});
|
| +
|
| +assertEqualsAsync("finally-return (eval)", AsyncFunction(`
|
| + try {
|
| + return "early-return (eval)";
|
| + } finally {
|
| + return "finally-return (eval)";
|
| + }
|
| +`));
|
| +
|
| +assertEqualsAsync("await-finally-return (func-expr)", async function() {
|
| + try {
|
| + return "early-return (func-expr)";
|
| + } finally {
|
| + return await resolveLater("await-finally-return (func-expr)");
|
| + }
|
| +});
|
| +
|
| +assertEqualsAsync("await-finally-return (arrow)", async() => {
|
| + try {
|
| + return "early-return (arrow)";
|
| + } finally {
|
| + return await resolveLater("await-finally-return (arrow)");
|
| + }
|
| +});
|
| +
|
| +assertEqualsAsync("await-finally-return (eval)", AsyncFunction(`
|
| + try {
|
| + return "early-return (eval)";
|
| + } finally {
|
| + return await resolveLater("await-finally-return (eval)");
|
| + }
|
| +`));
|
| +
|
| +assertThrowsAsync(async function() {
|
| + try {
|
| + return "early-return (func-expr)";
|
| + } finally {
|
| + throw new MyError("finally-throw (func-expr)");
|
| + }
|
| +}, MyError, "finally-throw (func-expr)");
|
| +
|
| +assertThrowsAsync(async() => {
|
| + try {
|
| + return "early-return (arrow)";
|
| + } finally {
|
| + throw new MyError("finally-throw (arrow)");
|
| + }
|
| +}, MyError, "finally-throw (arrow)");
|
| +
|
| +assertThrowsAsync(AsyncFunction(`
|
| + try {
|
| + return "early-return (eval)";
|
| + } finally {
|
| + throw new MyError("finally-throw (eval)");
|
| + }
|
| +`), MyError, "finally-throw (eval)");
|
| +
|
| +assertThrowsAsync(async function() {
|
| + try {
|
| + return "early-return (func-expr)";
|
| + } finally {
|
| + await rejectLater(new MyError("await-finally-throw (func-expr)"));
|
| + }
|
| +}, MyError, "await-finally-throw (func-expr)");
|
| +
|
| +assertThrowsAsync(async() => {
|
| + try {
|
| + return "early-return (arrow)";
|
| + } finally {
|
| + await rejectLater(new MyError("await-finally-throw (arrow)"));
|
| + }
|
| +}, MyError, "await-finally-throw (arrow)");
|
| +
|
| +assertThrowsAsync(AsyncFunction(`
|
| + try {
|
| + return "early-return (eval)";
|
| + } finally {
|
| + await rejectLater(new MyError("await-finally-throw (eval)"));
|
| + }
|
| +`), MyError, "await-finally-throw (eval)");
|
|
|