blob: 20db4de0fc8cfaf9729d217b613e8314aaac7cb4 [file] [log] [blame]
// Copyright 2018 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 "ui/views/controls/separator.h"
#include "ui/gfx/canvas.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 views::ViewsTestBase {
public:
SeparatorTest() = default;
~SeparatorTest() override = default;
protected:
void ExpectDrawAtLeastOnePixel(float image_scale);
SkBitmap PaintToCanvas(float image_scale);
Separator separator_;
static const SkColor kBackgroundColor;
static const SkColor kForegroundColor;
static const gfx::Size kTestImageSize;
private:
DISALLOW_COPY_AND_ASSIGN(SeparatorTest);
};
const SkColor SeparatorTest::kBackgroundColor = SK_ColorRED;
const SkColor SeparatorTest::kForegroundColor = SK_ColorGRAY;
const gfx::Size SeparatorTest::kTestImageSize{24, 24};
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, ImageScaleBelowOne) {
// Vertical line with 1[dp] thickness by default.
separator_.SetPreferredHeight(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_.SetColor(kForegroundColor);
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(0, 9));
EXPECT_EQ(kForegroundColor, painted.getColor(9, 9));
EXPECT_EQ(kForegroundColor, painted.getColor(9, 0));
}
TEST_F(SeparatorTest, Paint_NoInsets_FillsCanvas_Scale125) {
separator_.SetSize({10, 10});
separator_.SetColor(kForegroundColor);
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(0, 12));
EXPECT_EQ(kForegroundColor, painted.getColor(12, 12));
EXPECT_EQ(kForegroundColor, painted.getColor(12, 0));
}
TEST_F(SeparatorTest, Paint_NoInsets_FillsCanvas_Scale150) {
separator_.SetSize({10, 10});
separator_.SetColor(kForegroundColor);
SkBitmap painted = PaintToCanvas(1.5f);
EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(0, 14));
EXPECT_EQ(kForegroundColor, painted.getColor(14, 14));
EXPECT_EQ(kForegroundColor, painted.getColor(14, 0));
}
TEST_F(SeparatorTest, Paint_TopInset_Scale100) {
separator_.SetSize({10, 10});
separator_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(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(kForegroundColor, painted.getColor(0, 1));
EXPECT_EQ(kForegroundColor, painted.getColor(9, 1));
EXPECT_EQ(kForegroundColor, painted.getColor(0, 9));
EXPECT_EQ(kForegroundColor, painted.getColor(9, 9));
}
TEST_F(SeparatorTest, Paint_TopInset_Scale125) {
separator_.SetSize({10, 10});
separator_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(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(kForegroundColor, painted.getColor(0, 2));
EXPECT_EQ(kForegroundColor, painted.getColor(12, 2));
EXPECT_EQ(kForegroundColor, painted.getColor(0, 12));
EXPECT_EQ(kForegroundColor, painted.getColor(12, 12));
}
TEST_F(SeparatorTest, Paint_LeftInset_Scale100) {
separator_.SetSize({10, 10});
separator_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(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(kForegroundColor, painted.getColor(1, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(1, 9));
EXPECT_EQ(kForegroundColor, painted.getColor(9, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(9, 9));
}
TEST_F(SeparatorTest, Paint_LeftInset_Scale125) {
separator_.SetSize({10, 10});
separator_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(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(kForegroundColor, painted.getColor(2, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(2, 12));
EXPECT_EQ(kForegroundColor, painted.getColor(12, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(12, 12));
}
TEST_F(SeparatorTest, Paint_BottomInset_Scale100) {
separator_.SetSize({10, 10});
separator_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(0, 0, 1, 0));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(9, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(0, 8));
EXPECT_EQ(kForegroundColor, 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_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(0, 0, 1, 0));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(12, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(0, 10));
EXPECT_EQ(kForegroundColor, 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_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(0, 0, 0, 1));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(0, 9));
EXPECT_EQ(kForegroundColor, painted.getColor(8, 0));
EXPECT_EQ(kForegroundColor, 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_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(0, 0, 0, 1));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(kForegroundColor, painted.getColor(0, 0));
EXPECT_EQ(kForegroundColor, painted.getColor(0, 12));
EXPECT_EQ(kForegroundColor, painted.getColor(10, 0));
EXPECT_EQ(kForegroundColor, 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_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(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(kForegroundColor, painted.getColor(4, 0));
EXPECT_EQ(kForegroundColor, 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_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(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(kForegroundColor, painted.getColor(5, 0));
EXPECT_EQ(kForegroundColor, 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_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(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(kForegroundColor, painted.getColor(0, 4));
EXPECT_EQ(kForegroundColor, 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_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(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(kForegroundColor, painted.getColor(0, 5));
EXPECT_EQ(kForegroundColor, 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_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(5, 5, 5, 5));
SkBitmap painted = PaintToCanvas(1.0f);
EXPECT_EQ(kForegroundColor, 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_.SetColor(kForegroundColor);
separator_.SetBorder(CreateEmptyBorder(5, 5, 5, 5));
SkBitmap painted = PaintToCanvas(1.25f);
EXPECT_EQ(kForegroundColor, 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));
}
} // namespace views