// Copyright 2014 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.


var Debug = debug.Debug;
var listenerComplete = false;
var exception = null;
var count = 0;
var log = [];
var done = false;

function LogX(x) {
  var stored_count = count;
  return function() {
    log.push(`[${stored_count}] ${x}`);
  };
}

function DebuggerStatement() {
  log.push(`[${count}] debugger`);
  if (count++ < 3) {
    debugger;
  }
}

function listener(event, exec_state, event_data, data) {
  if (event != Debug.DebugEvent.Break) return;
  try {
    var p = Promise.resolve();
    var q = p.then(LogX("then 1"));
    p.then(LogX("then 2"));
    q.then(LogX("then 3"));
    q.then(DebuggerStatement);
    var r = q.then(() => { throw 1; });
    r.catch(LogX("catch"));
    listenerComplete = true;
  } catch (e) {
    exception = e;
    print(e, e.stack);
    quit(1);
  };
};

// Add the debug event listener.
Debug.setListener(listener);

DebuggerStatement();
LogX("start")();

// Make sure that the debug event listener was invoked.
assertTrue(listenerComplete);

%PerformMicrotaskCheckpoint();

var expectation =
  [ "[0] debugger", "[1] start", "[1] then 1",
    "[1] then 2", "[1] then 3", "[1] debugger",
    "[2] then 1", "[2] then 2", "[1] catch",
    "[2] then 3", "[2] debugger", "[3] then 1",
    "[3] then 2", "[2] catch", "[3] then 3",
    "[3] debugger", "[3] catch",
  ];

assertEquals(expectation, log);
