// 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.

import 'package:observatory/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() as Library;
  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) {
      dynamic 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() as Library;
  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) {
      dynamic 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() as Library;
  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) {
      dynamic 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() as Library;
  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) {
      dynamic 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);
