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

// Tests for LineColumnMap.

#include "common/strings/line_column_map.h"

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

#include "absl/strings/str_split.h"
#include "absl/strings/string_view.h"
#include "gtest/gtest.h"

namespace verible {
namespace {

struct LineColumnTestData {
  LineColumn line_col;
  const char *text;
};

struct LineColumnRangeTestData {
  LineColumnRange range;
  const char *text;
};

struct LineColumnQuery {
  int offset;
  LineColumn line_col;
};

struct LineColumnMapTestData {
  const char *text;
  std::vector<int> expected_offsets;
  std::vector<LineColumnQuery> queries;
};

// Raw line and column are 0-indexed.
const LineColumnMapTestData map_test_data[] = {
    // Also testing beyond the end of the file - it should return last position
    {"", {0}, {{0, {0, 0}}, {1, {0, 0}}, {100, {0, 0}}}},  // empty file
    {"_", {0}, {{0, {0, 0}}, {1, {0, 1}}}},                // no \n before EOF
    {"abc", {0}, {{0, {0, 0}}, {2, {0, 2}}, {3, {0, 3}}}},
    {"\n", {0, 1}, {{0, {0, 0}}, {1, {1, 0}}}},  // one empty line
    {"\n\n", {0, 1, 2}, {{0, {0, 0}}, {1, {1, 0}}, {2, {2, 0}}}},
    {"ab\nc", {0, 3}, {{0, {0, 0}}, {2, {0, 2}}, {3, {1, 0}}, {4, {1, 1}}}},
    {"_\n_\n", {0, 2, 4}, {{0, {0, 0}}, {1, {0, 1}}, {2, {1, 0}}, {3, {1, 1}}}},
    {"\nxx\n", {0, 1, 4}, {{0, {0, 0}}, {1, {1, 0}}, {2, {1, 1}}, {3, {1, 2}}}},
    {"hello\ndarkness\nmy old friend\n",
     {0, 6, 15, 29},
     {{0, {0, 0}}, {10, {1, 4}}, {15, {2, 0}}, {20, {2, 5}}}},
    // Multi-byte characters. Let's use strlen() to count the bytes, the
    // column should accurately point to the character.
    {"😀😀😀", {0}, {{static_cast<int>(2 * strlen("😀")), {0, 2}}}},
    {"Heizölrückstoßabdämpfung",
     {0},
     {{static_cast<int>(strlen("Heizölrückstoß")), {0, 14}}}},
};

// Test test verifies that line-column offset appear to the user correctly.
TEST(LineColumnTextTest, PrintLineColumn) {
  static constexpr LineColumnTestData text_test_data[] = {
      {{0, 0}, "1:1"},
      {{0, 1}, "1:2"},
      {{1, 0}, "2:1"},
      {{10, 8}, "11:9"},
  };
  for (const auto &test_case : text_test_data) {
    std::ostringstream oss;
    oss << test_case.line_col;
    EXPECT_EQ(oss.str(), test_case.text);
  }
}

TEST(LineColumnTextTest, PrintLineColumnRange) {
  static constexpr LineColumnRangeTestData text_test_data[] = {
      {{{0, 0}, {0, 7}}, "1:1-7:"},  // Same line, multiple columns
      {{{0, 1}, {0, 3}}, "1:2-3:"},
      {{{1, 0}, {2, 14}}, "2:1:3:14:"},  // start/end different lines
      {{{10, 8}, {11, 2}}, "11:9:12:2:"},
      {{{10, 8}, {10, 9}}, "11:9:"},  // Single character range
      {{{10, 8}, {10, 8}}, "11:9:"},  // Empty range.
  };
  for (const auto &test_case : text_test_data) {
    std::ostringstream oss;
    oss << test_case.range;
    EXPECT_EQ(oss.str(), test_case.text);
  }
}

// Test offset lookup values by line number.
TEST(LineColumnMapTest, OffsetAtLine) {
  LineColumnMap line_map("hello\n\nworld\n");
  EXPECT_EQ(line_map.OffsetAtLine(0), 0);
  EXPECT_EQ(line_map.OffsetAtLine(1), 6);
  EXPECT_EQ(line_map.OffsetAtLine(2), 7);
  EXPECT_EQ(line_map.OffsetAtLine(3), 13);  // There is no line[3].
}

// This test verifies the offsets where columns are reset to 0,
// which happens after every newline.
TEST(LineColumnMapTest, Offsets) {
  for (const auto &test_case : map_test_data) {
    const LineColumnMap line_map(test_case.text);
    EXPECT_EQ(line_map.GetBeginningOfLineOffsets(), test_case.expected_offsets)
        << "Text: \"" << test_case.text << "\"";
  }
}

// This tests that computing offsets from pre-split lines is consistent
// with the constructor that takes the whole text string.
TEST(LineColumnMapTest, OffsetsFromLines) {
  for (const auto &test_case : map_test_data) {
    const LineColumnMap line_map(test_case.text);
    std::vector<absl::string_view> lines = absl::StrSplit(test_case.text, '\n');
    const LineColumnMap alt_line_map(lines);
    EXPECT_EQ(line_map.GetBeginningOfLineOffsets(),
              alt_line_map.GetBeginningOfLineOffsets())
        << "Text: \"" << test_case.text << "\"";
  }
}

TEST(LineColumnMapTest, EndOffsetNoLines) {
  const std::vector<absl::string_view> lines;
  const LineColumnMap map(lines);
  EXPECT_EQ(map.LastLineOffset(), 0);
}

struct EndOffsetTestCase {
  absl::string_view text;
  int expected_offset;
};

TEST(LineColumnMapTest, EndOffsetVarious) {
  const EndOffsetTestCase kTestCases[] = {
      {"", 0},             // empty text
      {"aaaa", 0},         // missing EOL
      {"aaaa\nbbb", 5},    // missing EOL
      {"\n", 1},           //
      {"aaaa\n", 5},       //
      {"aaaa\nbbb\n", 9},  //
      {"\n\n", 2},
  };
  for (const auto &test : kTestCases) {
    const LineColumnMap map(test.text);
    EXPECT_EQ(map.LastLineOffset(), test.expected_offset) << "text:\n"
                                                          << test.text;
  }
}

// This test verifies the translation from byte-offset to line-column.
TEST(LineColumnMapTest, Lookup) {
  for (const auto &test_case : map_test_data) {
    const LineColumnMap line_map(test_case.text);
    for (const auto &q : test_case.queries) {
      EXPECT_EQ(q.line_col,
                line_map.GetLineColAtOffset(test_case.text, q.offset))
          << "Text: \"" << test_case.text << "\"\n"
          << "Failed testing offset " << q.offset;
    }
  }
}

TEST(LineColumnTest, LineColumnComparison) {
  constexpr LineColumn before_line{.line = 41, .column = 1};
  constexpr LineColumn before_col{.line = 42, .column = 1};
  constexpr LineColumn center{.line = 42, .column = 8};
  constexpr LineColumn after_col{.line = 42, .column = 8};

  EXPECT_LT(before_line, center);
  EXPECT_LT(before_col, center);
  EXPECT_EQ(center, center);
  EXPECT_GE(center, center);
  EXPECT_GE(after_col, center);
}

TEST(LineColumnTest, LineColumnRangeComparison) {
  constexpr LineColumnRange range{{.line = 42, .column = 17},
                                  {.line = 42, .column = 22}};

  constexpr LineColumn before{.line = 42, .column = 16};
  constexpr LineColumn inside_start{.line = 42, .column = 17};
  constexpr LineColumn inside_end{.line = 42, .column = 21};
  constexpr LineColumn outside_after_end{.line = 42, .column = 22};

  EXPECT_FALSE(range.PositionInRange(before));
  EXPECT_TRUE(range.PositionInRange(inside_start));
  EXPECT_TRUE(range.PositionInRange(inside_end));
  EXPECT_FALSE(range.PositionInRange(outside_after_end));
}
}  // namespace
}  // namespace verible
