// Copyright 2020 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 "chrome/browser/ui/font_access/font_access_chooser_controller.h"

#include "base/test/bind.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "components/permissions/mock_chooser_controller_view.h"
#include "content/public/test/test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/features.h"

class FontAccessChooserControllerTest : public ChromeRenderViewHostTestHarness {
 public:
  FontAccessChooserControllerTest() {
    scoped_feature_list_.InitAndEnableFeature(blink::features::kFontAccess);
  }

  void SetUp() override {
    ChromeRenderViewHostTestHarness::SetUp();
    mock_font_chooser_view_ =
        std::make_unique<permissions::MockChooserControllerView>();
  }

 protected:
  std::unique_ptr<permissions::MockChooserControllerView>
      mock_font_chooser_view_;
  base::test::ScopedFeatureList scoped_feature_list_;
};

TEST_F(FontAccessChooserControllerTest, MultiSelectTest) {
  base::RunLoop run_loop;
  FontAccessChooserController controller(
      main_rfh(), /*selection=*/std::vector<std::string>(),
      base::BindLambdaForTesting(
          [&](blink::mojom::FontEnumerationStatus status,
              std::vector<blink::mojom::FontMetadataPtr> items) {
            EXPECT_EQ(status, blink::mojom::FontEnumerationStatus::kOk);
            EXPECT_EQ(items.size(), 2u);
            run_loop.Quit();
          }));

  base::RunLoop readiness_loop;
  controller.SetReadyCallbackForTesting(readiness_loop.QuitClosure());
  readiness_loop.Run();

  controller.set_view(mock_font_chooser_view_.get());
  EXPECT_GT(controller.NumOptions(), 1u)
      << "FontAccessChooserController has more than 2 options";
  controller.Select(std::vector<size_t>({0, 1}));
  run_loop.Run();
}

TEST_F(FontAccessChooserControllerTest, CancelTest) {
  base::RunLoop run_loop;
  FontAccessChooserController controller(
      main_rfh(),
      /*selection=*/std::vector<std::string>(),
      base::BindLambdaForTesting(
          [&](blink::mojom::FontEnumerationStatus status,
              std::vector<blink::mojom::FontMetadataPtr> items) {
            EXPECT_EQ(status, blink::mojom::FontEnumerationStatus::kCanceled);
            EXPECT_EQ(items.size(), 0u);
            run_loop.Quit();
          }));

  base::RunLoop readiness_loop;
  controller.SetReadyCallbackForTesting(readiness_loop.QuitClosure());
  readiness_loop.Run();

  controller.set_view(mock_font_chooser_view_.get());
  controller.Cancel();
  run_loop.Run();
}

TEST_F(FontAccessChooserControllerTest, CloseTest) {
  base::RunLoop run_loop;
  FontAccessChooserController controller(
      main_rfh(),
      /*selection=*/std::vector<std::string>(),
      base::BindLambdaForTesting(
          [&](blink::mojom::FontEnumerationStatus status,
              std::vector<blink::mojom::FontMetadataPtr> items) {
            EXPECT_EQ(status, blink::mojom::FontEnumerationStatus::kCanceled);
            EXPECT_EQ(items.size(), 0u);
            run_loop.Quit();
          }));

  base::RunLoop readiness_loop;
  controller.SetReadyCallbackForTesting(readiness_loop.QuitClosure());
  readiness_loop.Run();

  controller.set_view(mock_font_chooser_view_.get());
  controller.Close();
  run_loop.Run();
}

TEST_F(FontAccessChooserControllerTest, DestructorTest) {
  base::RunLoop run_loop;
  std::unique_ptr<FontAccessChooserController> controller =
      std::make_unique<FontAccessChooserController>(
          main_rfh(),
          /*selection=*/std::vector<std::string>(),
          base::BindLambdaForTesting(
              [&](blink::mojom::FontEnumerationStatus status,
                  std::vector<blink::mojom::FontMetadataPtr> items) {
                EXPECT_EQ(
                    status,
                    blink::mojom::FontEnumerationStatus::kUnexpectedError);
                EXPECT_EQ(items.size(), 0u);
                run_loop.Quit();
              }));

  base::RunLoop readiness_loop;
  controller->SetReadyCallbackForTesting(readiness_loop.QuitClosure());
  readiness_loop.Run();

  controller.reset();
  run_loop.Run();
}
