| // 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/strings/range.h" |
| |
| #include "common/util/range.h" |
| #include "gmock/gmock.h" |
| #include "gtest/gtest.h" |
| |
| namespace verible { |
| namespace { |
| |
| TEST(MakeStringViewRangeTest, Empty) { |
| absl::string_view text(""); |
| auto copy_view = make_string_view_range(text.begin(), text.end()); |
| EXPECT_TRUE(BoundsEqual(copy_view, text)); |
| } |
| |
| TEST(MakeStringViewRangeTest, NonEmpty) { |
| absl::string_view text("I'm not empty!!!!"); |
| auto copy_view = make_string_view_range(text.begin(), text.end()); |
| EXPECT_TRUE(BoundsEqual(copy_view, text)); |
| } |
| |
| TEST(MakeStringViewRangeTest, BadRange) { |
| absl::string_view text("backwards"); |
| EXPECT_DEATH(make_string_view_range(text.end(), text.begin()), "Malformed"); |
| } |
| |
| typedef std::pair<int, int> IntPair; |
| |
| TEST(ByteOffsetRangeTest, EmptyInEmpty) { |
| const absl::string_view superstring(""); |
| const auto substring = superstring; |
| EXPECT_EQ(SubstringOffsets(substring, superstring), IntPair(0, 0)); |
| } |
| |
| TEST(ByteOffsetRangeTest, RangeInvariant) { |
| const absl::string_view superstring("xxxxxxxx"); |
| for (size_t i = 0; i < superstring.length(); ++i) { |
| for (size_t j = i; j < superstring.length(); ++j) { |
| const auto substring = superstring.substr(i, j - i); |
| EXPECT_EQ(SubstringOffsets(substring, superstring), IntPair(i, j)) |
| << i << ", " << j; |
| } |
| } |
| } |
| |
| // Tests that swapping substring with superstring fails. |
| TEST(ByteOffsetRangeTest, InsideOut) { |
| const absl::string_view superstring("yyyyyyy"); |
| for (size_t i = 0; i < superstring.length(); ++i) { |
| for (size_t j = i; j < superstring.length(); ++j) { |
| const auto substring = superstring.substr(i, j - i); |
| EXPECT_DEATH(SubstringOffsets(superstring, substring), "") |
| << i << ", " << j; |
| } |
| } |
| } |
| |
| TEST(ByteOffsetRangeTest, PartialOverlap) { |
| const absl::string_view superstring("zzzz"); |
| for (size_t i = 0; i < superstring.length(); ++i) { |
| for (size_t j = 1; j < superstring.length(); ++j) { |
| const auto left = superstring.substr(0, i); |
| const auto right = superstring.substr(j); |
| EXPECT_DEATH(SubstringOffsets(left, right), "") << i << ", " << j; |
| } |
| } |
| } |
| |
| } // namespace |
| } // namespace verible |