15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/test/test_views.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BoxLayoutTest : public testing::Test {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_.reset(new View);
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<View> host_;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BoxLayout> layout_;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxLayoutTest, Empty) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 10, 10, 20));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(20, 20), layout_->GetPreferredSize(host_.get()));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxLayoutTest, AlignmentHorizontal) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 0, 0, 0));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v1 = new StaticSizedView(gfx::Size(10, 20));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(v1);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v2 = new StaticSizedView(gfx::Size(10, 10));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(v2);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(20, 20), layout_->GetPreferredSize(host_.get()));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetBounds(0, 0, 20, 20);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_->Layout(host_.get());
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 10, 20), v1->bounds());
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 0, 10, 20), v2->bounds());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxLayoutTest, AlignmentVertical) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_.reset(new BoxLayout(BoxLayout::kVertical, 0, 0, 0));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v1 = new StaticSizedView(gfx::Size(20, 10));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(v1);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v2 = new StaticSizedView(gfx::Size(10, 10));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(v2);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(20, 20), layout_->GetPreferredSize(host_.get()));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetBounds(0, 0, 20, 20);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_->Layout(host_.get());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 20, 10), v1->bounds());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 10, 20, 10), v2->bounds());
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(BoxLayoutTest, SetInsideBorderInsets) {
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 10, 20, 0));
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  View* v1 = new StaticSizedView(gfx::Size(10, 20));
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  host_->AddChildView(v1);
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  View* v2 = new StaticSizedView(gfx::Size(10, 10));
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  host_->AddChildView(v2);
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 60), layout_->GetPreferredSize(host_.get()));
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  host_->SetBounds(0, 0, 40, 60);
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  layout_->Layout(host_.get());
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 20, 10, 20), v1->bounds());
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(gfx::Rect(20, 20, 10, 20), v2->bounds());
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  layout_->set_inside_border_insets(
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      gfx::Insets(5, 10, 15, 20));
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 40), layout_->GetPreferredSize(host_.get()));
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  host_->SetBounds(0, 0, 50, 40);
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  layout_->Layout(host_.get());
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 5, 10, 20), v1->bounds());
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(gfx::Rect(20, 5, 10, 20), v2->bounds());
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxLayoutTest, Spacing) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 7, 7, 8));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v1 = new StaticSizedView(gfx::Size(10, 20));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(v1);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v2 = new StaticSizedView(gfx::Size(10, 20));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(v2);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(42, 34), layout_->GetPreferredSize(host_.get()));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetBounds(0, 0, 100, 100);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_->Layout(host_.get());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(7, 7, 10, 86), v1->bounds());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(25, 7, 10, 86), v2->bounds());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxLayoutTest, Overflow) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 0, 0, 0));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v1 = new StaticSizedView(gfx::Size(20, 20));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(v1);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v2 = new StaticSizedView(gfx::Size(10, 20));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(v2);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetBounds(0, 0, 10, 10);
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overflows by positioning views at the start and truncating anything that
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // doesn't fit.
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->Layout(host_.get());
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 10, 10), v1->bounds());
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 0, 0), v2->bounds());
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // All values of main axis alignment should overflow in the same manner.
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->set_main_axis_alignment(BoxLayout::MAIN_AXIS_ALIGNMENT_START);
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->Layout(host_.get());
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 10, 10), v1->bounds());
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 0, 0), v2->bounds());
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->set_main_axis_alignment(BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER);
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->Layout(host_.get());
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 10, 10), v1->bounds());
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 0, 0), v2->bounds());
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->set_main_axis_alignment(BoxLayout::MAIN_AXIS_ALIGNMENT_END);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_->Layout(host_.get());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 10, 10), v1->bounds());
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 0, 0), v2->bounds());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxLayoutTest, NoSpace) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 10, 10, 10));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* childView = new StaticSizedView(gfx::Size(20, 20));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(childView);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetBounds(0, 0, 10, 10);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_->Layout(host_.get());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 0, 0), childView->bounds());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BoxLayoutTest, InvisibleChild) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 10, 10, 10));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v1 = new StaticSizedView(gfx::Size(20, 20));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v1->SetVisible(false);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(v1);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v2 = new StaticSizedView(gfx::Size(10, 10));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(v2);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(30, 30), layout_->GetPreferredSize(host_.get()));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetBounds(0, 0, 30, 30);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_->Layout(host_.get());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 10, 10, 10), v2->bounds());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(BoxLayoutTest, MainAxisAlignmentFill) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 10, 10, 10));
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->set_main_axis_alignment(BoxLayout::MAIN_AXIS_ALIGNMENT_FILL);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v1 = new StaticSizedView(gfx::Size(20, 20));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(v1);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* v2 = new StaticSizedView(gfx::Size(10, 10));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->AddChildView(v2);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(60, 40), layout_->GetPreferredSize(host_.get()));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_->SetBounds(0, 0, 100, 40);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout_->Layout(host_.get());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 10, 40, 20).ToString(), v1->bounds().ToString());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(60, 10, 30, 20).ToString(), v2->bounds().ToString());
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(BoxLayoutTest, UseHeightForWidth) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout_.reset(new BoxLayout(BoxLayout::kVertical, 0, 0, 0));
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View* v1 = new StaticSizedView(gfx::Size(20, 10));
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->AddChildView(v1);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View* v2 = new ProportionallySizedView(2);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->AddChildView(v2);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Size(20, 50), layout_->GetPreferredSize(host_.get()));
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetBounds(0, 0, 20, 50);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout_->Layout(host_.get());
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 20, 10), v1->bounds());
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 10, 20, 40), v2->bounds());
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(110, layout_->GetPreferredHeightForWidth(host_.get(), 50));
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(BoxLayoutTest, EmptyPreferredSize) {
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (size_t i = 0; i < 2; i++) {
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    BoxLayout::Orientation orientation = i == 0 ? BoxLayout::kHorizontal :
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                  BoxLayout::kVertical;
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    host_->RemoveAllChildViews(true);
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    host_->SetLayoutManager(new BoxLayout(orientation, 0, 0, 5));
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    View* v1 = new StaticSizedView(gfx::Size());
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    host_->AddChildView(v1);
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    View* v2 = new StaticSizedView(gfx::Size(10, 10));
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    host_->AddChildView(v2);
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    host_->SizeToPreferredSize();
18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    host_->Layout();
18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_EQ(v2->GetPreferredSize().width(), host_->bounds().width()) << i;
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_EQ(v2->GetPreferredSize().height(), host_->bounds().height()) << i;
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_EQ(v1->GetPreferredSize().width(), v1->bounds().width()) << i;
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_EQ(v1->GetPreferredSize().height(), v1->bounds().height()) << i;
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_EQ(v2->GetPreferredSize().width(), v2->bounds().width()) << i;
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_EQ(v2->GetPreferredSize().height(), v2->bounds().height()) << i;
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(BoxLayoutTest, MainAxisAlignmentHorizontal) {
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_.reset(new BoxLayout(BoxLayout::kHorizontal, 10, 10, 10));
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* v1 = new StaticSizedView(gfx::Size(20, 20));
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host_->AddChildView(v1);
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* v2 = new StaticSizedView(gfx::Size(10, 10));
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host_->AddChildView(v2);
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host_->SetBounds(0, 0, 100, 40);
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Align children to the horizontal start by default.
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->Layout(host_.get());
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 10, 20, 20).ToString(), v1->bounds().ToString());
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(40, 10, 10, 20).ToString(), v2->bounds().ToString());
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Ensure same results for MAIN_AXIS_ALIGNMENT_START.
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->set_main_axis_alignment(BoxLayout::MAIN_AXIS_ALIGNMENT_START);
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->Layout(host_.get());
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 10, 20, 20).ToString(), v1->bounds().ToString());
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(40, 10, 10, 20).ToString(), v2->bounds().ToString());
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Aligns children to the center horizontally.
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->set_main_axis_alignment(BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER);
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->Layout(host_.get());
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(30, 10, 20, 20).ToString(), v1->bounds().ToString());
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(60, 10, 10, 20).ToString(), v2->bounds().ToString());
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Aligns children to the end of the host horizontally, accounting for the
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // inside border spacing.
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->set_main_axis_alignment(BoxLayout::MAIN_AXIS_ALIGNMENT_END);
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->Layout(host_.get());
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(50, 10, 20, 20).ToString(), v1->bounds().ToString());
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(80, 10, 10, 20).ToString(), v2->bounds().ToString());
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(BoxLayoutTest, MainAxisAlignmentVertical) {
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_.reset(new BoxLayout(BoxLayout::kVertical, 10, 10, 10));
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* v1 = new StaticSizedView(gfx::Size(20, 20));
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host_->AddChildView(v1);
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* v2 = new StaticSizedView(gfx::Size(10, 10));
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host_->AddChildView(v2);
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host_->SetBounds(0, 0, 40, 100);
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Align children to the vertical start by default.
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->Layout(host_.get());
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 10, 20, 20).ToString(), v1->bounds().ToString());
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 40, 20, 10).ToString(), v2->bounds().ToString());
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Ensure same results for MAIN_AXIS_ALIGNMENT_START.
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->set_main_axis_alignment(BoxLayout::MAIN_AXIS_ALIGNMENT_START);
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->Layout(host_.get());
252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 10, 20, 20).ToString(), v1->bounds().ToString());
253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 40, 20, 10).ToString(), v2->bounds().ToString());
254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Aligns children to the center vertically.
256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->set_main_axis_alignment(BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER);
257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->Layout(host_.get());
258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 30, 20, 20).ToString(), v1->bounds().ToString());
259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 60, 20, 10).ToString(), v2->bounds().ToString());
260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Aligns children to the end of the host vertically, accounting for the
262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // inside border spacing.
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->set_main_axis_alignment(BoxLayout::MAIN_AXIS_ALIGNMENT_END);
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  layout_->Layout(host_.get());
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 50, 20, 20).ToString(), v1->bounds().ToString());
266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(10, 80, 20, 10).ToString(), v2->bounds().ToString());
267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
270