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

// ignore_for_file: prefer_interpolation_to_compose_strings

import 'package:source_span/source_span.dart';
import 'package:source_span/src/colors.dart' as colors;
import 'package:term_glyph/term_glyph.dart' as glyph;
import 'package:test/test.dart';

void main() {
  bool oldAscii;
  setUpAll(() {
    oldAscii = glyph.ascii;
    glyph.ascii = true;
  });

  tearDownAll(() {
    glyph.ascii = oldAscii;
  });

  SourceFile file;
  setUp(() {
    file = SourceFile.fromString('''
foo bar baz
whiz bang boom
zip zap zop
''');
  });

  test('points to the span in the source', () {
    expect(file.span(4, 7).highlight(), equals("""
  ,
1 | foo bar baz
  |     ^^^
  '"""));
  });

  test('gracefully handles a missing source URL', () {
    final span = SourceFile.fromString('foo bar baz').span(4, 7);
    expect(span.highlight(), equals("""
  ,
1 | foo bar baz
  |     ^^^
  '"""));
  });

  group('highlights a point span', () {
    test('in the middle of a line', () {
      expect(file.location(4).pointSpan().highlight(), equals("""
  ,
1 | foo bar baz
  |     ^
  '"""));
    });

    test('at the beginning of the file', () {
      expect(file.location(0).pointSpan().highlight(), equals("""
  ,
1 | foo bar baz
  | ^
  '"""));
    });

    test('at the beginning of a line', () {
      expect(file.location(12).pointSpan().highlight(), equals("""
  ,
2 | whiz bang boom
  | ^
  '"""));
    });

    test('at the end of a line', () {
      expect(file.location(11).pointSpan().highlight(), equals("""
  ,
1 | foo bar baz
  |            ^
  '"""));
    });

    test('at the end of the file', () {
      expect(file.location(38).pointSpan().highlight(), equals("""
  ,
3 | zip zap zop
  |            ^
  '"""));
    });

    test('after the end of the file', () {
      expect(file.location(39).pointSpan().highlight(), equals("""
  ,
4 | 
  | ^
  '"""));
    });

    test('at the end of the file with no trailing newline', () {
      file = SourceFile.fromString('zip zap zop');
      expect(file.location(10).pointSpan().highlight(), equals("""
  ,
1 | zip zap zop
  |           ^
  '"""));
    });

    test('after the end of the file with no trailing newline', () {
      file = SourceFile.fromString('zip zap zop');
      expect(file.location(11).pointSpan().highlight(), equals("""
  ,
1 | zip zap zop
  |            ^
  '"""));
    });

    test('in an empty file', () {
      expect(SourceFile.fromString('').location(0).pointSpan().highlight(),
          equals("""
  ,
1 | 
  | ^
  '"""));
    });

    test('on an empty line', () {
      final file = SourceFile.fromString('foo\n\nbar');
      expect(file.location(4).pointSpan().highlight(), equals("""
  ,
2 | 
  | ^
  '"""));
    });
  });

  test('highlights a single-line file without a newline', () {
    expect(SourceFile.fromString('foo bar').span(0, 7).highlight(), equals("""
  ,
1 | foo bar
  | ^^^^^^^
  '"""));
  });

  test('highlights a single empty line', () {
    expect(
        SourceFile.fromString('foo\n\nbar').span(4, 5).highlight(), equals("""
  ,
2 | 
  | ^
  '"""));
  });

  group('with a multiline span', () {
    test('highlights the middle of the first and last lines', () {
      expect(file.span(4, 34).highlight(), equals("""
  ,
1 |   foo bar baz
  | ,-----^
2 | | whiz bang boom
3 | | zip zap zop
  | '-------^
  '"""));
    });

    test('works when it begins at the end of a line', () {
      expect(file.span(11, 34).highlight(), equals("""
  ,
1 |   foo bar baz
  | ,------------^
2 | | whiz bang boom
3 | | zip zap zop
  | '-------^
  '"""));
    });

    test('works when it ends at the beginning of a line', () {
      expect(file.span(4, 28).highlight(), equals("""
  ,
1 |   foo bar baz
  | ,-----^
2 | | whiz bang boom
3 | | zip zap zop
  | '-^
  '"""));
    });

    test('highlights the full first line', () {
      expect(file.span(0, 34).highlight(), equals("""
  ,
1 | / foo bar baz
2 | | whiz bang boom
3 | | zip zap zop
  | '-------^
  '"""));
    });

    test("highlights the full first line even if it's indented", () {
      final file = SourceFile.fromString('''
  foo bar baz
  whiz bang boom
  zip zap zop
''');

      expect(file.span(2, 38).highlight(), equals("""
  ,
1 | /   foo bar baz
2 | |   whiz bang boom
3 | |   zip zap zop
  | '-------^
  '"""));
    });

    test("highlights the full first line if it's empty", () {
      final file = SourceFile.fromString('''
foo

bar
''');

      expect(file.span(4, 9).highlight(), equals("""
  ,
2 | / 
3 | \\ bar
  '"""));
    });

    test('highlights the full last line', () {
      expect(file.span(4, 27).highlight(), equals("""
  ,
1 |   foo bar baz
  | ,-----^
2 | \\ whiz bang boom
  '"""));
    });

    test('highlights the full last line with no trailing newline', () {
      expect(file.span(4, 26).highlight(), equals("""
  ,
1 |   foo bar baz
  | ,-----^
2 | \\ whiz bang boom
  '"""));
    });

    test('highlights the full last line with a trailing Windows newline', () {
      final file = SourceFile.fromString('''
foo bar baz\r
whiz bang boom\r
zip zap zop\r
''');

      expect(file.span(4, 29).highlight(), equals("""
  ,
1 |   foo bar baz
  | ,-----^
2 | \\ whiz bang boom
  '"""));
    });

    test('highlights the full last line at the end of the file', () {
      expect(file.span(4, 39).highlight(), equals("""
  ,
1 |   foo bar baz
  | ,-----^
2 | | whiz bang boom
3 | \\ zip zap zop
  '"""));
    });

    test(
        'highlights the full last line at the end of the file with no trailing '
        'newline', () {
      final file = SourceFile.fromString('''
foo bar baz
whiz bang boom
zip zap zop''');

      expect(file.span(4, 38).highlight(), equals("""
  ,
1 |   foo bar baz
  | ,-----^
2 | | whiz bang boom
3 | \\ zip zap zop
  '"""));
    });

    test("highlights the full last line if it's empty", () {
      final file = SourceFile.fromString('''
foo

bar
''');

      expect(file.span(0, 5).highlight(), equals("""
  ,
1 | / foo
2 | \\ 
  '"""));
    });

    test('highlights multiple empty lines', () {
      final file = SourceFile.fromString('foo\n\n\n\nbar');
      expect(file.span(4, 7).highlight(), equals("""
  ,
2 | / 
3 | | 
4 | \\ 
  '"""));
    });

    // Regression test for #32
    test('highlights the end of a line and an empty line', () {
      final file = SourceFile.fromString('foo\n\n');
      expect(file.span(3, 5).highlight(), equals("""
  ,
1 |   foo
  | ,----^
2 | \\ 
  '"""));
    });
  });

  group('prints tabs as spaces', () {
    group('in a single-line span', () {
      test('before the highlighted section', () {
        final span = SourceFile.fromString('foo\tbar baz').span(4, 7);

        expect(span.highlight(), equals("""
  ,
1 | foo    bar baz
  |        ^^^
  '"""));
      });

      test('within the highlighted section', () {
        final span = SourceFile.fromString('foo bar\tbaz bang').span(4, 11);

        expect(span.highlight(), equals("""
  ,
1 | foo bar    baz bang
  |     ^^^^^^^^^^
  '"""));
      });

      test('after the highlighted section', () {
        final span = SourceFile.fromString('foo bar\tbaz').span(4, 7);

        expect(span.highlight(), equals("""
  ,
1 | foo bar    baz
  |     ^^^
  '"""));
      });
    });

    group('in a multi-line span', () {
      test('before the highlighted section', () {
        final span = SourceFile.fromString('''
foo\tbar baz
whiz bang boom
''').span(4, 21);

        expect(span.highlight(), equals("""
  ,
1 |   foo    bar baz
  | ,--------^
2 | | whiz bang boom
  | '---------^
  '"""));
      });

      test('within the first highlighted line', () {
        final span = SourceFile.fromString('''
foo bar\tbaz
whiz bang boom
''').span(4, 21);

        expect(span.highlight(), equals("""
  ,
1 |   foo bar    baz
  | ,-----^
2 | | whiz bang boom
  | '---------^
  '"""));
      });

      test('within a middle highlighted line', () {
        final span = SourceFile.fromString('''
foo bar baz
whiz\tbang boom
zip zap zop
''').span(4, 34);

        expect(span.highlight(), equals("""
  ,
1 |   foo bar baz
  | ,-----^
2 | | whiz    bang boom
3 | | zip zap zop
  | '-------^
  '"""));
      });

      test('within the last highlighted line', () {
        final span = SourceFile.fromString('''
foo bar baz
whiz\tbang boom
''').span(4, 21);

        expect(span.highlight(), equals("""
  ,
1 |   foo bar baz
  | ,-----^
2 | | whiz    bang boom
  | '------------^
  '"""));
      });

      test('after the highlighted section', () {
        final span = SourceFile.fromString('''
foo bar baz
whiz bang\tboom
''').span(4, 21);

        expect(span.highlight(), equals("""
  ,
1 |   foo bar baz
  | ,-----^
2 | | whiz bang    boom
  | '---------^
  '"""));
      });
    });
  });

  group('supports lines of preceding and following context for a span', () {
    test('within a single line', () {
      final span = SourceSpanWithContext(
          SourceLocation(20, line: 2, column: 5, sourceUrl: 'foo.dart'),
          SourceLocation(27, line: 2, column: 12, sourceUrl: 'foo.dart'),
          'foo bar',
          'previous\nlines\n-----foo bar-----\nfollowing line\n');

      expect(span.highlight(), equals("""
  ,
1 | previous
2 | lines
3 | -----foo bar-----
  |      ^^^^^^^
4 | following line
  '"""));
    });

    test('covering a full line', () {
      final span = SourceSpanWithContext(
          SourceLocation(15, line: 2, column: 0, sourceUrl: 'foo.dart'),
          SourceLocation(33, line: 3, column: 0, sourceUrl: 'foo.dart'),
          '-----foo bar-----\n',
          'previous\nlines\n-----foo bar-----\nfollowing line\n');

      expect(span.highlight(), equals("""
  ,
1 | previous
2 | lines
3 | -----foo bar-----
  | ^^^^^^^^^^^^^^^^^
4 | following line
  '"""));
    });

    test('covering multiple full lines', () {
      final span = SourceSpanWithContext(
          SourceLocation(15, line: 2, column: 0, sourceUrl: 'foo.dart'),
          SourceLocation(23, line: 4, column: 0, sourceUrl: 'foo.dart'),
          'foo\nbar\n',
          'previous\nlines\nfoo\nbar\nfollowing line\n');

      expect(span.highlight(), equals("""
  ,
1 |   previous
2 |   lines
3 | / foo
4 | \\ bar
5 |   following line
  '"""));
    });
  });

  group('colors', () {
    test("doesn't colorize if color is false", () {
      expect(file.span(4, 7).highlight(color: false), equals("""
  ,
1 | foo bar baz
  |     ^^^
  '"""));
    });

    test('colorizes if color is true', () {
      expect(file.span(4, 7).highlight(color: true), equals('''
${colors.blue}  ,${colors.none}
${colors.blue}1 |${colors.none} foo ${colors.red}bar${colors.none} baz
${colors.blue}  |${colors.none}     ${colors.red}^^^${colors.none}
${colors.blue}  '${colors.none}'''));
    });

    test("uses the given color if it's passed", () {
      expect(file.span(4, 7).highlight(color: colors.yellow), equals('''
${colors.blue}  ,${colors.none}
${colors.blue}1 |${colors.none} foo ${colors.yellow}bar${colors.none} baz
${colors.blue}  |${colors.none}     ${colors.yellow}^^^${colors.none}
${colors.blue}  '${colors.none}'''));
    });

    test('colorizes a multiline span', () {
      expect(file.span(4, 34).highlight(color: true), equals('''
${colors.blue}  ,${colors.none}
${colors.blue}1 |${colors.none}   foo ${colors.red}bar baz${colors.none}
${colors.blue}  |${colors.none} ${colors.red},-----^${colors.none}
${colors.blue}2 |${colors.none} ${colors.red}| whiz bang boom${colors.none}
${colors.blue}3 |${colors.none} ${colors.red}| zip zap${colors.none} zop
${colors.blue}  |${colors.none} ${colors.red}'-------^${colors.none}
${colors.blue}  '${colors.none}'''));
    });

    test('colorizes a multiline span that highlights full lines', () {
      expect(file.span(0, 39).highlight(color: true), equals('''
${colors.blue}  ,${colors.none}
${colors.blue}1 |${colors.none} ${colors.red}/ foo bar baz${colors.none}
${colors.blue}2 |${colors.none} ${colors.red}| whiz bang boom${colors.none}
${colors.blue}3 |${colors.none} ${colors.red}\\ zip zap zop${colors.none}
${colors.blue}  '${colors.none}'''));
    });
  });

  group('line numbers have appropriate padding', () {
    test('with line number 9', () {
      expect(
          SourceFile.fromString('\n' * 8 + 'foo bar baz\n')
              .span(8, 11)
              .highlight(),
          equals("""
  ,
9 | foo bar baz
  | ^^^
  '"""));
    });

    test('with line number 10', () {
      expect(
          SourceFile.fromString('\n' * 9 + 'foo bar baz\n')
              .span(9, 12)
              .highlight(),
          equals("""
   ,
10 | foo bar baz
   | ^^^
   '"""));
    });
  });
}
