blob: f5c5a9b8768a6d593543dfa5eed312c8c3a02250 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/views/controls/separator.h"
#include <memory>
#include "base/memory/raw_ptr.h"
#include "ui/color/color_id.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/image/image_unittest_util.h"
#include "ui/views/border.h"
#include "ui/views/test/views_test_base.h"
namespace views {
// Base test fixture for Separator tests.
class SeparatorTest : public ViewsTestBase {
public:
SeparatorTest() = default;
SeparatorTest(const SeparatorTest&) = delete;
SeparatorTest& operator=(const SeparatorTest&) = delete;
~SeparatorTest() override = default;
protected:
// views::ViewsTestBase:
void SetUp() override;
void TearDown() override;
SkBitmap PaintToCanvas(float image_scale);
void ExpectDrawAtLeastOnePixel(float image_scale);
std::unique_ptr<Widget> widget_;
raw_ptr<Separator> separator_ = nullptr;
SkColor expected_foreground_color_ = gfx::kPlaceholderColor;
static const SkColor kBackgroundColor;
static const ui::ColorId kForegroundColorId;
static const gfx::Size kTestImageSize;
};
const SkColor SeparatorTest::kBackgroundColor = SK_ColorRED;
const ui::ColorId SeparatorTest::kForegroundColorId = ui::kColorSeparator;
const gfx::Size SeparatorTest::kTestImageSize{24, 24};
void SeparatorTest::SetUp() {
ViewsTestBase::SetUp();
widget_ = CreateTestWidget(Widget::InitParams::CLIENT_OWNS_WIDGET);
separator_ = widget_->SetContentsView(std::make_unique<Separator>());
expected_foreground_color_ =
widget_->GetColorProvider()->GetColor(kForegroundColorId);
}
void SeparatorTest::TearDown() {
separator_ = nullptr;
widget_.reset();
ViewsTestBase::TearDown();
}
SkBitmap SeparatorTest::PaintToCanvas(float image_scale) {
gfx::Canvas canvas(kTestImageSize, image_scale, true);
canvas.DrawColor(kBackgroundColor);
separator_->OnPaint(&canvas);
return canvas.GetBitmap();
}
void SeparatorTest::ExpectDrawAtLeastOnePixel(float image_scale) {
SkBitmap painted = PaintToCanvas(image_scale);
gfx::Canvas unpainted(kTestImageSize, image_scale, true);
unpainted.DrawColor(kBackgroundColor);
// At least 1 pixel should be changed.
EXPECT_FALSE(gfx::test::AreBitmapsEqual(painted, unpainted.GetBitmap()));
}
TEST_F(SeparatorTest, GetPreferredSize_VerticalOrientation) {
// Orientation is vertical by default.
constexpr int kLength = 8;
separator_->SetPreferredLength(kLength);
EXPECT_EQ(separator_->GetPreferredSize({}),
gfx::Size(Separator::kThickness, kLength));
}
TEST_F(SeparatorTest, GetPreferredSize_HorizontalOrientation) {
constexpr int kLength = 8;
separator_->SetOrientation(Separator::Orientation::kHorizontal);
separator_->SetPreferredLength(kLength);
EXPECT_EQ(separator_->GetPreferredSize({}),
gfx::Size(kLength, Separator::kThickness));
}
TEST_F(SeparatorTest, ImageScaleBelowOne) {
// Vertical line with 1[dp] thickness by default.
separator_->SetPreferredLength(8);
ExpectDrawAtLeastOnePixel(0.4);
}
TEST_F(SeparatorTest, ImageScaleBelowOne_HorizontalLine) {
const int kThickness = 1;
// Use Separator as a horizontal line with 1[dp] thickness.
separator_->SetBounds(4, 5, 8, kThickness);
ExpectDrawAtLeastOnePixel(0.4);
}
TEST_F(SeparatorTest, Paint_NoInsets_FillsCanvas_Scale100) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 9));
EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 9));
EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 0));
}
TEST_F(SeparatorTest, Paint_NoInsets_FillsCanvas_Scale125) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 12));
EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 12));
EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 0));
}
TEST_F(SeparatorTest, Paint_NoInsets_FillsCanvas_Scale150) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
SkBitmap painted = PaintToCanvas(1.5f);
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 14));
EXPECT_EQ(expected_foreground_color_, painted.getColor(14, 14));
EXPECT_EQ(expected_foreground_color_, painted.getColor(14, 0));
}
TEST_F(SeparatorTest, Paint_TopInset_Scale100) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(1, 0, 0, 0)));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 1));
EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 1));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 9));
EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 9));
}
TEST_F(SeparatorTest, Paint_TopInset_Scale125) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(1, 0, 0, 0)));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 1));
EXPECT_EQ(kBackgroundColor, painted.getColor(12, 1));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 2));
EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 2));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 12));
EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 12));
}
TEST_F(SeparatorTest, Paint_LeftInset_Scale100) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 1, 0, 0)));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 9));
EXPECT_EQ(expected_foreground_color_, painted.getColor(1, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(1, 9));
EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 9));
}
TEST_F(SeparatorTest, Paint_LeftInset_Scale125) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 1, 0, 0)));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(kBackgroundColor, painted.getColor(1, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(1, 12));
EXPECT_EQ(expected_foreground_color_, painted.getColor(2, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(2, 12));
EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 12));
}
TEST_F(SeparatorTest, Paint_BottomInset_Scale100) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 0, 1, 0)));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 8));
EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 8));
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 9));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 9));
}
TEST_F(SeparatorTest, Paint_BottomInset_Scale125) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 0, 1, 0)));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 10));
EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 10));
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 11));
EXPECT_EQ(kBackgroundColor, painted.getColor(12, 11));
}
TEST_F(SeparatorTest, Paint_RightInset_Scale100) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 0, 0, 1)));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 9));
EXPECT_EQ(expected_foreground_color_, painted.getColor(8, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(8, 9));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 9));
}
TEST_F(SeparatorTest, Paint_RightInset_Scale125) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 0, 0, 1)));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 12));
EXPECT_EQ(expected_foreground_color_, painted.getColor(10, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(10, 12));
EXPECT_EQ(kBackgroundColor, painted.getColor(11, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(11, 12));
}
TEST_F(SeparatorTest, Paint_Vertical_Scale100) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 4, 0, 5)));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kBackgroundColor, painted.getColor(3, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(3, 9));
EXPECT_EQ(expected_foreground_color_, painted.getColor(4, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(4, 9));
EXPECT_EQ(kBackgroundColor, painted.getColor(5, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(5, 9));
}
TEST_F(SeparatorTest, Paint_Vertical_Scale125) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(0, 4, 0, 5)));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(kBackgroundColor, painted.getColor(4, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(4, 12));
EXPECT_EQ(expected_foreground_color_, painted.getColor(5, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(5, 12));
EXPECT_EQ(kBackgroundColor, painted.getColor(6, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(6, 12));
}
TEST_F(SeparatorTest, Paint_Horizontal_Scale100) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(4, 0, 5, 0)));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 3));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 3));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 4));
EXPECT_EQ(expected_foreground_color_, painted.getColor(9, 4));
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 5));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 5));
}
TEST_F(SeparatorTest, Paint_Horizontal_Scale125) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(4, 0, 5, 0)));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 4));
EXPECT_EQ(kBackgroundColor, painted.getColor(12, 4));
EXPECT_EQ(expected_foreground_color_, painted.getColor(0, 5));
EXPECT_EQ(expected_foreground_color_, painted.getColor(12, 5));
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 6));
EXPECT_EQ(kBackgroundColor, painted.getColor(12, 6));
}
// Ensure that the separator is always at least 1px, even if insets would reduce
// it to zero.
TEST_F(SeparatorTest, Paint_MinimumSize_Scale100) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(5, 5, 5, 5)));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(expected_foreground_color_, painted.getColor(5, 5));
EXPECT_EQ(kBackgroundColor, painted.getColor(4, 5));
EXPECT_EQ(kBackgroundColor, painted.getColor(5, 4));
EXPECT_EQ(kBackgroundColor, painted.getColor(5, 6));
EXPECT_EQ(kBackgroundColor, painted.getColor(6, 5));
}
// Ensure that the separator is always at least 1px, even if insets would reduce
// it to zero (with scale factor > 1).
TEST_F(SeparatorTest, Paint_MinimumSize_Scale125) {
separator_->SetSize({10, 10});
separator_->SetColorId(kForegroundColorId);
separator_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(5, 5, 5, 5)));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(expected_foreground_color_, painted.getColor(7, 7));
EXPECT_EQ(kBackgroundColor, painted.getColor(6, 7));
EXPECT_EQ(kBackgroundColor, painted.getColor(7, 6));
EXPECT_EQ(kBackgroundColor, painted.getColor(7, 8));
EXPECT_EQ(kBackgroundColor, painted.getColor(8, 7));
}
TEST_F(SeparatorTest, Paint_BorderRadius) {
separator_->SetSize({10, 10});
separator_->SetBorderRadius(10);
separator_->SetColorId(kForegroundColorId);
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 0));
EXPECT_EQ(kBackgroundColor, painted.getColor(0, 9));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 9));
EXPECT_EQ(kBackgroundColor, painted.getColor(9, 0));
EXPECT_EQ(expected_foreground_color_, painted.getColor(5, 5));
}
} // namespace views