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
11namespace views {
12
13namespace {
14
15class 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
27TEST_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
32TEST_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
45TEST_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
58TEST_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
71TEST_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
83TEST_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
92TEST_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
105TEST_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
121TEST_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
137TEST_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