// Copyright (c) 2019, 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 'dart:math' as math;

import 'package:expect/expect.dart';

import 'package:test_runner/src/static_error.dart';
import 'package:test_runner/src/update_errors.dart';

import 'utils.dart';

// Note: This test file validates how some of the special markers used by the
// test runner are parsed. But this test is also run *by* that same test
// runner, and we don't want it to see the markers inside the string literals
// here as significant, so we obfuscate them using seemingly-pointless string
// escapes here like `\/`.

void main() {
  // Inserts single-front end errors.
  expectUpdate("""
int i = "bad";

int another = "wrong";

int third = "boo";
""", errors: [
    makeError(line: 1, column: 9, length: 5, analyzerError: "some.error"),
    makeError(line: 3, column: 15, length: 7, cfeError: "Bad."),
    makeError(line: 5, column: 13, length: 5, webError: "Web.\nError."),
  ], expected: """
int i = "bad";
/\/      ^^^^^
/\/ [analyzer] some.error

int another = "wrong";
/\/            ^^^^^^^
/\/ [cfe] Bad.

int third = "boo";
/\/          ^^^^^
/\/ [web] Web.
/\/ Error.
""");

  // Inserts errors for multiple front ends.
  expectUpdate("""
int i = "bad";

int another = "wrong";

int third = "boo";

int last = "oops";
""", errors: [
    makeError(line: 1, column: 9, length: 5, analyzerError: "some.error"),
    makeError(line: 1, column: 9, length: 5, cfeError: "Bad."),
    makeError(line: 3, column: 15, length: 7, cfeError: "Another bad."),
    makeError(line: 3, column: 15, length: 7, webError: "Web.\nError."),
    makeError(line: 5, column: 13, length: 5, analyzerError: "third.error"),
    makeError(line: 5, column: 13, length: 5, webError: "Web error."),
    makeError(line: 7, column: 12, length: 6, analyzerError: "last.error"),
    makeError(line: 7, column: 12, length: 6, cfeError: "Final.\nError."),
    makeError(line: 7, column: 12, length: 6, webError: "Web error."),
  ], expected: """
int i = "bad";
/\/      ^^^^^
/\/ [analyzer] some.error
/\/ [cfe] Bad.

int another = "wrong";
/\/            ^^^^^^^
/\/ [cfe] Another bad.
/\/ [web] Web.
/\/ Error.

int third = "boo";
/\/          ^^^^^
/\/ [analyzer] third.error
/\/ [web] Web error.

int last = "oops";
/\/         ^^^^^^
/\/ [analyzer] last.error
/\/ [cfe] Final.
/\/ Error.
/\/ [web] Web error.
""");

  // Removes only analyzer errors.
  expectUpdate("""
int i = "bad";
/\/      ^^^^^
/\/ [analyzer] some.error

int another = "wrong";
/\/            ^^^^^^^
/\/ [cfe] Bad.

int third = "boo";
/\/          ^^^^^
/\/ [analyzer] an.error
/\/ [cfe] Wrong.
""", remove: {ErrorSource.analyzer}, expected: """
int i = "bad";

int another = "wrong";
/\/            ^^^^^^^
/\/ [cfe] Bad.

int third = "boo";
/\/          ^^^^^
/\/ [cfe] Wrong.
""");

  // Removes only CFE errors.
  expectUpdate("""
int i = "bad";
/\/      ^^^^^
/\/ [analyzer] some.error

int another = "wrong";
/\/            ^^^^^^^
/\/ [cfe] Bad.

int third = "boo";
/\/          ^^^^^
/\/ [analyzer] an.error
/\/ [cfe] Wrong.
""", remove: {ErrorSource.cfe}, expected: """
int i = "bad";
/\/      ^^^^^
/\/ [analyzer] some.error

int another = "wrong";

int third = "boo";
/\/          ^^^^^
/\/ [analyzer] an.error
""");

  // Removes only web errors.
  expectUpdate("""
int i = "bad";
/\/      ^^^^^
/\/ [analyzer] some.error

int another = "wrong";
/\/            ^^^^^^^
/\/ [web] Bad.

int third = "boo";
/\/          ^^^^^
/\/ [cfe] Error.
/\/ [web] Wrong.
""", remove: {ErrorSource.web}, expected: """
int i = "bad";
/\/      ^^^^^
/\/ [analyzer] some.error

int another = "wrong";

int third = "boo";
/\/          ^^^^^
/\/ [cfe] Error.
""");

  // Removes multiple error sources.
  expectUpdate("""
int i = "bad";
/\/      ^^^^^
/\/ [analyzer] some.error
/\/ [cfe] CFE error.

int another = "wrong";
/\/            ^^^^^^^
/\/ [web] Bad.

int third = "boo";
/\/          ^^^^^
/\/ [analyzer] another.error
/\/ [cfe] Error.
/\/ [web] Wrong.
""", remove: {ErrorSource.analyzer, ErrorSource.web}, expected: """
int i = "bad";
/\/      ^^^^^
/\/ [cfe] CFE error.

int another = "wrong";

int third = "boo";
/\/          ^^^^^
/\/ [cfe] Error.
""");

  // Preserves previous error's indentation if possible.
  expectUpdate("""
int i = "bad";
    /\/    ^^
    /\/ [analyzer] previous.error
""", errors: [
    makeError(line: 1, column: 9, length: 5, analyzerError: "updated.error"),
    makeError(
        line: 1, column: 9, length: 5, cfeError: "Long.\nError.\nMessage."),
  ], expected: """
int i = "bad";
    /\/  ^^^^^
    /\/ [analyzer] updated.error
    /\/ [cfe] Long.
    /\/ Error.
    /\/ Message.
""");

  // Uses previous line's indentation if there was no existing error
  // expectation.
  expectUpdate("""
main() {
  int i = "bad";
}
""", errors: [
    makeError(line: 2, column: 11, length: 5, analyzerError: "updated.error"),
  ], expected: """
main() {
  int i = "bad";
  /\/      ^^^^^
  /\/ [analyzer] updated.error
}
""");

  // Discards indentation if it would collide with carets.
  expectUpdate("""
int i = "bad";
        /\/    ^^
        /\/ [analyzer] previous.error

main() {
  int i =
  "bad";
}
""", errors: [
    makeError(line: 1, column: 9, length: 5, cfeError: "Error."),
    makeError(line: 7, column: 3, length: 5, analyzerError: "new.error"),
  ], expected: """
int i = "bad";
/\/      ^^^^^
/\/ [cfe] Error.

main() {
  int i =
  "bad";
/\/^^^^^
/\/ [analyzer] new.error
}
""");

  // Uses an explicit error location if there's no room for the carets.
  expectUpdate("""
int i =
"bad";
    /\/    ^^
    /\/ [analyzer] previous.error

int j =
"bad";
""", errors: [
    makeError(line: 2, column: 1, length: 5, analyzerError: "updated.error"),
    makeError(line: 7, column: 1, length: 5, cfeError: "Error."),
  ], expected: """
int i =
"bad";
/\/ [error column 1, length 5]
/\/ [analyzer] updated.error

int j =
"bad";
/\/ [error column 1, length 5]
/\/ [cfe] Error.
""");

  // Uses length one if there's no length.
  expectUpdate("""
int i = "bad";
""", errors: [makeError(line: 1, column: 9, cfeError: "Error.")], expected: """
int i = "bad";
/\/      ^
/\/ [cfe] Error.
""");

  // Explicit error location handles null length.
  expectUpdate("""
int i =
"bad";
""", errors: [makeError(line: 2, column: 1, cfeError: "Error.")], expected: """
int i =
"bad";
/\/ [error column 1]
/\/ [cfe] Error.
""");

  // Handles shifted line numbers in explicit error locations.
  // Note that the reported line is line 6, but the output is line 3 to take
  // into account the three removed lines.
  expectUpdate("""
main() {
/\/ ^^
/\/ [analyzer] ERROR.CODE
/\/ [cfe] Error.
}
Error here;
""", errors: [
    makeError(line: 6, column: 1, length: 5, analyzerError: "NEW.ERROR"),
    makeError(line: 6, column: 2, length: 3, cfeError: "Error."),
  ], expected: """
main() {
}
Error here;
/\/ [error column 1, length 5]
/\/ [analyzer] NEW.ERROR
/\/ [error column 2, length 3]
/\/ [cfe] Error.
""");

  // Inserts a blank line if a subsequent line comment would become part of the
  // error message.
  expectUpdate("""
int i = "bad";
// Line comment.
""", errors: [
    makeError(line: 1, column: 9, length: 5, cfeError: "Wrong."),
  ], expected: """
int i = "bad";
/\/      ^^^^^
/\/ [cfe] Wrong.

// Line comment.
""");

  // Inserts a blank line if a subsequent line comment would become part of the
  // error message.
  expectUpdate("""
int i = "bad";
// Line comment.
""", errors: [
    makeError(line: 1, column: 9, length: 5, analyzerError: "ERR.CODE"),
  ], expected: """
int i = "bad";
/\/      ^^^^^
/\/ [analyzer] ERR.CODE

// Line comment.
""");

  // Multiple errors on the same line are ordered by column then length.
  expectUpdate("""
someBadCode();
""", errors: [
    makeError(line: 1, column: 9, length: 5, cfeError: "Wrong 1."),
    makeError(line: 1, column: 9, length: 4, cfeError: "Wrong 2."),
    makeError(line: 1, column: 6, length: 3, cfeError: "Wrong 3."),
    makeError(line: 1, column: 5, length: 5, cfeError: "Wrong 4."),
  ], expected: """
someBadCode();
/\/  ^^^^^
/\/ [cfe] Wrong 4.
/\/   ^^^
/\/ [cfe] Wrong 3.
/\/      ^^^^
/\/ [cfe] Wrong 2.
/\/      ^^^^^
/\/ [cfe] Wrong 1.
""");

  // Shared locations between errors with and without length.
  expectUpdate("""
someBadCode(arg);

moreBadCode(arg);
""", errors: [
    makeError(line: 1, column: 13, length: 3, analyzerError: "Error.CODE"),
    makeError(line: 1, column: 13, cfeError: "Wrong 1."),
    makeError(line: 3, column: 13, cfeError: "Wrong 2."),
    makeError(line: 3, column: 13, length: 3, webError: "Web error."),
  ], expected: """
someBadCode(arg);
/\/          ^^^
/\/ [analyzer] Error.CODE
/\/ [cfe] Wrong 1.

moreBadCode(arg);
/\/          ^^^
/\/ [web] Web error.
/\/ [cfe] Wrong 2.
""");

  // Doesn't crash with RangeError.
  expectUpdate("""
x
// [error line 1, column 1, length 0]
// [cfe] Whatever""", errors: [
    makeError(line: 1, column: 1, length: 0, cfeError: "Foo"),
  ], expected: """
x
// [error column 1, length 0]
// [cfe] Foo""");

  contextMessages();
  regression();
}

