// 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 'dart:io';

/// Produces a per-library coverage summary when fed an lcov file, sorted by
/// increasing code coverage percentage.
///
/// Usage: `dart tool/unit_coverage lcov.info`
void main(List<String> args) {
  if (args.isEmpty || args.length > 1) {
    print('Usage: dart tool/unit_coverage lcov.info');
    return;
  }
  final List<String> lines = File(args.single).readAsLinesSync();
  final List<Coverage> coverages = <Coverage>[];
  Coverage currentCoverage;

  for (final String line in lines) {
    if (line.startsWith('SF:')) {
      final String library = line.split('SF:')[1];
      currentCoverage = Coverage()..library = library;
      coverages.add(currentCoverage);
    }
    if (line.startsWith('DA')) {
      currentCoverage.totalLines += 1;
      if (!line.endsWith(',0')) {
        currentCoverage.testedLines += 1;
      }
    }
    if (line == 'end_of_record') {
      currentCoverage = null;
    }
  }
  coverages.sort((Coverage left, Coverage right) {
    final double leftPercent = left.testedLines / left.totalLines;
    final double rightPercent = right.testedLines / right.totalLines;
    return leftPercent.compareTo(rightPercent);
  });
  for (final Coverage coverage in coverages) {
    final String coveragePercent = (coverage.testedLines / coverage.totalLines * 100).toStringAsFixed(2);
    print('${coverage.library}: $coveragePercent%');
  }
}

class Coverage {
  String library;
  int totalLines = 0;
  int testedLines = 0;
}
