// 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_groups.h"

#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/omnibox_proto/groups.pb.h"

TEST(AutocompleteGrouperGroupsTest, Group) {
  Group group(4, {
                     {omnibox::GROUP_SEARCH, 2},
                     {omnibox::GROUP_DOCUMENT, 4},
                 });
  AutocompleteMatch search_match{};
  search_match.suggestion_group_id = omnibox::GROUP_SEARCH;
  AutocompleteMatch doc_match{};
  doc_match.suggestion_group_id = omnibox::GROUP_DOCUMENT;
  AutocompleteMatch other_match{};
  other_match.suggestion_group_id = omnibox::GROUP_OTHER_NAVS;

  EXPECT_TRUE(group.CanAdd(search_match));
  EXPECT_TRUE(group.CanAdd(doc_match));
  EXPECT_FALSE(group.CanAdd(other_match));

  // Verify the group limit with 2/2 searches, 0/4 docs, and 2/4 total.
  group.Add(search_match);  // 1/2 searches, 0/4 docs, 1/4 total.
  EXPECT_TRUE(group.CanAdd(search_match));
  group.Add(search_match);  // 2/2 searches, 0/4 docs, 2/4 total.
  EXPECT_FALSE(group.CanAdd(search_match));
  EXPECT_TRUE(group.CanAdd(doc_match));
  EXPECT_FALSE(group.CanAdd(other_match));

  // Verify the total `Group` limit with 2/2 searches, 2/4 docs, and 4/4 total.
  group.Add(doc_match);  // 2/2 searches, 1/4 docs, 3/4 total.
  EXPECT_TRUE(group.CanAdd(doc_match));
  group.Add(doc_match);  // 2/2 searches, 2/4 docs, 4/4 total.
  EXPECT_FALSE(group.CanAdd(search_match));
  EXPECT_FALSE(group.CanAdd(doc_match));
  EXPECT_FALSE(group.CanAdd(other_match));

  // Verify with 0/2 searches, 4/4 docs, and 4/4 total.
  Group group2(4, {
                      {omnibox::GROUP_SEARCH, 2},
                      {omnibox::GROUP_DOCUMENT, 4},
                  });
  group2.Add(doc_match);  // 0/2 searches, 1/4 docs, 1/4 total.
  group2.Add(doc_match);  // 0/2 searches, 2/4 docs, 2/4 total.
  group2.Add(doc_match);  // 0/2 searches, 3/4 docs, 3/4 total.
  EXPECT_TRUE(group2.CanAdd(search_match));
  EXPECT_TRUE(group2.CanAdd(doc_match));
  group2.Add(doc_match);  // 0/2 searches, 4/4 docs, 4/4 total.
  EXPECT_FALSE(group2.CanAdd(search_match));
  EXPECT_FALSE(group2.CanAdd(doc_match));
  EXPECT_FALSE(group2.CanAdd(other_match));
}

TEST(AutocompleteGrouperGroupsTest, DefaultGroup) {
  Group default_group(1,
                      {
                          {omnibox::GROUP_STARTER_PACK, 1},
                          {omnibox::GROUP_SEARCH, 1},
                          {omnibox::GROUP_OTHER_NAVS, 1},
                      },
                      /*is_zps=*/false,
                      /*is_default=*/true);
  ACMatches matches{{}, {}, {}};

  // Can't be added because `allowed_to_be_default` is false.
  AutocompleteMatch non_default_match{};
  non_default_match.suggestion_group_id = omnibox::GROUP_STARTER_PACK;
  // Can't be added because `GROUP_DOCUMENT` is not allowed.
  AutocompleteMatch default_match_doc{};
  default_match_doc.suggestion_group_id = omnibox::GROUP_DOCUMENT;
  default_match_doc.allowed_to_be_default_match = true;
  // Can be added.
  AutocompleteMatch default_match_search{};
  default_match_search.suggestion_group_id = omnibox::GROUP_SEARCH;
  default_match_search.allowed_to_be_default_match = true;

  EXPECT_FALSE(default_group.CanAdd(non_default_match));
  EXPECT_TRUE(default_group.CanAdd(default_match_search));
  EXPECT_FALSE(default_group.CanAdd(default_match_doc));

  default_group.Add(default_match_search);
  EXPECT_FALSE(default_group.CanAdd(non_default_match));
  EXPECT_FALSE(default_group.CanAdd(default_match_search));
  EXPECT_FALSE(default_group.CanAdd(default_match_doc));
}
