#include <memory>
#include "ash/shell.h"
#include "ash/test/ash_test_base.h"
#include "ash/test/pixel/ash_pixel_differ.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_type.h"
#include "ui/display/screen.h"
#include "ui/gfx/geometry/size.h"
#include "ui/views/widget/widget.h"
namespace {
constexpr gfx::Size kWidgetSize(50, 50);
}
namespace ash {
class DemoAshPixelDiffTest : public AshTestBase {
public:
std::optional<pixel_test::InitParams> CreatePixelTestInitParams()
const override {
return pixel_test::InitParams();
}
std::unique_ptr<views::Widget> CreateWidgetInSolidColor(
int64_t display_id,
const gfx::Rect& widget_bounds,
SkColor color) {
aura::Window* const root_window =
Shell::Get()->GetRootWindowForDisplayId(display_id);
CHECK(root_window);
auto widget = std::make_unique<views::Widget>();
views::Widget::InitParams init_params(
views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET,
views::Widget::InitParams::TYPE_POPUP);
init_params.bounds = gfx::Rect(widget_bounds);
init_params.parent = root_window;
widget->Init(std::move(init_params));
widget->Show();
auto contents_view = std::make_unique<views::View>();
contents_view->SetPaintToLayer(ui::LAYER_SOLID_COLOR);
contents_view->layer()->SetColor(color);
widget->SetContentsView(std::move(contents_view));
return widget;
}
std::vector<std::unique_ptr<views::Widget>> CreateWidgetsInCorners(
const display::Display& display) {
const gfx::Rect display_bounds = display.bounds();
CHECK(display_bounds.width() >= 2 * kWidgetSize.width() &&
display_bounds.height() >= 2 * kWidgetSize.height());
std::vector<std::unique_ptr<views::Widget>> widgets;
const int64_t display_id = display.id();
widgets.push_back(CreateWidgetInSolidColor(
display_id, gfx::Rect(kWidgetSize), SK_ColorGRAY));
widgets.push_back(CreateWidgetInSolidColor(
display_id,
gfx::Rect(gfx::Point(display_bounds.width() - kWidgetSize.width(), 0),
kWidgetSize),
SK_ColorGREEN));
widgets.push_back(CreateWidgetInSolidColor(
display_id,
gfx::Rect(gfx::Point(display_bounds.width() - kWidgetSize.width(),
display_bounds.height() - kWidgetSize.height()),
kWidgetSize),
SK_ColorBLUE));
widgets.push_back(CreateWidgetInSolidColor(
display_id,
gfx::Rect(gfx::Point(0, display_bounds.height() - kWidgetSize.height()),
kWidgetSize),
SK_ColorYELLOW));
return widgets;
}
};
TEST_F(DemoAshPixelDiffTest, VerifyTopLevelWidgets) {
const auto widgets = CreateWidgetsInCorners(GetPrimaryDisplay());
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
"check_widgets",
2, widgets[0].get(), widgets[1].get(),
widgets[2].get(), widgets[3].get()));
}
TEST_F(DemoAshPixelDiffTest, VerifyTopLevelWidgetsForNonDefaultDSF) {
UpdateDisplay("800x600*2");
const auto widgets = CreateWidgetsInCorners(GetPrimaryDisplay());
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
"check_widgets",
0, widgets[0].get(), widgets[1].get(),
widgets[2].get(), widgets[3].get()));
}
TEST_F(DemoAshPixelDiffTest,
VerifyTopLevelWidgetsOnPrimaryDisplay_SecondaryDisplayHasNonDefaultDSF) {
UpdateDisplay("800x600*1,800x600*2");
const auto widgets = CreateWidgetsInCorners(GetPrimaryDisplay());
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
"check_widgets",
0, widgets[0].get(), widgets[1].get(),
widgets[2].get(), widgets[3].get()));
}
TEST_F(DemoAshPixelDiffTest, VerifyTopLevelWidgetsOnSecondaryDisplay) {
UpdateDisplay("800x600*1,800x600*1");
const auto widgets = CreateWidgetsInCorners(GetSecondaryDisplay());
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnSecondaryScreen(
"check_widgets",
0, widgets[0].get(), widgets[1].get(),
widgets[2].get(), widgets[3].get()));
}
TEST_F(
DemoAshPixelDiffTest,
VerifyTopLevelWidgetsOnSecondaryDisplay_SecondaryDisplayHasNonDefaultDSF) {
UpdateDisplay("800x600*1,800x600*2");
const auto widgets = CreateWidgetsInCorners(GetSecondaryDisplay());
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnSecondaryScreen(
"check_widgets",
0, widgets[0].get(), widgets[1].get(),
widgets[2].get(), widgets[3].get()));
}
TEST_F(DemoAshPixelDiffTest,
VerifyTopLevelWidgetsOnSecondaryDisplay_BothDisplaysHaveNonDefaultDSF) {
UpdateDisplay("800x600*2,800x600*2");
const auto widgets = CreateWidgetsInCorners(GetSecondaryDisplay());
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnSecondaryScreen(
"check_widgets",
0, widgets[0].get(), widgets[1].get(),
widgets[2].get(), widgets[3].get()));
}
}