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

// @dart = 2.9

import 'package:observatory_2/service_io.dart';
import 'package:test/test.dart';
import 'test_helper.dart';

import 'dart:async';
import 'dart:math' as math;

breakHere() {}

use(dynamic v) => v;

class C {
  var instVar = 1;
  static var classVar = 2;

  method(methodParam) {
    var methodTemp = 4;
    use(methodTemp);
    [5].forEach((outerParam) {
      var outerTemp = 6;
      use(outerTemp);
      [7].forEach((innerParam) {
        var innerTemp = 8;
        use(innerTemp);
        breakHere();
      });
    });
  }

  static method2(methodParam) {
    var methodTemp = 4;
    use(methodTemp);
    [5].forEach((outerParam) {
      var outerTemp = 6;
      use(outerTemp);
      [7].forEach((innerParam) {
        var innerTemp = 8;
        use(innerTemp);
        breakHere();
      });
    });
  }

  method3(methodParam) {
    var methodTemp = 4;
    use(methodTemp);
    breakHere();
  }

  static var closureWithReturnedHome;
  method4(methodParam) {
    var methodTemp = 4;
    use(methodTemp);
    [5].forEach((outerParam) {
      var outerTemp = 6;
      use(outerTemp);
      closureWithReturnedHome = (innerParam) {
        var innerTemp = 8;
        use(innerTemp);
        breakHere();
      };
    });
  }
}

