| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/omnibox/browser/inline_autocompletion_util.h" |
| |
| #include <stddef.h> |
| |
| #include "base/strings/utf_string_conversions.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace { |
| |
| TEST(InlineAutocompletionUtilTest, FindAtWordbreak) { |
| // Should find the first wordbreak occurrence. |
| EXPECT_EQ(FindAtWordbreak(base::UTF8ToUTF16("prefixmatch wordbreak_match"), |
| base::UTF8ToUTF16("match")), |
| 22u); |
| |
| // Should return npos when no occurrences exist. |
| EXPECT_EQ(FindAtWordbreak(base::UTF8ToUTF16("prefixmatch"), |
| base::UTF8ToUTF16("match")), |
| std::string::npos); |
| |
| // Should skip occurrences before |search_start|. |
| EXPECT_EQ(FindAtWordbreak(base::UTF8ToUTF16("match match"), |
| base::UTF8ToUTF16("match"), 1), |
| 6u); |
| } |
| |
| TEST(InlineAutocompletionUtilTest, FindWordsSequentiallyAtWordbreak) { |
| using pair = std::pair<size_t, size_t>; |
| |
| // Occurrences must be sequential. |
| EXPECT_THAT(FindWordsSequentiallyAtWordbreak(base::UTF8ToUTF16("a b c"), |
| base::UTF8ToUTF16("a c")), |
| testing::ElementsAre(pair{0, 1}, pair{1, 2}, pair{4, 5})); |
| EXPECT_THAT(FindWordsSequentiallyAtWordbreak(base::UTF8ToUTF16("c b a"), |
| base::UTF8ToUTF16("a b")), |
| testing::ElementsAre()); |
| EXPECT_THAT(FindWordsSequentiallyAtWordbreak(base::UTF8ToUTF16("b a b"), |
| base::UTF8ToUTF16("a b")), |
| testing::ElementsAre(pair{2, 3}, pair{3, 4}, pair{4, 5})); |
| |
| // Occurrences must be at word breaks. |
| EXPECT_THAT(FindWordsSequentiallyAtWordbreak(base::UTF8ToUTF16("a b-c"), |
| base::UTF8ToUTF16("a c")), |
| testing::ElementsAre(pair{0, 1}, pair{1, 2}, pair{4, 5})); |
| EXPECT_THAT(FindWordsSequentiallyAtWordbreak(base::UTF8ToUTF16("a bc"), |
| base::UTF8ToUTF16("a c")), |
| testing::ElementsAre()); |
| EXPECT_THAT(FindWordsSequentiallyAtWordbreak(base::UTF8ToUTF16("a bc c"), |
| base::UTF8ToUTF16("a c")), |
| testing::ElementsAre(pair{0, 1}, pair{1, 2}, pair{5, 6})); |
| |
| // Whitespaces must also match |
| EXPECT_THAT(FindWordsSequentiallyAtWordbreak(base::UTF8ToUTF16("a-c"), |
| base::UTF8ToUTF16("a c")), |
| testing::ElementsAre()); |
| EXPECT_THAT(FindWordsSequentiallyAtWordbreak(base::UTF8ToUTF16("a c"), |
| base::UTF8ToUTF16("a c ")), |
| testing::ElementsAre()); |
| EXPECT_THAT(FindWordsSequentiallyAtWordbreak(base::UTF8ToUTF16("a -c"), |
| base::UTF8ToUTF16("a c")), |
| testing::ElementsAre(pair{0, 1}, pair{1, 2}, pair{3, 4})); |
| EXPECT_THAT(FindWordsSequentiallyAtWordbreak(base::UTF8ToUTF16("a- c"), |
| base::UTF8ToUTF16("a c")), |
| testing::ElementsAre(pair{0, 1}, pair{2, 3}, pair{3, 4})); |
| EXPECT_THAT(FindWordsSequentiallyAtWordbreak(base::UTF8ToUTF16("a c c"), |
| base::UTF8ToUTF16("a c")), |
| testing::ElementsAre()); |
| EXPECT_THAT(FindWordsSequentiallyAtWordbreak(base::UTF8ToUTF16("a c c"), |
| base::UTF8ToUTF16("a c")), |
| testing::ElementsAre(pair{0, 1}, pair{3, 5}, pair{5, 6})); |
| } |
| |
| TEST(InlineAutocompletionUtilTest, TermMatchesToSelections) { |
| // Empty |ranges| in empty |length|. |
| EXPECT_THAT(TermMatchesToSelections(0, {}), testing::ElementsAre()); |
| // Empty |ranges| in non-empty |length|. 12345 -> [12345] |
| EXPECT_THAT(TermMatchesToSelections(5, {}), |
| testing::ElementsAre(gfx::Range{5, 0})); |
| // Single empty range in |ranges|. 12|345 -> [12][345] |
| EXPECT_THAT(TermMatchesToSelections(5, {{2, 2}}), |
| testing::ElementsAre(gfx::Range{5, 2}, gfx::Range{2, 0})); |
| // Multiple empty ranges in |ranges|. 1|2|3|4|5 -> [1234][5] |
| EXPECT_THAT(TermMatchesToSelections(5, {{1, 1}, {2, 2}, {3, 3}, {4, 4}}), |
| testing::ElementsAre(gfx::Range{5, 4}, gfx::Range{4, 0})); |
| // Single range in |ranges|. 12[3]45 -> [12]3[45] |
| EXPECT_THAT(TermMatchesToSelections(5, {{2, 3}}), |
| testing::ElementsAre(gfx::Range{5, 3}, gfx::Range{2, 0})); |
| // Single range in |ranges| spanning all of |length|. [12345] -> 12345| |
| EXPECT_THAT(TermMatchesToSelections(5, {{0, 5}}), |
| testing::ElementsAre(gfx::Range{5, 5})); |
| // Multiple ranges in |ranges|, including adjacent and empty ranges. |
| // 1[23][45]6[7][8]9 -> [1]2345[6]78[9] |
| EXPECT_THAT(TermMatchesToSelections(9, {{1, 3}, {3, 5}, {6, 7}, {7, 8}}), |
| testing::ElementsAre(gfx::Range{9, 8}, gfx::Range{6, 5}, |
| gfx::Range{1, 0})); |
| // |ranges| ending at |length| and starting 0. |
| // [123][45]6[789] -> 12345[6]789| |
| EXPECT_THAT(TermMatchesToSelections(9, {{0, 3}, {3, 5}, {6, 9}}), |
| testing::ElementsAre(gfx::Range{9, 9}, gfx::Range{6, 5})); |
| } |
| |
| } // namespace |