// Copyright (c) 2014, 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.

library summary_report;

import "status_file_parser.dart";
import "test_runner.dart";

final summaryReport = new SummaryReport();

class SummaryReport {
  int _total = 0;
  int _skipped = 0;
  int _skippedByDesign = 0;
  int _noCrash = 0;
  int _flakyCrash = 0;
  int _pass = 0;
  int _failOk = 0;
  int _fail = 0;
  int _crash = 0;
  int _timeout = 0;
  int _compileErrorSkip = 0;

  int get total => _total;

  int get skippedOther => _skipped - _skippedByDesign;

  int get bogus => _nonStandardTestCases.length;

  final List<TestCase> _nonStandardTestCases = <TestCase>[];

  void add(TestCase testCase) {
    var expectations = testCase.expectedOutcomes;

    bool containsFail = expectations
        .any((expectation) => expectation.canBeOutcomeOf(Expectation.FAIL));
    bool containsPass = expectations.contains(Expectation.PASS);
    bool containsSkip = expectations
        .any((expectation) => expectation.canBeOutcomeOf(Expectation.SKIP));
    bool containsSkipByDesign =
        expectations.contains(Expectation.SKIP_BY_DESIGN);
    bool containsCrash = expectations.contains(Expectation.CRASH);
    bool containsOK = expectations.contains(Expectation.OK);
    bool containsSlow = expectations.contains(Expectation.SLOW);
    bool containsTimeout = expectations.contains(Expectation.TIMEOUT);

    ++_total;
    if (containsSkip) {
      ++_skipped;
    } else if (containsSkipByDesign) {
      ++_skipped;
      ++_skippedByDesign;
    } else {
      // We don't do if-else below because the buckets should be exclusive.
      // We keep a count around to guarantee that
      int markers = 0;

      // Counts the number of flaky tests.
      if (containsFail && containsPass && !containsCrash && !containsOK) {
        ++_noCrash;
        ++markers;
      }
      if (containsCrash && !containsOK && expectations.length > 1) {
        ++_flakyCrash;
        ++markers;
      }
      if ((containsPass && expectations.length == 1) ||
          (containsPass && containsSlow && expectations.length == 2)) {
        ++_pass;
        ++markers;
      }
      if (containsFail && containsOK) {
        ++_failOk;
        ++markers;
      }
      if ((containsFail && expectations.length == 1) ||
          (containsFail && containsSlow && expectations.length == 2)) {
        ++_fail;
        ++markers;
      }
      if ((containsCrash && expectations.length == 1) ||
          (containsCrash && containsSlow && expectations.length == 2)) {
        ++_crash;
        ++markers;
      }
      if (containsTimeout && expectations.length == 1) {
        ++_timeout;
        ++markers;
      }
      if (markers != 1) {
        _nonStandardTestCases.add(testCase);
      }
    }
  }

  void addCompileErrorSkipTest() {
    _total++;
    _compileErrorSkip++;
  }

  Map<String, int> get values => {
        'total': _total,
        'skippedOther': skippedOther,
        'skippedByDesign': _skippedByDesign,
        'pass': _pass,
        'noCrash': _noCrash,
        'flakyCrash': _flakyCrash,
        'failOk': _failOk,
        'fail': _fail,
        'crash': _crash,
        'timeout': _timeout,
        'compileErrorSkip': _compileErrorSkip,
        'bogus': bogus
      };

  String get report => """Total: $_total tests
 * $_skipped tests will be skipped ($_skippedByDesign skipped by design)
 * $_noCrash tests are expected to be flaky but not crash
 * $_flakyCrash tests are expected to flaky crash
 * $_pass tests are expected to pass
 * $_failOk tests are expected to fail that we won't fix
 * $_fail tests are expected to fail that we should fix
 * $_crash tests are expected to crash that we should fix
 * $_timeout tests are allowed to timeout
 * $_compileErrorSkip tests are skipped on browsers due to compile-time error
 * $bogus could not be categorized or are in multiple categories
""";

  void printReport() {
    if (_total == 0) return;
    print(report);
  }
}
