// Copyright (c) 2021, 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.
// VMOptions=--verbose_debug

import 'dart:developer';

import 'package:observatory_2/service_io.dart';

import 'service_test_common.dart';
import 'test_helper.dart';

// Line in core/print.dart
const int LINE_A = 10;

testMain() {
  debugger();
  print('1');
  print('2');
  print('3');
  print('Done');
}

IsolateTest expectHitBreakpoint(String uri, int line) {
  return (Isolate isolate) async {
    final bpt = await isolate.addBreakpointByScriptUri(uri, line);
    await resumeIsolate(isolate);
    await hasStoppedAtBreakpoint(isolate);
    await stoppedAtLine(line)(isolate);
    await isolate.removeBreakpoint(bpt);
  };
}

var tests = <IsolateTest>[
  hasStoppedAtBreakpoint,

  // Dart libraries are not debuggable by default
  markDartColonLibrariesDebuggable,

  expectHitBreakpoint('org-dartlang-sdk:///sdk/lib/core/print.dart', LINE_A),
  expectHitBreakpoint('dart:core/print.dart', LINE_A),
  expectHitBreakpoint('/core/print.dart', LINE_A),

  resumeIsolate,
];

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