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 "base/strings/utf_string_conversions.h" 6 #include "third_party/skia/include/core/SkBitmap.h" 7 #include "ui/gfx/canvas.h" 8 #include "ui/gfx/font.h" 9 #include "ui/gfx/size.h" 10 #include "ui/views/controls/button/label_button.h" 11 #include "ui/views/test/views_test_base.h" 12 13 namespace { 14 15 gfx::ImageSkia CreateTestImage(int width, int height) { 16 SkBitmap bitmap; 17 bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height); 18 bitmap.allocPixels(); 19 return gfx::ImageSkia::CreateFrom1xBitmap(bitmap); 20 } 21 22 } // namespace 23 24 namespace views { 25 26 typedef ViewsTestBase LabelButtonTest; 27 28 TEST_F(LabelButtonTest, Init) { 29 const string16 text(ASCIIToUTF16("abc")); 30 LabelButton button(NULL, text); 31 32 EXPECT_TRUE(button.GetImage(Button::STATE_NORMAL).isNull()); 33 EXPECT_TRUE(button.GetImage(Button::STATE_HOVERED).isNull()); 34 EXPECT_TRUE(button.GetImage(Button::STATE_PRESSED).isNull()); 35 EXPECT_TRUE(button.GetImage(Button::STATE_DISABLED).isNull()); 36 37 EXPECT_EQ(text, button.GetText()); 38 EXPECT_EQ(gfx::ALIGN_LEFT, button.GetHorizontalAlignment()); 39 EXPECT_FALSE(button.is_default()); 40 EXPECT_EQ(button.style(), Button::STYLE_TEXTBUTTON); 41 EXPECT_EQ(Button::STATE_NORMAL, button.state()); 42 43 EXPECT_EQ(button.image_->parent(), &button); 44 EXPECT_EQ(button.label_->parent(), &button); 45 } 46 47 TEST_F(LabelButtonTest, Label) { 48 LabelButton button(NULL, string16()); 49 EXPECT_TRUE(button.GetText().empty()); 50 51 const gfx::Font font; 52 const string16 short_text(ASCIIToUTF16("abcdefghijklm")); 53 const string16 long_text(ASCIIToUTF16("abcdefghijklmnopqrstuvwxyz")); 54 const int short_text_width = gfx::Canvas::GetStringWidth(short_text, font); 55 const int long_text_width = gfx::Canvas::GetStringWidth(long_text, font); 56 57 // The width increases monotonically with string size (it does not shrink). 58 EXPECT_LT(button.GetPreferredSize().width(), short_text_width); 59 button.SetText(short_text); 60 EXPECT_GT(button.GetPreferredSize().height(), font.GetHeight()); 61 EXPECT_GT(button.GetPreferredSize().width(), short_text_width); 62 EXPECT_LT(button.GetPreferredSize().width(), long_text_width); 63 button.SetText(long_text); 64 EXPECT_GT(button.GetPreferredSize().width(), long_text_width); 65 button.SetText(short_text); 66 EXPECT_GT(button.GetPreferredSize().width(), long_text_width); 67 68 // Clamp the size to a maximum value. 69 button.set_max_size(gfx::Size(long_text_width, 1)); 70 EXPECT_EQ(button.GetPreferredSize(), gfx::Size(long_text_width, 1)); 71 72 // Clear the monotonically increasing minimum size. 73 button.set_min_size(gfx::Size()); 74 EXPECT_GT(button.GetPreferredSize().width(), short_text_width); 75 EXPECT_LT(button.GetPreferredSize().width(), long_text_width); 76 } 77 78 TEST_F(LabelButtonTest, Image) { 79 LabelButton button(NULL, string16()); 80 81 const int small_size = 50, large_size = 100; 82 const gfx::ImageSkia small_image = CreateTestImage(small_size, small_size); 83 const gfx::ImageSkia large_image = CreateTestImage(large_size, large_size); 84 85 // The width increases monotonically with image size (it does not shrink). 86 EXPECT_LT(button.GetPreferredSize().width(), small_size); 87 EXPECT_LT(button.GetPreferredSize().height(), small_size); 88 button.SetImage(Button::STATE_NORMAL, small_image); 89 EXPECT_GT(button.GetPreferredSize().width(), small_size); 90 EXPECT_GT(button.GetPreferredSize().height(), small_size); 91 EXPECT_LT(button.GetPreferredSize().width(), large_size); 92 EXPECT_LT(button.GetPreferredSize().height(), large_size); 93 button.SetImage(Button::STATE_NORMAL, large_image); 94 EXPECT_GT(button.GetPreferredSize().width(), large_size); 95 EXPECT_GT(button.GetPreferredSize().height(), large_size); 96 button.SetImage(Button::STATE_NORMAL, small_image); 97 EXPECT_GT(button.GetPreferredSize().width(), large_size); 98 EXPECT_GT(button.GetPreferredSize().height(), large_size); 99 100 // Clamp the size to a maximum value. 101 button.set_max_size(gfx::Size(large_size, 1)); 102 EXPECT_EQ(button.GetPreferredSize(), gfx::Size(large_size, 1)); 103 104 // Clear the monotonically increasing minimum size. 105 button.set_min_size(gfx::Size()); 106 EXPECT_GT(button.GetPreferredSize().width(), small_size); 107 EXPECT_LT(button.GetPreferredSize().width(), large_size); 108 } 109 110 TEST_F(LabelButtonTest, LabelAndImage) { 111 LabelButton button(NULL, string16()); 112 113 const gfx::Font font; 114 const string16 text(ASCIIToUTF16("abcdefghijklm")); 115 const int text_width = gfx::Canvas::GetStringWidth(text, font); 116 117 const int image_size = 50; 118 const gfx::ImageSkia image = CreateTestImage(image_size, image_size); 119 ASSERT_LT(font.GetHeight(), image_size); 120 121 // The width increases monotonically with content size (it does not shrink). 122 EXPECT_LT(button.GetPreferredSize().width(), text_width); 123 EXPECT_LT(button.GetPreferredSize().width(), image_size); 124 EXPECT_LT(button.GetPreferredSize().height(), image_size); 125 button.SetText(text); 126 EXPECT_GT(button.GetPreferredSize().width(), text_width); 127 EXPECT_GT(button.GetPreferredSize().height(), font.GetHeight()); 128 EXPECT_LT(button.GetPreferredSize().width(), text_width + image_size); 129 EXPECT_LT(button.GetPreferredSize().height(), image_size); 130 button.SetImage(Button::STATE_NORMAL, image); 131 EXPECT_GT(button.GetPreferredSize().width(), text_width + image_size); 132 EXPECT_GT(button.GetPreferredSize().height(), image_size); 133 134 // Layout and ensure the image is left of the label except for ALIGN_RIGHT. 135 // (A proper parent view or layout manager would Layout on its invalidations). 136 button.SetSize(button.GetPreferredSize()); 137 button.Layout(); 138 EXPECT_EQ(gfx::ALIGN_LEFT, button.GetHorizontalAlignment()); 139 EXPECT_LT(button.image_->bounds().right(), button.label_->bounds().x()); 140 button.SetHorizontalAlignment(gfx::ALIGN_CENTER); 141 button.Layout(); 142 EXPECT_EQ(gfx::ALIGN_CENTER, button.GetHorizontalAlignment()); 143 EXPECT_LT(button.image_->bounds().right(), button.label_->bounds().x()); 144 button.SetHorizontalAlignment(gfx::ALIGN_RIGHT); 145 button.Layout(); 146 EXPECT_EQ(gfx::ALIGN_RIGHT, button.GetHorizontalAlignment()); 147 EXPECT_LT(button.label_->bounds().right(), button.image_->bounds().x()); 148 149 button.SetText(string16()); 150 EXPECT_GT(button.GetPreferredSize().width(), text_width + image_size); 151 EXPECT_GT(button.GetPreferredSize().height(), image_size); 152 button.SetImage(Button::STATE_NORMAL, gfx::ImageSkia()); 153 EXPECT_GT(button.GetPreferredSize().width(), text_width + image_size); 154 EXPECT_GT(button.GetPreferredSize().height(), image_size); 155 156 // Clamp the size to a maximum value. 157 button.set_max_size(gfx::Size(image_size, 1)); 158 EXPECT_EQ(button.GetPreferredSize(), gfx::Size(image_size, 1)); 159 160 // Clear the monotonically increasing minimum size. 161 button.set_min_size(gfx::Size()); 162 EXPECT_LT(button.GetPreferredSize().width(), text_width); 163 EXPECT_LT(button.GetPreferredSize().width(), image_size); 164 EXPECT_LT(button.GetPreferredSize().height(), image_size); 165 } 166 167 TEST_F(LabelButtonTest, Font) { 168 const string16 text(ASCIIToUTF16("abc")); 169 LabelButton button(NULL, text); 170 171 const gfx::Font original_font = button.GetFont(); 172 const gfx::Font large_font = original_font.DeriveFont(100); 173 const int original_width = button.GetPreferredSize().width(); 174 const int original_height = button.GetPreferredSize().height(); 175 176 // The button size increases when the font size is increased. 177 button.SetFont(large_font); 178 EXPECT_GT(button.GetPreferredSize().width(), original_width); 179 EXPECT_GT(button.GetPreferredSize().height(), original_height); 180 181 // The button returns to its original size when the minimal size is cleared 182 // and the original font size is restored. 183 button.set_min_size(gfx::Size()); 184 button.SetFont(original_font); 185 EXPECT_EQ(original_width, button.GetPreferredSize().width()); 186 EXPECT_EQ(original_height, button.GetPreferredSize().height()); 187 } 188 189 } // namespace views 190