void contextMessages() {
  // Inserts context messages.
  expectUpdate(
      """
int i = "bad";

int another = "wrong";

int third = "boo";
""",
      errors: [
        makeError(
            line: 3,
            column: 15,
            length: 7,
            analyzerError: "some.error",
            context: [
              makeError(
                  line: 1,
                  column: 9,
                  length: 5,
                  contextError: "Analyzer context."),
              makeError(
                  line: 5,
                  column: 13,
                  length: 5,
                  contextError: "More context."),
            ]),
        makeError(
            line: 3,
            column: 15,
            length: 7,
            cfeError: "CFE error.",
            context: [
              makeError(
                  line: 1, column: 9, length: 5, contextError: "CFE context."),
            ]),
      ],
      remove: {ErrorSource.analyzer},
      includeContext: true,
      expected: """
int i = "bad";
/\/      ^^^^^
/\/ [context 1] Analyzer context.
/\/ [context 2] CFE context.

int another = "wrong";
/\/            ^^^^^^^
/\/ [analyzer 1] some.error
/\/ [cfe 2] CFE error.

int third = "boo";
/\/          ^^^^^
/\/ [context 1] More context.
""");

  // Removes context messages for removed errors.
  expectUpdate(
      """
int i = "bad";
/\/      ^^^^^
/\/ [context 1] Analyzer context.
/\/ [context 2] CFE context.

int another = "wrong";
/\/            ^^^^^^^
/\/ [analyzer 1] some.error
/\/ [cfe 2] CFE error.

int third = "boo";
/\/          ^^^^^
/\/ [context 1] More context.
""",
      remove: {ErrorSource.analyzer},
      includeContext: true,
      expected: """
int i = "bad";
/\/      ^^^^^
/\/ [context 1] CFE context.

int another = "wrong";
/\/            ^^^^^^^
/\/ [cfe 1] CFE error.

int third = "boo";
""");

  // Discards context messages when not told to include them.
  expectUpdate(
      """
int i = "bad";

int another = "wrong";

int third = "boo";
""",
      errors: [
        makeError(
            line: 3,
            column: 15,
            length: 7,
            analyzerError: "some.error",
            context: [
              makeError(
                  line: 1,
                  column: 9,
                  length: 5,
                  contextError: "Analyzer context."),
              makeError(
                  line: 5,
                  column: 13,
                  length: 5,
                  contextError: "More context."),
            ]),
        makeError(
            line: 3,
            column: 15,
            length: 7,
            cfeError: "CFE error.",
            context: [
              makeError(
                  line: 1, column: 9, length: 5, contextError: "CFE context."),
            ]),
      ],
      includeContext: false,
      expected: """
int i = "bad";

int another = "wrong";
/\/            ^^^^^^^
/\/ [analyzer] some.error
/\/ [cfe] CFE error.

int third = "boo";
""");

  // Discards existing context messages when not told to include them.
  expectUpdate(
      """
int i = "bad";
/\/      ^^^^^
/\/ [context 1] CFE context.

int another = "wrong";
/\/            ^^^^^^^
/\/ [cfe 1] CFE error.

int third = "boo";
""",
      errors: [
        makeError(
            line: 5,
            column: 15,
            length: 7,
            analyzerError: "some.error",
            context: [
              makeError(
                  line: 1,
                  column: 9,
                  length: 5,
                  contextError: "Analyzer context."),
              makeError(
                  line: 7,
                  column: 13,
                  length: 5,
                  contextError: "More context."),
            ]),
      ],
      remove: {ErrorSource.analyzer},
      includeContext: false,
      expected: """
int i = "bad";

int another = "wrong";
/\/            ^^^^^^^
/\/ [analyzer] some.error
/\/ [cfe] CFE error.

int third = "boo";
""");
}

