Home | History | Annotate | Download | only in button
      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