| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/omnibox/browser/autocomplete_grouper_sections.h" |
| |
| #include <iterator> |
| #include <memory> |
| |
| #include "base/test/scoped_feature_list.h" |
| #include "components/omnibox/browser/autocomplete_match.h" |
| #include "components/omnibox/browser/omnibox_field_trial.h" |
| #include "components/omnibox/common/omnibox_feature_configs.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "third_party/omnibox_proto/groups.pb.h" |
| |
| namespace { |
| AutocompleteMatch CreateMatch(int relevance, |
| omnibox::GroupId group_id, |
| bool allowed_to_be_default = false) { |
| AutocompleteMatch match; |
| match.relevance = relevance; |
| match.suggestion_group_id = group_id; |
| match.allowed_to_be_default_match = allowed_to_be_default; |
| return match; |
| } |
| |
| void VerifyMatches(const ACMatches& matches, |
| std::vector<int> expected_relevances) { |
| std::vector<int> relevances = {}; |
| std::ranges::transform(matches, std::back_inserter(relevances), |
| [&](const auto& match) { return match.relevance; }); |
| |
| EXPECT_THAT(relevances, testing::ElementsAreArray(expected_relevances)); |
| } |
| |
| void VerifyMatches( |
| const ACMatches& matches, |
| const std::vector<std::pair<int, omnibox::GroupId>>& expected) { |
| std::vector<std::pair<int, omnibox::GroupId>> actual; |
| std::ranges::transform( |
| matches, std::back_inserter(actual), [](const auto& match) { |
| return std::make_pair(match.relevance, |
| match.suggestion_group_id.value()); |
| }); |
| EXPECT_THAT(actual, testing::ElementsAreArray(expected)); |
| } |
| |
| } // namespace |
| |
| // Tests rules for Section. |
| TEST(AutocompleteGrouperSectionsTest, Section) { |
| class TestSection : public Section { |
| public: |
| // Up to 1 item of the following types. |
| explicit TestSection(omnibox::GroupConfigMap& group_configs) |
| : Section( |
| 1, |
| { |
| Group( |
| 1, |
| { |
| {omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS, |
| 1}, |
| }), |
| Group(1, |
| { |
| {omnibox::GROUP_PREVIOUS_SEARCH_RELATED, 1}, |
| }), |
| }, |
| group_configs, |
| omnibox::GroupConfig_SideType_DEFAULT_PRIMARY) {} |
| }; |
| |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| // A `Section` ensures all matches in `Group`s have the same `SideType` as |
| // the `Section`. |
| omnibox::GroupConfig group; |
| group.set_side_type(omnibox::GroupConfig_SideType_SECONDARY); |
| omnibox::GroupConfigMap group_configs{ |
| {omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS, group}}; |
| |
| sections.push_back(std::make_unique<TestSection>(group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| // Given no matches, should return no matches. |
| test({}, {}); |
| |
| // Matches not qualifying for the section should not be added. |
| test({CreateMatch(1, omnibox::GROUP_SEARCH)}, {}); |
| } |
| |
| // Tests rules for Section. |
| TEST(AutocompleteGrouperGroupsTest, Section) { |
| class TestSection : public Section { |
| public: |
| // Up to 2 items of the following types. |
| explicit TestSection(omnibox::GroupConfigMap& group_configs) |
| : Section(2, |
| { |
| Group(1, |
| { |
| {omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX, 1}, |
| }), |
| Group(1, |
| { |
| {omnibox::GROUP_MOBILE_CLIPBOARD, 1}, |
| }), |
| Group(1, |
| { |
| {omnibox::GROUP_MOBILE_MOST_VISITED, 1}, |
| }), |
| Group(1, |
| { |
| {omnibox::GROUP_VISITED_DOC_RELATED, 1}, |
| }), |
| Group(1, |
| { |
| {omnibox::GROUP_RELATED_QUERIES, 1}, |
| }), |
| }, |
| group_configs, |
| omnibox::GroupConfig_SideType_DEFAULT_PRIMARY) {} |
| }; |
| |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back(std::make_unique<TestSection>(group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| { |
| SCOPED_TRACE( |
| "Matches are ranked by the group order and added up to the limits."); |
| test( |
| { |
| CreateMatch(6, omnibox::GROUP_RELATED_QUERIES), |
| CreateMatch(5, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(4, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(3, omnibox::GROUP_MOBILE_CLIPBOARD), |
| CreateMatch(2, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| CreateMatch(1, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| }, |
| {5, 6}); |
| } |
| } |
| |
| // Tests the groups, limits, and rules for the Desktop NTP ZPS section. |
| TEST(AutocompleteGrouperSectionsTest, DesktopNTPZpsSection) { |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back( |
| std::make_unique<DesktopNTPZpsSection>(group_configs, 8u, false)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| { |
| SCOPED_TRACE("Given no matches, should return no matches."); |
| test({}, {}); |
| } |
| { |
| SCOPED_TRACE("Matches that qualify for no groups should not be added."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_DOCUMENT), |
| CreateMatch(99, omnibox::GROUP_SEARCH), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {98}); |
| } |
| { |
| SCOPED_TRACE("Personalized suggestions get precedence over trending ones"); |
| test( |
| { |
| // `GROUP_TRENDS` matches are more relevant but will not be added. |
| CreateMatch(90, omnibox::GROUP_TRENDS), |
| CreateMatch(89, omnibox::GROUP_TRENDS), |
| CreateMatch(88, omnibox::GROUP_TRENDS), |
| CreateMatch(87, omnibox::GROUP_TRENDS), |
| CreateMatch(86, omnibox::GROUP_TRENDS), |
| CreateMatch(85, omnibox::GROUP_TRENDS), |
| CreateMatch(84, omnibox::GROUP_TRENDS), |
| CreateMatch(83, omnibox::GROUP_TRENDS), |
| CreateMatch(82, omnibox::GROUP_TRENDS), |
| CreateMatch(81, omnibox::GROUP_TRENDS), |
| // `GROUP_PERSONALIZED_ZERO_SUGGEST` matches should be added. |
| CreateMatch(80, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(79, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(78, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(77, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(76, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(75, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(74, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(73, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(72, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(71, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| { |
| 80, |
| 79, |
| 78, |
| 77, |
| 76, |
| 75, |
| 74, |
| 73, |
| }); |
| } |
| { |
| SCOPED_TRACE("Matches should be added up to their group limit."); |
| test( |
| { |
| CreateMatch(80, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(79, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(78, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(77, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(76, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(75, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(74, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(73, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(72, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(71, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| { |
| 80, |
| 79, |
| 78, |
| 77, |
| 76, |
| 75, |
| 74, |
| 73, |
| }); |
| } |
| { |
| SCOPED_TRACE("Matches should be added up to the section limit."); |
| test( |
| { |
| // `GROUP_TRENDS` matches should be added up to the remaining |
| // section limit (3). |
| CreateMatch(90, omnibox::GROUP_TRENDS), |
| CreateMatch(89, omnibox::GROUP_TRENDS), |
| CreateMatch(88, omnibox::GROUP_TRENDS), |
| CreateMatch(87, omnibox::GROUP_TRENDS), |
| CreateMatch(86, omnibox::GROUP_TRENDS), |
| CreateMatch(85, omnibox::GROUP_TRENDS), |
| CreateMatch(84, omnibox::GROUP_TRENDS), |
| CreateMatch(83, omnibox::GROUP_TRENDS), |
| CreateMatch(82, omnibox::GROUP_TRENDS), |
| CreateMatch(81, omnibox::GROUP_TRENDS), |
| // `GROUP_PERSONALIZED_ZERO_SUGGEST` matches should all be added. |
| CreateMatch(78, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(77, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(76, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(75, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(74, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| { |
| 78, |
| 77, |
| 76, |
| 75, |
| 74, |
| 90, |
| 89, |
| 88, |
| }); |
| } |
| } |
| |
| // Tests the groups, limits, and rules for the Desktop NTP ZPS section. |
| TEST(AutocompleteGrouperSectionsTest, DesktopNTPZpsSectionWithMIA) { |
| auto test = [](std::vector<std::pair<int, omnibox::GroupId>> input, |
| bool mia_enabled, |
| std::vector<std::pair<int, omnibox::GroupId>> output) { |
| ACMatches in_matches; |
| for (const auto& [relevance, group_id] : input) { |
| in_matches.push_back(CreateMatch(relevance, group_id)); |
| } |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back( |
| std::make_unique<DesktopNTPZpsSection>(group_configs, 8u, mia_enabled)); |
| auto out_matches = Section::GroupMatches(std::move(sections), in_matches); |
| VerifyMatches(out_matches, output); |
| }; |
| |
| { |
| SCOPED_TRACE( |
| "MIA above pSuggest - local history zps takes precedence over Trends."); |
| test( |
| { |
| // `GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA` and |
| // `GROUP_MIA_RECOMMENDATIONS` matches should all be added and |
| // appear first due to their higher relevance scores. |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| // remote `GROUP_PERSONALIZED_ZERO_SUGGEST` should all be added. |
| {86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| // `GROUP_TRENDS` matches should not be added. |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| // local `GROUP_PERSONALIZED_ZERO_SUGGEST` should be added up to the |
| // remaining section limit (2) despite having lower relevance than |
| // `GROUP_TRENDS`. |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }, |
| /*mia_enabled=*/true, |
| { |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }); |
| } |
| { |
| SCOPED_TRACE( |
| "MIA below pSuggest - Local history zps is grouped with pSuggest but " |
| "doesn't take precedence over non-Trends."); |
| test( |
| { |
| // remote `GROUP_PERSONALIZED_ZERO_SUGGEST` should all be added. |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| // `GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA` and |
| // `GROUP_MIA_RECOMMENDATIONS` matches should should all be added |
| // and appear last due to their lower relevance scores. |
| {88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {86, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {85, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| // `GROUP_TRENDS` matches should not be added. |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| // local `GROUP_PERSONALIZED_ZERO_SUGGEST` should be added up to the |
| // remaining section limit (2). |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }, |
| /*mia_enabled=*/true, |
| { |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {86, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {85, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| }); |
| } |
| { |
| SCOPED_TRACE( |
| "MIA and no pSuggest - Local history zps doesn't take precedence over " |
| "non-Trends."); |
| test( |
| { |
| // `GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA` and |
| // `GROUP_MIA_RECOMMENDATIONS` matches should all be added and |
| // appear first due to their higher relevance scores. |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {86, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {85, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {84, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {83, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| // `GROUP_TRENDS` matches should not be added. |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| // local `GROUP_PERSONALIZED_ZERO_SUGGEST` should not be added. |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }, |
| /*mia_enabled=*/true, |
| { |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {86, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {85, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {84, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {83, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| }); |
| } |
| { |
| SCOPED_TRACE( |
| "MIA and no pSuggest - Local history zps added but doesn't take " |
| "precedence over non-Trends."); |
| test( |
| { |
| // `GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA` and |
| // `GROUP_MIA_RECOMMENDATIONS` matches should all be added and |
| // appear first due to their higher relevance scores. |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {86, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {85, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| // `GROUP_TRENDS` matches should not be added. |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| // local `GROUP_PERSONALIZED_ZERO_SUGGEST` should not be added. |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }, |
| /*mia_enabled=*/true, |
| { |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {86, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {85, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }); |
| } |
| { |
| SCOPED_TRACE("MIA is not added if feature is disabled."); |
| test( |
| { |
| // remote `GROUP_PERSONALIZED_ZERO_SUGGEST` should all be added. |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| // `GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA` and |
| // `GROUP_MIA_RECOMMENDATIONS` matches should not be added. |
| {88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {86, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {85, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| // `GROUP_TRENDS` matches should all be added. |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| // local `GROUP_PERSONALIZED_ZERO_SUGGEST` should be added. |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }, |
| /*mia_enabled=*/false, |
| { |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| }); |
| } |
| } |
| |
| TEST(AutocompleteGrouperSectionsTest, AndroidNTPZpsSectionWithMIA) { |
| auto test = [](std::vector<std::pair<int, omnibox::GroupId>> input, |
| bool mia_enabled, bool suppress_psuggest_backfill_with_mia, |
| std::vector<std::pair<int, omnibox::GroupId>> output) { |
| ACMatches in_matches; |
| for (const auto& [relevance, group_id] : input) { |
| in_matches.push_back(CreateMatch(relevance, group_id)); |
| } |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| |
| // Cache the fieldtrial state from the singleton instance: we will be |
| // overriding the state for the purpose of the test, and should revert the |
| // default value right after. |
| auto& mia_zps = const_cast<omnibox_feature_configs::MiaZPS&>( |
| omnibox_feature_configs::MiaZPS::Get()); |
| bool default_suppress_psuggest_backfill_with_mia = |
| mia_zps.suppress_psuggest_backfill_with_mia; |
| mia_zps.suppress_psuggest_backfill_with_mia = |
| suppress_psuggest_backfill_with_mia; |
| |
| sections.push_back( |
| std::make_unique<AndroidNTPZpsSection>(group_configs, mia_enabled)); |
| auto out_matches = Section::GroupMatches(std::move(sections), in_matches); |
| |
| // Restore the backfill state as we can't reset the singleton. |
| mia_zps.suppress_psuggest_backfill_with_mia = |
| default_suppress_psuggest_backfill_with_mia; |
| |
| VerifyMatches(out_matches, output); |
| }; |
| |
| { |
| SCOPED_TRACE( |
| "MIA above pSuggest - local history zps takes precedence over Trends."); |
| test( |
| { |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }, |
| /*mia_enabled=*/true, |
| /*supppress_psuggest_backfill_with_mia=*/false, |
| { |
| // First: MIA |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| // Next: backfill |
| {86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| // Lastly: Inspire Me |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| }); |
| } |
| |
| { |
| SCOPED_TRACE("MIA above pSuggest - local history suppressed."); |
| test( |
| { |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }, |
| /*mia_enabled=*/true, |
| /*supppress_psuggest_backfill_with_mia=*/true, |
| { |
| // First: MIA |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| // No backfill this time |
| // Lastly - Inspire Me |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| }); |
| } |
| |
| { |
| SCOPED_TRACE("PSuggest backfill present with no MIA"); |
| test( |
| { |
| {86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }, |
| /*mia_enabled=*/true, |
| /*supppress_psuggest_backfill_with_mia=*/true, |
| { |
| // Show backfill |
| {86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| // and then Inspire Me |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| }); |
| } |
| } |
| |
| TEST(AutocompleteGrouperSectionsTest, IosNTPZpsSectionWithMIA) { |
| auto test = [](std::vector<std::pair<int, omnibox::GroupId>> input, |
| bool mia_enabled, bool suppress_psuggest_backfill_with_mia, |
| std::vector<std::pair<int, omnibox::GroupId>> output) { |
| ACMatches in_matches; |
| for (const auto& [relevance, group_id] : input) { |
| in_matches.push_back(CreateMatch(relevance, group_id)); |
| } |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| |
| // Cache the fieldtrial state from the singleton instance: we will be |
| // overriding the state for the purpose of the test, and should revert the |
| // default value right after. |
| auto& mia_zps = const_cast<omnibox_feature_configs::MiaZPS&>( |
| omnibox_feature_configs::MiaZPS::Get()); |
| bool default_suppress_psuggest_backfill_with_mia = |
| mia_zps.suppress_psuggest_backfill_with_mia; |
| mia_zps.suppress_psuggest_backfill_with_mia = |
| suppress_psuggest_backfill_with_mia; |
| |
| sections.push_back( |
| std::make_unique<IOSNTPZpsSection>(group_configs, mia_enabled)); |
| auto out_matches = Section::GroupMatches(std::move(sections), in_matches); |
| |
| // Restore the backfill state as we can't reset the singleton. |
| mia_zps.suppress_psuggest_backfill_with_mia = |
| default_suppress_psuggest_backfill_with_mia; |
| |
| VerifyMatches(out_matches, output); |
| }; |
| |
| { |
| SCOPED_TRACE( |
| "MIA above pSuggest - local history zps takes precedence over Trends."); |
| test( |
| { |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }, |
| /*mia_enabled=*/true, |
| /*suppress_psuggest_backfill_with_mia=*/false, |
| { |
| // First: MIA |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| // Next: backfill |
| {86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| // Lastly: Inspire Me |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| }); |
| } |
| |
| { |
| SCOPED_TRACE("MIA above pSuggest - local history suppressed."); |
| test( |
| { |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }, |
| /*mia_enabled=*/true, |
| /*suppress_psuggest_backfill_with_mia=*/true, |
| { |
| // First: MIA |
| {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, |
| {88, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| {87, omnibox::GROUP_MIA_RECOMMENDATIONS}, |
| // No backfill this time |
| // Lastly - Inspire Me |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| }); |
| } |
| |
| { |
| SCOPED_TRACE("PSuggest backfill present with no MIA"); |
| test( |
| { |
| {86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| }, |
| /*mia_enabled=*/true, |
| /*suppress_psuggest_backfill_with_mia=*/true, |
| { |
| // Show backfill |
| {86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {49, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, |
| // and then Inspire Me |
| {84, omnibox::GROUP_TRENDS}, |
| {83, omnibox::GROUP_TRENDS}, |
| {82, omnibox::GROUP_TRENDS}, |
| {81, omnibox::GROUP_TRENDS}, |
| }); |
| } |
| } |
| |
| // Tests the groups, limits, and rules for the Desktop NTP ZPS section. |
| TEST(AutocompleteGrouperSectionsTest, DesktopNTPZpsSection_WithIPH) { |
| base::test::ScopedFeatureList feature_list; |
| feature_list.InitAndEnableFeature(omnibox::kStarterPackIPH); |
| |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back( |
| std::make_unique<DesktopNTPZpsSection>(group_configs, 7u, false)); |
| sections.push_back( |
| std::make_unique<DesktopNTPZpsIPHSection>(group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| { |
| SCOPED_TRACE("Given no matches, should return no matches."); |
| test({}, {}); |
| } |
| { |
| SCOPED_TRACE("Matches that qualify for no groups should not be added."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_DOCUMENT), |
| CreateMatch(99, omnibox::GROUP_SEARCH), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {98}); |
| } |
| { |
| SCOPED_TRACE("Personalized suggestions get precedence over trending ones"); |
| test( |
| { |
| // `GROUP_TRENDS` matches are more relevant but will not be added. |
| CreateMatch(90, omnibox::GROUP_TRENDS), |
| CreateMatch(89, omnibox::GROUP_TRENDS), |
| CreateMatch(88, omnibox::GROUP_TRENDS), |
| CreateMatch(87, omnibox::GROUP_TRENDS), |
| CreateMatch(86, omnibox::GROUP_TRENDS), |
| CreateMatch(85, omnibox::GROUP_TRENDS), |
| CreateMatch(84, omnibox::GROUP_TRENDS), |
| CreateMatch(83, omnibox::GROUP_TRENDS), |
| CreateMatch(82, omnibox::GROUP_TRENDS), |
| CreateMatch(81, omnibox::GROUP_TRENDS), |
| // `GROUP_PERSONALIZED_ZERO_SUGGEST` matches should be added. |
| CreateMatch(80, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(79, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(78, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(77, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(76, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(75, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(74, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(73, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(72, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(71, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| // `GROUP_PREVIOUS_SEARCH_RELATED` matches should not be added. |
| CreateMatch(70, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(69, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(68, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(67, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(66, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(65, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(64, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(63, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(62, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(61, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| // `GROUP_ZERO_SUGGEST_IN_PRODUCT_HELP` suggestions have their |
| // own section, so one should be added. |
| CreateMatch(60, omnibox::GROUP_ZERO_SUGGEST_IN_PRODUCT_HELP), |
| CreateMatch(59, omnibox::GROUP_ZERO_SUGGEST_IN_PRODUCT_HELP), |
| }, |
| { |
| 80, |
| 79, |
| 78, |
| 77, |
| 76, |
| 75, |
| 74, |
| 60, |
| }); |
| } |
| { |
| SCOPED_TRACE("Matches should be added up to their group limit."); |
| test( |
| { |
| CreateMatch(80, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(79, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(78, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(77, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(76, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(75, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(74, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(73, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(72, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(71, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| { |
| 80, |
| 79, |
| 78, |
| 77, |
| 76, |
| 75, |
| 74, |
| }); |
| } |
| { |
| SCOPED_TRACE("Matches should be added up to the section limit."); |
| test( |
| { |
| // `GROUP_TRENDS` matches should be added up to the remaining |
| // section limit (2). |
| CreateMatch(90, omnibox::GROUP_TRENDS), |
| CreateMatch(89, omnibox::GROUP_TRENDS), |
| CreateMatch(88, omnibox::GROUP_TRENDS), |
| CreateMatch(87, omnibox::GROUP_TRENDS), |
| CreateMatch(86, omnibox::GROUP_TRENDS), |
| CreateMatch(85, omnibox::GROUP_TRENDS), |
| CreateMatch(84, omnibox::GROUP_TRENDS), |
| CreateMatch(83, omnibox::GROUP_TRENDS), |
| CreateMatch(82, omnibox::GROUP_TRENDS), |
| CreateMatch(81, omnibox::GROUP_TRENDS), |
| // `GROUP_PERSONALIZED_ZERO_SUGGEST` matches should all be added. |
| CreateMatch(80, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(79, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(78, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(77, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(76, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| // `GROUP_ZERO_SUGGEST_IN_PRODUCT_HELP` should be added up to its |
| // section limit (1). |
| CreateMatch(75, omnibox::GROUP_ZERO_SUGGEST_IN_PRODUCT_HELP), |
| CreateMatch(74, omnibox::GROUP_ZERO_SUGGEST_IN_PRODUCT_HELP), |
| }, |
| { |
| 80, |
| 79, |
| 78, |
| 77, |
| 76, |
| 90, |
| 89, |
| 75, |
| }); |
| } |
| { |
| SCOPED_TRACE( |
| "IPH match should be added regardless of matches in first section."); |
| test( |
| { |
| // `GROUP_PERSONALIZED_ZERO_SUGGEST` matches should all be added. |
| CreateMatch(80, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(77, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(76, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| // `GROUP_ZERO_SUGGEST_IN_PRODUCT_HELP` should be added up to its |
| // section limit even if the first section is not full. (1). |
| CreateMatch(75, omnibox::GROUP_ZERO_SUGGEST_IN_PRODUCT_HELP), |
| CreateMatch(74, omnibox::GROUP_ZERO_SUGGEST_IN_PRODUCT_HELP), |
| }, |
| { |
| 80, |
| 77, |
| 76, |
| 75, |
| }); |
| } |
| } |
| |
| // Tests the groups, limits, and rules for the Desktop non-ZPS section. |
| TEST(AutocompleteGrouperSectionsTest, DesktopNonZpsSection) { |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back(std::make_unique<DesktopNonZpsSection>(group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| { |
| SCOPED_TRACE("Given no matches, should return no matches."); |
| test({}, {}); |
| } |
| |
| { |
| SCOPED_TRACE("Rank groups: default > starter pack > searches > navs."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_SEARCH), |
| CreateMatch(99, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(98, omnibox::GROUP_SEARCH), |
| CreateMatch(96, omnibox::GROUP_SEARCH, true), |
| // Only the 1st default-able suggestion should be ranked 1st. |
| CreateMatch(97, omnibox::GROUP_OTHER_NAVS, true), |
| CreateMatch(95, omnibox::GROUP_STARTER_PACK), |
| }, |
| {96, 95, 100, 98, 99, 97}); |
| } |
| |
| { |
| SCOPED_TRACE("Matches that qualify for no groups, should not be added."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_SEARCH, true), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_MOBILE_CLIPBOARD), |
| }, |
| {100}); |
| } |
| |
| { |
| SCOPED_TRACE( |
| "A match that qualifies for multiple groups, should only be added " |
| "once."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_SEARCH, true), |
| }, |
| {100}); |
| } |
| |
| { |
| SCOPED_TRACE("Show at least 1 search."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(99, omnibox::GROUP_OTHER_NAVS, true), |
| CreateMatch(98, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(97, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(96, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(95, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(94, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(93, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(92, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(91, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(90, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(89, omnibox::GROUP_SEARCH), |
| CreateMatch(88, omnibox::GROUP_SEARCH), |
| CreateMatch(87, omnibox::GROUP_SEARCH), |
| }, |
| {99, 89, 100, 98, 97, 96, 95, 94}); |
| } |
| |
| { |
| SCOPED_TRACE("Show at least 1 search unless there are no searches."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(99, omnibox::GROUP_OTHER_NAVS, true), |
| CreateMatch(98, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(97, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(96, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(95, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(94, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(93, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(92, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(91, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(90, omnibox::GROUP_OTHER_NAVS), |
| }, |
| {99, 100, 98, 97, 96, 95, 94, 93}); |
| } |
| |
| { |
| SCOPED_TRACE( |
| "Show at least 1 search; if the default is a search, that counts too."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(99, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(98, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(97, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(96, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(95, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(94, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(93, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(92, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(91, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(90, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(89, omnibox::GROUP_SEARCH, true), |
| CreateMatch(88, omnibox::GROUP_SEARCH), |
| CreateMatch(87, omnibox::GROUP_SEARCH), |
| }, |
| {89, 100, 99, 98, 97, 96, 95, 94}); |
| } |
| |
| { |
| SCOPED_TRACE("Show at most 8 suggestions."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(99, omnibox::GROUP_SEARCH), |
| CreateMatch(98, omnibox::GROUP_SEARCH, true), |
| CreateMatch(97, omnibox::GROUP_SEARCH), |
| CreateMatch(96, omnibox::GROUP_SEARCH), |
| CreateMatch(95, omnibox::GROUP_SEARCH), |
| CreateMatch(94, omnibox::GROUP_SEARCH), |
| CreateMatch(93, omnibox::GROUP_SEARCH), |
| CreateMatch(92, omnibox::GROUP_SEARCH), |
| CreateMatch(91, omnibox::GROUP_SEARCH), |
| CreateMatch(90, omnibox::GROUP_SEARCH), |
| }, |
| {98, 99, 97, 96, 95, 94, 93, 100}); |
| } |
| |
| { |
| SCOPED_TRACE( |
| "Show at most 8 suggestions; unless there are no navs, then show up to " |
| "10."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_SEARCH), |
| CreateMatch(99, omnibox::GROUP_SEARCH), |
| CreateMatch(98, omnibox::GROUP_SEARCH, true), |
| CreateMatch(97, omnibox::GROUP_SEARCH), |
| CreateMatch(96, omnibox::GROUP_SEARCH), |
| CreateMatch(95, omnibox::GROUP_SEARCH), |
| CreateMatch(94, omnibox::GROUP_SEARCH), |
| CreateMatch(93, omnibox::GROUP_SEARCH), |
| CreateMatch(92, omnibox::GROUP_SEARCH), |
| CreateMatch(91, omnibox::GROUP_SEARCH), |
| CreateMatch(90, omnibox::GROUP_SEARCH), |
| }, |
| {98, 100, 99, 97, 96, 95, 94, 93, 92, 91}); |
| } |
| |
| { |
| SCOPED_TRACE( |
| "Show at most 8 suggestions; unless there are no navs, then show up to " |
| "10, even if there are navs after the 10th suggestion."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_SEARCH), |
| CreateMatch(99, omnibox::GROUP_SEARCH), |
| CreateMatch(98, omnibox::GROUP_SEARCH, true), |
| CreateMatch(97, omnibox::GROUP_SEARCH), |
| CreateMatch(96, omnibox::GROUP_SEARCH), |
| CreateMatch(95, omnibox::GROUP_SEARCH), |
| CreateMatch(94, omnibox::GROUP_SEARCH), |
| CreateMatch(93, omnibox::GROUP_SEARCH), |
| CreateMatch(92, omnibox::GROUP_SEARCH), |
| CreateMatch(91, omnibox::GROUP_SEARCH), |
| CreateMatch(90, omnibox::GROUP_SEARCH), |
| CreateMatch(89, omnibox::GROUP_OTHER_NAVS), |
| }, |
| {98, 100, 99, 97, 96, 95, 94, 93, 92, 91}); |
| } |
| |
| { |
| SCOPED_TRACE( |
| "Show at most 8 suggestions; unless the 10th suggestion is the 1st " |
| "nav, then show up to 9."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_SEARCH), |
| CreateMatch(99, omnibox::GROUP_SEARCH), |
| CreateMatch(98, omnibox::GROUP_SEARCH, true), |
| CreateMatch(97, omnibox::GROUP_SEARCH), |
| CreateMatch(96, omnibox::GROUP_SEARCH), |
| CreateMatch(95, omnibox::GROUP_SEARCH), |
| CreateMatch(94, omnibox::GROUP_SEARCH), |
| CreateMatch(93, omnibox::GROUP_SEARCH), |
| CreateMatch(92, omnibox::GROUP_SEARCH), |
| CreateMatch(91, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(90, omnibox::GROUP_SEARCH), |
| }, |
| {98, 100, 99, 97, 96, 95, 94, 93, 92}); |
| } |
| |
| { |
| SCOPED_TRACE( |
| "Show at most 8 suggestions if the 9th suggestion is the 1st nav."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_SEARCH), |
| CreateMatch(99, omnibox::GROUP_SEARCH), |
| CreateMatch(98, omnibox::GROUP_SEARCH, true), |
| CreateMatch(97, omnibox::GROUP_SEARCH), |
| CreateMatch(96, omnibox::GROUP_SEARCH), |
| CreateMatch(95, omnibox::GROUP_SEARCH), |
| CreateMatch(94, omnibox::GROUP_SEARCH), |
| CreateMatch(93, omnibox::GROUP_SEARCH), |
| CreateMatch(92, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(91, omnibox::GROUP_SEARCH), |
| CreateMatch(90, omnibox::GROUP_SEARCH), |
| }, |
| {98, 100, 99, 97, 96, 95, 94, 93}); |
| } |
| |
| { |
| SCOPED_TRACE( |
| "Show at most 8 suggestions if the default suggestion is a nav."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_OTHER_NAVS, true), |
| CreateMatch(99, omnibox::GROUP_SEARCH), |
| CreateMatch(98, omnibox::GROUP_SEARCH), |
| CreateMatch(97, omnibox::GROUP_SEARCH), |
| CreateMatch(96, omnibox::GROUP_SEARCH), |
| CreateMatch(95, omnibox::GROUP_SEARCH), |
| CreateMatch(94, omnibox::GROUP_SEARCH), |
| CreateMatch(93, omnibox::GROUP_SEARCH), |
| CreateMatch(92, omnibox::GROUP_SEARCH), |
| CreateMatch(91, omnibox::GROUP_SEARCH), |
| CreateMatch(90, omnibox::GROUP_SEARCH), |
| }, |
| {100, 99, 98, 97, 96, 95, 94, 93}); |
| } |
| |
| { |
| SCOPED_TRACE("Show at most 1 default."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_OTHER_NAVS, true), |
| CreateMatch(99, omnibox::GROUP_OTHER_NAVS, true), |
| CreateMatch(98, omnibox::GROUP_OTHER_NAVS, true), |
| CreateMatch(97, omnibox::GROUP_STARTER_PACK, true), |
| CreateMatch(96, omnibox::GROUP_SEARCH, true), |
| CreateMatch(95, omnibox::GROUP_SEARCH, true), |
| }, |
| {100, 97, 96, 95, 99, 98}); |
| } |
| |
| { |
| SCOPED_TRACE("Group history clusters with searches."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_SEARCH, true), |
| CreateMatch(99, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(98, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(97, omnibox::GROUP_SEARCH), |
| CreateMatch(96, omnibox::GROUP_HISTORY_CLUSTER), |
| CreateMatch(95, omnibox::GROUP_SEARCH), |
| }, |
| {100, 97, 96, 95, 99, 98}); |
| } |
| |
| { |
| SCOPED_TRACE("Show at most 1 history cluster."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_SEARCH, true), |
| CreateMatch(99, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(98, omnibox::GROUP_OTHER_NAVS), |
| CreateMatch(97, omnibox::GROUP_SEARCH), |
| CreateMatch(96, omnibox::GROUP_HISTORY_CLUSTER), |
| CreateMatch(95, omnibox::GROUP_HISTORY_CLUSTER), |
| CreateMatch(94, omnibox::GROUP_SEARCH), |
| }, |
| {100, 97, 96, 94, 99, 98}); |
| } |
| |
| { |
| SCOPED_TRACE("History cluster should count against search limit."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_SEARCH, true), |
| CreateMatch(99, omnibox::GROUP_SEARCH), |
| CreateMatch(98, omnibox::GROUP_SEARCH), |
| CreateMatch(97, omnibox::GROUP_SEARCH), |
| CreateMatch(96, omnibox::GROUP_HISTORY_CLUSTER), |
| CreateMatch(95, omnibox::GROUP_SEARCH), |
| CreateMatch(94, omnibox::GROUP_SEARCH), |
| CreateMatch(93, omnibox::GROUP_SEARCH), |
| CreateMatch(92, omnibox::GROUP_SEARCH), |
| CreateMatch(91, omnibox::GROUP_SEARCH), |
| CreateMatch(90, omnibox::GROUP_SEARCH), |
| CreateMatch(89, omnibox::GROUP_SEARCH), |
| CreateMatch(88, omnibox::GROUP_SEARCH), |
| CreateMatch(87, omnibox::GROUP_SEARCH), |
| CreateMatch(86, omnibox::GROUP_SEARCH), |
| CreateMatch(85, omnibox::GROUP_SEARCH), |
| CreateMatch(84, omnibox::GROUP_SEARCH), |
| CreateMatch(83, omnibox::GROUP_SEARCH), |
| }, |
| {100, 99, 98, 97, 96, 95, 94, 93, 92, 91}); |
| } |
| } |
| |
| // Tests the groups, limits, and rules for the Android SRP ZPS section. |
| TEST(AutocompleteGrouperSectionsTest, AndroidSRPZpsSection) { |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back(std::make_unique<AndroidSRPZpsSection>(group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| { |
| SCOPED_TRACE("Given no matches, should return no matches."); |
| test({}, {}); |
| } |
| { |
| SCOPED_TRACE("Android/ZPS with extra searches."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86}); |
| } |
| { |
| SCOPED_TRACE("Android/ZPS with Clipboard entries."); |
| // Verify that up to one Clipboard suggestion is retained on top. |
| test( |
| { |
| CreateMatch(200, omnibox::GROUP_MOBILE_CLIPBOARD), |
| CreateMatch(199, omnibox::GROUP_MOBILE_CLIPBOARD), |
| CreateMatch(198, omnibox::GROUP_MOBILE_CLIPBOARD), |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {200, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87}); |
| } |
| { |
| SCOPED_TRACE("Android/ZPS with Search Ready Omnibox."); |
| // Verify that up to one SRO suggestion is retained on top. |
| test( |
| { |
| CreateMatch(200, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| CreateMatch(199, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| CreateMatch(198, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {200, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87}); |
| } |
| { |
| SCOPED_TRACE("Android/ZPS on SRP with recent searches only."); |
| // Verify that recent searches are shown up to the section limit. |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86}); |
| } |
| { |
| SCOPED_TRACE("Android/ZPS with MV Tiles."); |
| // Verify that the MV suggestions are not allowed. |
| test( |
| { |
| CreateMatch(300, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(299, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(298, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86}); |
| } |
| { |
| SCOPED_TRACE("Android/ZPS with multiple auxiliary suggestions."); |
| test( |
| { |
| // Up to one SRO should be shown first. |
| CreateMatch(300, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| CreateMatch(299, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| // Up to one Clipboard should be shown after SRO. |
| CreateMatch(298, omnibox::GROUP_MOBILE_CLIPBOARD), |
| CreateMatch(297, omnibox::GROUP_MOBILE_CLIPBOARD), |
| // MV Tiles are not allowed. |
| CreateMatch(296, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(295, omnibox::GROUP_MOBILE_MOST_VISITED), |
| // Previous Search Related and recent searches should be shown up to |
| // the remaining section limit. |
| CreateMatch(100, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(99, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(98, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(97, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(96, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(95, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(94, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(93, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {300, 298, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88}); |
| } |
| } |
| |
| // Tests the groups, limits, and rules for the Android Web ZPS section. |
| TEST(AutocompleteGrouperSectionsTest, AndroidWebZpsSection) { |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back(std::make_unique<AndroidWebZpsSection>(group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| { |
| SCOPED_TRACE("Given no matches, should return no matches."); |
| test({}, {}); |
| } |
| { |
| SCOPED_TRACE("Android/ZPS with extra searches."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86}); |
| } |
| { |
| SCOPED_TRACE("Android/ZPS with Clipboard entries."); |
| // Verify that up to one Clipboard suggestion is retained on top. |
| test( |
| { |
| CreateMatch(200, omnibox::GROUP_MOBILE_CLIPBOARD), |
| CreateMatch(199, omnibox::GROUP_MOBILE_CLIPBOARD), |
| CreateMatch(198, omnibox::GROUP_MOBILE_CLIPBOARD), |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {200, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87}); |
| } |
| { |
| SCOPED_TRACE("Android/ZPS with Search Ready Omnibox."); |
| // Verify that up to one SRO suggestion is retained on top. |
| test( |
| { |
| CreateMatch(200, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| CreateMatch(199, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| CreateMatch(198, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {200, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87}); |
| } |
| { |
| SCOPED_TRACE("Android/ZPS with MV Tiles."); |
| // Verify that the MV suggestions are retained on top. |
| test( |
| { |
| // Slotted in horizontal render group, taking up 1 row. |
| CreateMatch(300, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(299, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(298, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {300, 299, 298, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, |
| 87}); |
| } |
| { |
| SCOPED_TRACE("Android/ZPS with multiple auxiliary suggestions."); |
| test( |
| { |
| // Up to one SRO should be shown first. |
| CreateMatch(300, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| CreateMatch(299, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| // Up to one Clipboard should be shown after SRO. |
| CreateMatch(298, omnibox::GROUP_MOBILE_CLIPBOARD), |
| CreateMatch(297, omnibox::GROUP_MOBILE_CLIPBOARD), |
| CreateMatch(297, omnibox::GROUP_MOBILE_CLIPBOARD), |
| // MV Tiles are slotted in horizontal render group, taking up 1 |
| // row. |
| CreateMatch(296, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(295, omnibox::GROUP_MOBILE_MOST_VISITED), |
| // Visited Doc Related and recent searches should be shown up to |
| // the remaining section limit. |
| CreateMatch(100, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(99, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(98, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(97, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(96, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(95, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(94, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(93, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {300, 298, 296, 295, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89}); |
| } |
| } |
| |
| // Tests the groups, limits, and rules for the Android NTP ZPS + Inspire Me. |
| TEST(AutocompleteGrouperSectionsTest, AndroidNTPZpsSection_withInspireMe) { |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back( |
| std::make_unique<AndroidNTPZpsSection>(group_configs, false)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| { |
| SCOPED_TRACE("Given no matches, should return no matches."); |
| test({}, {}); |
| } |
| { |
| SCOPED_TRACE("Given no InspireMe matches, should return no matches."); |
| // Verify that the Clipboard suggestion is retained on top. |
| test( |
| { |
| // PSUGGEST to show on the NTP ZPS. |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86}); |
| } |
| { |
| SCOPED_TRACE("Clipboard suggestion is always shown when available."); |
| test( |
| { |
| CreateMatch(3, omnibox::GROUP_MOBILE_CLIPBOARD), |
| // Auxiliary matches not valid for NTP ZPS. |
| CreateMatch(2, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| CreateMatch(1, omnibox::GROUP_MOBILE_MOST_VISITED), |
| // PSUGGEST to show on the NTP ZPS. |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(92, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(88, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(87, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(86, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(85, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(84, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {3, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86}); |
| } |
| { |
| SCOPED_TRACE("No Trending Queries Backfill"); |
| // Verify that Trending queries don't backfill unoccupied Related queries |
| // slots. |
| // Must offer less PREVIOUS_SEARCH_RELATED than MAX_PREVIOUS_SEARCH_RELATED, |
| // and more TRENDS than MAX_TRENDING_QUERIES. |
| test( |
| { |
| CreateMatch(20, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(19, omnibox::GROUP_TRENDS), |
| CreateMatch(18, omnibox::GROUP_TRENDS), |
| CreateMatch(17, omnibox::GROUP_TRENDS), |
| CreateMatch(16, omnibox::GROUP_TRENDS), |
| CreateMatch(15, omnibox::GROUP_TRENDS), |
| }, |
| {19, 18, 17, 16, 15}); |
| } |
| { |
| SCOPED_TRACE("No Related Queries Backfill"); |
| // Verify that Related queries are completely ignored by Inspire Me. |
| // Must offer less TRENDS than MAX_TRENDING_QUERIES, and more |
| // PREVIOUS_SEARCH_RELATED than MAX_PREVIOUS_SEARCH_RELATED. |
| test( |
| { |
| CreateMatch(20, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(19, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(18, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(17, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(16, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(15, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(14, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(13, omnibox::GROUP_TRENDS), |
| }, |
| {13}); |
| } |
| { |
| SCOPED_TRACE("Conform to Limits"); |
| test( |
| { |
| CreateMatch(20, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(19, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(18, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(17, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(16, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(15, omnibox::GROUP_TRENDS), |
| CreateMatch(14, omnibox::GROUP_TRENDS), |
| CreateMatch(13, omnibox::GROUP_TRENDS), |
| CreateMatch(12, omnibox::GROUP_TRENDS), |
| CreateMatch(11, omnibox::GROUP_TRENDS), |
| CreateMatch(10, omnibox::GROUP_TRENDS), |
| }, |
| // No more than MAX_PREVIOUS_SEARCH_RELATED + MAX_TRENDING_QUERIES. |
| {15, 14, 13, 12, 11}); |
| } |
| } |
| |
| // Tests the groups, limits, and rules for the Android Web ZPS + MV tiles. |
| TEST(AutocompleteGrouperSectionsTest, AndroidWebZpsSection_mostVisitedTiles) { |
| const ACMatches tail = { |
| CreateMatch(105, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(104, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(103, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(102, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(101, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(10, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(9, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(8, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(7, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(6, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(5, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(4, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(3, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(2, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(1, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }; |
| |
| auto test = [&tail](ACMatches matches, bool append_tail_suggestions, |
| std::vector<int> expected_relevances) { |
| if (append_tail_suggestions) { |
| matches.insert(matches.end(), tail.begin(), tail.end()); |
| } |
| |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back(std::make_unique<AndroidWebZpsSection>(group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| { |
| SCOPED_TRACE("No Search Ready Omnibox. No MV Tiles."); |
| test({}, true, {105, 104, 103, 102, 101, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}); |
| } |
| |
| { |
| SCOPED_TRACE("Search Ready Omnibox, no MV Tiles."); |
| // Verify that the Clipboard suggestion is retained on top. |
| test( |
| { |
| CreateMatch(200, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| }, |
| true, {200, 105, 104, 103, 102, 101, 10, 9, 8, 7, 6, 5, 4, 3, 2}); |
| } |
| |
| { |
| // This test verifies that when we append MV Tiles, we don't do this at |
| // expense of Search suggestions. |
| SCOPED_TRACE("Search Ready Omnibox and 1 MV Tile."); |
| test( |
| { |
| CreateMatch(300, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| CreateMatch(200, omnibox::GROUP_MOBILE_MOST_VISITED), |
| }, |
| true, {300, 200, 105, 104, 103, 102, 101, 10, 9, 8, 7, 6, 5, 4, 3}); |
| } |
| |
| { |
| // This test verifies that if we have no suggestions, we don't spend the |
| // limit on excessive MV Tiles. |
| SCOPED_TRACE("Excessive number of MV Tiles."); |
| test( |
| { |
| CreateMatch(215, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(214, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(213, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(212, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(211, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(210, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(209, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(208, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(207, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(206, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(205, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(204, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(203, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(202, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(201, omnibox::GROUP_MOBILE_MOST_VISITED), |
| }, |
| false, {215, 214, 213, 212, 211, 210, 209, 208, 207, 206}); |
| } |
| |
| { |
| // This test verifies that if we have both MV Tiles and suggestions, we |
| // don't lose search suggestions slots on MV tiles. |
| SCOPED_TRACE("Search Ready Omnibox and many MV Tiles."); |
| test( |
| { |
| CreateMatch(300, omnibox::GROUP_MOBILE_SEARCH_READY_OMNIBOX), |
| CreateMatch(215, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(214, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(213, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(212, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(211, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(210, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(209, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(208, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(207, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(206, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(205, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(204, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(203, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(202, omnibox::GROUP_MOBILE_MOST_VISITED), |
| CreateMatch(201, omnibox::GROUP_MOBILE_MOST_VISITED), |
| }, |
| true, |
| {// SRO |
| 300, |
| // 10 MV Tiles |
| 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, |
| // 13 search suggestions. |
| 105, 104, 103, 102, 101, 10, 9, 8, 7, 6, 5, 4, 3}); |
| } |
| } |
| |
| // Tests the groups, limits, and rules for the iOS NTP ZPS. |
| TEST(AutocompleteGrouperSectionsTest, IOSNTPZpsSection) { |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back( |
| std::make_unique<IOSNTPZpsSection>(group_configs, false)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| { |
| SCOPED_TRACE("Given no matches, should return no matches."); |
| test({}, {}); |
| } |
| |
| { |
| SCOPED_TRACE( |
| "Given no trend matches and only psuggest, should only display " |
| "psuggest following the psuggest count limit"); |
| test({CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST)}, |
| {100, 99, 98, 97}); |
| } |
| |
| { |
| SCOPED_TRACE( |
| "Given no psuggest matches and only trends, should only display trends " |
| "following the trends count limit"); |
| test({CreateMatch(100, omnibox::GROUP_TRENDS), |
| CreateMatch(99, omnibox::GROUP_TRENDS), |
| CreateMatch(98, omnibox::GROUP_TRENDS), |
| CreateMatch(97, omnibox::GROUP_TRENDS), |
| CreateMatch(96, omnibox::GROUP_TRENDS), |
| CreateMatch(95, omnibox::GROUP_TRENDS)}, |
| {100, 99, 98, 97, 96}); |
| } |
| |
| { |
| SCOPED_TRACE( |
| "Given both psuggest and trends matches, should display both groups " |
| "following their count limit"); |
| test({CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_TRENDS), |
| CreateMatch(95, omnibox::GROUP_TRENDS), |
| CreateMatch(94, omnibox::GROUP_TRENDS), |
| CreateMatch(93, omnibox::GROUP_TRENDS)}, |
| {100, 99, 98, 97, 96, 95, 94, 93}); |
| } |
| } |
| |
| // Tests the groups and limits for DesktopSecondaryNTPZpsSection. |
| TEST(AutocompleteGrouperSectionsTest, DesktopSecondaryNTPZpsSection) { |
| // Explicitly enable RealboxContextualAndTrendingSuggestions feature and set |
| // params. |
| omnibox_feature_configs::ScopedConfigForTesting< |
| omnibox_feature_configs::RealboxContextualAndTrendingSuggestions> |
| scoped_config; |
| scoped_config.Get().enabled = true; |
| scoped_config.Get().total_limit = 4; |
| scoped_config.Get().contextual_suggestions_limit = 4; |
| scoped_config.Get().trending_suggestions_limit = 4; |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| const auto group1 = omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS; |
| const auto group2 = omnibox::GROUP_PREVIOUS_SEARCH_RELATED; |
| const auto group3 = omnibox::GROUP_TRENDS; |
| group_configs[group1].set_side_type( |
| omnibox::GroupConfig_SideType_SECONDARY); |
| group_configs[group2].set_side_type( |
| omnibox::GroupConfig_SideType_SECONDARY); |
| group_configs[group3].set_side_type( |
| omnibox::GroupConfig_SideType_SECONDARY); |
| sections.push_back( |
| std::make_unique<DesktopSecondaryNTPZpsSection>(group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| { |
| SCOPED_TRACE("Given no matches, should return no matches."); |
| test({}, {}); |
| } |
| { |
| SCOPED_TRACE("Matches should be added up to their group limit."); |
| // Groups do not enforce a minimum number of matches shown. They do enforce |
| // a maximum number of matches shown for that Group. |
| test({CreateMatch(100, omnibox::GROUP_TRENDS), |
| CreateMatch(99, omnibox::GROUP_TRENDS), |
| CreateMatch(98, omnibox::GROUP_TRENDS), |
| CreateMatch(97, omnibox::GROUP_TRENDS), |
| CreateMatch(96, omnibox::GROUP_TRENDS)}, |
| {100, 99, 98, 97}); |
| } |
| { |
| SCOPED_TRACE("Matches should be added up to the section limit."); |
| // Sections do not enforce a minimum number of matches shown. They do |
| // enforce a maximum number of matches shown. |
| test({CreateMatch(100, omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS), |
| CreateMatch(99, omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS), |
| // `GROUP_PREVIOUS_SEARCH_RELATED` matches will be displayed |
| // simultaneously as `GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS` |
| // matches. Showing both may occur but is not likely to happen. |
| CreateMatch(200, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(201, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(202, omnibox::GROUP_PREVIOUS_SEARCH_RELATED)}, |
| {100, 99, 200, 201}); |
| } |
| { |
| SCOPED_TRACE( |
| "Matches added up to their group limit, but not section limit."); |
| test({CreateMatch(100, omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS), |
| CreateMatch(99, omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS), |
| CreateMatch(98, omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS), |
| CreateMatch(97, omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS)}, |
| {100, 99, 98}); |
| } |
| { |
| SCOPED_TRACE( |
| "Given no matches that can be added to this section because of their " |
| "GroupId, should return no matches."); |
| test({CreateMatch(100, omnibox::GROUP_TRENDS_ENTITY_CHIPS), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST)}, |
| {}); |
| } |
| // Test groups and limits when RealboxContextualAndTrendingSuggestions feature |
| // is disabled. |
| scoped_config.Reset(); |
| scoped_config.Get().enabled = false; |
| { |
| SCOPED_TRACE( |
| "Matches should be added up to their group limit. " |
| "(RealboxContextualAndTrendingSuggestions feature disabled)"); |
| test({CreateMatch(100, omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS), |
| CreateMatch(99, omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS), |
| CreateMatch(98, omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS), |
| CreateMatch(97, omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS)}, |
| {100, 99, 98}); |
| } |
| { |
| SCOPED_TRACE( |
| "Given no matches that can be added to this section because of their " |
| "Group limit, should return no matches. " |
| "(RealboxContextualAndTrendingSuggestions feature disabled)"); |
| test({CreateMatch(100, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(99, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(98, omnibox::GROUP_TRENDS)}, |
| {}); |
| } |
| } |
| |
| // Tests the behavior when DesktopNTPZpsSection and |
| // DesktopSecondaryNTPZpsSection are both created. |
| TEST(AutocompleteGrouperSectionsTest, |
| DesktopNTPZpsSectionAndDesktopSecondaryNTPZpsSection) { |
| // Explicitly enable RealboxContextualAndTrendingSuggestions feature and set |
| // params. |
| omnibox_feature_configs::ScopedConfigForTesting< |
| omnibox_feature_configs::RealboxContextualAndTrendingSuggestions> |
| scoped_config; |
| scoped_config.Get().enabled = true; |
| scoped_config.Get().total_limit = 4; |
| scoped_config.Get().contextual_suggestions_limit = 4; |
| scoped_config.Get().trending_suggestions_limit = 4; |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances, |
| bool trends_has_default_side_type = true) { |
| PSections sections; |
| const auto group1 = omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST; |
| const auto group2 = omnibox::GROUP_TRENDS; |
| const auto group3 = omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS; |
| const auto group4 = omnibox::GROUP_PREVIOUS_SEARCH_RELATED; |
| omnibox::GroupConfigMap group_configs; |
| group_configs[group1]; |
| group_configs[group2]; |
| if (!trends_has_default_side_type) { |
| group_configs[group2].set_side_type( |
| omnibox::GroupConfig_SideType_SECONDARY); |
| } |
| group_configs[group3].set_side_type( |
| omnibox::GroupConfig_SideType_SECONDARY); |
| group_configs[group4].set_side_type( |
| omnibox::GroupConfig_SideType_SECONDARY); |
| sections.push_back( |
| std::make_unique<DesktopNTPZpsSection>(group_configs, 8u, false)); |
| sections.push_back( |
| std::make_unique<DesktopSecondaryNTPZpsSection>(group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| { |
| SCOPED_TRACE( |
| "Given 8 psuggest matches, and trending matches with a secondary side " |
| "type, display psuggest matches on LHS and trending on the RHS."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(91, omnibox::GROUP_TRENDS), |
| CreateMatch(90, omnibox::GROUP_TRENDS), |
| CreateMatch(89, omnibox::GROUP_TRENDS), |
| CreateMatch(88, omnibox::GROUP_TRENDS), |
| }, |
| {100, 99, 98, 97, 96, 95, 94, 93, 91, 90, 89, 88}, false); |
| } |
| { |
| SCOPED_TRACE( |
| "Given psuggests and trending suggestions with a default side type, " |
| "display psuggest and trending on the LHS and entity chip suggestions " |
| "on the RHS."); |
| test( |
| { |
| CreateMatch(200, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(199, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(198, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(197, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(100, omnibox::GROUP_TRENDS), |
| CreateMatch(99, omnibox::GROUP_TRENDS), |
| CreateMatch(98, omnibox::GROUP_TRENDS), |
| CreateMatch(97, omnibox::GROUP_TRENDS), |
| CreateMatch(96, omnibox::GROUP_TRENDS), |
| CreateMatch(92, |
| omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS), |
| CreateMatch(91, |
| omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS), |
| CreateMatch(90, |
| omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS), |
| }, |
| {200, 199, 198, 197, 100, 99, 98, 97, 92, 91, 90}); |
| } |
| // Test groups and limits when RealboxContextualAndTrendingSuggestions feature |
| // is disabled. |
| scoped_config.Reset(); |
| scoped_config.Get().enabled = false; |
| { |
| SCOPED_TRACE( |
| "Given 8 psuggest matches, and trending matches with a secondary side " |
| "type, but RealboxContextualAndTrendingSuggestions" |
| "feature disabled, do not show trending on the RHS."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(95, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(94, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(93, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(92, omnibox::GROUP_TRENDS), |
| CreateMatch(91, omnibox::GROUP_TRENDS), |
| CreateMatch(90, omnibox::GROUP_TRENDS), |
| CreateMatch(89, omnibox::GROUP_TRENDS), |
| }, |
| {100, 99, 98, 97, 96, 95, 94, 93}, false); |
| } |
| } |
| |
| #if !(BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)) |
| // Tests the groups, limits, and rules for the Desktop SRP section with URL |
| // suggestions enabled. |
| TEST(AutocompleteGrouperSectionsTest, DesktopSRPZpsSectionWithUrls) { |
| omnibox_feature_configs::ScopedConfigForTesting< |
| omnibox_feature_configs::OmniboxZpsSuggestionLimit> |
| scoped_config; |
| scoped_config.Get().enabled = true; |
| scoped_config.Get().max_search_suggestions = 4; |
| scoped_config.Get().max_url_suggestions = 4; |
| auto test = [](size_t action_count, ACMatches matches, |
| std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| group_configs[omnibox::GROUP_MOST_VISITED]; |
| group_configs[omnibox::GROUP_PREVIOUS_SEARCH_RELATED]; |
| // Max 8 suggestions, with an upper limit of 4 search suggestions. |
| sections.push_back(std::make_unique<DesktopSRPZpsSection>( |
| group_configs, 8u + action_count, 4u, 4u, action_count)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| { |
| SCOPED_TRACE( |
| "Given 12 srp zps matches, the group should respect the search " |
| "suggestion limit"); |
| test(0, |
| { |
| CreateMatch(100, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(99, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(98, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(97, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(96, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(95, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(94, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(93, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(92, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(91, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(89, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(88, omnibox::GROUP_MOST_VISITED), |
| }, |
| {100, 99, 98, 97, 94, 93, 92, 91}); |
| } |
| { |
| SCOPED_TRACE( |
| "Given 12 srp zps matches, the group should respect the url suggestion " |
| "limit"); |
| test(0, |
| { |
| CreateMatch(100, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(99, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(98, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(97, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(96, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(95, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(94, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(93, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(92, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(91, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(90, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(89, omnibox::GROUP_MOST_VISITED), |
| }, |
| {100, 99, 98, 97, 96}); |
| } |
| { |
| SCOPED_TRACE("Contextual search action is excluded when disabled."); |
| test(0, |
| { |
| CreateMatch(100, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(99, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(98, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(97, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(96, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(95, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(94, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(93, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(92, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(91, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(89, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(88, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(87, omnibox::GROUP_CONTEXTUAL_SEARCH_ACTION), |
| }, |
| {100, 99, 98, 97, 94, 93, 92, 91}); |
| } |
| { |
| SCOPED_TRACE("Contextual search action is included when enabled."); |
| test(1, |
| { |
| CreateMatch(100, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(99, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(98, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(97, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(96, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(95, omnibox::GROUP_PREVIOUS_SEARCH_RELATED), |
| CreateMatch(94, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(93, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(92, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(91, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(89, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(88, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(87, omnibox::GROUP_CONTEXTUAL_SEARCH_ACTION), |
| }, |
| {100, 99, 98, 97, 94, 93, 92, 91, 87}); |
| } |
| } |
| |
| // Tests the groups, limits, and rules for the Desktop Web section with URL |
| // suggestions enabled. |
| TEST(AutocompleteGrouperSectionsTest, DesktopWebZpsSectionWithUrls) { |
| omnibox_feature_configs::ScopedConfigForTesting< |
| omnibox_feature_configs::OmniboxUrlSuggestionsOnFocus> |
| scoped_config; |
| scoped_config.Get().enabled = true; |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances, |
| bool trends_has_default_side_type = true) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| group_configs[omnibox::GROUP_MOST_VISITED]; |
| group_configs[omnibox::GROUP_PREVIOUS_SEARCH_RELATED]; |
| group_configs[omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST]; |
| // Max 4 url suggestions. |
| sections.push_back( |
| std::make_unique<DesktopWebURLZpsSection>(group_configs, 4u)); |
| // Max 4 suggestions, with an upper limit of 4 contextual search |
| // suggestions and no contextual actions. |
| sections.push_back(std::make_unique<DesktopWebSearchZpsSection>( |
| group_configs, /*limit=*/4u, /*contextual_action_limit=*/0u, |
| /*contextual_search_limit=*/4u)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| { |
| SCOPED_TRACE( |
| "Given 12 web zps matches, the group should respect the url " |
| "limit as well as show them first in the suggestion list."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(99, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(98, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(97, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(96, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(95, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(94, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(93, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(92, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| {100, 99, 98, 97, 94, 93, 92, 91}); |
| } |
| { |
| SCOPED_TRACE( |
| "Given 12 web zps matches, if there aren't enough search suggestions, " |
| "url suggestions should not take their place. Instead less " |
| "overall suggestions should be shown."); |
| test( |
| { |
| CreateMatch(100, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(99, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(98, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(97, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(96, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(95, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(94, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(93, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(91, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(90, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(89, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(88, omnibox::GROUP_MOST_VISITED), |
| }, |
| {98, 97, 96, 95, 100, 99}); |
| } |
| } |
| |
| TEST(AutocompleteGrouperSectionsTest, DesktopWebZpsWithActionsSection) { |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| // Max 3 suggestions, with an upper limit of 3 url suggestions. |
| sections.push_back( |
| std::make_unique<DesktopWebURLZpsSection>(group_configs, 3u)); |
| // Max 3 suggestions, with an upper limit of 3 contextual search |
| // suggestions and one contextual action. |
| sections.push_back(std::make_unique<DesktopWebSearchZpsSection>( |
| group_configs, /*limit=*/3u, /*contextual_action_limit=*/1u, |
| /*contextual_search_limit=*/3u)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| { |
| SCOPED_TRACE("ZPS action matches group before contextual search matches"); |
| test( |
| { |
| CreateMatch(300, omnibox::GROUP_CONTEXTUAL_SEARCH_ACTION), |
| CreateMatch(299, omnibox::GROUP_CONTEXTUAL_SEARCH_ACTION), |
| CreateMatch(200, omnibox::GROUP_CONTEXTUAL_SEARCH), |
| CreateMatch(199, omnibox::GROUP_CONTEXTUAL_SEARCH), |
| CreateMatch(100, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(99, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(98, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(97, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(96, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(95, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(94, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(93, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(92, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(91, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| }, |
| // 3 URLs, 1 action, 2 contextual searches. |
| {100, 99, 98, 300, 200, 199}); |
| } |
| } |
| |
| TEST(AutocompleteGrouperSectionsTest, DesktopWebZpsNoContextualSuggestions) { |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back( |
| std::make_unique<DesktopWebURLZpsSection>(group_configs, 3u)); |
| sections.push_back(std::make_unique<DesktopWebSearchZpsSection>( |
| group_configs, /*limit=*/4u, /*contextual_action_limit=*/1u, |
| /*contextual_search_limit=*/0u)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| { |
| SCOPED_TRACE("ZPS contextual search matches limit 0"); |
| test( |
| { |
| CreateMatch(99, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(98, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_CONTEXTUAL_SEARCH_ACTION), |
| CreateMatch(95, omnibox::GROUP_CONTEXTUAL_SEARCH), |
| CreateMatch(94, omnibox::GROUP_CONTEXTUAL_SEARCH_ACTION), |
| CreateMatch(93, omnibox::GROUP_CONTEXTUAL_SEARCH), |
| }, |
| // URLs, then searches, then one action, stable sorted. |
| // No contextual search matches due to above configuration. |
| {99, 98, 97, 96}); |
| } |
| } |
| |
| TEST(AutocompleteGrouperSectionsTest, DesktopWebZpsContextualSuggestionsOnly) { |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back( |
| std::make_unique<DesktopWebSearchZpsContextualOnlySection>( |
| group_configs, /*contextual_action_limit=*/1u, |
| /*contextual_search_limit=*/3u)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| { |
| SCOPED_TRACE("ZPS contextual search matches only"); |
| test( |
| { |
| CreateMatch(99, omnibox::GROUP_MOST_VISITED), |
| CreateMatch(98, omnibox::GROUP_VISITED_DOC_RELATED), |
| CreateMatch(97, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST), |
| CreateMatch(96, omnibox::GROUP_CONTEXTUAL_SEARCH_ACTION), |
| CreateMatch(95, omnibox::GROUP_CONTEXTUAL_SEARCH), |
| CreateMatch(94, omnibox::GROUP_CONTEXTUAL_SEARCH_ACTION), |
| CreateMatch(93, omnibox::GROUP_CONTEXTUAL_SEARCH), |
| }, |
| // Nothing but contextual action and contextual search matches. |
| {96, 95, 93}); |
| } |
| } |
| #endif // !(BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)) |
| |
| // Test that (on Android) sections are grouped by Search vs URL. |
| #if BUILDFLAG(IS_ANDROID) |
| TEST(AutocompleteGrouperSectionsTest, |
| AndroidNonZPSSection_groupsBySearchVsUrl) { |
| auto test = [](bool show_only_search_suggestions, ACMatches matches, |
| std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| sections.push_back(std::make_unique<AndroidNonZPSSection>( |
| show_only_search_suggestions, group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| auto make_search = [](int score) { |
| auto match = CreateMatch(score, omnibox::GROUP_SEARCH); |
| match.type = AutocompleteMatchType::SEARCH_HISTORY; |
| return match; |
| }; |
| |
| auto make_url = [](int score) { |
| auto match = CreateMatch(score, omnibox::GROUP_OTHER_NAVS); |
| match.type = AutocompleteMatchType::NAVSUGGEST; |
| return match; |
| }; |
| |
| constexpr bool kSearchesOnly = true; |
| constexpr bool kSearchesAndUrls = false; |
| |
| { |
| SCOPED_TRACE("No matches = no crashes."); |
| test(kSearchesAndUrls, {}, {}); |
| test(kSearchesOnly, {}, {}); |
| } |
| { |
| SCOPED_TRACE("Grouping top section only w/ Search."); |
| test(kSearchesAndUrls, {make_search(100)}, {100}); |
| test(kSearchesOnly, {make_search(100)}, {100}); |
| } |
| { |
| SCOPED_TRACE("Grouping top section only w/ URL."); |
| test(kSearchesAndUrls, {make_url(100)}, {100}); |
| // Top URL is allowed. |
| test(kSearchesOnly, {make_url(100)}, {100}); |
| } |
| { |
| SCOPED_TRACE("Grouping top section only w/ multiple URLs."); |
| ACMatches matches{ |
| make_url(20), |
| make_url(19), |
| make_url(18), |
| }; |
| test(kSearchesAndUrls, matches, {20, 19, 18}); |
| // Only top URL is allowed. |
| test(kSearchesOnly, matches, {20}); |
| } |
| { |
| SCOPED_TRACE("Grouping top two sections."); |
| ACMatches matches{ |
| make_url(20), make_url(19), make_url(18), |
| make_search(10), make_search(9), |
| }; |
| |
| test(kSearchesAndUrls, matches, |
| // 20 -- default match. |
| // 10, 9 -- top searches. |
| // 19, 18 -- top URLs. |
| {20, 10, 9, 19, 18}); |
| |
| test(kSearchesOnly, matches, |
| // 20 -- default match (url). |
| // 10, 9 -- top searches. |
| {20, 10, 9}); |
| } |
| { |
| SCOPED_TRACE("Grouping all sections."); |
| ACMatches matches{ |
| make_url(20), |
| // top adaptive group |
| make_url(19), |
| make_url(18), |
| make_search(10), |
| make_search(9), |
| make_url(17), |
| // bottom adaptive group |
| make_url(16), |
| make_search(8), |
| make_search(7), |
| make_url(15), |
| make_url(14), |
| make_search(6), |
| make_search(5), |
| make_url(13), |
| make_url(12), |
| }; |
| |
| test(kSearchesAndUrls, matches, |
| { |
| 20, // the default match |
| 10, 9, 19, 18, 17, // the top adaptive group |
| 8, 7, 6, 5, 16, 15, 14, 13, 12 // the bottom adaptive group. |
| }); |
| |
| test(kSearchesOnly, matches, |
| { |
| 20, // Default match is URL |
| 10, 9, 8, 7, 6, 5, // top adaptive group. |
| }); |
| } |
| } |
| |
| TEST(AutocompleteGrouperSectionsTest, |
| AndroidNonZPSSection_richCardInFirstPosition) { |
| base::test::ScopedFeatureList feature_list; |
| feature_list.InitAndEnableFeatureWithParameters( |
| omnibox::kOmniboxAnswerActions, |
| {{OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "true"}}); |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| AndroidNonZPSSection::set_num_visible_matches(5); |
| sections.push_back( |
| std::make_unique<AndroidNonZPSSection>(false, group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| auto make_search = [](int score) { |
| auto match = CreateMatch(score, omnibox::GROUP_SEARCH); |
| match.type = AutocompleteMatchType::SEARCH_HISTORY; |
| return match; |
| }; |
| |
| auto make_url = [](int score) { |
| auto match = CreateMatch(score, omnibox::GROUP_OTHER_NAVS); |
| match.type = AutocompleteMatchType::NAVSUGGEST; |
| return match; |
| }; |
| |
| auto make_rich_card = [](int score) { |
| auto match = CreateMatch(score, omnibox::GROUP_MOBILE_RICH_ANSWER); |
| match.type = AutocompleteMatchType::SEARCH_HISTORY; |
| return match; |
| }; |
| |
| { |
| SCOPED_TRACE("No matches, no crashes."); |
| test({}, {}); |
| } |
| |
| SCOPED_TRACE("Card in first position"); |
| test( |
| { |
| make_rich_card(20), |
| make_url(19), |
| make_url(18), |
| make_search(10), |
| make_search(9), |
| }, |
| // 20 -- rich answer card |
| // 10, 9 -- top searches. |
| // 19, 18 -- top URLs. |
| {20, 10, 9, 19, 18}); |
| } |
| |
| TEST(AutocompleteGrouperSectionsTest, |
| AndroidNonZPSSection_richCardAboveKeyboard) { |
| base::test::ScopedFeatureList feature_list; |
| feature_list.InitAndEnableFeatureWithParameters( |
| omnibox::kOmniboxAnswerActions, |
| {{OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "true"}, |
| {OmniboxFieldTrial::kAnswerActionsShowAboveKeyboard.name, "true"}, |
| {OmniboxFieldTrial::kAnswerActionsShowIfUrlsPresent.name, "true"}}); |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| AndroidNonZPSSection::set_num_visible_matches(5); |
| sections.push_back( |
| std::make_unique<AndroidNonZPSSection>(false, group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| auto make_search = [](int score) { |
| auto match = CreateMatch(score, omnibox::GROUP_SEARCH); |
| match.type = AutocompleteMatchType::SEARCH_HISTORY; |
| return match; |
| }; |
| |
| auto make_url = [](int score) { |
| auto match = CreateMatch(score, omnibox::GROUP_OTHER_NAVS); |
| match.type = AutocompleteMatchType::NAVSUGGEST; |
| return match; |
| }; |
| |
| auto make_rich_card = [](int score) { |
| auto match = CreateMatch(score, omnibox::GROUP_MOBILE_RICH_ANSWER); |
| match.type = AutocompleteMatchType::SEARCH_HISTORY; |
| omnibox::RichAnswerTemplate answer_template; |
| match.answer_template = answer_template; |
| return match; |
| }; |
| |
| { |
| SCOPED_TRACE("No matches, no crashes."); |
| test({}, {}); |
| } |
| |
| SCOPED_TRACE("Card in last position of visible matches"); |
| test( |
| { |
| make_url(19), |
| make_url(18), |
| make_rich_card(20), |
| make_search(10), |
| make_search(9), |
| make_search(8), |
| make_search(7), |
| }, |
| // 19 -- default match url |
| // 10, 9 -- top searches. |
| // 18 -- remaining URL. |
| // 20 -- rich answer card |
| // 8, 7 -- below the fold matches |
| {19, 10, 9, 18, 20, 8, 7}); |
| } |
| |
| TEST(AutocompleteGrouperSectionsTest, |
| AndroidNonZPSSection_hideCardWhenUrlsPresent) { |
| base::test::ScopedFeatureList feature_list; |
| feature_list.InitAndEnableFeatureWithParameters( |
| omnibox::kOmniboxAnswerActions, |
| {{OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "true"}, |
| {OmniboxFieldTrial::kAnswerActionsShowAboveKeyboard.name, "true"}, |
| {OmniboxFieldTrial::kAnswerActionsShowIfUrlsPresent.name, "false"}}); |
| |
| auto test = [](ACMatches matches, std::vector<int> expected_relevances) { |
| PSections sections; |
| omnibox::GroupConfigMap group_configs; |
| AndroidNonZPSSection::set_num_visible_matches(5); |
| sections.push_back( |
| std::make_unique<AndroidNonZPSSection>(false, group_configs)); |
| auto out_matches = Section::GroupMatches(std::move(sections), matches); |
| VerifyMatches(out_matches, expected_relevances); |
| }; |
| |
| auto make_search = [](int score) { |
| auto match = CreateMatch(score, omnibox::GROUP_SEARCH); |
| match.type = AutocompleteMatchType::SEARCH_HISTORY; |
| return match; |
| }; |
| |
| auto make_url = [](int score) { |
| auto match = CreateMatch(score, omnibox::GROUP_OTHER_NAVS); |
| match.type = AutocompleteMatchType::NAVSUGGEST; |
| return match; |
| }; |
| |
| auto make_rich_card = [](int score) { |
| auto match = CreateMatch(score, omnibox::GROUP_MOBILE_RICH_ANSWER); |
| match.type = AutocompleteMatchType::SEARCH_HISTORY; |
| omnibox::RichAnswerTemplate answer_template; |
| match.answer_template = answer_template; |
| return match; |
| }; |
| |
| { |
| SCOPED_TRACE("No matches, no crashes."); |
| test({}, {}); |
| } |
| |
| SCOPED_TRACE("Card in last position of visible matches"); |
| test( |
| { |
| make_url(19), |
| make_url(18), |
| make_rich_card(20), |
| make_search(10), |
| make_search(9), |
| make_search(8), |
| make_search(7), |
| }, |
| // 19 -- default match url |
| // 20, 10 -- top searches. |
| // Answer(20) counts as a plain search due to presence of urls. |
| // 18 -- remaining URL. |
| // 9, 8, 7 -- below the fold matches |
| {19, 20, 10, 18, 9, 8, 7}); |
| } |
| |
| #endif |