// Copyright 2022 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: --experimental-value-unavailable

const {session, Protocol} =
    InspectorTest.start('Checks that after restarting the top frame, local variables are reset');

session.setupScriptMap();

const source = `
function foo() {
  var x = 'some var';
  const y = 'some const';
  let z = 'some let';
  debugger;
}
foo();
//# sourceURL=testRestartFrame.js`;

(async () => {
  await Protocol.Debugger.enable();

  const { callFrames } = await InspectorTest.evaluateAndWaitForPause(source);

  let { callFrameId } = callFrames[0];
  InspectorTest.log('Evaluating x:');
  InspectorTest.logMessage(await Protocol.Debugger.evaluateOnCallFrame({ callFrameId, expression: 'x' }));

  InspectorTest.log('Evaluating y:');
  InspectorTest.logMessage(await Protocol.Debugger.evaluateOnCallFrame({ callFrameId, expression: 'y' }));

  InspectorTest.log('Evaluating z:');
  InspectorTest.logMessage(await Protocol.Debugger.evaluateOnCallFrame({ callFrameId, expression: 'z' }));

  const callFramesAfter = await InspectorTest.restartFrameAndWaitForPause(callFrames, 0);

  ({ callFrameId } = callFramesAfter[0]);
  InspectorTest.log('Evaluating x:');
  InspectorTest.logMessage(await Protocol.Debugger.evaluateOnCallFrame({ callFrameId, expression: 'x' }));

  InspectorTest.log('Evaluating y:');
  InspectorTest.logMessage(await Protocol.Debugger.evaluateOnCallFrame({ callFrameId, expression: 'y' }));

  InspectorTest.log('Evaluating z:');
  InspectorTest.logMessage(await Protocol.Debugger.evaluateOnCallFrame({ callFrameId, expression: 'z' }));

  Protocol.Debugger.resume();  // Resuming hits the 'debugger' stmt again.
  await Protocol.Debugger.oncePaused();
  await Protocol.Debugger.resume();

  InspectorTest.completeTest();
})();
