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/grid_layout.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExpectViewBoundsEquals(int x, int y, int w, int h,
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const View* view) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(x, view->x());
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(y, view->y());
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(w, view->width());
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(h, view->height());
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SettableSizeView : public View {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SettableSizeView(const gfx::Size& pref) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref_ = pref;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pref_;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   gfx::Size pref_;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A view with fixed circumference that trades height for width.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FlexibleView : public View {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit FlexibleView(int circumference) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    circumference_ = circumference;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gfx::Size(0, circumference_ / 2);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual int GetHeightForWidth(int width) const OVERRIDE {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::max(0, circumference_ / 2 - width);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int circumference_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GridLayoutTest : public testing::Test {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GridLayoutTest() : layout(&host) {}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveAll() {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = host.child_count() - 1; i >= 0; i--)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host.RemoveChildView(host.child_at(i));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetPreferredSize() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pref = layout.GetPreferredSize(&host);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size pref;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View host;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GridLayout layout;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GridLayoutAlignmentTest : public testing::Test {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   GridLayoutAlignmentTest()
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       : v1(gfx::Size(10, 20)),
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         layout(&host) {}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveAll() {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = host.child_count() - 1; i >= 0; i--)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host.RemoveChildView(host.child_at(i));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestAlignment(GridLayout::Alignment alignment, gfx::Rect* bounds) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ColumnSet* c1 = layout.AddColumnSet(0);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c1->AddColumn(alignment, alignment, 1, GridLayout::USE_PREF, 0, 0);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layout.StartRow(1, 0);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layout.AddView(&v1);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Size pref = layout.GetPreferredSize(&host);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(gfx::Size(10, 20), pref);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host.SetBounds(0, 0, 100, 100);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layout.Layout(&host);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *bounds = v1.bounds();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RemoveAll();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View host;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v1;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GridLayout layout;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutAlignmentTest, Fill) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAlignment(GridLayout::FILL, &bounds);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 100, 100), bounds);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutAlignmentTest, Leading) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAlignment(GridLayout::LEADING, &bounds);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 10, 20), bounds);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutAlignmentTest, Center) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAlignment(GridLayout::CENTER, &bounds);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(45, 40, 10, 20), bounds);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutAlignmentTest, Trailing) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAlignment(GridLayout::TRAILING, &bounds);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(90, 80, 10, 20), bounds);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, TwoColumns) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v1(gfx::Size(10, 20));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v2(gfx::Size(20, 20));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* c1 = layout.AddColumnSet(0);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                0, GridLayout::USE_PREF, 0, 0);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                0, GridLayout::USE_PREF, 0, 0);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v1);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v2);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(30, 20), pref);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, pref.width(), pref.height());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 10, 20, &v1);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(10, 0, 20, 20, &v2);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAll();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, ColSpan1) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v1(gfx::Size(100, 20));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v2(gfx::Size(10, 40));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* c1 = layout.AddColumnSet(0);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                0, GridLayout::USE_PREF, 0, 0);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                1, GridLayout::USE_PREF, 0, 0);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v1, 2, 1);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v2);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 60), pref);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, pref.width(), pref.height());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 100, 20, &v1);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 20, 10, 40, &v2);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAll();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, ColSpan2) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v1(gfx::Size(100, 20));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v2(gfx::Size(10, 20));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* c1 = layout.AddColumnSet(0);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                1, GridLayout::USE_PREF, 0, 0);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                0, GridLayout::USE_PREF, 0, 0);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v1, 2, 1);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.SkipColumns(1);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v2);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 40), pref);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, pref.width(), pref.height());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 100, 20, &v1);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(90, 20, 10, 20, &v2);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAll();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, ColSpan3) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v1(gfx::Size(100, 20));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v2(gfx::Size(10, 20));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v3(gfx::Size(10, 20));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* c1 = layout.AddColumnSet(0);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                0, GridLayout::USE_PREF, 0, 0);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                0, GridLayout::USE_PREF, 0, 0);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v1, 2, 1);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v2);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v3);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 40), pref);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, pref.width(), pref.height());
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 100, 20, &v1);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 20, 10, 20, &v2);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(50, 20, 10, 20, &v3);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAll();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, ColSpan4) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* set = layout.AddColumnSet(0);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 0,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GridLayout::USE_PREF, 0, 0);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 0,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GridLayout::USE_PREF, 0, 0);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v1(gfx::Size(10, 10));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v2(gfx::Size(10, 10));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v3(gfx::Size(25, 20));
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v1);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v2);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v3, 2, 1);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(25, 30), pref);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, pref.width(), pref.height());
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 10, 10, &v1);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(12, 0, 10, 10, &v2);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 10, 25, 20, &v3);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAll();
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Verifies the sizing of a view that doesn't start in the first column
256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// and has a column span > 1 (crbug.com/254092).
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(GridLayoutTest, ColSpanStartSecondColumn) {
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ColumnSet* set = layout.AddColumnSet(0);
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  set->AddColumn(GridLayout::FILL, GridLayout::FILL, 0,
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 GridLayout::USE_PREF, 0, 0);
262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  set->AddColumn(GridLayout::FILL, GridLayout::FILL, 0,
263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 GridLayout::USE_PREF, 0, 0);
264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  set->AddColumn(GridLayout::FILL, GridLayout::FILL, 0,
265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 GridLayout::FIXED, 10, 0);
266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SettableSizeView v1(gfx::Size(10, 10));
268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SettableSizeView v2(gfx::Size(20, 10));
269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  layout.StartRow(0, 0);
271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  layout.AddView(&v1);
272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  layout.AddView(&v2, 2, 1);
273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GetPreferredSize();
275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(gfx::Size(30, 10), pref);
276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  host.SetBounds(0, 0, pref.width(), pref.height());
278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  layout.Layout(&host);
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectViewBoundsEquals(0, 0, 10, 10, &v1);
280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ExpectViewBoundsEquals(10, 0, 20, 10, &v2);
281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RemoveAll();
283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, SameSizeColumns) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v1(gfx::Size(50, 20));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v2(gfx::Size(10, 10));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* c1 = layout.AddColumnSet(0);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                0, GridLayout::USE_PREF, 0, 0);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                0, GridLayout::USE_PREF, 0, 0);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->LinkColumnSizes(0, 1, -1);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v1);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v2);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size pref = layout.GetPreferredSize(&host);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(100, 20), pref);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, pref.width(), pref.height());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 50, 20, &v1);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(50, 0, 10, 10, &v2);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAll();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, HorizontalResizeTest1) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v1(gfx::Size(50, 20));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v2(gfx::Size(10, 10));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* c1 = layout.AddColumnSet(0);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::FILL, GridLayout::LEADING,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                1, GridLayout::USE_PREF, 0, 0);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                0, GridLayout::USE_PREF, 0, 0);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v1);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v2);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, 110, 20);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 100, 20, &v1);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(100, 0, 10, 10, &v2);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAll();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, HorizontalResizeTest2) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v1(gfx::Size(50, 20));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v2(gfx::Size(10, 10));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* c1 = layout.AddColumnSet(0);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::FILL, GridLayout::LEADING,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                1, GridLayout::USE_PREF, 0, 0);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::TRAILING, GridLayout::LEADING,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                1, GridLayout::USE_PREF, 0, 0);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v1);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v2);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, 120, 20);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 80, 20, &v1);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(110, 0, 10, 10, &v2);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAll();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Tests that space leftover due to rounding is distributed to the last
350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// resizable column.
351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(GridLayoutTest, HorizontalResizeTest3) {
352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SettableSizeView v1(gfx::Size(10, 10));
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SettableSizeView v2(gfx::Size(10, 10));
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SettableSizeView v3(gfx::Size(10, 10));
355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ColumnSet* c1 = layout.AddColumnSet(0);
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  c1->AddColumn(GridLayout::FILL, GridLayout::LEADING,
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                1, GridLayout::USE_PREF, 0, 0);
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  c1->AddColumn(GridLayout::FILL, GridLayout::LEADING,
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                1, GridLayout::USE_PREF, 0, 0);
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  c1->AddColumn(GridLayout::TRAILING, GridLayout::LEADING,
361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                0, GridLayout::USE_PREF, 0, 0);
362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  layout.StartRow(0, 0);
363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  layout.AddView(&v1);
364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  layout.AddView(&v2);
365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  layout.AddView(&v3);
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  host.SetBounds(0, 0, 31, 10);
368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  layout.Layout(&host);
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 10, 10, &v1);
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ExpectViewBoundsEquals(10, 0, 11, 10, &v2);
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ExpectViewBoundsEquals(21, 0, 10, 10, &v3);
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RemoveAll();
374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, TestVerticalResize1) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v1(gfx::Size(50, 20));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v2(gfx::Size(10, 10));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* c1 = layout.AddColumnSet(0);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::FILL, GridLayout::FILL,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                1, GridLayout::USE_PREF, 0, 0);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(1, 0);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v1);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v2);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(50, 30), pref);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, 50, 100);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 50, 90, &v1);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 90, 50, 10, &v2);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAll();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, Insets) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v1(gfx::Size(10, 20));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* c1 = layout.AddColumnSet(0);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.SetInsets(1, 2, 3, 4);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  c1->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                0, GridLayout::USE_PREF, 0, 0);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v1);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(16, 24), pref);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, pref.width(), pref.height());
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(2, 1, 10, 20, &v1);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAll();
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, FixedSize) {
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.SetInsets(2, 2, 2, 2);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* set = layout.AddColumnSet(0);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int column_count = 4;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int title_width = 100;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int row_count = 2;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pref_width = 10;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pref_height = 20;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < column_count; ++i) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set->AddColumn(GridLayout::CENTER,
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   GridLayout::CENTER,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   0,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   GridLayout::FIXED,
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   title_width,
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   title_width);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int row = 0; row < row_count; ++row) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layout.StartRow(0, 0);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int col = 0; col < column_count; ++col) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layout.AddView(new SettableSizeView(gfx::Size(pref_width, pref_height)));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < column_count; ++i) {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int row = 0; row < row_count; ++row) {
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      View* view = host.child_at(row * column_count + i);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExpectViewBoundsEquals(
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          2 + title_width * i + (title_width - pref_width) / 2,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          2 + pref_height * row,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pref_width,
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pref_height, view);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(column_count * title_width + 4,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      row_count * pref_height + 4), pref);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, RowSpanWithPaddingRow) {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* set = layout.AddColumnSet(0);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::CENTER,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GridLayout::CENTER,
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0,
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GridLayout::FIXED,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 10,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 10);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(new SettableSizeView(gfx::Size(10, 10)), 1, 2);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddPaddingRow(0, 10);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, RowSpan) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* set = layout.AddColumnSet(0);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::LEADING,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GridLayout::LEADING,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GridLayout::USE_PREF,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::LEADING,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GridLayout::LEADING,
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0,
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GridLayout::USE_PREF,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(new SettableSizeView(gfx::Size(20, 10)));
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(new SettableSizeView(gfx::Size(20, 40)), 1, 2);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(1, 0);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* s3 = new SettableSizeView(gfx::Size(20, 10));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(s3);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40), pref);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, pref.width(), pref.height());
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 10, 20, 10, s3);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, RowSpan2) {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* set = layout.AddColumnSet(0);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0, GridLayout::USE_PREF, 0, 0);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0,GridLayout::USE_PREF, 0, 0);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(new SettableSizeView(gfx::Size(20, 20)));
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* s3 = new SettableSizeView(gfx::Size(64, 64));
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(s3, 1, 3);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddPaddingRow(0, 10);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(new SettableSizeView(gfx::Size(10, 20)));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(84, 64), pref);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, pref.width(), pref.height());
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(20, 0, 64, 64, s3);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, FixedViewWidth) {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* set = layout.AddColumnSet(0);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0, GridLayout::USE_PREF, 0, 0);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0,GridLayout::USE_PREF, 0, 0);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* view = new SettableSizeView(gfx::Size(30, 40));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(view, 1, 1, GridLayout::LEADING, GridLayout::LEADING, 10, 0);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, pref.width());
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(40, pref.height());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, pref.width(), pref.height());
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 10, 40, view);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, FixedViewHeight) {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* set = layout.AddColumnSet(0);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0, GridLayout::USE_PREF, 0, 0);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::LEADING, GridLayout::LEADING,
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0,GridLayout::USE_PREF, 0, 0);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* view = new SettableSizeView(gfx::Size(30, 40));
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(view, 1, 1, GridLayout::LEADING, GridLayout::LEADING, 0, 10);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(30, pref.width());
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, pref.height());
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, pref.width(), pref.height());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 30, 10, view);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that for views that span columns the underlying columns are resized
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// based on the resize percent of the column.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, ColumnSpanResizing) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* set = layout.AddColumnSet(0);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::FILL, GridLayout::CENTER,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 2, GridLayout::USE_PREF, 0, 0);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::FILL, GridLayout::CENTER,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 4, GridLayout::USE_PREF, 0, 0);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // span_view spans two columns and is twice as big the views added below.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* span_view = new SettableSizeView(gfx::Size(12, 40));
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(span_view, 2, 1, GridLayout::LEADING, GridLayout::LEADING);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* view1 = new SettableSizeView(gfx::Size(2, 40));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* view2 = new SettableSizeView(gfx::Size(4, 40));
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(view1);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(view2);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.SetBounds(0, 0, 12, 80);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.Layout(&host);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 0, 12, 40, span_view);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // view1 should be 4 pixels wide
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // column_pref + (remaining_width * column_resize / total_column_resize) =
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2 + (6 * 2 / 6).
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(0, 40, 4, 40, view1);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And view2 should be 8 pixels wide:
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 4 + (6 * 4 / 6).
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectViewBoundsEquals(4, 40, 8, 40, view2);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that GetPreferredSize() takes resizing of columns into account when
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// there is additional space in the case we have column sets of different
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// preferred sizes.
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, ColumnResizingOnGetPreferredSize) {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* set = layout.AddColumnSet(0);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::FILL, GridLayout::CENTER,
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 1, GridLayout::USE_PREF, 0, 0);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set = layout.AddColumnSet(1);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::FILL, GridLayout::CENTER,
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 1, GridLayout::USE_PREF, 0, 0);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set = layout.AddColumnSet(2);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::FILL, GridLayout::CENTER,
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 1, GridLayout::USE_PREF, 0, 0);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make a row containing a flexible view that trades width for height.
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* view1 = new FlexibleView(100);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(view1, 1, 1, GridLayout::FILL, GridLayout::LEADING);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The second row contains a view of fixed size that will enforce a column
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // width of 20 pixels.
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 1);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* view2 = new SettableSizeView(gfx::Size(20, 20));
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(view2, 1, 1, GridLayout::FILL, GridLayout::LEADING);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add another flexible view in row three in order to ensure column set
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ordering doesn't influence sizing behaviour.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 2);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  View* view3 = new FlexibleView(40);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(view3, 1, 1, GridLayout::FILL, GridLayout::LEADING);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We expect a height of 50: 30 from the variable width view in the first row
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // plus 20 from the statically sized view in the second row. The flexible
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // view in the third row should contribute no height.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(20, 50), layout.GetPreferredSize(&host));
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GridLayoutTest, MinimumPreferredSize) {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettableSizeView v1(gfx::Size(10, 20));
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ColumnSet* set = layout.AddColumnSet(0);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->AddColumn(GridLayout::FILL, GridLayout::FILL,
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 0, GridLayout::USE_PREF, 0, 0);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.StartRow(0, 0);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.AddView(&v1);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(10, 20), pref);
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout.set_minimum_size(gfx::Size(40, 40));
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPreferredSize();
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Size(40, 40), pref);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAll();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
670