// 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('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.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('Regular'), 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);
