// Copyright 2017-2020 The Verible Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "common/analysis/lint_rule_status.h"

#include <sstream>  // IWYU pragma: keep  // for ostringstream
#include <string>
#include <vector>

#include "absl/strings/str_split.h"
#include "absl/strings/string_view.h"
#include "common/text/concrete_syntax_tree.h"
#include "common/text/token_info.h"
#include "common/text/tree_builder_test_util.h"
#include "gtest/gtest.h"

namespace verible {
namespace {

// Tests initialization of LintRuleStatus.
TEST(LintRuleStatusTest, Construction) {
  std::set<LintViolation> violations;
  LintRuleStatus status(violations, "RULE_NAME", "http://example.com/svstyle");
  EXPECT_TRUE(status.violations.empty());
  EXPECT_EQ(status.lint_rule_name, "RULE_NAME");
  EXPECT_EQ(status.url, "http://example.com/svstyle");
  EXPECT_TRUE(status.isOk());
}

// Tests adding violations to LintRuleStatus.
TEST(LintRuleStatusTest, ConstructWithViolation) {
  const TokenInfo token(1, "1bad-id");
  std::set<LintViolation> violations({LintViolation(token, "invalid id")});
  LintRuleStatus status(violations, "RULE_NAME", "http://example.com/svstyle");
  EXPECT_FALSE(status.violations.empty());
  EXPECT_FALSE(status.isOk());
}

// Tests waiving violations and removing them from LintRuleStatus.
TEST(LintRuleStatusTest, WaiveViolations) {
  const TokenInfo token(1, "1bad-id");
  std::set<LintViolation> violations({LintViolation(token, "invalid id")});
  LintRuleStatus status(violations, "RULE_NAME", "http://example.com/svstyle");
  EXPECT_FALSE(status.violations.empty());
  EXPECT_FALSE(status.isOk());
  // First, waive nothing.
  status.WaiveViolations([](const LintViolation&) { return false; });
  EXPECT_FALSE(status.violations.empty());
  EXPECT_FALSE(status.isOk());
  // Second, waive everything.
  status.WaiveViolations([](const LintViolation&) { return true; });
  EXPECT_TRUE(status.violations.empty());
  EXPECT_TRUE(status.isOk());
}

// Struct for checking expected formatting of a single Lint Violation
// Note that the filename produced by formatter is provided by LintStatusTest,
// which contains this struct.
struct LintViolationTest {
  std::string reason;
  TokenInfo token;
  std::string expected_output;
};

// Struct for checking expected formatting of a LintRuleStatus
// TODO(b/136092807): leverage SynthesizedLexerTestData to produce
// expected findings.
struct LintStatusTest {
  absl::string_view rule_name;
  std::string url;
  absl::string_view path;
  absl::string_view text;
  std::vector<LintViolationTest> violations;
};

void RunLintStatusTest(const LintStatusTest& test) {
  // Dummy tree so we have something for test cases to point at
  SymbolPtr root = Node();

  LintRuleStatus status;
  status.url = test.url;
  status.lint_rule_name = test.rule_name;
  for (const auto& violation_test : test.violations) {
    status.violations.insert(
        LintViolation(violation_test.token, violation_test.reason));
  }

  std::ostringstream ss;

  LintStatusFormatter formatter(test.text);
  formatter.FormatLintRuleStatus(&ss, status, test.text, test.path);
  auto result_parts = absl::StrSplit(ss.str(), '\n');
  auto part_iterator = result_parts.begin();

  for (const auto& violation_test : test.violations) {
    EXPECT_EQ(*part_iterator, violation_test.expected_output);
    part_iterator++;
  }
}

TEST(LintRuleStatusFormatterTest, SimpleOutput) {
  SymbolPtr root = Node();
  static const int dont_care_tag = 0;
  constexpr absl::string_view text(
      "This is some code\n"
      "That you are looking at right now\n"
      "It is nice code, make no mistake\n"
      "Very nice");
  LintStatusTest test = {
      "test-rule",
      "http://foobar",
      "some/path/to/somewhere.fvg",
      text,
      {{"reason1", TokenInfo(dont_care_tag, text.substr(0, 5)),
        "some/path/to/somewhere.fvg:1:1: reason1 http://foobar [test-rule]"},
       {"reason2", TokenInfo(dont_care_tag, text.substr(21, 4)),
        "some/path/to/somewhere.fvg:2:4: reason2 http://foobar [test-rule]"}}};

  RunLintStatusTest(test);
}

TEST(LintRuleStatusFormatterTest, NoOutput) {
  SymbolPtr root = Node();
  LintStatusTest test = {"cool-rule",
                         "http://example.com/svstyle",
                         "some/path/to/somewhere.fvg",
                         "This is some code\n"
                         "That you are looking at right now\n"
                         "It is nice code, make no mistake\n"
                         "Very nice",
                         {}};

  RunLintStatusTest(test);
}

void RunLintStatusesTest(const LintStatusTest& test, bool show_context) {
  // Dummy tree so we have something for test cases to point at
  SymbolPtr root = Node();

  std::vector<LintRuleStatus> statuses;
  LintRuleStatus status0;
  status0.url = test.url;
  status0.lint_rule_name = test.rule_name;

  LintRuleStatus status1;
  status1.url = test.url;
  status1.lint_rule_name = test.rule_name;

  ASSERT_EQ(test.violations.size(), 2);

  // Insert the violations in the wrong order
  status0.violations.insert(
      LintViolation(test.violations[1].token, test.violations[1].reason));

  status1.violations.insert(
      LintViolation(test.violations[0].token, test.violations[0].reason));

  statuses.push_back(status0);
  statuses.push_back(status1);

  std::ostringstream ss;

  LintStatusFormatter formatter(test.text);
  const std::vector<absl::string_view> lines;
  if (!show_context) {
    formatter.FormatLintRuleStatuses(&ss, statuses, test.text, test.path, {});
  } else {
    formatter.FormatLintRuleStatuses(&ss, statuses, test.text, test.path,
                                     absl::StrSplit(test.text, '\n'));
    std::cout << ss.str() << std::endl;
  }
  std::vector<std::string> result_parts;
  if (!show_context) {
    result_parts = absl::StrSplit(ss.str(), '\n');
  } else {
    result_parts = absl::StrSplit(ss.str(), "^\n");
  }

  auto part_iterator = result_parts.begin();

  for (const auto& violation_test : test.violations) {
    EXPECT_EQ(*part_iterator, violation_test.expected_output);
    part_iterator++;
  }
}

TEST(LintRuleStatusFormatterTest, MultipleStatusesSimpleOutput) {
  SymbolPtr root = Node();
  static const int dont_care_tag = 0;
  constexpr absl::string_view text(
      "This is some code\n"
      "That you are looking at right now\n"
      "It is nice code, make no mistake\n"
      "Very nice");
  LintStatusTest test = {
      "test-rule",
      "http://foobar",
      "some/path/to/somewhere.fvg",
      text,
      {{"reason1", TokenInfo(dont_care_tag, text.substr(0, 5)),
        "some/path/to/somewhere.fvg:1:1: reason1 http://foobar [test-rule]"},
       {"reason2", TokenInfo(dont_care_tag, text.substr(21, 4)),
        "some/path/to/somewhere.fvg:2:4: reason2 http://foobar [test-rule]"}}};

  RunLintStatusesTest(test, false);
}

TEST(LintRuleStatusFormatterTestWithContext, MultipleStatusesSimpleOutput) {
  SymbolPtr root = Node();
  static const int dont_care_tag = 0;
  constexpr absl::string_view text(
      "This is some code\n"
      "That you are looking at right now\n"
      "It is nice code, make no mistake\n"
      "Very nice");
  LintStatusTest test = {
      "test-rule",
      "http://foobar",
      "some/path/to/somewhere.fvg",
      text,
      {{"reason1", TokenInfo(dont_care_tag, text.substr(0, 5)),
        "some/path/to/somewhere.fvg:1:1: reason1 http://foobar "
        "[test-rule]\nThis is some code\n"},
       {"reason2", TokenInfo(dont_care_tag, text.substr(21, 4)),
        "some/path/to/somewhere.fvg:2:4: reason2 http://foobar "
        "[test-rule]\nThat you are looking at right now\n   "}}};
  RunLintStatusesTest(test, true);
}

TEST(AutoFixTest, ValidUseCases) {
  //                                       0123456789abcdef
  static constexpr absl::string_view text("This is an image");

  // AutoFix(ReplacementEdit)
  const AutoFix singleEdit({text.substr(5, 2), "isn't"});
  EXPECT_EQ(singleEdit.Apply(text), "This isn't an image");

  const AutoFix singleInsert({text.substr(16, 0), "."});
  EXPECT_EQ(singleInsert.Apply(text), "This is an image.");

  // AutoFix()
  AutoFix fixesCollection;
  EXPECT_TRUE(fixesCollection.AddEdits(singleEdit.Edits()));
  EXPECT_TRUE(fixesCollection.AddEdits(singleInsert.Edits()));
  EXPECT_EQ(fixesCollection.Apply(text), "This isn't an image.");
  EXPECT_TRUE(fixesCollection.AddEdits({{text.substr(0, 0), "Hello. "}}));
  EXPECT_EQ(fixesCollection.Apply(text), "Hello. This isn't an image.");

  static const int dont_care_tag = 0;
  TokenInfo image_token(dont_care_tag, text.substr(11, 5));

  // AutoFix(ReplacementEdit),
  // ReplacementEdit(const TokenInfo&, const std::string&)
  AutoFix otherCollection({image_token, "🖼"});
  EXPECT_TRUE(otherCollection.AddEdits(fixesCollection.Edits()));
  EXPECT_EQ(otherCollection.Apply(text), "Hello. This isn't an 🖼.");

  // AutoFix(std::initializer_list<ReplacementEdit>)
  const AutoFix multipleEdits({
      {text.substr(11, 5), "text"},
      {text.substr(8, 2), "a"},
  });
  EXPECT_EQ(multipleEdits.Apply(text), "This is a text");

  // AutoFix(const AutoFix& other)
  AutoFix copyFix(multipleEdits);
  EXPECT_EQ(copyFix.Apply(text), "This is a text");
  EXPECT_TRUE(copyFix.AddEdits(singleInsert.Edits()));
  EXPECT_EQ(copyFix.Apply(text), "This is a text.");

  // AutoFix(const AutoFix&& other)
  AutoFix moveFix(std::move(copyFix));
  EXPECT_EQ(moveFix.Apply(text), "This is a text.");

  // AutoFix(const std::string&, ReplacementEdit)
  const AutoFix singleInsertWithDescription("Add dot",
                                            {text.substr(16, 0), "."});
  EXPECT_EQ(singleInsertWithDescription.Apply(text), "This is an image.");
  EXPECT_EQ(singleInsertWithDescription.Description(), "Add dot");

  // AutoFix(const std::string&, std::initializer_list<ReplacementEdit>)
  const AutoFix multipleEditsWithDescription("Stop lying",
                                             {
                                                 {text.substr(11, 5), "text"},
                                                 {text.substr(8, 2), "a"},
                                             });
  EXPECT_EQ(multipleEditsWithDescription.Apply(text), "This is a text");
  EXPECT_EQ(multipleEditsWithDescription.Description(), "Stop lying");
}

TEST(AutoFixTest, ConflictingEdits) {
  //                                       0123456789abcdef
  static constexpr absl::string_view text("This is an image");

  AutoFix fixesCollection;
  EXPECT_TRUE(fixesCollection.AddEdits({{text.substr(8, 8), "a text"}}));
  EXPECT_FALSE(fixesCollection.AddEdits({{text.substr(11, 5), "IMAGE"}}));
  EXPECT_FALSE(fixesCollection.AddEdits({{text.substr(8, 1), "A"}}));
  EXPECT_FALSE(fixesCollection.AddEdits({{text.substr(15, 1), "ination"}}));
  EXPECT_EQ(fixesCollection.Apply(text), "This is a text");

  EXPECT_DEATH(AutoFix({{text.substr(8, 8), "a text"},  //
                        {text.substr(11, 5), "IMAGE"}}),
               "Edits must not overlap");

  EXPECT_DEATH(AutoFix({{text.substr(8, 8), "a text"},  //
                        {text.substr(8, 1), "A"}}),
               "Edits must not overlap");

  EXPECT_DEATH(AutoFix({{text.substr(8, 8), "a text"},  //
                        {text.substr(15, 1), "ination"}}),
               "Edits must not overlap");
}

TEST(LintViolationTest, ViolationWithAutoFix) {
  static constexpr absl::string_view text("This is an image");
  static const int dont_care_tag = 0;
  const TokenInfo an_image_token(dont_care_tag, text.substr(8, 5));

  const LintViolation no_fixes(an_image_token, "No, it's not.");
  EXPECT_TRUE(no_fixes.autofixes.empty());

  const LintViolation single_fix(
      an_image_token, "No, it's not.",
      {
          AutoFix("Replace with 'a text'", {an_image_token, "a text"}),
      });
  EXPECT_EQ(single_fix.autofixes.size(), 1);

  const LintViolation multiple_fixes(
      an_image_token, "No, it's not.",
      {
          AutoFix("Replace with 'a text'", {an_image_token, "a text"}),
          AutoFix("Add waiver comment",
                  {text.substr(0, 0), "// verilog_lint: waive no-lying\n"}),
      });
  EXPECT_EQ(multiple_fixes.autofixes.size(), 2);
}

}  // namespace
}  // namespace verible
