// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// VMOptions=--async-debugger --verbose-debug --no-causal-async-stacks --lazy-async-stacks
// VMOptions=--async-debugger --verbose-debug --causal-async-stacks --no-lazy-async-stacks

import 'dart:developer';
import 'package:observatory_2/models.dart' as M;
import 'package:observatory_2/service_io.dart';
import 'package:test/test.dart';
import 'service_test_common.dart';
import 'test_helper.dart';

const LINE_A = 28;
const LINE_B = 34;
const LINE_C = 38;

notCalled() async {
  await null;
  await null;
  await null;
  await null;
}

foobar() async {
  await null;
  debugger();
  print('foobar'); // LINE_A.
}

helper() async {
  await null;
  print('helper');
  await foobar(); // LINE_B.
}

testMain() async {
  helper(); // LINE_C.
}

var tests = <IsolateTest>[
  hasStoppedAtBreakpoint,
  stoppedAtLine(LINE_A),
  (Isolate isolate) async {
    // Verify awaiter stack trace is the current frame + the awaiter.
    ServiceMap stack = await isolate.getStack();
    expect(stack['awaiterFrames'], isNotNull);
    List awaiterFrames = stack['awaiterFrames'];
    for (final v in awaiterFrames) {
      print(v);
    }

    if (useCausalAsyncStacks) {
      expect(awaiterFrames.length, greaterThanOrEqualTo(4));
      // Awaiter frame.
      expect(await awaiterFrames[0].toUserString(),
          stringContainsInOrder(['foobar', '.dart:${LINE_A}']));
      // Awaiter frame.
      expect(await awaiterFrames[1].toUserString(),
          stringContainsInOrder(['helper', '.dart:${LINE_B}']));
      // Suspension point.
      expect(awaiterFrames[2].kind, equals(M.FrameKind.asyncSuspensionMarker));
      // Causal frame.
      expect(await awaiterFrames[3].toUserString(),
          stringContainsInOrder(['testMain', '.dart:${LINE_C}']));
    } else {
      expect(awaiterFrames.length, greaterThanOrEqualTo(2));
      // Awaiter frame.
      expect(await awaiterFrames[0].toUserString(),
          stringContainsInOrder(['foobar', '.dart:${LINE_A}']));
      // Awaiter frame.
      expect(await awaiterFrames[1].toUserString(),
          stringContainsInOrder(['helper', '.dart:${LINE_B}']));
    }
  },
];

main(args) => runIsolateTestsSynchronous(args, tests,
    testeeConcurrent: testMain, extraArgs: extraDebuggingArgs);
