blob: f9d58c6bf735e8bbe2d3ca1941e1880f9a7e4460 [file] [log] [blame]
// Copyright (c) 2023, 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 'dart:developer';
import 'dart:io';
import 'package:test/test.dart';
import 'package:vm_service/vm_service.dart';
import 'common/service_test_common.dart';
import 'common/test_helper.dart';
// ignore_for_file: dead_code
class Class {
void method() {
print('hit');
}
void missed() {
print('miss');
}
}
void unusedFunction() {
print('miss');
}
void testFunction() {
if (true) {
print('hit');
Class().method();
} else {
print('miss');
unusedFunction();
}
debugger();
}
const ignoreHitsBelowThisLine = 39;
const allHits = [17, 18, 30, 32, 33, 38];
final tests = <IsolateTest>[
hasStoppedAtBreakpoint,
librariesAlreadyCompiledTest(false, [], allHits, [35, 36]),
librariesAlreadyCompiledTest(true, [target], allHits, [35, 36]),
librariesAlreadyCompiledTest(true, [], allHits, [21, 22, 26, 27, 35, 36]),
resumeIsolate,
];
final target = Platform.script.toString();
Future<void> Function(VmService service, IsolateRef isolateRef)
librariesAlreadyCompiledTest(
bool forceCompile,
List<String> librariesAlreadyCompiled,
List<int> expectedHits,
List<int> expectedMisses,
) =>
(VmService service, IsolateRef isolateRef) async {
final isolateId = isolateRef.id!;
final report = await service.getSourceReport(
isolateId,
[SourceReportKind.kCoverage],
forceCompile: forceCompile,
reportLines: true,
librariesAlreadyCompiled: librariesAlreadyCompiled,
);
void addLines(List<int>? lines, Set<int> out) {
for (final line in lines ?? []) {
if (line < ignoreHitsBelowThisLine) {
out.add(line);
}
}
}
final hits = <int>{};
final misses = <int>{};
for (final range in report.ranges!) {
if (report.scripts?[range.scriptIndex!].uri == target) {
addLines(range.coverage?.hits, hits);
addLines(range.coverage?.misses, misses);
}
}
expect(hits, unorderedEquals(expectedHits));
expect(misses, unorderedEquals(expectedMisses));
};
void main([args = const <String>[]]) => runIsolateTests(
args,
tests,
target,
testeeConcurrent: testFunction,
);