88import 'dart:convert' ;
99import 'dart:io' ;
1010
11+ import 'package:coverage/coverage.dart' ;
1112import 'package:path/path.dart' as p;
1213import 'package:test/test.dart' ;
1314import 'package:test_descriptor/test_descriptor.dart' as d;
@@ -20,55 +21,136 @@ void main() {
2021
2122 group ('with the --coverage flag,' , () {
2223 late Directory coverageDirectory;
24+ late d.DirectoryDescriptor packageDirectory;
2325
24- Future <void > validateCoverage (TestProcess test, String coveragePath ) async {
26+ Future <void > validateTest (TestProcess test) async {
2527 expect (test.stdout, emitsThrough (contains ('+1: All tests passed!' )));
2628 await test.shouldExit (0 );
29+ }
30+
31+ Future <Map <String , HitMap >> validateCoverage (
32+ TestProcess test,
33+ String coveragePath,
34+ ) async {
35+ await validateTest (test);
2736
2837 final coverageFile = File (p.join (coverageDirectory.path, coveragePath));
2938 final coverage = await coverageFile.readAsString ();
30- final jsonCoverage = json.decode (coverage);
31- expect (jsonCoverage['coverage' ], isNotEmpty);
39+ final jsonCoverage = json.decode (coverage)['coverage' ] as List <dynamic >;
40+ expect (jsonCoverage, isNotEmpty);
41+
42+ return HitMap .parseJson (jsonCoverage.cast <Map <String , dynamic >>());
3243 }
3344
3445 setUp (() async {
35- await d.file ('test.dart' , '''
36- import 'package:test/test.dart';
37-
38- void main() {
39- test("test 1", () {
40- expect(true, isTrue);
41- });
42- }
43- ''' ).create ();
44-
4546 coverageDirectory = await Directory .systemTemp.createTemp (
4647 'test_coverage' ,
4748 );
49+
50+ packageDirectory = d.dir (d.sandbox, [
51+ d.dir ('lib' , [
52+ d.file ('calculate.dart' , '''
53+ int calculate(int x) {
54+ if (x % 2 == 0) {
55+ return x * 2;
56+ } else {
57+ return x * 3;
58+ }
59+ }
60+ ''' ),
61+ ]),
62+ d.dir ('test' , [
63+ d.file ('test.dart' , '''
64+ import 'package:fake_package/calculate.dart';
65+ import 'package:test/test.dart';
66+
67+ void main() {
68+ test('test 1', () {
69+ expect(calculate(6), 12);
70+ });
71+ }
72+ ''' ),
73+ ]),
74+ d.file ('pubspec.yaml' , '''
75+ name: fake_package
76+ version: 1.0.0
77+ environment:
78+ sdk: ^3.5.0
79+ dev_dependencies:
80+ test: ^1.26.2
81+ ''' ),
82+ ]);
83+ await packageDirectory.create ();
4884 });
4985
5086 tearDown (() async {
5187 await coverageDirectory.delete (recursive: true );
5288 });
5389
5490 test ('gathers coverage for VM tests' , () async {
91+ await (await runPub (['get' ])).shouldExit (0 );
5592 var test = await runTest ([
5693 '--coverage' ,
5794 coverageDirectory.path,
58- 'test.dart' ,
59- ]);
60- await validateCoverage (test, 'test.dart.vm.json' );
95+ 'test/test.dart' ,
96+ ], packageConfig: p.join (d.sandbox, '.dart_tool/package_config.json' ));
97+ final coverage = await validateCoverage (test, 'test/test.dart.vm.json' );
98+ final hitmap = coverage['package:fake_package/calculate.dart' ]! ;
99+ expect (hitmap.lineHits, {1 : 1 , 2 : 2 , 3 : 1 , 5 : 0 });
100+ expect (hitmap.funcHits, isNull);
101+ expect (hitmap.branchHits, isNull);
102+ });
103+
104+ test ('gathers branch coverage for VM tests' , () async {
105+ await (await runPub (['get' ])).shouldExit (0 );
106+ var test = await runTest (
107+ [
108+ '--coverage' ,
109+ coverageDirectory.path,
110+ '--branch-coverage' ,
111+ 'test/test.dart' ,
112+ ],
113+ vmArgs: ['--branch-coverage' ],
114+ packageConfig: p.join (d.sandbox, '.dart_tool/package_config.json' ),
115+ );
116+ final coverage = await validateCoverage (test, 'test/test.dart.vm.json' );
117+ final hitmap = coverage['package:fake_package/calculate.dart' ]! ;
118+ expect (hitmap.lineHits, {1 : 1 , 2 : 2 , 3 : 1 , 5 : 0 });
119+ expect (hitmap.funcHits, isNull);
120+ expect (hitmap.branchHits, {1 : 1 , 2 : 1 , 4 : 0 });
121+ });
122+
123+ test ('gathers lcov coverage for VM tests' , () async {
124+ await (await runPub (['get' ])).shouldExit (0 );
125+ final lcovFile = p.join (coverageDirectory.path, 'lcov.info' );
126+ var test = await runTest ([
127+ '--coverage-path' ,
128+ lcovFile,
129+ 'test/test.dart' ,
130+ ], packageConfig: p.join (d.sandbox, '.dart_tool/package_config.json' ));
131+ await validateTest (test);
132+ expect (File (lcovFile).readAsStringSync (), '''
133+ SF:${p .join (d .sandbox , 'lib' , 'calculate.dart' )}
134+ DA:1,1
135+ DA:2,2
136+ DA:3,1
137+ DA:5,0
138+ LF:4
139+ LH:3
140+ end_of_record
141+ ''' );
61142 });
62143
63144 test ('gathers coverage for Chrome tests' , () async {
145+ await (await runPub (['get' ])).shouldExit (0 );
64146 var test = await runTest ([
65147 '--coverage' ,
66148 coverageDirectory.path,
67- 'test.dart' ,
149+ 'test/test .dart' ,
68150 '-p' ,
69151 'chrome' ,
70- ]);
71- await validateCoverage (test, 'test.dart.chrome.json' );
152+ ], packageConfig : p. join (d.sandbox, '.dart_tool/package_config.json' ) );
153+ await validateCoverage (test, 'test/test .dart.chrome.json' );
72154 });
73155
74156 test (
0 commit comments