Future testMethod(Isolate isolate) async {
  // silence analyzer.
  expect(math.sqrt(4), equals(2));
  Library rootLib = await isolate.rootLibrary.load();
  ServiceFunction function =
      rootLib.functions.singleWhere((f) => f.name == 'breakHere');
  Breakpoint bpt = await isolate.addBreakpointAtEntry(function);
  print("Breakpoint: $bpt");
  expect(bpt is Breakpoint, isTrue);  // I.e, not null.

  bool hitBreakpoint = false;
  var stream = await isolate.vm.getEventStream(VM.kDebugStream);
  var sub;
  sub = stream.listen((ServiceEvent event) async {
    print("Event $event");
    if (event.kind == ServiceEvent.kPauseBreakpoint) {
      var frameNumber = 1, r;
      r = await isolate.evalFrame(frameNumber, '123');  //# instance: ok
      expect(r.valueAsString, equals('123'));  //# instance: continued
      r = await isolate.evalFrame(frameNumber, 'this');  //# scope: ok
      expect(r.clazz.name, equals('C'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'instVar');  //# instance: continued
      expect(r.valueAsString, equals('1'));  //# instance: continued
      r = await isolate.evalFrame(frameNumber, 'classVar'); //# instance: continued
      expect(r.valueAsString, equals('2'));  //# instance: continued
      r = await isolate.evalFrame(frameNumber, 'methodParam');  //# scope: continued
      expect(r.valueAsString, equals('3'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'methodTemp');  //# scope: continued
      expect(r.valueAsString, equals('4'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'outerParam');  //# scope: continued
      expect(r.valueAsString, equals('5'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'outerTemp');  //# scope: continued
      expect(r.valueAsString, equals('6'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'innerParam');  //# instance: continued
      expect(r.valueAsString, equals('7'));  //# instance: continued
      r = await isolate.evalFrame(frameNumber, 'innerTemp');  //# instance: continued
      expect(r.valueAsString, equals('8'));  //# instance: continued
      r = await isolate.evalFrame(frameNumber, 'math.sqrt');  //# instance: continued
      expect(r.isClosure, isTrue);  //# instance: continued

      hitBreakpoint = true;
      sub.cancel();  // Do not handle events for the other tests.
      isolate.resume();
    }
  });

  var result = await rootLib.evaluate('new C().method(3)');
  print("Result $result");
  expect(hitBreakpoint, isTrue);
}

Future testMethod2(Isolate isolate) async {
  Library rootLib = await isolate.rootLibrary.load();
  ServiceFunction function =
      rootLib.functions.singleWhere((f) => f.name == 'breakHere');
  Breakpoint bpt = await isolate.addBreakpointAtEntry(function);
  print("Breakpoint: $bpt");
  expect(bpt is Breakpoint, isTrue);  // I.e, not null.

  bool hitBreakpoint = false;
  var stream = await isolate.vm.getEventStream(VM.kDebugStream);
  var sub;
  sub = stream.listen((ServiceEvent event) async {
    print("Event $event");
    if (event.kind == ServiceEvent.kPauseBreakpoint) {
      var frameNumber = 1, r;
      r = await isolate.evalFrame(frameNumber, '123');
      expect(r.valueAsString, equals('123'));
      r = await isolate.evalFrame(frameNumber, 'this');
      expect(r is DartError, isTrue);
      r = await isolate.evalFrame(frameNumber, 'instVar');
      expect(r is DartError, isTrue);
      r = await isolate.evalFrame(frameNumber, 'classVar');
      expect(r.valueAsString, equals('2'));
      r = await isolate.evalFrame(frameNumber, 'methodParam');
      expect(r.valueAsString, equals('3'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'methodTemp');
      expect(r.valueAsString, equals('4'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'outerParam');
      expect(r.valueAsString, equals('5'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'outerTemp');
      expect(r.valueAsString, equals('6'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'innerParam');
      expect(r.valueAsString, equals('7'));
      r = await isolate.evalFrame(frameNumber, 'innerTemp');
      expect(r.valueAsString, equals('8'));
      r = await isolate.evalFrame(frameNumber, 'math.sqrt');
      expect(r.isClosure, isTrue);

      hitBreakpoint = true;
      sub.cancel();  // Do not handle events for the other tests.
      isolate.resume();
    }
  });

  var result = await rootLib.evaluate('C.method2(3)');
  print("Result $result");
  expect(hitBreakpoint, isTrue);
}

Future testMethod3(Isolate isolate) async {
  Library rootLib = await isolate.rootLibrary.load();
  ServiceFunction function =
      rootLib.functions.singleWhere((f) => f.name == 'breakHere');
  Breakpoint bpt = await isolate.addBreakpointAtEntry(function);
  print("Breakpoint: $bpt");
  expect(bpt is Breakpoint, isTrue);  // I.e, not null.

  bool hitBreakpoint = false;
  var stream = await isolate.vm.getEventStream(VM.kDebugStream);
  var sub;
  sub = stream.listen((ServiceEvent event) async {
    print("Event $event");
    if (event.kind == ServiceEvent.kPauseBreakpoint) {
      var frameNumber = 1, r;
      r = await isolate.evalFrame(frameNumber, '123');
      expect(r.valueAsString, equals('123'));
      r = await isolate.evalFrame(frameNumber, 'this');
      expect(r.clazz.name, equals('C'));
      r = await isolate.evalFrame(frameNumber, 'instVar');
      expect(r.valueAsString, equals('1'));
      r = await isolate.evalFrame(frameNumber, 'classVar');
      expect(r.valueAsString, equals('2'));
      r = await isolate.evalFrame(frameNumber, 'methodParam');
      expect(r.valueAsString, equals('3'));
      r = await isolate.evalFrame(frameNumber, 'methodTemp');
      expect(r.valueAsString, equals('4'));
      r = await isolate.evalFrame(frameNumber, 'math.sqrt');
      expect(r.isClosure, isTrue);

      hitBreakpoint = true;
      sub.cancel();  // Do not handle events for the other tests.
      isolate.resume();
    }
  });

  var result = await rootLib.evaluate('new C().method3(3)');
  print("Result $result");
  expect(hitBreakpoint, isTrue);
}


Future testMethod4(Isolate isolate) async {
  Library rootLib = await isolate.rootLibrary.load();
  ServiceFunction function =
      rootLib.functions.singleWhere((f) => f.name == 'breakHere');
  Breakpoint bpt = await isolate.addBreakpointAtEntry(function);
  print("Breakpoint: $bpt");
  expect(bpt is Breakpoint, isTrue);  // I.e, not null.

  bool hitBreakpoint = false;
  var stream = await isolate.vm.getEventStream(VM.kDebugStream);
  var sub;
  sub = stream.listen((ServiceEvent event) async {
    print("Event $event");
    if (event.kind == ServiceEvent.kPauseBreakpoint) {
      var frameNumber = 1, r;
      r = await isolate.evalFrame(frameNumber, '123');  //# instance: continued
      expect(r.valueAsString, equals('123'));  //# instance: continued
      r = await isolate.evalFrame(frameNumber, 'this');  //# scope: continued
      expect(r.clazz.name, equals('C'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'instVar');  //# instance: continued
      expect(r.valueAsString, equals('1'));  //# instance: continued
      r = await isolate.evalFrame(frameNumber, 'classVar');  //# instance: continued
      expect(r.valueAsString, equals('2'));  //# instance: continued
      r = await isolate.evalFrame(frameNumber, 'methodParam');  //# scope: continued
      expect(r.valueAsString, equals('3'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'methodTemp');  //# scope: continued
      expect(r.valueAsString, equals('4'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'outerParam');  //# scope: continued
      expect(r.valueAsString, equals('5'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'outerTemp');  //# scope: continued
      expect(r.valueAsString, equals('6'));  //# scope: continued
      r = await isolate.evalFrame(frameNumber, 'innerParam');  //# instance: continued
      expect(r.valueAsString, equals('7'));  //# instance: continued
      r = await isolate.evalFrame(frameNumber, 'innerTemp');  //# instance: continued
      expect(r.valueAsString, equals('8'));  //# instance: continued
      r = await isolate.evalFrame(frameNumber, 'math.sqrt');  //# instance: continued
      expect(r.isClosure, isTrue);  //# instance: continued

      hitBreakpoint = true;
      sub.cancel();  // Do not handle events for the other tests.
      isolate.resume();
    }
  });

  var result = await rootLib.evaluate(
      '(){ new C().method4(3); C.closureWithReturnedHome(7); }()');
  print("Result $result");
  expect(hitBreakpoint, isTrue);
}

var tests = <IsolateTest>[
  testMethod,
  testMethod2,
  testMethod3,
  testMethod4,
];

main(args) => runIsolateTests(args, tests);
