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

function* serialize() {
  debugger;
  switch (0) {
    case 0:
      let x = 1;
      return x;  // Check scopes
  }
}

let exception = null;
let step_count = 0;
let scopes_checked = false;

function listener(event, exec_state, event_data, data) {
  if (event != Debug.DebugEvent.Break) return;
  try {
    if (exec_state.frame().sourceLineText().includes("Check scopes")) {
      let expected = [ debug.ScopeType.Block,
                       debug.ScopeType.Local,
                       debug.ScopeType.Script,
                       debug.ScopeType.Global ];
      for (let i = 0; i < exec_state.frame().scopeCount(); i++) {
        assertEquals(expected[i], exec_state.frame().scope(i).scopeType());
      }
      scopes_checked = true;
    }
    if (step_count++ < 3) exec_state.prepareStep(Debug.StepAction.StepNext);
  } catch (e) {
    exception = e;
    print(e, e.stack);
  }
}



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

let gen = serialize();
gen.next();

Debug.setListener(null);
assertNull(exception);
assertEquals(4, step_count);
assertTrue(scopes_checked);
