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

// Test that asynchronous features do not work with
// side-effect free debug-evaluate.

Debug = debug.Debug

var exception = null;

function* generator() {
  yield 1;
}

async function async() {
  return 1;
}

var g = generator();

function listener(event, exec_state, event_data, data) {
  if (event != Debug.DebugEvent.Break) return;
  try {
    function fail(source) {
      assertThrows(() => exec_state.frame(0).evaluate(source, true),
                   EvalError);
    }
    fail("new Promise()");
    fail("generator()");
    fail("g.next()");
    fail("async()");
  } catch (e) {
    exception = e;
    print(e, e.stack);
  };
};

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

function f() {
  debugger;
};

f();

assertNull(exception);
