1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "testing/gtest/include/gtest/gtest.h"
6 #include "ui/base/layout.h"
7 #include "ui/views/border.h"
8 #include "ui/views/controls/button/image_button.h"
9 #include "ui/views/test/views_test_base.h"
10
11 namespace {
12
CreateTestImage(int width,int height)13 gfx::ImageSkia CreateTestImage(int width, int height) {
14 SkBitmap bitmap;
15 bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height);
16 bitmap.allocPixels();
17 return gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
18 }
19
20 } // namespace
21
22 namespace views {
23
24 typedef ViewsTestBase ImageButtonTest;
25
TEST_F(ImageButtonTest,Basics)26 TEST_F(ImageButtonTest, Basics) {
27 ImageButton button(NULL);
28
29 // Our image to paint starts empty.
30 EXPECT_TRUE(button.GetImageToPaint().isNull());
31
32 // Without a theme, buttons are 16x14 by default.
33 EXPECT_EQ("16x14", button.GetPreferredSize().ToString());
34
35 // We can set a preferred size when we have no image.
36 button.SetPreferredSize(gfx::Size(5, 15));
37 EXPECT_EQ("5x15", button.GetPreferredSize().ToString());
38
39 // Set a normal image.
40 gfx::ImageSkia normal_image = CreateTestImage(10, 20);
41 button.SetImage(CustomButton::STATE_NORMAL, &normal_image);
42
43 // Image uses normal image for painting.
44 EXPECT_FALSE(button.GetImageToPaint().isNull());
45 EXPECT_EQ(10, button.GetImageToPaint().width());
46 EXPECT_EQ(20, button.GetImageToPaint().height());
47
48 // Preferred size is the normal button size.
49 EXPECT_EQ("10x20", button.GetPreferredSize().ToString());
50
51 // Set a pushed image.
52 gfx::ImageSkia pushed_image = CreateTestImage(11, 21);
53 button.SetImage(CustomButton::STATE_PRESSED, &pushed_image);
54
55 // By convention, preferred size doesn't change, even though pushed image
56 // is bigger.
57 EXPECT_EQ("10x20", button.GetPreferredSize().ToString());
58
59 // We're still painting the normal image.
60 EXPECT_FALSE(button.GetImageToPaint().isNull());
61 EXPECT_EQ(10, button.GetImageToPaint().width());
62 EXPECT_EQ(20, button.GetImageToPaint().height());
63
64 // Set an overlay image.
65 gfx::ImageSkia overlay_image = CreateTestImage(12, 22);
66 button.SetOverlayImage(&overlay_image);
67 EXPECT_EQ(12, button.overlay_image_.width());
68 EXPECT_EQ(22, button.overlay_image_.height());
69
70 // By convention, preferred size doesn't change, even though pushed image
71 // is bigger.
72 EXPECT_EQ("10x20", button.GetPreferredSize().ToString());
73
74 // We're still painting the normal image.
75 EXPECT_FALSE(button.GetImageToPaint().isNull());
76 EXPECT_EQ(10, button.GetImageToPaint().width());
77 EXPECT_EQ(20, button.GetImageToPaint().height());
78
79 // Reset the overlay image.
80 button.SetOverlayImage(NULL);
81 EXPECT_TRUE(button.overlay_image_.isNull());
82 }
83
TEST_F(ImageButtonTest,SetAndGetImage)84 TEST_F(ImageButtonTest, SetAndGetImage) {
85 ImageButton button(NULL);
86
87 // Images start as null.
88 EXPECT_TRUE(button.GetImage(Button::STATE_NORMAL).isNull());
89 EXPECT_TRUE(button.GetImage(Button::STATE_HOVERED).isNull());
90 EXPECT_TRUE(button.GetImage(Button::STATE_PRESSED).isNull());
91 EXPECT_TRUE(button.GetImage(Button::STATE_DISABLED).isNull());
92
93 // Setting images works as expected.
94 gfx::ImageSkia image1 = CreateTestImage(10, 11);
95 gfx::ImageSkia image2 = CreateTestImage(20, 21);
96 button.SetImage(Button::STATE_NORMAL, &image1);
97 button.SetImage(Button::STATE_HOVERED, &image2);
98 EXPECT_TRUE(
99 button.GetImage(Button::STATE_NORMAL).BackedBySameObjectAs(image1));
100 EXPECT_TRUE(
101 button.GetImage(Button::STATE_HOVERED).BackedBySameObjectAs(image2));
102 EXPECT_TRUE(button.GetImage(Button::STATE_PRESSED).isNull());
103 EXPECT_TRUE(button.GetImage(Button::STATE_DISABLED).isNull());
104
105 // ImageButton supports NULL image pointers.
106 button.SetImage(Button::STATE_NORMAL, NULL);
107 EXPECT_TRUE(button.GetImage(Button::STATE_NORMAL).isNull());
108 }
109
TEST_F(ImageButtonTest,ImagePositionWithBorder)110 TEST_F(ImageButtonTest, ImagePositionWithBorder) {
111 ImageButton button(NULL);
112 gfx::ImageSkia image = CreateTestImage(20, 30);
113 button.SetImage(CustomButton::STATE_NORMAL, &image);
114
115 // The image should be painted at the top-left corner.
116 EXPECT_EQ(gfx::Point().ToString(),
117 button.ComputeImagePaintPosition(image).ToString());
118
119 button.set_border(views::Border::CreateEmptyBorder(10, 5, 0, 0));
120 EXPECT_EQ(gfx::Point(5, 10).ToString(),
121 button.ComputeImagePaintPosition(image).ToString());
122
123 button.set_border(NULL);
124 button.SetBounds(0, 0, 50, 50);
125 EXPECT_EQ(gfx::Point().ToString(),
126 button.ComputeImagePaintPosition(image).ToString());
127
128 button.SetImageAlignment(ImageButton::ALIGN_CENTER,
129 ImageButton::ALIGN_MIDDLE);
130 EXPECT_EQ(gfx::Point(15, 10).ToString(),
131 button.ComputeImagePaintPosition(image).ToString());
132 button.set_border(views::Border::CreateEmptyBorder(10, 10, 0, 0));
133 EXPECT_EQ(gfx::Point(20, 15).ToString(),
134 button.ComputeImagePaintPosition(image).ToString());
135 }
136
TEST_F(ImageButtonTest,LeftAlignedMirrored)137 TEST_F(ImageButtonTest, LeftAlignedMirrored) {
138 ImageButton button(NULL);
139 gfx::ImageSkia image = CreateTestImage(20, 30);
140 button.SetImage(CustomButton::STATE_NORMAL, &image);
141 button.SetBounds(0, 0, 50, 30);
142 button.SetImageAlignment(ImageButton::ALIGN_LEFT,
143 ImageButton::ALIGN_BOTTOM);
144 button.SetDrawImageMirrored(true);
145
146 // Because the coordinates are flipped, we should expect this to draw as if
147 // it were ALIGN_RIGHT.
148 EXPECT_EQ(gfx::Point(30, 0).ToString(),
149 button.ComputeImagePaintPosition(image).ToString());
150 }
151
TEST_F(ImageButtonTest,RightAlignedMirrored)152 TEST_F(ImageButtonTest, RightAlignedMirrored) {
153 ImageButton button(NULL);
154 gfx::ImageSkia image = CreateTestImage(20, 30);
155 button.SetImage(CustomButton::STATE_NORMAL, &image);
156 button.SetBounds(0, 0, 50, 30);
157 button.SetImageAlignment(ImageButton::ALIGN_RIGHT,
158 ImageButton::ALIGN_BOTTOM);
159 button.SetDrawImageMirrored(true);
160
161 // Because the coordinates are flipped, we should expect this to draw as if
162 // it were ALIGN_LEFT.
163 EXPECT_EQ(gfx::Point(0, 0).ToString(),
164 button.ComputeImagePaintPosition(image).ToString());
165 }
166
167 } // namespace views
168