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


// Test we break at every assignment in a var-statement with multiple
// variable declarations.

var exception = null;
var log = []

function f() {
  var l1 = 1,    // l
      l2,        // m
      l3 = 3;    // n
  let l4,        // o
      l5 = 5,    // p
      l6 = 6;    // q
  const l7 = 7,  // r
        l8 = 8,  // s
        l9 = 9;  // t
  return 0       // u
  ;              // v
}

function listener(event, exec_state, event_data, data) {
  if (event != Debug.DebugEvent.Break) return;
  try {
    var line = exec_state.frame(0).sourceLineText();
    var col = exec_state.frame(0).sourceColumn();
    print(line);
    var match = line.match(/\/\/ (\w)$/);
    assertEquals(2, match.length);
    log.push(match[1] + col);
    if (match[1] != "v") {
      exec_state.prepareStep(Debug.StepAction.StepIn);
    }
  } catch (e) {
    exception = e;
  }
}

var Debug = debug.Debug;
Debug.setListener(listener);

debugger;        // a
var g1 = 1,      // b
    g2 = 2,      // c
    g3;          // d
let g4 = 4,      // e
    g5,          // f
    g6 = 6;      // g
const g7 = 7,    // h
      g8 = 8,    // i
      g9 = f();  // j

Debug.setListener(null);

assertNull(exception);

// Note that let declarations, if not explicitly initialized, implicitly
// initialize to undefined.

var expected = [
  "a0",               // debugger statement
  "b9","c9",          // global var
  "e9","f4","g9",     // global let
  "h11","i11","j11",  // global const
  "l11","n11",        // local var
  "o6","p11","q11",   // local let
  "r13","s13","t13",  // local const
  "u2","v3",          // return
];
assertEquals(expected, log);
