Home | History | Annotate | Download | only in layout
      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 "ui/views/layout/box_layout.h"
      6 
      7 #include "testing/gtest/include/gtest/gtest.h"
      8 #include "ui/views/test/test_views.h"
      9 #include "ui/views/view.h"
     10 
     11 namespace views {
     12 
     13 namespace {
     14 
     15 class BoxLayoutTest : public testing::Test {
     16  public:
     17   virtual void SetUp() OVERRIDE {
     18     host_.reset(new View);
     19   }
     20 
     21   scoped_ptr<View> host_;
     22   scoped_ptr<BoxLayout> layout_;
     23 };
     24 
     25 }  // namespace
     26 
     27 TEST_F(BoxLayoutTest, Empty) {
     28   layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 10, 10, 20));
     29   EXPECT_EQ(gfx::Size(20, 20), layout_->GetPreferredSize(host_.get()));
     30 }
     31 
     32 TEST_F(BoxLayoutTest, AlignmentHorizontal) {
     33   layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 0, 0, 0));
     34   View* v1 = new StaticSizedView(gfx::Size(10, 20));
     35   host_->AddChildView(v1);
     36   View* v2 = new StaticSizedView(gfx::Size(10, 10));
     37   host_->AddChildView(v2);
     38   EXPECT_EQ(gfx::Size(20, 20), layout_->GetPreferredSize(host_.get()));
     39   host_->SetBounds(0, 0, 20, 20);
     40   layout_->Layout(host_.get());
     41   EXPECT_EQ(gfx::Rect(0, 0, 10, 20), v1->bounds());
     42   EXPECT_EQ(gfx::Rect(10, 0, 10, 20), v2->bounds());
     43 }
     44 
     45 TEST_F(BoxLayoutTest, AlignmentVertical) {
     46   layout_.reset(new BoxLayout(BoxLayout::kVertical, 0, 0, 0));
     47   View* v1 = new StaticSizedView(gfx::Size(20, 10));
     48   host_->AddChildView(v1);
     49   View* v2 = new StaticSizedView(gfx::Size(10, 10));
     50   host_->AddChildView(v2);
     51   EXPECT_EQ(gfx::Size(20, 20), layout_->GetPreferredSize(host_.get()));
     52   host_->SetBounds(0, 0, 20, 20);
     53   layout_->Layout(host_.get());
     54   EXPECT_EQ(gfx::Rect(0, 0, 20, 10), v1->bounds());
     55   EXPECT_EQ(gfx::Rect(0, 10, 20, 10), v2->bounds());
     56 }
     57 
     58 TEST_F(BoxLayoutTest, Spacing) {
     59   layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 7, 7, 8));
     60   View* v1 = new StaticSizedView(gfx::Size(10, 20));
     61   host_->AddChildView(v1);
     62   View* v2 = new StaticSizedView(gfx::Size(10, 20));
     63   host_->AddChildView(v2);
     64   EXPECT_EQ(gfx::Size(42, 34), layout_->GetPreferredSize(host_.get()));
     65   host_->SetBounds(0, 0, 100, 100);
     66   layout_->Layout(host_.get());
     67   EXPECT_EQ(gfx::Rect(7, 7, 10, 86), v1->bounds());
     68   EXPECT_EQ(gfx::Rect(25, 7, 10, 86), v2->bounds());
     69 }
     70 
     71 TEST_F(BoxLayoutTest, Overflow) {
     72   layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 0, 0, 0));
     73   View* v1 = new StaticSizedView(gfx::Size(20, 20));
     74   host_->AddChildView(v1);
     75   View* v2 = new StaticSizedView(gfx::Size(10, 20));
     76   host_->AddChildView(v2);
     77   host_->SetBounds(0, 0, 10, 10);
     78   layout_->Layout(host_.get());
     79   EXPECT_EQ(gfx::Rect(0, 0, 10, 10), v1->bounds());
     80   EXPECT_EQ(gfx::Rect(0, 0, 0, 0), v2->bounds());
     81 }
     82 
     83 TEST_F(BoxLayoutTest, NoSpace) {
     84   layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 10, 10, 10));
     85   View* childView = new StaticSizedView(gfx::Size(20, 20));
     86   host_->AddChildView(childView);
     87   host_->SetBounds(0, 0, 10, 10);
     88   layout_->Layout(host_.get());
     89   EXPECT_EQ(gfx::Rect(0, 0, 0, 0), childView->bounds());
     90 }
     91 
     92 TEST_F(BoxLayoutTest, InvisibleChild) {
     93   layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 10, 10, 10));
     94   View* v1 = new StaticSizedView(gfx::Size(20, 20));
     95   v1->SetVisible(false);
     96   host_->AddChildView(v1);
     97   View* v2 = new StaticSizedView(gfx::Size(10, 10));
     98   host_->AddChildView(v2);
     99   EXPECT_EQ(gfx::Size(30, 30), layout_->GetPreferredSize(host_.get()));
    100   host_->SetBounds(0, 0, 30, 30);
    101   layout_->Layout(host_.get());
    102   EXPECT_EQ(gfx::Rect(10, 10, 10, 10), v2->bounds());
    103 }
    104 
    105 TEST_F(BoxLayoutTest, DistributeEmptySpace) {
    106   layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 10, 10, 10));
    107   layout_->set_spread_blank_space(true);
    108 
    109   View* v1 = new StaticSizedView(gfx::Size(20, 20));
    110   host_->AddChildView(v1);
    111   View* v2 = new StaticSizedView(gfx::Size(10, 10));
    112   host_->AddChildView(v2);
    113   EXPECT_EQ(gfx::Size(60, 40), layout_->GetPreferredSize(host_.get()));
    114 
    115   host_->SetBounds(0, 0, 100, 40);
    116   layout_->Layout(host_.get());
    117   EXPECT_EQ(gfx::Rect(10, 10, 40, 20).ToString(), v1->bounds().ToString());
    118   EXPECT_EQ(gfx::Rect(60, 10, 30, 20).ToString(), v2->bounds().ToString());
    119 }
    120 
    121 TEST_F(BoxLayoutTest, UseHeightForWidth) {
    122   layout_.reset(new BoxLayout(BoxLayout::kVertical, 0, 0, 0));
    123   View* v1 = new StaticSizedView(gfx::Size(20, 10));
    124   host_->AddChildView(v1);
    125   View* v2 = new ProportionallySizedView(2);
    126   host_->AddChildView(v2);
    127   EXPECT_EQ(gfx::Size(20, 50), layout_->GetPreferredSize(host_.get()));
    128 
    129   host_->SetBounds(0, 0, 20, 50);
    130   layout_->Layout(host_.get());
    131   EXPECT_EQ(gfx::Rect(0, 0, 20, 10), v1->bounds());
    132   EXPECT_EQ(gfx::Rect(0, 10, 20, 40), v2->bounds());
    133 
    134   EXPECT_EQ(110, layout_->GetPreferredHeightForWidth(host_.get(), 50));
    135 }
    136 
    137 TEST_F(BoxLayoutTest, EmptyPreferredSize) {
    138   for (size_t i = 0; i < 2; i++) {
    139     BoxLayout::Orientation orientation = i == 0 ? BoxLayout::kHorizontal :
    140                                                   BoxLayout::kVertical;
    141     host_->RemoveAllChildViews(true);
    142     host_->SetLayoutManager(new BoxLayout(orientation, 0, 0, 5));
    143     View* v1 = new StaticSizedView(gfx::Size());
    144     host_->AddChildView(v1);
    145     View* v2 = new StaticSizedView(gfx::Size(10, 10));
    146     host_->AddChildView(v2);
    147     host_->SizeToPreferredSize();
    148     host_->Layout();
    149 
    150     EXPECT_EQ(v2->GetPreferredSize().width(), host_->bounds().width()) << i;
    151     EXPECT_EQ(v2->GetPreferredSize().height(), host_->bounds().height()) << i;
    152     EXPECT_EQ(v1->GetPreferredSize().width(), v1->bounds().width()) << i;
    153     EXPECT_EQ(v1->GetPreferredSize().height(), v1->bounds().height()) << i;
    154     EXPECT_EQ(v2->GetPreferredSize().width(), v2->bounds().width()) << i;
    155     EXPECT_EQ(v2->GetPreferredSize().height(), v2->bounds().height()) << i;
    156   }
    157 }
    158 
    159 }  // namespace views
    160