1865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
2865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
3865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// found in the LICENSE file.
4865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
5865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// Flags: --harmony-promises --expose-debug-as debug
6865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
7865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// Test debug events when an exception is thrown inside a Promise, which is
8865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org// caught by a custom promise, which has no reject handler.
9a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// We expect an Exception event with a promise to be triggered.
10865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
11865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgDebug = debug.Debug;
12865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
13865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvar log = [];
14865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvar step = 0;
15865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
16865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvar p = new Promise(function(resolve, reject) {
17865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  log.push("resolve");
18865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  resolve();
19865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org});
20865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
21865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgfunction MyPromise(resolver) {
22865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  var reject = undefined;
23865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  var resolve = function() { };
24865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  log.push("construct");
25865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  resolver(resolve, reject);
26865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org};
27865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
28865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgMyPromise.prototype = p;
29865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgp.constructor = MyPromise;
30865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
31865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvar q = p.chain(
32865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  function() {
33865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    log.push("throw caught");
34a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    throw new Error("caught");  // event
35865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  });
36865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
37865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgfunction listener(event, exec_state, event_data, data) {
38865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  try {
39a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    if (event == Debug.DebugEvent.Exception) {
40865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org      assertEquals(["resolve", "construct", "end main", "throw caught"], log);
41a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      assertEquals("undefined is not a function",
42a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org                   event_data.exception().message);
43a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      assertEquals(q, event_data.promise());
44865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    }
45865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  } catch (e) {
46865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    // Signal a failure with exit code 1.  This is necessary since the
47865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    // debugger swallows exceptions and we expect the chained function
48865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    // and this listener to be executed after the main script is finished.
49865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    print("Unexpected exception: " + e + "\n" + e.stack);
50865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    quit(1);
51865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  }
52865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
53865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
54865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgDebug.setBreakOnUncaughtException();
55865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgDebug.setListener(listener);
56865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
57865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orglog.push("end main");
58