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

print("Test for Debugger.getPossibleBreakpoints");

Protocol.Runtime.enable();
Protocol.Debugger.enable();

InspectorTest.runTestSuite([

  function getPossibleBreakpointsInRange(next) {
    var source = "function foo(){ return Promise.resolve(); }\nfunction boo(){ return Promise.resolve().then(() => 42); }\n\n";
    var scriptId;
    compileScript(source)
      .then(id => scriptId = id)
      .then(() => InspectorTest.log("Test start.scriptId != end.scriptId."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 0, columnNumber: 0, scriptId: scriptId }, end: { lineNumber: 0, columnNumber: 0, scriptId: scriptId + "0" }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test not existing scriptId."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 0, columnNumber: 0, scriptId: "-1" }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test end < start."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 1, columnNumber: 0, scriptId: scriptId }, end: { lineNumber: 0, columnNumber: 0, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test empty range in first line."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 0, columnNumber: 16, scriptId: scriptId }, end: { lineNumber: 0, columnNumber: 16, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test one character range in first line."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 0, columnNumber: 16, scriptId: scriptId }, end: { lineNumber: 0, columnNumber: 17, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test empty range in not first line."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 1, columnNumber: 16, scriptId: scriptId }, end: { lineNumber: 1, columnNumber: 16, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test one character range in not first line."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 1, columnNumber: 16, scriptId: scriptId }, end: { lineNumber: 1, columnNumber: 17, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test end is undefined"))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 0, columnNumber: 0, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test end.lineNumber > scripts.lineCount()"))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 0, columnNumber: 0, scriptId: scriptId }, end: { lineNumber: 5, columnNumber: 0, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test one string"))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 0, columnNumber: 0, scriptId: scriptId }, end: { lineNumber: 1, columnNumber: 0, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test end.columnNumber > end.line.length(), should be the same as previous."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 0, columnNumber: 0, scriptId: scriptId }, end: { lineNumber: 0, columnNumber: 256, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(next);
  },

  function getPossibleBreakpointsInArrow(next) {
    var source = "function foo() { return Promise.resolve().then(() => 239).then(() => 42).then(() => () => 42) }";
    var scriptId;
    compileScript(source)
      .then(id => scriptId = id)
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 0, columnNumber: 0, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(next);
  },

  function arrowFunctionFirstLine(next) {
    Protocol.Debugger.onPaused(message => {
      InspectorTest.log("paused in " + message.params.callFrames[0].functionName);
      InspectorTest.logMessage(message.params.callFrames[0].location);
      Protocol.Debugger.resume();
    });

    var source = `function foo1() { Promise.resolve().then(() => 42) }
function foo2() { Promise.resolve().then(() => 42) }`;
    waitForPossibleBreakpoints(source, { lineNumber: 0, columnNumber: 0 }, { lineNumber: 1, columnNumber: 0 })
      .then(InspectorTest.logMessage)
      .then(setAllBreakpoints)
      .then(() => Protocol.Runtime.evaluate({ expression: "foo1(); foo2()"}))
      .then(next);
  },

  function arrowFunctionOnPause(next) {
    function dumpAndResume(message) {
      InspectorTest.log("paused in " + message.params.callFrames[0].functionName);
      InspectorTest.logMessage(message.params.callFrames[0].location);
      Protocol.Debugger.resume();
    }

    var source = `debugger; function foo3() { Promise.resolve().then(() => 42) }
function foo4() { Promise.resolve().then(() => 42) };\nfoo3();\nfoo4();`;
    waitForPossibleBreakpointsOnPause(source, { lineNumber: 0, columnNumber: 0 }, undefined, next)
      .then(InspectorTest.logMessage)
      .then(setAllBreakpoints)
      .then(() => Protocol.Debugger.onPaused(dumpAndResume))
      .then(() => Protocol.Debugger.resume());
  },

  function getPossibleBreakpointsInRangeWithOffset(next) {
    var source = "function foo(){ return Promise.resolve(); }\nfunction boo(){ return Promise.resolve().then(() => 42); }\n\n";
    var scriptId;
    compileScript(source, { name: "with-offset.js", line_offset: 1, column_offset: 1 })
      .then(id => scriptId = id)
      .then(() => InspectorTest.log("Test empty range in first line."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 1, columnNumber: 17, scriptId: scriptId }, end: { lineNumber: 1, columnNumber: 17, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test one character range in first line."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 1, columnNumber: 17, scriptId: scriptId }, end: { lineNumber: 1, columnNumber: 18, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test empty range in not first line."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 2, columnNumber: 16, scriptId: scriptId }, end: { lineNumber: 2, columnNumber: 16, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test one character range in not first line."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 2, columnNumber: 16, scriptId: scriptId }, end: { lineNumber: 2, columnNumber: 17, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test end is undefined"))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 0, columnNumber: 0, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test end.lineNumber > scripts.lineCount()"))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 0, columnNumber: 0, scriptId: scriptId }, end: { lineNumber: 5, columnNumber: 0, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test one string"))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 1, columnNumber: 1, scriptId: scriptId }, end: { lineNumber: 2, columnNumber: 0, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(() => InspectorTest.log("Test end.columnNumber > end.line.length(), should be the same as previous."))
      .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: { lineNumber: 1, columnNumber: 1, scriptId: scriptId }, end: { lineNumber: 1, columnNumber: 256, scriptId: scriptId }}))
      .then(InspectorTest.logMessage)
      .then(next);
  },

  function withOffset(next) {
    Protocol.Debugger.onPaused(message => {
      InspectorTest.log("paused in " + message.params.callFrames[0].functionName);
      InspectorTest.logMessage(message.params.callFrames[0].location);
      Protocol.Debugger.resume();
    });

    var source = `function foo5() { Promise.resolve().then(() => 42) }
function foo6() { Promise.resolve().then(() => 42) }`;
    waitForPossibleBreakpoints(source, { lineNumber: 0, columnNumber: 0 }, undefined, { name: "with-offset.js", line_offset: 3, column_offset: 18 })
      .then(InspectorTest.logMessage)
      .then(setAllBreakpoints)
      .then(() => Protocol.Runtime.evaluate({ expression: "foo5(); foo6()"}))
      .then(next);
  },

  function arrowFunctionReturn(next) {
    waitForPossibleBreakpoints("() => 239\n", { lineNumber: 0, columnNumber: 0 })
      .then(InspectorTest.logMessage)
      .then(() => waitForPossibleBreakpoints("function foo() { function boo() { return 239 }  }\n", { lineNumber: 0, columnNumber: 0 }))
      .then(InspectorTest.logMessage)
      .then(() => waitForPossibleBreakpoints("() => { 239 }\n", { lineNumber: 0, columnNumber: 0 }))
      .then(InspectorTest.logMessage)
      // TODO(kozyatinskiy): lineNumber for return position should be 21 instead of 22.
      .then(() => waitForPossibleBreakpoints("function foo() { 239 }\n", { lineNumber: 0, columnNumber: 0 }))
      .then(InspectorTest.logMessage)
      // TODO(kozyatinskiy): lineNumber for return position should be only 9, not 8.
      .then(() => waitForPossibleBreakpoints("() => 239", { lineNumber: 0, columnNumber: 0 }))
      .then(InspectorTest.logMessage)
      // TODO(kozyatinskiy): lineNumber for return position should be only 19, not 20.
      .then(() => waitForPossibleBreakpoints("() => { return 239 }", { lineNumber: 0, columnNumber: 0 }))
      .then(InspectorTest.logMessage)
      .then(next)
  }
]);

