// Copyright 2018 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: --allow-natives-syntax

let {session, contextGroup, Protocol} =
    InspectorTest.start('Tests stepping with blackboxing and inlining');

contextGroup.addScript(
`function bar() {
  return 1 + foo();
}
//# sourceURL=bar.js`);

contextGroup.addScript(
`function foo() {
  return "foo";
}
//# sourceURL=foo.js`);

Protocol.Debugger.enable();
Protocol.Debugger.setBlackboxPatterns({ patterns: [ "bar.js" ] });

Protocol.Debugger.onPaused(PerformSteps);
Protocol.Runtime.evaluate({
  "expression": "%PrepareFunctionForOptimization(bar); bar(); bar(); " +
                "%OptimizeFunctionOnNextCall(bar); bar()"
});
Protocol.Runtime.evaluate({ "expression": "debugger; bar();" });

var commands = [ "stepInto", "stepInto" ];

function PerformSteps(message) {
  InspectorTest.log("Paused in");
  var callFrames = message.params.callFrames;
  for (var callFrame of callFrames) {
    InspectorTest.log(
        (callFrame.functionName || "(...)") + ":" + (callFrame.location.lineNumber + 1));
  }
  var command = commands.shift();
  if (!command) {
    InspectorTest.completeTest();
    return;
  }
  Protocol.Debugger[command]();
}