void regression() {
  // https://github.com/dart-lang/sdk/issues/37990.
  expectUpdate("""
int get xx => 3;
int get yy => 3;

class A {
  void test() {
    xx = 1;
/\/  ^^^^^^^^^^^^^^
/\/ [cfe] unspecified
/\/  ^^^^^^^^^^^^^^
/\/ [analyzer] unspecified


    yy(4);
/\/  ^^^^^^^^^^^^^^
/\/ [cfe] unspecified
/\/  ^^^^^^^^^^^^^^
/\/ [analyzer] unspecified

  }
}
""", remove: {
    ErrorSource.cfe
  }, errors: [
    makeError(
        line: 6, column: 5, length: 14, cfeError: "Setter not found: 'xx'."),
    makeError(
        line: 16,
        column: 7,
        cfeError: "The method 'call' isn't defined for the class 'int'.")
  ], expected: """
int get xx => 3;
int get yy => 3;

class A {
  void test() {
    xx = 1;
/\/  ^^^^^^^^^^^^^^
/\/ [analyzer] unspecified
/\/ [cfe] Setter not found: 'xx'.


    yy(4);
/\/  ^^^^^^^^^^^^^^
/\/ [analyzer] unspecified
/\/    ^
/\/ [cfe] The method 'call' isn't defined for the class 'int'.

  }
}
""");
}

