// 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:unittest/unittest.dart';
import 'test_helper.dart';
import 'dart:async';

int counter = 0;

void funcB() {
  counter++;  // line 13
  if (counter % 100000000 == 0) {
    print(counter);
  }
}

void funcA() {
  funcB();
}

void testFunction() {
  while (true) {
    funcA();
  }
}

var tests = [

// Go to breakpoint at line 13.
(Isolate isolate) {
  return isolate.rootLib.load().then((_) {
      // Set up a listener to wait for breakpoint events.
      Completer completer = new Completer();
      List events = [];
      isolate.vm.events.stream.listen((ServiceEvent event) {
        if (event.eventType == 'BreakpointReached') {
          print('Breakpoint reached');
          completer.complete();
        }
      });

      // Add the breakpoint.
      var script = isolate.rootLib.scripts[0];
      var line = 13;
      return isolate.addBreakpoint(script, line).then((ServiceObject bpt) {
          return completer.future;  // Wait for breakpoint reached.
      });
    });
},

// Inspect code objects for top two frames.
(Isolate isolate) {
  return isolate.getStack().then((ServiceMap stack) {
      // Make sure we are in the right place.
      expect(stack.type, equals('Stack'));
      expect(stack['frames'].length, greaterThanOrEqualTo(3));
      var frame0 = stack['frames'][0];
      var frame1 = stack['frames'][1];
      print(frame0);
      expect(frame0['function'].name, equals('funcB'));
      expect(frame1['function'].name, equals('funcA'));
      var codeId0 = frame0['code'].id;
      var codeId1 = frame1['code'].id;

      List tests = [];
      // Load code from frame 0.
      tests.add(isolate.getObject(codeId0)..then((Code code) {
            expect(code.type, equals('Code'));
            expect(code.function.name, equals('funcB'));
            expect(code.hasDisassembly, equals(true));
          }));
      // Load code from frame 0.
      tests.add(isolate.getObject(codeId1)..then((Code code) {
            expect(code.type, equals('Code'));
            expect(code.function.name, equals('funcA'));
            expect(code.hasDisassembly, equals(true));
          }));
      return Future.wait(tests);
  });
},

];

main(args) => runIsolateTests(args, tests, testeeConcurrent: testFunction);
