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

library linter.test.formatter;

import 'package:analyzer/src/generated/error.dart';
import 'package:linter/src/formatter.dart';
import 'package:linter/src/linter.dart';
import 'package:mockito/mockito.dart';
import 'package:unittest/unittest.dart';

import 'mocks.dart';

main() {
  groupSep = ' | ';

  defineTests();
}

defineTests() {
  group('formatter', () {
    test('shorten', () {
      expect(shorten('/foo/bar', '/foo/bar/baz'), '/baz');
    });

    test('pluralize', () {
      expect(pluralize('issue', 0), '0 issues');
      expect(pluralize('issue', 1), '1 issue');
      expect(pluralize('issue', 2), '2 issues');
    });

    group('reporter', () {
      var info = new MockAnalysisErrorInfo();
      var error = new MockAnalysisError();
      var lineInfo = new MockLineInfo();
      var location = new MockLineInfo_Location();
      when(location.columnNumber).thenReturn(3);
      when(location.lineNumber).thenReturn(3);

      when(lineInfo.getLocation(any)).thenReturn(location);
      var code = new MockErrorCode();
      when(code.name).thenReturn('mock_code');
      when(error.errorCode).thenReturn(code);
      var type = new MockErrorType();
      when(type.displayName).thenReturn('test');
      when(code.type).thenReturn(type);
      when(error.message).thenReturn('MSG');
      var source = new MockSource();
      when(source.fullName).thenReturn('/foo/bar/baz.dart');
      when(error.source).thenReturn(source);

      when(info.lineInfo).thenReturn(lineInfo);

      when(info.errors).thenReturn([error]);
      var out = new CollectingSink();

      var reporter =
          new SimpleFormatter([info], null, out, fileCount: 1, elapsedMs: 13);
      reporter.write();

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

      test('write', () {
        expect(
            out.buffer.toString().trim(),
            '''/foo/bar/baz.dart 3:3 [test] MSG

1 file analyzed, 1 issue found, in 13 ms.''');
      });

      test('stats', () {
        out.buffer.clear();
        var reporter = new SimpleFormatter([info], null, out,
            fileCount: 1, showStatistics: true, elapsedMs: 13);
        reporter.write();
        expect(out.buffer.toString(),
            startsWith('''/foo/bar/baz.dart 3:3 [test] MSG

1 file analyzed, 1 issue found, in 13 ms.
-----------------------------------------
mock_code                               1
-----------------------------------------
'''));
      });
    });

    group('reporter', () {
      var info = new MockAnalysisErrorInfo();
      var error = new MockAnalysisError();
      var lineInfo = new MockLineInfo();
      var location = new MockLineInfo_Location();
      when(location.columnNumber).thenReturn(3);
      when(location.lineNumber).thenReturn(3);

      when(lineInfo.getLocation(any)).thenReturn(location);
      var code = new MockErrorCode();
      when(code.errorSeverity).thenReturn(new MockErrorCode());
      when(code.name).thenReturn('MockError');
      when(error.errorCode).thenReturn(code);
      var type = new MockErrorType();
      when(type.displayName).thenReturn('test');
      when(code.type).thenReturn(type);
      when(error.message).thenReturn('MSG');
      var source = new MockSource();
      when(source.fullName).thenReturn('/foo/bar/baz.dart');
      when(error.source).thenReturn(source);
      when(error.length).thenReturn(13);
      when(error.source).thenReturn(source);

      when(info.lineInfo).thenReturn(lineInfo);

      when(info.errors).thenReturn([error]);
      var out = new CollectingSink();

      group('filtered', () {
        var reporter = new SimpleFormatter([info], new _RejectingFilter(), out,
            fileCount: 1, elapsedMs: 13);
        reporter.write();

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

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

        test('write', () {
          expect(out.buffer.toString().trim(),
              '1 file analyzed, 0 issues found (1 filtered), in 13 ms.');
        });
      });

      group('machine-ouptut', () {
        test('write', () {
          out.buffer.clear();
          var reporter = new SimpleFormatter([info], null, out,
              fileCount: 1, machineOutput: true, elapsedMs: 13);
          reporter.write();

          expect(
              out.buffer.toString().trim(),
              '''MockErrorCode|MockErrorType|MockError|/foo/bar/baz.dart|3|3|13|MSG

1 file analyzed, 1 issue found, in 13 ms.''');
        });
      });
    });
  });
}

class _RejectingFilter extends LintFilter {
  @override
  bool filter(AnalysisError lint) => true;
}
