#include "ash/clipboard/clipboard_history_item.h"
#include "ash/clipboard/clipboard_history_util.h"
#include "ash/clipboard/test_support/clipboard_history_item_builder.h"
#include "ash/test/ash_test_base.h"
#include "base/files/file_path.h"
#include "base/strings/string_util.h"
#include "base/test/icu_test_util.h"
#include "base/test/mock_callback.h"
#include "chromeos/crosapi/mojom/clipboard_history.mojom.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/clipboard/clipboard_data.h"
#include "ui/base/clipboard/file_info.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/image_model.h"
#include "ui/gfx/image/image_unittest_util.h"
#include "ui/strings/grit/ui_strings.h"
namespace ash {
namespace {
using ::testing::Bool;
using ::testing::Combine;
using ::testing::Optional;
using ::testing::Values;
using ::testing::WithParamInterface;
struct FormatPair {
ui::ClipboardInternalFormat clipboard_format;
crosapi::mojom::ClipboardHistoryDisplayFormat display_format;
};
}
using ClipboardHistoryItemTest = AshTestBase;
TEST_F(ClipboardHistoryItemTest, SetDisplayImageNotifiesCallback) {
ClipboardHistoryItemBuilder builder;
builder.SetFormat(ui::ClipboardInternalFormat::kHtml);
ClipboardHistoryItem item = builder.Build();
EXPECT_EQ(item.display_format(),
crosapi::mojom::ClipboardHistoryDisplayFormat::kHtml);
ASSERT_TRUE(item.display_image().has_value());
EXPECT_EQ(item.display_image().value(),
clipboard_history_util::GetHtmlPreviewPlaceholder());
{
SCOPED_TRACE("Set a callback that is run.");
base::MockCallback<base::RepeatingClosure> callback;
auto subscription = item.AddDisplayImageUpdatedCallback(callback.Get());
EXPECT_CALL(callback, Run());
item.SetDisplayImage(
ui::ImageModel::FromImage(gfx::test::CreateImage(100, 50)));
EXPECT_NE(item.display_image().value(),
clipboard_history_util::GetHtmlPreviewPlaceholder());
}
{
SCOPED_TRACE("Set a callback that is not run because the item was copied.");
base::MockCallback<base::RepeatingClosure> callback;
auto subscription = item.AddDisplayImageUpdatedCallback(callback.Get());
EXPECT_CALL(callback, Run()).Times(0);
ClipboardHistoryItem copied_item(item);
copied_item.SetDisplayImage(
ui::ImageModel::FromImage(gfx::test::CreateImage(100, 50)));
}
{
SCOPED_TRACE("Set a callback that is not run because the item was moved.");
base::MockCallback<base::RepeatingClosure> callback;
auto subscription = item.AddDisplayImageUpdatedCallback(callback.Get());
EXPECT_CALL(callback, Run()).Times(0);
ClipboardHistoryItem moved_item(std::move(item));
moved_item.SetDisplayImage(
ui::ImageModel::FromImage(gfx::test::CreateImage(100, 50)));
}
}
TEST_F(ClipboardHistoryItemTest, DisplayText) {
base::test::ScopedRestoreICUDefaultLocale locale("en_US");
ClipboardHistoryItemBuilder builder;
builder.SetText("Text")
.SetMarkup("HTML with no image or table tags")
.SetRtf("Rtf")
.SetFilenames({ui::FileInfo(base::FilePath("/path/to/File.txt"),
base::FilePath("File.txt")),
ui::FileInfo(base::FilePath("/path/to/Other%20File.txt"),
base::FilePath("Other%20File.txt"))})
.SetBookmarkTitle("Bookmark Title")
.SetPng(gfx::test::CreatePNGBytes(10))
.SetFileSystemData({u"/path/to/Third%20File.txt"})
.SetWebSmartPaste(true);
EXPECT_EQ(builder.Build().display_text(),
l10n_util::GetStringUTF16(IDS_CLIPBOARD_MENU_IMAGE));
builder.ClearPng();
EXPECT_EQ(builder.Build().display_text(), u"Text");
builder.ClearText();
EXPECT_EQ(builder.Build().display_text(),
l10n_util::GetStringUTF16(IDS_CLIPBOARD_MENU_HTML));
builder.SetText("Text");
builder.ClearMarkup();
EXPECT_EQ(builder.Build().display_text(), u"Text");
builder.ClearText();
EXPECT_EQ(builder.Build().display_text(),
l10n_util::GetStringUTF16(IDS_CLIPBOARD_MENU_RTF_CONTENT));
builder.ClearRtf();
EXPECT_EQ(builder.Build().display_text(), u"2 files");
builder.ClearFilenames();
EXPECT_EQ(builder.Build().display_text(), u"Bookmark Title");
builder.ClearBookmarkTitle();
EXPECT_EQ(builder.Build().display_text(),
l10n_util::GetStringUTF16(IDS_CLIPBOARD_MENU_WEB_SMART_PASTE));
builder.ClearWebSmartPaste();
EXPECT_EQ(builder.Build().display_text(), u"Third File.txt");
}
class ClipboardHistoryItemDisplayFormatTest
: public ClipboardHistoryItemTest,
public WithParamInterface<FormatPair> {
public:
ClipboardHistoryItemDisplayFormatTest() = default;
ClipboardHistoryItem BuildClipboardHistoryItem() const {
ClipboardHistoryItemBuilder builder;
builder.SetFormat(GetClipboardFormat());
ClipboardHistoryItem item = builder.Build();
EXPECT_EQ(item.display_format(), GetDisplayFormat());
return item;
}
ui::ClipboardInternalFormat GetClipboardFormat() const {
return GetParam().clipboard_format;
}
crosapi::mojom::ClipboardHistoryDisplayFormat GetDisplayFormat() const {
return GetParam().display_format;
}
};
INSTANTIATE_TEST_SUITE_P(
All,
ClipboardHistoryItemDisplayFormatTest,
Values(FormatPair{ui::ClipboardInternalFormat::kText,
crosapi::mojom::ClipboardHistoryDisplayFormat::kText},
FormatPair{ui::ClipboardInternalFormat::kPng,
crosapi::mojom::ClipboardHistoryDisplayFormat::kPng},
FormatPair{ui::ClipboardInternalFormat::kHtml,
crosapi::mojom::ClipboardHistoryDisplayFormat::kHtml},
FormatPair{ui::ClipboardInternalFormat::kFilenames,
crosapi::mojom::ClipboardHistoryDisplayFormat::kFile}));
TEST_P(ClipboardHistoryItemDisplayFormatTest, Icon) {
const auto item = BuildClipboardHistoryItem();
const auto& maybe_icon = item.icon();
ASSERT_TRUE(maybe_icon.has_value());
EXPECT_TRUE(maybe_icon.value().IsVectorIcon());
}
TEST_P(ClipboardHistoryItemDisplayFormatTest, DisplayImage) {
const auto item = BuildClipboardHistoryItem();
const auto& maybe_image = item.display_image();
switch (GetDisplayFormat()) {
case crosapi::mojom::ClipboardHistoryDisplayFormat::kUnknown:
NOTREACHED();
case crosapi::mojom::ClipboardHistoryDisplayFormat::kText:
case crosapi::mojom::ClipboardHistoryDisplayFormat::kFile:
EXPECT_FALSE(maybe_image);
break;
case crosapi::mojom::ClipboardHistoryDisplayFormat::kPng:
ASSERT_TRUE(maybe_image);
EXPECT_TRUE(maybe_image.value().IsImage());
break;
case crosapi::mojom::ClipboardHistoryDisplayFormat::kHtml:
EXPECT_THAT(
maybe_image,
Optional(clipboard_history_util::GetHtmlPreviewPlaceholder()));
break;
}
}
}