// Copyright 2014 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/dom_distiller/core/viewer.h"

#include "components/dom_distiller/core/distilled_page_prefs.h"
#include "components/dom_distiller/core/dom_distiller_service.h"
#include "components/dom_distiller/core/dom_distiller_test_util.h"
#include "components/dom_distiller/core/task_tracker.h"
#include "components/dom_distiller/core/url_constants.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace dom_distiller {

const char kTestScheme[] = "myscheme";

class FakeViewRequestDelegate : public ViewRequestDelegate {
 public:
  ~FakeViewRequestDelegate() override {}
  MOCK_METHOD1(OnArticleReady, void(const DistilledArticleProto* proto));
  MOCK_METHOD1(OnArticleUpdated,
               void(ArticleDistillationUpdate article_update));
};

class TestDomDistillerService : public DomDistillerServiceInterface {
 public:
  TestDomDistillerService() {}
  ~TestDomDistillerService() override {}

  MOCK_CONST_METHOD0(GetSyncableService, syncer::SyncableService*());
  MOCK_METHOD3(AddToList,
               const std::string(const GURL&,
                                 DistillerPage*,
                                 const ArticleAvailableCallback&));
  const std::string AddToList(
      const GURL& url,
      scoped_ptr<DistillerPage> distiller_page,
      const ArticleAvailableCallback& article_cb) override {
    return AddToList(url, distiller_page.get(), article_cb);
  }
  MOCK_METHOD1(HasEntry, bool(const std::string&));
  MOCK_METHOD1(GetUrlForEntry, std::string(const std::string&));
  MOCK_CONST_METHOD0(GetEntries, std::vector<ArticleEntry>());
  MOCK_METHOD1(AddObserver, void(DomDistillerObserver*));
  MOCK_METHOD1(RemoveObserver, void(DomDistillerObserver*));
  MOCK_METHOD0(ViewUrlImpl, ViewerHandle*());
  scoped_ptr<ViewerHandle> ViewUrl(
      ViewRequestDelegate*,
      scoped_ptr<DistillerPage> distiller_page,
      const GURL&) override {
    return scoped_ptr<ViewerHandle>(ViewUrlImpl());
  }
  MOCK_METHOD0(ViewEntryImpl, ViewerHandle*());
  scoped_ptr<ViewerHandle> ViewEntry(
      ViewRequestDelegate*,
      scoped_ptr<DistillerPage> distiller_page,
      const std::string&) override {
    return scoped_ptr<ViewerHandle>(ViewEntryImpl());
  }
  MOCK_METHOD0(RemoveEntryImpl, ArticleEntry*());
  scoped_ptr<ArticleEntry> RemoveEntry(const std::string&) override {
    return scoped_ptr<ArticleEntry>(RemoveEntryImpl());
  }
  scoped_ptr<DistillerPage> CreateDefaultDistillerPage(
      const gfx::Size& render_view_size) override {
    return scoped_ptr<DistillerPage>();
  }
  scoped_ptr<DistillerPage> CreateDefaultDistillerPageWithHandle(
      scoped_ptr<SourcePageHandle> handle) override {
    return scoped_ptr<DistillerPage>();
  }
  DistilledPagePrefs* GetDistilledPagePrefs() override;
};

class DomDistillerViewerTest : public testing::Test {
 public:
  void SetUp() override { service_.reset(new TestDomDistillerService()); }

 protected:
  scoped_ptr<ViewerHandle> CreateViewRequest(
      const std::string& path,
      ViewRequestDelegate* view_request_delegate) {
    return viewer::CreateViewRequest(
        service_.get(), path, view_request_delegate, gfx::Size());
  }

  scoped_ptr<TestDomDistillerService> service_;
};

