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

let {session, contextGroup, Protocol} = InspectorTest.start('Tests that blackboxed ranges are respected while stepping');

contextGroup.addScript(
`function blackboxedBoo()
{
    var a = 42;
    var b = foo();
    return a + b;
}
//# sourceURL=blackboxed-script.js`);

contextGroup.addScript(
`function notBlackboxedFoo()
{
    var a = 42;
    var b = blackboxedBoo();
    return a + b;
}

function blackboxedFoo()
{
    var a = 42;
    var b = notBlackboxedFoo();
    return a + b;
}

function notBlackboxedBoo()
{
    var a = 42;
    var b = blackboxedFoo();
    return a + b;
}
//# sourceURL=mixed-source.js`);

contextGroup.addScript(
`function testFunction()
{
    notBlackboxedBoo(); // for setup ranges and stepOut
    notBlackboxedBoo(); // for stepIn
}

function foo()
{
    debugger;
    return 239;
}`);

Protocol.Debugger.oncePaused().then(setBlackboxedScriptRanges);
Protocol.Debugger.enable().then(callTestFunction);

function callTestFunction(response)
{
  Protocol.Runtime.evaluate({ expression: "setTimeout(testFunction, 0);"});
}

function setBlackboxedScriptRanges(response)
{
  var callFrames = response.params.callFrames;
  printCallFrames(callFrames);
  Protocol.Debugger.setBlackboxedRanges({
    scriptId: callFrames[1].location.scriptId,
    positions: [ { lineNumber: 0, columnNumber: 0 } ] // blackbox ranges for blackboxed.js
  }).then(setIncorrectRanges.bind(null, callFrames[2].location.scriptId));
}

var incorrectPositions = [
    [ { lineNumber: 0, columnNumber: 0 }, { lineNumber: 0, columnNumber: 0 } ],
    [ { lineNumber: 0, columnNumber: 1 }, { lineNumber: 0, columnNumber: 0 } ],
    [ { lineNumber: 0, columnNumber: -1 } ],
];

function setIncorrectRanges(scriptId, response)
{
  if (response.error)
    InspectorTest.log(response.error.message);
  var positions = incorrectPositions.shift();
  if (!positions) {
    setMixedSourceRanges(scriptId);
    return;
  }
  InspectorTest.log("Try to set positions: " + JSON.stringify(positions));
  Protocol.Debugger.setBlackboxedRanges({
    scriptId: scriptId,
    positions: positions
  }).then(setIncorrectRanges.bind(null, scriptId));
}

function setMixedSourceRanges(scriptId)
{
  Protocol.Debugger.onPaused(runAction);
  Protocol.Debugger
      .setBlackboxedRanges({
        scriptId: scriptId,
        positions: [
          {lineNumber: 6, columnNumber: 0},
          {lineNumber: 14, columnNumber: 0}
        ]  // blackbox ranges for mixed.js
      })
      .then(runAction);
}

var actions = [ "stepOut", "print", "stepOut", "print", "stepOut", "print",
    "stepInto", "print", "stepOver", "stepInto", "print", "stepOver", "stepInto", "print",
    "stepOver", "stepInto", "print" ];

function runAction(response)
{
  var action = actions.shift();
  if (!action) {
    InspectorTest.completeTest();
    return;
  }

  if (action === "print") {
    printCallFrames(response.params.callFrames);
    runAction({});
  } else {
    InspectorTest.log("action: " + action);
    Protocol.Debugger[action]();
  }
}

function printCallFrames(callFrames)
{
  var topCallFrame = callFrames[0];
  if (topCallFrame.functionName.startsWith("blackboxed"))
    InspectorTest.log("FAIL: blackboxed function in top call frame");
  for (var callFrame of callFrames)
    InspectorTest.log(callFrame.functionName + ": " + callFrame.location.lineNumber + ":" + callFrame.location.columnNumber);
  InspectorTest.log("");
}
