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

// Unit tests for RebaseStringView

#include "common/strings/rebase.h"

#include <string>

#include "gtest/gtest.h"
#include "absl/base/macros.h"
#include "absl/strings/string_view.h"
#include "common/util/range.h"

namespace verible {
namespace {

// Test that empty string token rebases correctly.
TEST(RebaseStringViewTest, EmptyStringsZeroOffset) {
  const std::string text = "";
  // We want another empty string, but we need to trick too smart compilers
  // to give us a different memory address.
  std::string substr = "foo";
  substr.resize(0);  // Force empty string such as 'text' but memory space
  ASSERT_NE(text.c_str(), substr.c_str()) << "Mismatch in memory assumption";

  absl::string_view text_view(text);
  const absl::string_view substr_view(substr);
  EXPECT_FALSE(BoundsEqual(text_view, substr_view));
  RebaseStringView(&text_view, substr);
  EXPECT_TRUE(BoundsEqual(text_view, substr_view));
}

// Test that non-empty whole-string copy rebases correctly.
TEST(RebaseStringViewTest, IdenticalCopy) {
  const std::string text = "hello";
  const std::string substr = "hello";  // different memory space
  absl::string_view text_view(text);
  const absl::string_view substr_view(substr);
  EXPECT_FALSE(BoundsEqual(text_view, substr_view));
  RebaseStringView(&text_view, substr);
  EXPECT_TRUE(BoundsEqual(text_view, substr_view));
}

// Test that substring mismatch between new and old is checked.
TEST(RebaseStringViewDeathTest, SubstringMismatch) {
  const absl::string_view text = "hell0";
  const absl::string_view substr = "hello";
  absl::string_view text_view(text);
  EXPECT_DEATH(RebaseStringView(&text_view, substr),
               "only valid when the new text referenced matches the old text");
}

TEST(RebaseStringViewDeathTest, SubstringMismatch2) {
  const absl::string_view text = "hello";
  const absl::string_view substr = "Hello";
  absl::string_view text_view(text);
  EXPECT_DEATH(RebaseStringView(&text_view, substr),
               "only valid when the new text referenced matches the old text");
}

// Test that substring in the middle of old string is rebased correctly.
TEST(RebaseStringViewTest, NewSubstringNotAtFront) {
  const absl::string_view text = "hello";
  const absl::string_view new_base = "xxxhelloyyy";
  const absl::string_view new_view(new_base.substr(3, 5));
  absl::string_view text_view(text);
  EXPECT_FALSE(BoundsEqual(text_view, new_view));
  RebaseStringView(&text_view, new_view);
  EXPECT_TRUE(BoundsEqual(text_view, new_view));
}

// Test that substring in the middle of old string is rebased correctly.
TEST(RebaseStringViewTest, UsingCharPointer) {
  const absl::string_view text = "hello";
  const absl::string_view new_base = "xxxhelloyyy";
  const char* new_view = new_base.begin() + 3;
  absl::string_view text_view(text);
  RebaseStringView(&text_view, new_view);  // assume original length
  EXPECT_TRUE(BoundsEqual(text_view, new_base.substr(3, 5)));
}

// Test integration with substr() function rebases correctly.
TEST(RebaseStringViewTest, RelativeToOldBase) {
  const absl::string_view full_text = "xxxxxxhelloyyyyy";
  absl::string_view substr = full_text.substr(6, 5);
  EXPECT_EQ(substr, "hello");
  const absl::string_view new_base = "aahellobbb";
  const absl::string_view new_view(new_base.substr(2, substr.length()));
  RebaseStringView(&substr, new_view);
  EXPECT_TRUE(BoundsEqual(substr, new_view));
}

// Test rebasing into middle of superstring.
TEST(RebaseStringViewTest, MiddleOfSuperstring) {
  const absl::string_view dest_text = "xxxxxxhell0yyyyy";
  const absl::string_view src_text = "ccchell0ddd";
  const int dest_offset = 6;
  absl::string_view src_substr(src_text.substr(3, 5));
  EXPECT_EQ(src_substr, "hell0");
  // src_text[3] lines up with dest_text[6].
  const absl::string_view dest_view(
      dest_text.substr(dest_offset, src_substr.length()));
  RebaseStringView(&src_substr, dest_view);
  EXPECT_TRUE(BoundsEqual(src_substr, dest_view));
}

// Test rebasing into prefix superstring.
TEST(RebaseStringViewTest, PrefixSuperstring) {
  const absl::string_view dest_text = "xxxhell0yyyyyzzzzzzz";
  const absl::string_view src_text = "ccchell0ddd";
  const int dest_offset = 3;
  absl::string_view src_substr = src_text.substr(3, 5);
  EXPECT_EQ(src_substr, "hell0");
  // src_text[3] lines up with dest_text[3].
  const absl::string_view dest_view(
      dest_text.substr(dest_offset, src_substr.length()));
  RebaseStringView(&src_substr, dest_view);
  EXPECT_TRUE(BoundsEqual(src_substr, dest_view));
}

}  // namespace
}  // namespace verible
