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.
5 #include "testing/gtest/include/gtest/gtest.h"
6 #include "ui/base/layout.h"
7 #include "ui/views/controls/button/image_button.h"
8 #include "ui/views/test/views_test_base.h"
12 gfx::ImageSkia CreateTestImage(int width, int height) {
14 bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height);
16 return gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
23 typedef ViewsTestBase ImageButtonTest;
25 TEST_F(ImageButtonTest, Basics) {
26 ImageButton button(NULL);
28 // Our image to paint starts empty.
29 EXPECT_TRUE(button.GetImageToPaint().isNull());
31 // Without a theme, buttons are 16x14 by default.
32 EXPECT_EQ("16x14", button.GetPreferredSize().ToString());
34 // We can set a preferred size when we have no image.
35 button.SetPreferredSize(gfx::Size(5, 15));
36 EXPECT_EQ("5x15", button.GetPreferredSize().ToString());
38 // Set a normal image.
39 gfx::ImageSkia normal_image = CreateTestImage(10, 20);
40 button.SetImage(CustomButton::STATE_NORMAL, &normal_image);
42 // Image uses normal image for painting.
43 EXPECT_FALSE(button.GetImageToPaint().isNull());
44 EXPECT_EQ(10, button.GetImageToPaint().width());
45 EXPECT_EQ(20, button.GetImageToPaint().height());
47 // Preferred size is the normal button size.
48 EXPECT_EQ("10x20", button.GetPreferredSize().ToString());
50 // Set a pushed image.
51 gfx::ImageSkia pushed_image = CreateTestImage(11, 21);
52 button.SetImage(CustomButton::STATE_PRESSED, &pushed_image);
54 // By convention, preferred size doesn't change, even though pushed image
56 EXPECT_EQ("10x20", button.GetPreferredSize().ToString());
58 // We're still painting the normal image.
59 EXPECT_FALSE(button.GetImageToPaint().isNull());
60 EXPECT_EQ(10, button.GetImageToPaint().width());
61 EXPECT_EQ(20, button.GetImageToPaint().height());
63 // Set an overlay image.
64 gfx::ImageSkia overlay_image = CreateTestImage(12, 22);
65 button.SetOverlayImage(&overlay_image);
66 EXPECT_EQ(12, button.overlay_image_.width());
67 EXPECT_EQ(22, button.overlay_image_.height());
69 // By convention, preferred size doesn't change, even though pushed image
71 EXPECT_EQ("10x20", button.GetPreferredSize().ToString());
73 // We're still painting the normal image.
74 EXPECT_FALSE(button.GetImageToPaint().isNull());
75 EXPECT_EQ(10, button.GetImageToPaint().width());
76 EXPECT_EQ(20, button.GetImageToPaint().height());
78 // Reset the overlay image.
79 button.SetOverlayImage(NULL);
80 EXPECT_TRUE(button.overlay_image_.isNull());
83 TEST_F(ImageButtonTest, SetAndGetImage) {
84 ImageButton button(NULL);
86 // Images start as null.
87 EXPECT_TRUE(button.GetImage(Button::STATE_NORMAL).isNull());
88 EXPECT_TRUE(button.GetImage(Button::STATE_HOVERED).isNull());
89 EXPECT_TRUE(button.GetImage(Button::STATE_PRESSED).isNull());
90 EXPECT_TRUE(button.GetImage(Button::STATE_DISABLED).isNull());
92 // Setting images works as expected.
93 gfx::ImageSkia image1 = CreateTestImage(10, 11);
94 gfx::ImageSkia image2 = CreateTestImage(20, 21);
95 button.SetImage(Button::STATE_NORMAL, &image1);
96 button.SetImage(Button::STATE_HOVERED, &image2);
98 button.GetImage(Button::STATE_NORMAL).BackedBySameObjectAs(image1));
100 button.GetImage(Button::STATE_HOVERED).BackedBySameObjectAs(image2));
101 EXPECT_TRUE(button.GetImage(Button::STATE_PRESSED).isNull());
102 EXPECT_TRUE(button.GetImage(Button::STATE_DISABLED).isNull());
104 // ImageButton supports NULL image pointers.
105 button.SetImage(Button::STATE_NORMAL, NULL);
106 EXPECT_TRUE(button.GetImage(Button::STATE_NORMAL).isNull());
109 TEST_F(ImageButtonTest, ImagePositionWithBorder) {
110 ImageButton button(NULL);
111 gfx::ImageSkia image = CreateTestImage(20, 30);
112 button.SetImage(CustomButton::STATE_NORMAL, &image);
114 // The image should be painted at the top-left corner.
115 EXPECT_EQ(gfx::Point().ToString(),
116 button.ComputeImagePaintPosition(image).ToString());
118 button.set_border(views::Border::CreateEmptyBorder(10, 5, 0, 0));
119 EXPECT_EQ(gfx::Point(5, 10).ToString(),
120 button.ComputeImagePaintPosition(image).ToString());
122 button.set_border(NULL);
123 button.SetBounds(0, 0, 50, 50);
124 EXPECT_EQ(gfx::Point().ToString(),
125 button.ComputeImagePaintPosition(image).ToString());
127 button.SetImageAlignment(ImageButton::ALIGN_CENTER,
128 ImageButton::ALIGN_MIDDLE);
129 EXPECT_EQ(gfx::Point(15, 10).ToString(),
130 button.ComputeImagePaintPosition(image).ToString());
131 button.set_border(views::Border::CreateEmptyBorder(10, 10, 0, 0));
132 EXPECT_EQ(gfx::Point(20, 15).ToString(),
133 button.ComputeImagePaintPosition(image).ToString());