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

import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
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);
  });

  test('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 = globals.fs.path.join(getFlutterRoot(), 'bin', 'dart');
    final String coverageScript = globals.fs.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%'),
    ]));
  });
}
