// Copyright (c) 2019, 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.

@TestOn('vm')
@Timeout(Duration(minutes: 2))
library;

import 'package:test/test.dart';
import 'package:test_common/logging.dart';
import 'package:test_common/test_sdk_configuration.dart';
import 'package:vm_service/vm_service.dart';
import 'package:vm_service_interface/vm_service_interface.dart';

import 'fixtures/context.dart';
import 'fixtures/project.dart';
import 'fixtures/utilities.dart';

void main() {
  // Enable verbose logging for debugging.
  final debug = false;

  final provider = TestSdkConfigurationProvider(verbose: debug);
  tearDownAll(provider.dispose);

  group('shared context |', () {
    final project = TestProject.testPackage();
    final context = TestContext(project, provider);

    setUpAll(() async {
      setCurrentLogWriter(debug: debug);
      await context.setUp(
        testSettings: TestSettings(
          compilationMode: CompilationMode.frontendServer,
          enableExpressionEvaluation: true,
          verboseCompiler: debug,
        ),
      );
    });

    tearDownAll(() async {
      await context.tearDown();
    });

    group('callStack |', () {
      late VmServiceInterface service;
      VM vm;
      late Isolate isolate;
      late String isolateId;
      ScriptList scripts;
      late ScriptRef mainScript;
      late ScriptRef testLibraryScript;
      late Stream<Event> stream;

      setUp(() async {
        setCurrentLogWriter(debug: debug);
        service = context.service;
        vm = await service.getVM();
        isolate = await service.getIsolate(vm.isolates!.first.id!);
        isolateId = isolate.id!;
        scripts = await service.getScripts(isolateId);

        await service.streamListen('Debug');
        stream = service.onEvent('Debug');

        final testPackage = project.packageName;
        mainScript = scripts.scripts!
            .firstWhere((each) => each.uri!.contains('main.dart'));
        testLibraryScript = scripts.scripts!.firstWhere(
          (each) =>
              each.uri!.contains('package:$testPackage/test_library.dart'),
        );
      });

      tearDown(() async {
        await service.resume(isolateId);
      });

      Future<void> onBreakPoint(
        BreakpointTestData breakpoint,
        Future<void> Function() body,
      ) async {
        Breakpoint? bp;
        try {
          final bpId = breakpoint.bpId;
          final script = breakpoint.script;
          final line =
              await context.findBreakpointLine(bpId, isolateId, script);
          bp = await context.service
              .addBreakpointWithScriptUri(isolateId, script.uri!, line);

          expect(bp, isNotNull);
          expect(bp.location, _matchBpLocation(script, line, 0));

          await stream.firstWhere(
            (Event event) => event.kind == EventKind.kPauseBreakpoint,
          );

          await body();
        } finally {
          // Remove breakpoint so it doesn't impact other tests or retries.
          if (bp != null) {
            await context.service.removeBreakpoint(isolateId, bp.id!);
          }
        }
      }

      Future<void> testCallStack(
        List<BreakpointTestData> breakpoints, {
        int frameIndex = 1,
      }) async {
        // Find lines the breakpoints are located on.
        final lines = await Future.wait(
          breakpoints.map(
            (frame) => context.findBreakpointLine(
              frame.bpId,
              isolateId,
              frame.script,
            ),
          ),
        );

        // Get current stack.
        final stack = await service.getStack(isolateId);

        // Verify the stack is correct.
        expect(stack.frames!.length, greaterThanOrEqualTo(lines.length));
        final expected = [
          for (var i = 0; i < lines.length; i++)
            _matchFrame(
              breakpoints[i].script,
              breakpoints[i].function,
              lines[i],
            ),
        ];
        expect(stack.frames, containsAll(expected));

        // Verify that expression evaluation is not failing.
        final instance =
            await service.evaluateInFrame(isolateId, frameIndex, 'true');
        expect(instance, isA<InstanceRef>());
      }

      test('breakpoint succeeds with correct callstack', () async {
        // Expected breakpoints on the stack
        final breakpoints = [
          BreakpointTestData(
            'printEnclosingObject',
            'printEnclosingObject',
            mainScript,
          ),
          BreakpointTestData(
            'printEnclosingFunctionMultiLine',
            'printNestedObjectsMultiLine',
            mainScript,
          ),
          BreakpointTestData(
            'callPrintEnclosingFunctionMultiLine',
            '<closure>',
            mainScript,
          ),
        ];
        await onBreakPoint(
          breakpoints[0],
          () => testCallStack(breakpoints),
        );
      });

      test('expression evaluation succeeds on parent frame', () async {
        // Expected breakpoints on the stack
        final breakpoints = [
          BreakpointTestData(
            'testLibraryClassConstructor',
            'new',
            testLibraryScript,
          ),
          BreakpointTestData(
            'createLibraryObject',
            'printFieldFromLibraryClass',
            mainScript,
          ),
          BreakpointTestData(
            'callPrintFieldFromLibraryClass',
            '<closure>',
            mainScript,
          ),
        ];
        await onBreakPoint(
          breakpoints[0],
          () => testCallStack(breakpoints, frameIndex: 2),
        );
      });

      test('breakpoint inside a line gives correct callstack', () async {
        // Expected breakpoints on the stack
        final breakpoints = [
          BreakpointTestData(
            'newEnclosedClass',
            'new',
            mainScript,
          ),
          BreakpointTestData(
            'printNestedObjectMultiLine',
            'printNestedObjectsMultiLine',
            mainScript,
          ),
          BreakpointTestData(
            'callPrintEnclosingFunctionMultiLine',
            '<closure>',
            mainScript,
          ),
        ];
        await onBreakPoint(
          breakpoints[0],
          () => testCallStack(breakpoints),
        );
      });

      test('breakpoint gives correct callstack after step out', () async {
        // Expected breakpoints on the stack
        final breakpoints = [
          BreakpointTestData(
            'newEnclosedClass',
            'new',
            mainScript,
          ),
          BreakpointTestData(
            'printEnclosingObjectMultiLine',
            'printNestedObjectsMultiLine',
            mainScript,
          ),
          BreakpointTestData(
            'callPrintEnclosingFunctionMultiLine',
            '<closure>',
            mainScript,
          ),
        ];
        await onBreakPoint(breakpoints[0], () async {
          await service.resume(isolateId, step: 'Out');
          await stream.firstWhere(
            (Event event) => event.kind == EventKind.kPauseInterrupted,
          );
          return testCallStack([breakpoints[1], breakpoints[2]]);
        });
      });

      test('breakpoint gives correct callstack after step in', () async {
        // Expected breakpoints on the stack
        final breakpoints = [
          BreakpointTestData(
            'newEnclosedClass',
            'new',
            mainScript,
          ),
          BreakpointTestData(
            'printNestedObjectMultiLine',
            'printNestedObjectsMultiLine',
            mainScript,
          ),
          BreakpointTestData(
            'callPrintEnclosingFunctionMultiLine',
            '<closure>',
            mainScript,
          ),
        ];
        await onBreakPoint(breakpoints[1], () async {
          await service.resume(isolateId, step: 'Into');
          await stream.firstWhere(
            (Event event) => event.kind == EventKind.kPauseInterrupted,
          );
          return testCallStack(breakpoints);
        });
      });

      test('breakpoint gives correct callstack after step into chain calls',
          () async {
        // Expected breakpoints on the stack
        final breakpoints = [
          BreakpointTestData(
            'createObjectWithMethod',
            'createObject',
            mainScript,
          ),
          BreakpointTestData(
            // This is currently incorrect, should be printObjectMultiLine.
            // See issue: https://github.com/dart-lang/sdk/issues/48874
            'printMultiLine',
            'printObjectMultiLine',
            mainScript,
          ),
          BreakpointTestData(
            'callPrintObjectMultiLine',
            '<closure>',
            mainScript,
          ),
        ];
        final bp = BreakpointTestData(
          'printMultiLine',
          'printObjectMultiLine',
          mainScript,
        );
        await onBreakPoint(bp, () async {
          await service.resume(isolateId, step: 'Into');
          await stream.firstWhere(
            (Event event) => event.kind == EventKind.kPauseInterrupted,
          );
          return testCallStack(breakpoints);
        });
      });
    });
  });
}

Matcher _matchFrame(ScriptRef script, String function, int line) => isA<Frame>()
    .having((frame) => frame.code!.name, 'function', function)
    .having(
      (frame) => frame.location,
      'location',
      _matchFrameLocation(script, line),
    );

Matcher _matchBpLocation(ScriptRef script, int line, int column) =>
    isA<SourceLocation>()
        .having((loc) => loc.script, 'script', equals(script))
        .having((loc) => loc.line, 'line', equals(line))
        .having((loc) => loc.column, 'column', greaterThanOrEqualTo(column));

Matcher _matchFrameLocation(ScriptRef script, int line) => isA<SourceLocation>()
    .having((loc) => loc.script, 'script', equals(script))
    .having((loc) => loc.line, 'line', equals(line));

class BreakpointTestData {
  String bpId;
  String function;
  ScriptRef script;

  BreakpointTestData(this.bpId, this.function, this.script);
}
