// 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:linter/src/analyzer.dart';
import 'package:linter/src/test_utilities/analysis_error_info.dart';
import 'package:test/test.dart';
import 'package:test_descriptor/test_descriptor.dart' as d;

import '../tool/util/formatter.dart';
import 'mocks.dart';

void main() {
  defineTests();
}

void defineTests() {
  group('formatter', () {
    test('pluralize', () {
      expect(pluralize('issue', 0), '0 issues');
      expect(pluralize('issue', 1), '1 issue');
      expect(pluralize('issue', 2), '2 issues');
    });

    group('reporter', () {
      late AnalysisErrorInfo info;
      late StringBuffer out;
      late String sourcePath;
      late ReportFormatter reporter;

      setUp(() async {
        var lineInfo = LineInfo([3, 6, 9]);

        var type = MockErrorType()..displayName = 'test';

        var code = TestErrorCode('mock_code', 'MSG')..type = type;

        await d.dir('project', [
          d.file('foo.dart', '''
var x = 11;
var y = 22;
var z = 33;
'''),
        ]).create();
        sourcePath = '${d.sandbox}/project/foo.dart';
        var source = MockSource(sourcePath);

        var error = AnalysisError.tmp(
            source: source, offset: 10, length: 3, errorCode: code);

        info = AnalysisErrorInfo([error], lineInfo);
        out = StringBuffer();
        reporter = ReportFormatter([info], out)..write();
      });

      test('count', () {
        expect(reporter.errorCount, 1);
      });

      test('write', () {
        expect(out.toString().trim(), '''$sourcePath 3:2 [test] MSG
var z = 33;
 ^^^

files analyzed, 1 issue found.''');
      });

      test('stats', () {
        out.clear();
        ReportFormatter([info], out).write();
        expect(out.toString(), startsWith('''$sourcePath 3:2 [test] MSG
var z = 33;
 ^^^

files analyzed, 1 issue found.
'''));
      });
    });
  });
}
