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/controls/button/image_button.h" 8 #include "ui/views/test/views_test_base.h" 9 10 namespace { 11 12 gfx::ImageSkia CreateTestImage(int width, int height) { 13 SkBitmap bitmap; 14 bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height); 15 bitmap.allocPixels(); 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 a theme, buttons are 16x14 by default. 32 EXPECT_EQ("16x14", button.GetPreferredSize().ToString()); 33 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()); 37 38 // Set a normal image. 39 gfx::ImageSkia normal_image = CreateTestImage(10, 20); 40 button.SetImage(CustomButton::STATE_NORMAL, &normal_image); 41 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()); 46 47 // Preferred size is the normal button size. 48 EXPECT_EQ("10x20", button.GetPreferredSize().ToString()); 49 50 // Set a pushed image. 51 gfx::ImageSkia pushed_image = CreateTestImage(11, 21); 52 button.SetImage(CustomButton::STATE_PRESSED, &pushed_image); 53 54 // By convention, preferred size doesn't change, even though pushed image 55 // is bigger. 56 EXPECT_EQ("10x20", button.GetPreferredSize().ToString()); 57 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()); 62 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()); 68 69 // By convention, preferred size doesn't change, even though pushed image 70 // is bigger. 71 EXPECT_EQ("10x20", button.GetPreferredSize().ToString()); 72 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()); 77 78 // Reset the overlay image. 79 button.SetOverlayImage(NULL); 80 EXPECT_TRUE(button.overlay_image_.isNull()); 81 } 82 83 TEST_F(ImageButtonTest, SetAndGetImage) { 84 ImageButton button(NULL); 85 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()); 91 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); 97 EXPECT_TRUE( 98 button.GetImage(Button::STATE_NORMAL).BackedBySameObjectAs(image1)); 99 EXPECT_TRUE( 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()); 103 104 // ImageButton supports NULL image pointers. 105 button.SetImage(Button::STATE_NORMAL, NULL); 106 EXPECT_TRUE(button.GetImage(Button::STATE_NORMAL).isNull()); 107 } 108 109 TEST_F(ImageButtonTest, ImagePositionWithBorder) { 110 ImageButton button(NULL); 111 gfx::ImageSkia image = CreateTestImage(20, 30); 112 button.SetImage(CustomButton::STATE_NORMAL, &image); 113 114 // The image should be painted at the top-left corner. 115 EXPECT_EQ(gfx::Point().ToString(), 116 button.ComputeImagePaintPosition(image).ToString()); 117 118 button.set_border(views::Border::CreateEmptyBorder(10, 5, 0, 0)); 119 EXPECT_EQ(gfx::Point(5, 10).ToString(), 120 button.ComputeImagePaintPosition(image).ToString()); 121 122 button.set_border(NULL); 123 button.SetBounds(0, 0, 50, 50); 124 EXPECT_EQ(gfx::Point().ToString(), 125 button.ComputeImagePaintPosition(image).ToString()); 126 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()); 134 } 135 136 } // namespace views 137