void expectUpdate(String original,
    {List<StaticError> errors,
    Set<ErrorSource> remove,
    bool includeContext,
    String expected}) {
  errors ??= const [];
  remove ??= ErrorSource.all.toSet();
  includeContext ??= false;

  var actual = updateErrorExpectations(original, errors,
      remove: remove, includeContext: includeContext);
  if (actual != expected) {
    // Not using Expect.equals() because the diffs it shows aren't helpful for
    // strings this large.
    var actualLines = actual.split("\n");
    var expectedLines = expected.split("\n");

    // Figure out which leading lines do match so we can ignore those and
    // highlight the offending ones.
    var matchingActual = <int>{};
    var matchingExpected = <int>{};
    for (var i = 0;
        i < math.min(actualLines.length, expectedLines.length);
        i++) {
      if (actualLines[i] != expectedLines[i]) break;
      matchingActual.add(i);
      matchingExpected.add(i);
    }

    // Find which trailing lines are the same so we can hide those too.
    for (var i = 0;
        i < math.min(actualLines.length, expectedLines.length);
        i++) {
      // Count backwards from the ends of each list.
      var actualIndex = actualLines.length - i - 1;
      var expectedIndex = expectedLines.length - i - 1;
      if (actualLines[actualIndex] != expectedLines[expectedIndex]) break;
      matchingActual.add(actualIndex);
      matchingExpected.add(expectedIndex);
    }

    var buffer = StringBuffer();
    void writeLine(int index, String line, Set<int> matchingLines) {
      // Only show the line if it was different from the expectation.
      if (matchingLines.contains(index)) {
        buffer.writeln("    : $line");
      } else {
        buffer.writeln("${(index + 1).toString().padLeft(4)}: $line");
      }
    }

    buffer.writeln("Output did not match expectation. Expected:");
    for (var i = 0; i < expectedLines.length; i++) {
      writeLine(i, expectedLines[i], matchingExpected);
    }

    buffer.writeln();
    buffer.writeln("Was:");
    for (var i = 0; i < actualLines.length; i++) {
      writeLine(i, actualLines[i], matchingActual);
    }

    Expect.fail(buffer.toString());
  }
}
