// 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: --noanalyze-environment-liveness


Debug = debug.Debug

listenerComplete = false;
breakPointCount = 0;
exception = null;

function listener(event, exec_state, event_data, data) {
  if (event != Debug.DebugEvent.Break) return;
  try {
    breakPointCount++;
    if (breakPointCount == 1) {
      // Break point in initializer for parameter `a`, invoked by
      // initializer for parameter `b`
      assertEquals('default', exec_state.frame(0).evaluate('mode').value());
      assertTrue(exec_state.frame(1).evaluate('b').isUndefined());
      assertTrue(exec_state.frame(1).evaluate('c').isUndefined());
    } 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());
      assertTrue(exec_state.frame(1).evaluate('c').isUndefined());
    } 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());
    }
  } catch (e) {
    exception = e;
  }
};

// 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);
assertNull(exception);
