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 13 gfx::ImageSkia CreateTestImage(int width, int height) { 14 SkBitmap bitmap; 15 bitmap.allocN32Pixels(width, height); 16 return gfx::ImageSkia::CreateFrom1xBitmap(bitmap); 17 } 18 19 } // namespace 20 21 namespace views { 22 23 typedef ViewsTestBase ImageButtonTest; 24 25 TEST_F(ImageButtonTest, Basics) { 26 ImageButton button(NULL); 27 28 // Our image to paint starts empty. 29 EXPECT_TRUE(button.GetImageToPaint().isNull()); 30 31 // Without an image, buttons are 16x14 by default. 32 EXPECT_EQ("16x14", button.GetPreferredSize().ToString()); 33 34 // The minimum image size should be applied even when there is no image. 35 button.SetMinimumImageSize(gfx::Size(5, 15)); 36 EXPECT_EQ("5x15", button.minimum_image_size().ToString()); 37 EXPECT_EQ("16x15", 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 // The minimum image size should make the preferred size bigger. 65 button.SetMinimumImageSize(gfx::Size(15, 5)); 66 EXPECT_EQ("15x5", button.minimum_image_size().ToString()); 67 EXPECT_EQ("15x20", button.GetPreferredSize().ToString()); 68 button.SetMinimumImageSize(gfx::Size(15, 25)); 69 EXPECT_EQ("15x25", button.minimum_image_size().ToString()); 70 EXPECT_EQ("15x25", button.GetPreferredSize().ToString()); 71 } 72 73 TEST_F(ImageButtonTest, SetAndGetImage) { 74 ImageButton button(NULL); 75 76 // Images start as null. 77 EXPECT_TRUE(button.GetImage(Button::STATE_NORMAL).isNull()); 78 EXPECT_TRUE(button.GetImage(Button::STATE_HOVERED).isNull()); 79 EXPECT_TRUE(button.GetImage(Button::STATE_PRESSED).isNull()); 80 EXPECT_TRUE(button.GetImage(Button::STATE_DISABLED).isNull()); 81 82 // Setting images works as expected. 83 gfx::ImageSkia image1 = CreateTestImage(10, 11); 84 gfx::ImageSkia image2 = CreateTestImage(20, 21); 85 button.SetImage(Button::STATE_NORMAL, &image1); 86 button.SetImage(Button::STATE_HOVERED, &image2); 87 EXPECT_TRUE( 88 button.GetImage(Button::STATE_NORMAL).BackedBySameObjectAs(image1)); 89 EXPECT_TRUE( 90 button.GetImage(Button::STATE_HOVERED).BackedBySameObjectAs(image2)); 91 EXPECT_TRUE(button.GetImage(Button::STATE_PRESSED).isNull()); 92 EXPECT_TRUE(button.GetImage(Button::STATE_DISABLED).isNull()); 93 94 // ImageButton supports NULL image pointers. 95 button.SetImage(Button::STATE_NORMAL, NULL); 96 EXPECT_TRUE(button.GetImage(Button::STATE_NORMAL).isNull()); 97 } 98 99 TEST_F(ImageButtonTest, ImagePositionWithBorder) { 100 ImageButton button(NULL); 101 gfx::ImageSkia image = CreateTestImage(20, 30); 102 button.SetImage(CustomButton::STATE_NORMAL, &image); 103 104 // The image should be painted at the top-left corner. 105 EXPECT_EQ(gfx::Point().ToString(), 106 button.ComputeImagePaintPosition(image).ToString()); 107 108 button.SetBorder(views::Border::CreateEmptyBorder(10, 5, 0, 0)); 109 EXPECT_EQ(gfx::Point(5, 10).ToString(), 110 button.ComputeImagePaintPosition(image).ToString()); 111 112 button.SetBorder(Border::NullBorder()); 113 button.SetBounds(0, 0, 50, 50); 114 EXPECT_EQ(gfx::Point().ToString(), 115 button.ComputeImagePaintPosition(image).ToString()); 116 117 button.SetImageAlignment(ImageButton::ALIGN_CENTER, 118 ImageButton::ALIGN_MIDDLE); 119 EXPECT_EQ(gfx::Point(15, 10).ToString(), 120 button.ComputeImagePaintPosition(image).ToString()); 121 button.SetBorder(views::Border::CreateEmptyBorder(10, 10, 0, 0)); 122 EXPECT_EQ(gfx::Point(20, 15).ToString(), 123 button.ComputeImagePaintPosition(image).ToString()); 124 125 // The entire button's size should take the border into account. 126 EXPECT_EQ(gfx::Size(30, 40).ToString(), button.GetPreferredSize().ToString()); 127 128 // The border should be added on top of the minimum image size. 129 button.SetMinimumImageSize(gfx::Size(30, 5)); 130 EXPECT_EQ(gfx::Size(40, 40).ToString(), button.GetPreferredSize().ToString()); 131 } 132 133 TEST_F(ImageButtonTest, LeftAlignedMirrored) { 134 ImageButton button(NULL); 135 gfx::ImageSkia image = CreateTestImage(20, 30); 136 button.SetImage(CustomButton::STATE_NORMAL, &image); 137 button.SetBounds(0, 0, 50, 30); 138 button.SetImageAlignment(ImageButton::ALIGN_LEFT, 139 ImageButton::ALIGN_BOTTOM); 140 button.SetDrawImageMirrored(true); 141 142 // Because the coordinates are flipped, we should expect this to draw as if 143 // it were ALIGN_RIGHT. 144 EXPECT_EQ(gfx::Point(30, 0).ToString(), 145 button.ComputeImagePaintPosition(image).ToString()); 146 } 147 148 TEST_F(ImageButtonTest, RightAlignedMirrored) { 149 ImageButton button(NULL); 150 gfx::ImageSkia image = CreateTestImage(20, 30); 151 button.SetImage(CustomButton::STATE_NORMAL, &image); 152 button.SetBounds(0, 0, 50, 30); 153 button.SetImageAlignment(ImageButton::ALIGN_RIGHT, 154 ImageButton::ALIGN_BOTTOM); 155 button.SetDrawImageMirrored(true); 156 157 // Because the coordinates are flipped, we should expect this to draw as if 158 // it were ALIGN_LEFT. 159 EXPECT_EQ(gfx::Point(0, 0).ToString(), 160 button.ComputeImagePaintPosition(image).ToString()); 161 } 162 163 } // namespace views 164