// Copyright (c) 2020, 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=--lazy-async-stacks --no-causal-async-stacks --verbose_debug

import 'dart:developer';

import 'package:vm_service/vm_service.dart';
import 'package:test/test.dart';

import 'common/service_test_common.dart';
import 'common/test_helper.dart';

const LINE_A = 33;
const LINE_B = 35;

Future<void> testMain() async {
  await func1();
}

Future func1() async => await func2();
Future func2() async => await func3();
Future func3() async => await func4();
Future func4() async => await func5();
Future func5() async => await func6();
Future func6() async => await func7();
Future func7() async => await func8();
Future func8() async => await func9();
Future func9() async => await func10();
Future func10() async {
  debugger(); // LINE_A
  await 0;
  debugger(); // LINE_B
  print("Hello, world!");
}

void expectFrame(
    final frame, final kindExpectation, final codeNameExpectation) {
  expect(frame.kind, kindExpectation);
  expect(frame.code?.name, codeNameExpectation);
}

void expectFrames(final frames, final expectKindAndCodeName) {
  for (int i = 0; i < expectKindAndCodeName.length; i++) {
    expectFrame(
        frames[i], expectKindAndCodeName[i][0], expectKindAndCodeName[i][1]);
  }
}

final tests = <IsolateTest>[
  // Before the first await.
  hasStoppedAtBreakpoint,
  stoppedAtLine(LINE_A),
  (VmService service, IsolateRef isolateRef) async {
    final result = await service.getStack(isolateRef.id);

    expect(result.frames, hasLength(16));
    expect(result.asyncCausalFrames, hasLength(16));
    expect(result.awaiterFrames, hasLength(16));

    expectFrames(result.frames, [
      [equals('Regular'), endsWith(' func10')],
      [equals('Regular'), endsWith(' func9')],
      [equals('Regular'), endsWith(' func8')],
      [equals('Regular'), endsWith(' func7')],
      [equals('Regular'), endsWith(' func6')],
      [equals('Regular'), endsWith(' func5')],
      [equals('Regular'), endsWith(' func4')],
      [equals('Regular'), endsWith(' func3')],
      [equals('Regular'), endsWith(' func2')],
      [equals('Regular'), endsWith(' func1')],
      [equals('Regular'), endsWith(' testMain')],
    ]);

    expectFrames(result.asyncCausalFrames, [
      [equals('AsyncCausal'), endsWith(' func10')],
      [equals('AsyncCausal'), endsWith(' func9')],
      [equals('AsyncCausal'), endsWith(' func8')],
      [equals('AsyncCausal'), endsWith(' func7')],
      [equals('AsyncCausal'), endsWith(' func6')],
      [equals('AsyncCausal'), endsWith(' func5')],
      [equals('AsyncCausal'), endsWith(' func4')],
      [equals('AsyncCausal'), endsWith(' func3')],
      [equals('AsyncCausal'), endsWith(' func2')],
      [equals('AsyncCausal'), endsWith(' func1')],
      [equals('AsyncCausal'), endsWith(' testMain')],
    ]);

    expectFrames(result.awaiterFrames, [
      [equals('AsyncActivation'), endsWith(' func10')],
      [equals('AsyncActivation'), endsWith(' func9')],
      [equals('AsyncActivation'), endsWith(' func8')],
      [equals('AsyncActivation'), endsWith(' func7')],
      [equals('AsyncActivation'), endsWith(' func6')],
      [equals('AsyncActivation'), endsWith(' func5')],
      [equals('AsyncActivation'), endsWith(' func4')],
      [equals('AsyncActivation'), endsWith(' func3')],
      [equals('AsyncActivation'), endsWith(' func2')],
      [equals('AsyncActivation'), endsWith(' func1')],
      [equals('AsyncActivation'), endsWith(' testMain')],
    ]);
  },
  // After resuming the continuation - i.e. running async.
  resumeIsolate,
  hasStoppedAtBreakpoint,
  stoppedAtLine(LINE_B),
  (VmService service, IsolateRef isolateRef) async {
    final result = await service.getStack(isolateRef.id);

    expect(result.frames, hasLength(10));
    expect(result.asyncCausalFrames, hasLength(26));
    expect(result.awaiterFrames, hasLength(2));

    expectFrames(result.frames, [
      [equals('Regular'), endsWith(' func10')],
      [equals('Regular'), endsWith(' _RootZone.runUnary')],
      [equals('Regular'), anything], // Internal mech. ..
      [equals('Regular'), anything],
      [equals('Regular'), anything],
      [equals('Regular'), anything],
      [equals('Regular'), anything],
      [equals('Regular'), anything],
      [equals('Regular'), anything],
      [equals('Regular'), endsWith(' _RawReceivePortImpl._handleMessage')],
    ]);

    expectFrames(result.asyncCausalFrames, [
      [equals('AsyncCausal'), endsWith(' func10')],
      [equals('AsyncSuspensionMarker'), isNull],
      [equals('AsyncCausal'), endsWith(' func9')],
      [equals('AsyncSuspensionMarker'), isNull],
      [equals('AsyncCausal'), endsWith(' func8')],
      [equals('AsyncSuspensionMarker'), isNull],
      [equals('AsyncCausal'), endsWith(' func7')],
      [equals('AsyncSuspensionMarker'), isNull],
      [equals('AsyncCausal'), endsWith(' func6')],
      [equals('AsyncSuspensionMarker'), isNull],
      [equals('AsyncCausal'), endsWith(' func5')],
      [equals('AsyncSuspensionMarker'), isNull],
      [equals('AsyncCausal'), endsWith(' func4')],
      [equals('AsyncSuspensionMarker'), isNull],
      [equals('AsyncCausal'), endsWith(' func3')],
      [equals('AsyncSuspensionMarker'), isNull],
      [equals('AsyncCausal'), endsWith(' func2')],
      [equals('AsyncSuspensionMarker'), isNull],
      [equals('AsyncCausal'), endsWith(' func1')],
      [equals('AsyncSuspensionMarker'), isNull],
      [equals('AsyncCausal'), endsWith(' testMain')],
      [equals('AsyncSuspensionMarker'), isNull],
    ]);

    expectFrames(result.awaiterFrames, [
      [equals('AsyncActivation'), endsWith(' func10')],
      [equals('AsyncActivation'), endsWith(' func9')],
    ]);
  },
];

main([args = const <String>[]]) =>
    runIsolateTests(args, tests, testeeConcurrent: testMain);
