// Copyright 2024 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/open_tab_provider.h"

#include <memory>

#include "base/test/task_environment.h"
#include "components/omnibox/browser/autocomplete_input.h"
#include "components/omnibox/browser/fake_autocomplete_provider_client.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/metrics_proto/omnibox_event.pb.h"

class OpenTabProviderTest : public testing::Test {
 public:
  OpenTabProviderTest() { open_tab_provider_ = new OpenTabProvider(&client_); }

  FakeAutocompleteProviderClient& client() { return client_; }

  OpenTabProvider& open_tab_provider() { return *open_tab_provider_; }

 private:
  search_engines::SearchEnginesTestEnvironment search_engines_test_environment_;
  base::test::TaskEnvironment task_environment_;
  FakeAutocompleteProviderClient client_;
  scoped_refptr<OpenTabProvider> open_tab_provider_;
};

TEST_F(OpenTabProviderTest, TestNoResults) {
  AutocompleteInput input(u"test",
                          metrics::OmniboxEventProto::PageClassification::
                              OmniboxEventProto_PageClassification_ANDROID_HUB,
                          TestSchemeClassifier());
  open_tab_provider().Start(input, /* minimal_changes= */ false);
  ASSERT_EQ(0UL, open_tab_provider().matches().size());
}

TEST_F(OpenTabProviderTest, TestTitleMatch) {
  TabMatcher::TabWrapper open_tab(u"test title", GURL("http://google.com"),
                                  base::Time());
  static_cast<FakeTabMatcher&>(
      const_cast<TabMatcher&>(client().GetTabMatcher()))
      .AddOpenTab(open_tab);

  AutocompleteInput input(u"test",
                          metrics::OmniboxEventProto::PageClassification::
                              OmniboxEventProto_PageClassification_ANDROID_HUB,
                          TestSchemeClassifier());
  open_tab_provider().Start(input, /* minimal_changes= */ false);
  ASSERT_EQ(1UL, open_tab_provider().matches().size());
}

TEST_F(OpenTabProviderTest, TestURLMatch) {
  TabMatcher::TabWrapper open_tab(u"google", GURL("http://test.com"),
                                  base::Time());
  static_cast<FakeTabMatcher&>(
      const_cast<TabMatcher&>(client().GetTabMatcher()))
      .AddOpenTab(open_tab);

  AutocompleteInput input(u"test",
                          metrics::OmniboxEventProto::PageClassification::
                              OmniboxEventProto_PageClassification_ANDROID_HUB,
                          TestSchemeClassifier());
  open_tab_provider().Start(input, /* minimal_changes= */ false);
  ASSERT_EQ(1UL, open_tab_provider().matches().size());
}

TEST_F(OpenTabProviderTest, TestNTPOmitted) {
  TabMatcher::TabWrapper open_tab(u"google", GURL("chrome-native://newtab/"),
                                  base::Time());
  static_cast<FakeTabMatcher&>(
      const_cast<TabMatcher&>(client().GetTabMatcher()))
      .AddOpenTab(open_tab);

  AutocompleteInput input(u"new",
                          metrics::OmniboxEventProto::PageClassification::
                              OmniboxEventProto_PageClassification_ANDROID_HUB,
                          TestSchemeClassifier());
  open_tab_provider().Start(input, /* minimal_changes= */ false);
#if BUILDFLAG(IS_ANDROID)
  ASSERT_EQ(0UL, open_tab_provider().matches().size());
#else
  ASSERT_EQ(1UL, open_tab_provider().matches().size());
#endif
}

TEST_F(OpenTabProviderTest, TestNoMatches) {
  FakeTabMatcher& tab_matcher = static_cast<FakeTabMatcher&>(
      const_cast<TabMatcher&>(client().GetTabMatcher()));
  tab_matcher.AddOpenTab(
      TabMatcher::TabWrapper(u"foo", GURL("http://foo.com"), base::Time()));
  tab_matcher.AddOpenTab(
      TabMatcher::TabWrapper(u"bar", GURL("http://bar.com"), base::Time()));

  AutocompleteInput input(u"test",
                          metrics::OmniboxEventProto::PageClassification::
                              OmniboxEventProto_PageClassification_ANDROID_HUB,
                          TestSchemeClassifier());
  open_tab_provider().Start(input, /* minimal_changes= */ false);
  ASSERT_EQ(0UL, open_tab_provider().matches().size());
}

TEST_F(OpenTabProviderTest, TestZPS) {
  FakeTabMatcher& tab_matcher = static_cast<FakeTabMatcher&>(
      const_cast<TabMatcher&>(client().GetTabMatcher()));
  tab_matcher.AddOpenTab(
      TabMatcher::TabWrapper(u"foo", GURL("http://foo.com"), base::Time()));
  tab_matcher.AddOpenTab(
      TabMatcher::TabWrapper(u"bar", GURL("http://bar.com"), base::Time()));

  AutocompleteInput input(u"",
                          metrics::OmniboxEventProto::PageClassification::
                              OmniboxEventProto_PageClassification_ANDROID_HUB,
                          TestSchemeClassifier());
  open_tab_provider().Start(input, /* minimal_changes= */ false);

#if BUILDFLAG(IS_ANDROID)
  ASSERT_EQ(2UL, open_tab_provider().matches().size());
#else
  ASSERT_EQ(0UL, open_tab_provider().matches().size());
#endif
}

TEST_F(OpenTabProviderTest, TestZPS_WeightedByRecency) {
  // Ordering by recency means that the tabs should be ordered:
  // baz -> foo -> bar
  FakeTabMatcher& tab_matcher = static_cast<FakeTabMatcher&>(
      const_cast<TabMatcher&>(client().GetTabMatcher()));
  tab_matcher.AddOpenTab(
      TabMatcher::TabWrapper(u"foo", GURL("http://foo.com"),
                             base::Time::FromSecondsSinceUnixEpoch(2)));
  tab_matcher.AddOpenTab(
      TabMatcher::TabWrapper(u"bar", GURL("http://bar.com"),
                             base::Time::FromSecondsSinceUnixEpoch(1)));
  tab_matcher.AddOpenTab(
      TabMatcher::TabWrapper(u"baz", GURL("http://baz.com"),
                             base::Time::FromSecondsSinceUnixEpoch(3)));

  AutocompleteInput input(u"",
                          metrics::OmniboxEventProto::PageClassification::
                              OmniboxEventProto_PageClassification_ANDROID_HUB,
                          TestSchemeClassifier());
  open_tab_provider().Start(input, /* minimal_changes= */ false);

#if BUILDFLAG(IS_ANDROID)
  ASSERT_EQ(3UL, open_tab_provider().matches().size());
  auto match1 = open_tab_provider().matches()[0];
  auto match2 = open_tab_provider().matches()[1];
  auto match3 = open_tab_provider().matches()[2];
  ASSERT_GT(match1.relevance, match2.relevance);
  ASSERT_GT(match3.relevance, match1.relevance);
#else
  ASSERT_EQ(0UL, open_tab_provider().matches().size());
#endif
}
