// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/omnibox/browser/clipboard_url_provider.h"

#include <memory>
#include <string>

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "components/omnibox/browser/autocomplete_input.h"
#include "components/omnibox/browser/mock_autocomplete_provider_client.h"
#include "components/omnibox/browser/test_scheme_classifier.h"
#include "components/open_from_clipboard/fake_clipboard_recent_content.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"

namespace {

const char kCurrentURL[] = "http://example.com/current";
const char kClipboardURL[] = "http://example.com/clipboard";

class ClipboardURLProviderTest : public testing::Test {
 public:
  ClipboardURLProviderTest()
      : client_(new testing::NiceMock<MockAutocompleteProviderClient>()),
        provider_(new ClipboardURLProvider(client_.get(), nullptr,
                                           &clipboard_content_)) {
    SetClipboardUrl(GURL(kClipboardURL));
  }

  ~ClipboardURLProviderTest() override {}

  void ClearClipboard() { clipboard_content_.SuppressClipboardContent(); }

  void SetClipboardUrl(const GURL& url) {
    clipboard_content_.SetClipboardContent(url,
                                           base::TimeDelta::FromMinutes(10));
  }

  AutocompleteInput CreateAutocompleteInput(bool from_omnibox_focus) {
    return AutocompleteInput(base::string16(), base::string16::npos,
                             std::string(), GURL(kCurrentURL), base::string16(),
                             metrics::OmniboxEventProto::INVALID_SPEC, false,
                             false, false, false, from_omnibox_focus,
                             classifier_);
  }

 protected:
  TestSchemeClassifier classifier_;
  FakeClipboardRecentContent clipboard_content_;
  std::unique_ptr<testing::NiceMock<MockAutocompleteProviderClient>> client_;
  scoped_refptr<ClipboardURLProvider> provider_;
};

TEST_F(ClipboardURLProviderTest, NotFromOmniboxFocus) {
  provider_->Start(CreateAutocompleteInput(false), false);
  EXPECT_TRUE(provider_->matches().empty());
}

TEST_F(ClipboardURLProviderTest, EmptyClipboard) {
  ClearClipboard();
  provider_->Start(CreateAutocompleteInput(true), false);
  EXPECT_TRUE(provider_->matches().empty());
}

TEST_F(ClipboardURLProviderTest, ClipboardIsCurrentURL) {
  SetClipboardUrl(GURL(kCurrentURL));
  provider_->Start(CreateAutocompleteInput(true), false);
  EXPECT_TRUE(provider_->matches().empty());
}

TEST_F(ClipboardURLProviderTest, HasMultipleMatches) {
  provider_->Start(CreateAutocompleteInput(true), false);
  ASSERT_GE(provider_->matches().size(), 1U);
  EXPECT_EQ(GURL(kClipboardURL), provider_->matches().back().destination_url);
}

}  // namespace
