Index: test/mjsunit/harmony/async-function-stacktrace.js |
diff --git a/test/mjsunit/harmony/async-function-stacktrace.js b/test/mjsunit/harmony/async-function-stacktrace.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..50df44d033fda61e01c003a27c15aeb62cf27b90 |
--- /dev/null |
+++ b/test/mjsunit/harmony/async-function-stacktrace.js |
@@ -0,0 +1,115 @@ |
+// 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-await |
+ |
+async function test(func, funcs) { |
+ try { |
+ await func(); |
+ throw new Error("Expected " + func.toString() + " to throw"); |
+ } catch (e) { |
+ var stack = e.stack.split('\n'). |
+ slice(1). |
+ map(line => line.trim()). |
+ map(line => line.match(/at (?:(.*) )?.*$/)[1]). |
+ filter(x => typeof x === 'string' && x.length); |
+ |
+ assertEquals(funcs, stack, `Unexpected stack trace ${e.stack}`); |
+ } |
+} |
+ |
+function thrower() { throw new Error("NOPE"); } |
+function reject() { return Promise.reject(new Error("NOPE")); } |
+ |
+async function runTests() { |
+ await test(async function a() { |
+ throw new Error("FAIL"); |
+ }, |
+ ["a", "test", "runTests"]); |
+ |
+ await test(async function a2() { |
+ await 1; |
+ throw new Error("FAIL"); |
+ }, ["a2"]); |
+ |
+ await test(async function a3() { |
+ await 1; |
+ try { await thrower(); } catch (e) { throw new Error("FAIL"); } |
+ }, ["a3"]); |
+ |
+ await test(async function a4() { |
+ await 1; |
+ try { await reject(); } catch (e) { throw new Error("FAIL"); } |
+ }, ["a4"]); |
+ |
+ await test({ async b() { |
+ throw new Error("FAIL"); |
+ }}.b, |
+ ["b", "test", "runTests"]); |
+ |
+ await test({ async b2() { |
+ await 1; |
+ throw new Error("FAIL"); |
+ }}.b2, ["b2"]); |
+ |
+ await test({ async b3() { |
+ await 1; |
+ try { await thrower(); } catch (e) { throw new Error("FAIL"); } |
+ } }.b3, ["b3"]); |
+ |
+ await test({ async b4() { |
+ await 1; |
+ try { await reject(); } catch (e) { throw new Error("FAIL"); } |
+ } }.b4, ["b4"]); |
+ |
+ await test((new class { async c() { |
+ throw new Error("FAIL"); |
+ } }).c, |
+ ["c", "test", "runTests"]); |
+ |
+ await test((new class { async c2() { |
+ await 1; |
+ throw new Error("FAIL"); |
+ } }).c2, ["c2"]); |
+ |
+ await test((new class { async c3() { |
+ await 1; |
+ try { await thrower(); } catch (e) { throw new Error("FAIL"); } |
+ } }).c3, ["c3"]); |
+ |
+ await test((new class { async c4() { |
+ await 1; |
+ try { await reject(); } catch (e) { throw new Error("FAIL"); } |
+ } }).c4, ["c4"]); |
+ |
+ // TODO(caitp): `async` probably shouldn't be the inferred name for async |
+ // arrow functions... |
+ await test(async() => { throw new Error("FAIL") }, |
+ ["async", "test", "runTests"]); |
+ |
+ await test(async() => { await 1; throw new Error("FAIL") }, ["async"]); |
+ |
+ await test(async() => { |
+ await 1; |
+ try { |
+ await thrower(); |
+ } catch (e) { |
+ throw new Error("FAIL"); |
+ } |
+ }, ["e"]); // TODO(caitp): FuncNameInferer is doing some weird stuff... |
+ |
+ await test(async() => { |
+ await 1; |
+ try { |
+ await reject(); |
+ } catch (e) { |
+ throw new Error("FAIL"); |
+ } |
+ }, ["e"]); |
+} |
+ |
+runTests().catch(e => { |
+ print(e); |
+ quit(1); |
+}); |