TEST_F(DomDistillerViewerTest, TestCreatingViewUrlRequest) {
  scoped_ptr<FakeViewRequestDelegate> view_request_delegate(
      new FakeViewRequestDelegate());
  ViewerHandle* viewer_handle(new ViewerHandle(ViewerHandle::CancelCallback()));
  EXPECT_CALL(*service_.get(), ViewUrlImpl())
      .WillOnce(testing::Return(viewer_handle));
  EXPECT_CALL(*service_.get(), ViewEntryImpl()).Times(0);
  CreateViewRequest(
      std::string("?") + kUrlKey + "=http%3A%2F%2Fwww.example.com%2F",
      view_request_delegate.get());
}

TEST_F(DomDistillerViewerTest, TestCreatingViewEntryRequest) {
  scoped_ptr<FakeViewRequestDelegate> view_request_delegate(
      new FakeViewRequestDelegate());
  ViewerHandle* viewer_handle(new ViewerHandle(ViewerHandle::CancelCallback()));
  EXPECT_CALL(*service_.get(), ViewEntryImpl())
      .WillOnce(testing::Return(viewer_handle));
  EXPECT_CALL(*service_.get(), ViewUrlImpl()).Times(0);
  CreateViewRequest(std::string("?") + kEntryIdKey + "=abc-def",
                    view_request_delegate.get());
}

TEST_F(DomDistillerViewerTest, TestCreatingInvalidViewRequest) {
  scoped_ptr<FakeViewRequestDelegate> view_request_delegate(
      new FakeViewRequestDelegate());
  EXPECT_CALL(*service_.get(), ViewEntryImpl()).Times(0);
  EXPECT_CALL(*service_.get(), ViewUrlImpl()).Times(0);
  // Specify none of the required query parameters.
  CreateViewRequest("?foo=bar", view_request_delegate.get());
  // Specify both of the required query parameters.
  CreateViewRequest("?" + std::string(kUrlKey) +
                        "=http%3A%2F%2Fwww.example.com%2F&" +
                        std::string(kEntryIdKey) + "=abc-def",
                    view_request_delegate.get());
  // Specify an internal Chrome page.
  CreateViewRequest("?" + std::string(kUrlKey) + "=chrome%3A%2F%2Fsettings%2F",
                    view_request_delegate.get());
  // Specify a recursive URL.
  CreateViewRequest("?" + std::string(kUrlKey) + "=" +
                        std::string(kTestScheme) + "%3A%2F%2Fabc-def%2F",
                    view_request_delegate.get());
}

DistilledPagePrefs* TestDomDistillerService::GetDistilledPagePrefs() {
  return NULL;
}

TEST_F(DomDistillerViewerTest, TestGetDistilledPageThemeJsOutput) {
  std::string kDarkJs = "useTheme('dark');";
  std::string kSepiaJs = "useTheme('sepia');";
  std::string kLightJs = "useTheme('light');";
  EXPECT_EQ(kDarkJs.compare(viewer::GetDistilledPageThemeJs(
                DistilledPagePrefs::DARK)),
            0);
  EXPECT_EQ(kLightJs.compare(viewer::GetDistilledPageThemeJs(
                DistilledPagePrefs::LIGHT)),
            0);
  EXPECT_EQ(kSepiaJs.compare(viewer::GetDistilledPageThemeJs(
                DistilledPagePrefs::SEPIA)),
            0);
}

TEST_F(DomDistillerViewerTest, TestGetDistilledPageFontFamilyJsOutput) {
  std::string kSerifJsFontFamily = "useFontFamily('serif');";
  std::string kMonospaceJsFontFamily = "useFontFamily('monospace');";
  std::string kSansSerifJsFontFamily = "useFontFamily('sans-serif');";
  EXPECT_EQ(kSerifJsFontFamily.compare(viewer::GetDistilledPageFontFamilyJs(
                DistilledPagePrefs::SERIF)),
            0);
  EXPECT_EQ(kMonospaceJsFontFamily.compare(viewer::GetDistilledPageFontFamilyJs(
                DistilledPagePrefs::MONOSPACE)),
            0);
  EXPECT_EQ(kSansSerifJsFontFamily.compare(viewer::GetDistilledPageFontFamilyJs(
                DistilledPagePrefs::SANS_SERIF)),
            0);
}

}  // namespace dom_distiller
