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

import 'package:analyzer/error/error.dart';
import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/dart/analysis/results.dart';
import 'package:analyzer_cli/src/ansi.dart' as ansi;
import 'package:analyzer_cli/src/error_formatter.dart';
import 'package:test/test.dart' hide ErrorFormatter;

import 'mocks.dart';

main() {
  group('reporter', () {
    StringBuffer out;
    AnalysisStats stats;
    MockCommandLineOptions options;
    ErrorFormatter reporter;

    setUp(() {
      ansi.runningTests = true;

      out = new StringBuffer();
      stats = new AnalysisStats();

      options = new MockCommandLineOptions();
      options.enableTypeChecks = false;
      options.infosAreFatal = false;
      options.machineFormat = false;
      options.verbose = false;
      options.color = false;

      reporter = new HumanErrorFormatter(out, options, stats);
    });

    tearDown(() {
      ansi.runningTests = false;
    });

    test('error', () {
      ErrorsResultImpl error =
          mockResult(ErrorType.SYNTACTIC_ERROR, ErrorSeverity.ERROR);
      reporter.formatErrors([error]);
      reporter.flush();

      expect(out.toString().trim(),
          'error • MSG at /foo/bar/baz.dart:3:3 • mock_code');
    });

    test('hint', () {
      ErrorsResultImpl error = mockResult(ErrorType.HINT, ErrorSeverity.INFO);
      reporter.formatErrors([error]);
      reporter.flush();

      expect(out.toString().trim(),
          'hint • MSG at /foo/bar/baz.dart:3:3 • mock_code');
    });

    test('stats', () {
      ErrorsResultImpl error = mockResult(ErrorType.HINT, ErrorSeverity.INFO);
      reporter.formatErrors([error]);
      reporter.flush();
      stats.print(out);
      expect(
          out.toString().trim(),
          'hint • MSG at /foo/bar/baz.dart:3:3 • mock_code\n'
          '1 hint found.');
    });
  });
}

ErrorsResultImpl mockResult(ErrorType type, ErrorSeverity severity) {
  // ErrorInfo
  var location = new CharacterLocation(3, 3);
  var lineInfo = new MockLineInfo(defaultLocation: location);

  // Details
  var code = new MockErrorCode(type, severity, 'mock_code');
  var source = new MockSource('/foo/bar/baz.dart');
  var error = new MockAnalysisError(source, code, 20, 'MSG');

  return ErrorsResultImpl(
      null, source.fullName, null, lineInfo, false, [error]);
}
