// Copyright 2015 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: --expose-debug-as debug --harmony-default-parameters

// Get the Debug object exposed from the debug context global object.
Debug = debug.Debug

listenerComplete = false;
breakPointCount = 0;

function listener(event, exec_state, event_data, data) {
  if (event == Debug.DebugEvent.Break) {
    breakPointCount++;
    if (breakPointCount == 1) {
      // Break point in initializer for parameter `a`, invoked by
      // initializer for parameter `b`
      assertEquals('default', exec_state.frame(1).evaluate('mode').value());

      // initializer for `b` can't refer to `b`
      assertThrows(function() {
        exec_state.frame(1).evaluate('b').value();
      }, ReferenceError);

      assertThrows(function() {
        exec_state.frame(1).evaluate('c');
      }, ReferenceError);
    } else if (breakPointCount == 2) {
      // Break point in IIFE initializer for parameter `c`
      assertEquals('modeFn', exec_state.frame(1).evaluate('a.name').value());
      assertEquals('default', exec_state.frame(1).evaluate('b').value());
      assertThrows(function() {
        exec_state.frame(1).evaluate('c');
      }, ReferenceError);
    } else if (breakPointCount == 3) {
      // Break point in function body --- `c` parameter is shadowed
      assertEquals('modeFn', exec_state.frame(0).evaluate('a.name').value());
      assertEquals('default', exec_state.frame(0).evaluate('b').value());
      assertEquals('local', exec_state.frame(0).evaluate('d').value());
    }
  }
};

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

function f(a = function modeFn(mode) { debugger; return mode; },
           b = a("default"),
           c = (function() { debugger; })()) {
  var d = 'local';
  debugger;
};

f();

// Make sure that the debug event listener vas invoked.
assertEquals(3, breakPointCount);
