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.
5 #include "ui/views/layout/box_layout.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "ui/views/test/test_views.h"
9 #include "ui/views/view.h"
15 class BoxLayoutTest : public testing::Test {
17 virtual void SetUp() OVERRIDE {
18 host_.reset(new View);
21 scoped_ptr<View> host_;
22 scoped_ptr<BoxLayout> layout_;
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()));
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());
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());
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());
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());
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());
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());
105 TEST_F(BoxLayoutTest, DistributeEmptySpace) {
106 layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 10, 10, 10));
107 layout_->set_spread_blank_space(true);
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()));
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());
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()));
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());
134 EXPECT_EQ(110, layout_->GetPreferredHeightForWidth(host_.get(), 50));
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();
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;