// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart = 2.8

import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:process/process.dart';

import '../src/common.dart';
import 'test_utils.dart';

void main() {
  Directory tempDir;

  setUp(() async {
    tempDir = createResolvedTempDirectorySync('unit_coverage_test.');
  });

  tearDown(() async {
    tryToDelete(tempDir);
  });

  testWithoutContext('Can parse and output summaries for code coverage', () async {
    final File coverageFile = tempDir.childFile('info.lcov')
      ..writeAsStringSync('''
SF:lib/src/artifacts.dart
DA:15,10
DA:17,7
DA:19,7
DA:20,7
DA:22,7
DA:324,10
DA:724,0
DA:727,2
DA:729,3
DA:732,0
DA:737,1
LF:443
LH:292
end_of_record
SF:lib/src/base/common.dart
DA:13,7
DA:14,7
DA:22,7
DA:27,3
DA:28,6
DA:40,7
LF:6
LH:6
end_of_record
''');

    final String dartScript = fileSystem.path.join(getFlutterRoot(), 'bin', 'dart');
    final String coverageScript = fileSystem.path.join(getFlutterRoot(), 'packages', 'flutter_tools', 'tool', 'unit_coverage.dart');
    final ProcessResult result = await const LocalProcessManager().run(<String>[
      dartScript,
      coverageScript,
      coverageFile.path,
    ]);

    // May contain other output if building flutter tool.
    expect(result.stdout.toString().split('\n'), containsAll(<Matcher>[
      contains('lib/src/artifacts.dart: 81.82%'),
      contains('lib/src/base/common.dart: 100.00%'),
    ]));
  });
}
