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

// While it's not (currently) necessary, add some noise here to push down token
// positions in this file compared to the file regress_34841_lib.dart.
// This is to ensure that any possible tokens in that file are just comments
// (i.e. not actual) positions in this file.

import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'test_helper.dart';
import 'service_test_common.dart';
import 'dart:developer';
import 'regress_34841_lib.dart';

class Bar extends Object with Foo {}

void testFunction() {
  Bar bar = new Bar();
  print(bar.foo);
  debugger();
}

var tests = <IsolateTest>[
  hasStoppedAtBreakpoint,
  (Isolate isolate) async {
    var stack = await isolate.getStack();

    // Make sure we are in the right place.
    expect(stack.type, equals('Stack'));
    expect(stack['frames'].length, greaterThanOrEqualTo(1));
    expect(stack['frames'][0].function.name, equals('testFunction'));

    var root = isolate.rootLibrary;
    await root.load();
    Script script = root.scripts.first;
    await script.load();

    var params = {
      'reports': ['Coverage'],
      'scriptId': script.id,
      'forceCompile': true
    };
    var report = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
    List<dynamic> ranges = report['ranges'];
    List<int> coveragePlaces = <int>[];
    for (var range in ranges) {
      for (int i in range["coverage"]["hits"]) {
        coveragePlaces.add(i);
      }
      for (int i in range["coverage"]["misses"]) {
        coveragePlaces.add(i);
      }
    }

    // Make sure we can translate it all.
    for (int place in coveragePlaces) {
      int line = script.tokenToLine(place);
      int column = script.tokenToCol(place);
      if (line == null || column == null) {
        throw "Token $place translated to $line:$column";
      }
    }
  },
];

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