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

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

const int LINE_A = 13;

Future<String> testFunction() async {
  await new Future.delayed(new Duration(milliseconds: 1));
  return "Done";
}

testMain() async {
  debugger();
  var str = await testFunction();
  print(str);
}

var tests = <IsolateTest>[
  hasStoppedAtBreakpoint,

// Add breakpoint at the entry of async function
  (Isolate isolate) async {
    Library rootLib = await isolate.rootLibrary.load();
    var function =
        rootLib.functions.singleWhere((f) => f.name == 'testFunction');

    var bpt = await isolate.addBreakpointAtEntry(function);
    expect(bpt is Breakpoint, isTrue);
    print(bpt);
  },

  resumeIsolate,

  hasStoppedAtBreakpoint,
  stoppedAtLine(LINE_A),
  resumeIsolate,
];

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