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

const int LINE_A = 16;
const int LINE_B = 17;

testMain() {
  var foo; // line A
  foo = 42; // line B
  print(foo);
}

var tests = <IsolateTest>[
  hasPausedAtStart,

  // Add breakpoints at line 11 and line 12.
  (Isolate isolate) async {
    var rootLib = isolate.rootLibrary;
    await rootLib.load();
    var script = rootLib.scripts[0];

    var bpt1 = await isolate.addBreakpoint(script, LINE_A);
    var bpt2 = await isolate.addBreakpoint(script, LINE_B);
    expect(await bpt1.location.getLine(), equals(LINE_A));
    expect(await bpt2.location.getLine(), equals(LINE_B));

    var stream = await isolate.vm.getEventStream(VM.kDebugStream);
    Completer completer = new Completer();
    var subscription;
    var breakCount = 0;
    subscription = stream.listen((ServiceEvent event) async {
      if (event.kind == ServiceEvent.kPauseBreakpoint) {
        breakCount++;
        print('break count is $breakCount');
        if (breakCount == 1) {
          // We are stopped at breakpoint 1.
          expect(event.breakpoint.number, equals(bpt1.number));

          // Remove both breakpoints
          var result = await isolate.removeBreakpoint(bpt1);
          expect(result.type, equals("Success"));

          result = await isolate.removeBreakpoint(bpt2);
          expect(result.type, equals("Success"));

          isolate.stepOver();
        } else {
          // No breakpoint.
          expect(event.breakpoint, isNull);

          // We expect the next step to take us to line B.
          var stack = await isolate.getStack();
          expect(await stack['frames'][0].location.getLine(), equals(LINE_B));

          subscription.cancel();
          completer.complete(null);
        }
      }
    });
    isolate.resume();
    await completer.future;
  },
];

main(args) => runIsolateTests(args, tests,
    testeeConcurrent: testMain, pause_on_start: true);