function compileScript(source, origin) {
  var promise = Protocol.Debugger.onceScriptParsed().then(message => message.params.scriptId);
  if (!origin) origin = { name: "", line_offset: 0, column_offset: 0 };
  compileAndRunWithOrigin(source, origin.name, origin.line_offset, origin.column_offset, false);
  return promise;
}

function waitForPossibleBreakpoints(source, start, end, origin) {
  return compileScript(source, origin)
    .then(scriptId => { (start || {}).scriptId = scriptId; (end || {}).scriptId = scriptId })
    .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: start, end: end }));
}

function waitForPossibleBreakpointsOnPause(source, start, end, next) {
  var promise = Protocol.Debugger.oncePaused()
    .then(msg => { (start || {}).scriptId = msg.params.callFrames[0].location.scriptId; (end || {}).scriptId = msg.params.callFrames[0].location.scriptId })
    .then(() => Protocol.Debugger.getPossibleBreakpoints({ start: start, end: end }));
  Protocol.Runtime.evaluate({ expression: source }).then(next);
  return promise;
}

function setAllBreakpoints(message) {
  var promises = [];
  for (var location of message.result.locations)
    promises.push(Protocol.Debugger.setBreakpoint({ location: location }).then(checkBreakpointAndDump));
  return Promise.all(promises);
}

function checkBreakpointAndDump(message) {
  if (message.error) {
    InspectorTest.log("FAIL: error in setBreakpoint");
    InspectorTest.logMessage(message);
    return;
  }
  var id_data = message.result.breakpointId.split(":");
  if (parseInt(id_data[1]) !== message.result.actualLocation.lineNumber || parseInt(id_data[2]) !== message.result.actualLocation.columnNumber) {
    InspectorTest.log("FAIL: possible breakpoint was resolved in another location");
    InspectorTest.logMessage(message);
  }
  InspectorTest.logMessage(message);
}
