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) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/tabs/stacked_tab_strip_layout.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view_model.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CommonTestData { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int initial_x; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int width; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int tab_size; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int tab_padding; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int stacked_offset; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int mini_tab_count; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int active_index; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string start_bounds; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string expected_bounds; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StackedTabStripLayoutTest : public testing::Test { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StackedTabStripLayoutTest() {} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Reset(StackedTabStripLayout* layout, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mini_tab_count, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int active_index) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->Reset(x, width, mini_tab_count, active_index); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateLayout(const CommonTestData& data) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!data.start_bounds.empty()) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareChildViewsFromString(data.start_bounds); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareChildViewsFromString(data.expected_bounds); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout_.reset(new StackedTabStripLayout( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size(data.tab_size, 10), data.tab_padding, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.stacked_offset, 4, &view_model_)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data.start_bounds.empty()) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareChildViewsFromString(data.expected_bounds); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout_->Reset(data.initial_x, data.width, data.mini_tab_count, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.active_index); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(SetBoundsFromString(data.start_bounds)); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout_->Reset(data.initial_x, data.width, data.mini_tab_count, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.active_index); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(SetBoundsFromString(data.start_bounds)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddViewToViewModel(int index) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* child_view = new views::View; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_.AddChildView(child_view); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_model_.Add(child_view, index); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrepareChildViewsFromString(const std::string& bounds) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> positions; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tokenize(bounds, " ", &positions); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareChildViews(static_cast<int>(positions.size())); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrepareChildViews(int count) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_model_.Clear(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_.RemoveAllChildViews(true); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < count; ++i) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToViewModel(i); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetBoundsFromString(const std::string& bounds) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> positions; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tokenize(bounds, " ", &positions); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareChildViews(static_cast<int>(positions.size())); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < view_model_.view_size(); ++i) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x = 0; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(view_model_.ideal_bounds(i)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(base::StringToInt(positions[i], &x)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_x(x); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_model_.set_ideal_bounds(i, bounds); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string BoundsString() const { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < view_model_.view_size(); ++i) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result.empty()) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += " "; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += base::IntToString(view_model_.ideal_bounds(i).x()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string BoundsString2(int active_index) const { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < view_model_.view_size(); ++i) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result.empty()) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += " "; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == active_index) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += "["; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += base::IntToString(view_model_.ideal_bounds(i).x()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == active_index) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += "]"; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Validate(int active_index, int max_width) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure none of the tabs are more than 90 apart 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (tab_size(100) + padding (-10)). 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 1; j < view_model_.view_size(); ++j) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(ideal_x(j) - ideal_x(j - 1), max_width - 100); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ideal_x(int index) const { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view_model_.ideal_bounds(index).x(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<StackedTabStripLayout> layout_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ViewModel view_model_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View view_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(StackedTabStripLayoutTest); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Random data. 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, ValidateInitialLayout) { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StackedTabStripLayout layout(gfx::Size(100, 10), -10, 2, 4, &view_model_); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareChildViews(12); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 120; i < 600; ++i) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < 12; ++j) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(&layout, 0, i, 0, j); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Validate(j, i); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasNonfatalFailure()) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensure initial layout is correct. 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, InitialLayout) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct CommonTestData test_data[] = { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 198, 100, -10, 1, 0, 9, "", 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0 0 0 0 0 0 1 2 3 4 94 95 96 97 98 98 98 98" }, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 198, 100, -10, 1, 0, 0, "", "0 90 94 95 96 97 98 98 98" }, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 300, 100, -10, 1, 0, 0, "", 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0 90 180 196 197 198 199 200 200 200 200" }, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 300, 100, -10, 1, 0, 10, "", "0 0 0 0 1 2 3 4 20 110 200" }, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 300, 100, -10, 1, 0, 1, "", "0 90 180 196 197 198 199 200 200" }, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 643, 160, -27, 6, 0, 0, "", "0 133 266 399" }, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 300, 100, -10, 1, 0, 7, "", "0 1 2 3 4 20 110 200" }, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 300, 100, -10, 1, 0, 6, "", "0 1 2 3 4 20 110 200" }, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 300, 100, -10, 1, 0, 4, "", "0 1 2 3 4 94 184 199 200" }, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateLayout(test_data[i]); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_data[i].expected_bounds, BoundsString()) << " at " << i; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions for dragging from an existing configuration. 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, DragActiveTabExisting) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct CommonTestData common_data; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int delta; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_data[] = { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The following set of tests create 6 tabs, the first two are pinned and 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the 2nd tab is selected. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1 pixel to the right, should push only mini-tabs and first non-mini-tab. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 1, "0 5 10 100 138 140", 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "1 6 11 101 138 140" }, 1 }, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Push enough to collapse the 4th tab. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 1, "0 5 10 100 138 140", 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "36 41 46 136 138 140" }, 36 }, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1 past collapsing the 4th. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 1, "0 5 10 100 138 140", 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "37 42 47 136 138 140" }, 37 }, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Collapse the third. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 1, "0 5 10 100 138 140", 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "124 129 134 136 138 140" }, 124 }, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One past collapsing the third. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 1, "0 5 10 100 138 140", 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "124 129 134 136 138 140" }, 125 }, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The following set of tests create 6 tabs, the first two are pinned and 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the 5th is selected. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1 pixel to the right, should expose part of a tab. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 4, "0 5 10 90 130 140", "0 5 10 90 131 140" }, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1 }, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Push the tab as far to the right as it'll go. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 4, "0 5 10 90 130 140", "0 5 10 90 138 140" }, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8 }, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One past as far to the right as it'll go. Should expose more of the tab 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before it. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 4, "0 5 10 90 130 140", "0 5 10 91 138 140" }, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9 }, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enough so that the pinned tabs start pulling in. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 4, "0 5 10 90 130 140", "1 6 11 101 138 140" }, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19 }, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One more than last. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 4, "0 5 10 90 130 140", "2 7 12 102 138 140" }, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20 }, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enough to collapse the fourth as small it can get. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 4, "0 5 10 90 130 140", 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "36 41 46 136 138 140" }, 54 }, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enough to collapse the third as small it can get. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 4, "0 5 10 90 130 140", 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "124 129 134 136 138 140" }, 142 }, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One more than last, shouldn't change anything. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 240, 100, -10, 2, 2, 4, "0 5 10 90 130 140", 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "124 129 134 136 138 140" }, 143 }, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The following set of tests create 3 tabs with the second selected. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drags in 2, pulling the rightmost tab along. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 240, 100, -10, 2, 0, 1, "0 90 140", "2 92 140" }, 2 }, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drags the rightmost tab as far to right as possible. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 240, 100, -10, 2, 0, 1, "0 90 140", "48 138 140" }, 48 }, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drags so much that the left most tabs pulls in. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 240, 100, -10, 2, 0, 1, "0 90 140", "135 138 140" }, 135 }, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drags so far that no more tabs pull in. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 240, 100, -10, 2, 0, 1, "0 90 140", "136 138 140" }, 200 }, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drags to the left most position before the right tabs start pulling in. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 240, 100, -10, 2, 0, 1, "0 90 140", "0 50 140" }, -40 }, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drags 1 beyond the left most position, which should pull in the right 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tab slightly. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 240, 100, -10, 2, 0, 1, "0 90 140", "0 49 139" }, -41 }, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drags to the left as far as the tab goes. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 240, 100, -10, 2, 0, 1, "0 90 140", "0 2 92" }, -88 }, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drags one past as far to the left as the tab goes. Should keep pulling 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the rightmost tab. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 240, 100, -10, 2, 0, 1, "0 90 140", "0 2 91" }, -89 }, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateLayout(test_data[i].common_data); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout_->DragActiveTab(test_data[i].delta); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_data[i].common_data.expected_bounds, BoundsString()) << 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " at " << i; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions for SizeToFit(). 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, SizeToFit) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct CommonTestData test_data[] = { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dragged to the right. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 240, 100, -10, 2, 2, 1, "0 5 10 100 138 140", "1 6 11 101 138 140"}, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 240, 100, -10, 2, 2, 1, "0 5 10 100 138 140", 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "124 129 134 136 138 140" }, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dragged to the left. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 240, 100, -10, 2, 0, 1, "0 50 140", "0 49 139" }, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dragged to the left. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 240, 100, -10, 2, 0, 1, "0 49 89 140", "0 49 89 139" }, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateLayout(test_data[i]); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBoundsFromString(test_data[i].expected_bounds); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout_->SizeToFit(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: because of the way the code is structured this asserts on 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |start_bound|, not |expected_bounds|. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_data[i].start_bounds, BoundsString()) << " at " << i; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions for AddTab(). 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, AddTab) { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonTestData common_data; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int add_index; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool add_active; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool add_mini; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_data[] = { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding a background tab test cases. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 300, 100, -10, 2, 0, 1, "0 90 180 198 200", "0 16 106 196 198 200"}, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, false, false }, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 300, 100, -10, 2, 0, 1, "0 90 180 198 200", "0 2 4 20 110 200"}, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5, false, false }, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 300, 100, -10, 2, 0, 1, "0 90 180 198 200", "0 90 180 196 198 200"}, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, false, false }, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 300, 100, -10, 2, 0, 1, "0 90 180 198 200", "0 2 4 94 184 200"}, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, false, false }, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 4, 200, 100, -10, 2, 1, 2, "0 4 10 100", "0 0 8 10 100"}, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, false, true }, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 4, 200, 100, -10, 2, 1, 2, "0 4 10 100", "0 0 8 98 100"}, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, true, true }, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 4, 200, 100, -10, 2, 1, 2, "0 4 10 100", "0 0 8 98 100"}, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, true, true }, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 2, "0 2 10 100", "0 4 94 98 100"}, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, true, true }, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 0, "0 90 92 92 94 96 98 100", 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0 0 0 2 4 6 8 98 100"}, 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7, true, false }, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 7, "0 2 4 6 8 8 10 100", 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0 0 2 4 6 8 96 98 100"}, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5, true, false }, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 7, "0 2 4 6 8 8 10 100", 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0 2 4 6 8 94 96 98 100"}, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4, true, false }, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 2, "0 2 10 100", "0 2 10 98 100"}, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, true, false }, 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 2, "0 2 10 100", "0 2 4 10 100"}, 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4, true, false }, 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 2, "0 2 10 100", "0 90 96 98 100"}, 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, true, false }, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateLayout(test_data[i].common_data); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int add_types = 0; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_data[i].add_active) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) add_types |= StackedTabStripLayout::kAddTypeActive; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_data[i].add_mini) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) add_types |= StackedTabStripLayout::kAddTypeMini; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToViewModel(test_data[i].add_index); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout_->AddTab(test_data[i].add_index, add_types, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data[i].common_data.initial_x + 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (test_data[i].add_mini ? 4 : 0)); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_data[i].common_data.expected_bounds, BoundsString()) << 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " at " << i; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around removing tabs. 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, RemoveTab) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: add coverage of removing mini tabs! 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct CommonTestData common_data; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int remove_index; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int x_after_remove; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_data[] = { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 882, 220, -29, 2, 0, 4, "0 23 214 405 596 602", 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0 191 382 573 662" }, 1, 0 }, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove before active. 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 4, "0 2 4 6 8 10 80 98 100", 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0 2 6 8 10 80 98 100" }, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 0 }, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stacked tabs on both sides. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 4, "0 2 4 6 8 10 80 98 100", 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0 2 4 6 10 80 98 100" }, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4, 0 }, 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mini-tabs. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 8, 200, 100, -10, 2, 1, 0, "0 8 94 96 98 100", "0 86 88 90 100" }, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0 }, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 16, 200, 100, -10, 2, 2, 0, "0 8 16 94 96 98 100", "8 8 86 88 90 100" }, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 8 }, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 16, 200, 100, -10, 2, 2, 0, "0 8 16 94 96 98 100", "0 8 86 88 90 100" }, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 8 }, 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove from ideal layout. 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 0, "0 90 94 96 98 100", "0 90 96 98 100" }, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0 }, 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 0, "0 90 94 96 98 100", "0 90 96 98 100" }, 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 0 }, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 0, "0 90 94 96 98 100", "0 90 96 98 100" }, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 0 }, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 0, "0 90 94 96 98 100", "0 90 94 98 100" }, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 0 }, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 0, "0 90 94 96 98 100", "0 90 94 96 100" }, 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5, 0 }, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateLayout(test_data[i].common_data); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int old_x = view_model_.ideal_bounds(test_data[i].remove_index).x(); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_model_.Remove(test_data[i].remove_index); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout_->RemoveTab(test_data[i].remove_index, test_data[i].x_after_remove, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_x); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_data[i].common_data.expected_bounds, BoundsString()) << 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " at " << i; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions for SetWidth(). 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, SetWidth) { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonTestData common_data; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int new_width; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_data[] = { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 500, 100, -10, 2, 0, 4, "0 90 180 270 360 400", 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0 90 180 196 198 200"}, 300 }, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies a bug in AdjustTrailingStackedTabs(). 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 103, 100, -10, 2, 0, 0, "", "0 2"}, 102 }, 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 8, 250, 100, -10, 2, 2, 2, "0 4 8 98 148 150", "0 4 8 98 160 250"}, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 350 }, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 8, 250, 100, -10, 2, 2, 2, "0 4 8 98 148 150", "0 4 8 96 98 100"}, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 200 }, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 250, 100, -10, 2, 0, 2, "0 40 90 120 150", "0 40 90 98 100"}, 200 }, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 250, 100, -10, 2, 0, 2, "0 2 60 150", "0 2 60 100"}, 200 }, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 250, 100, -10, 2, 0, 2, "0 40 120 150", "0 40 98 100"}, 200 }, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 2, "0 2 10 100", "0 2 60 150"}, 250 }, 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 2, "0 2 4 10 100", "0 2 20 110 200"}, 300 }, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateLayout(test_data[i].common_data); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout_->SetWidth(test_data[i].new_width); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_data[i].common_data.expected_bounds, BoundsString()) << 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " at " << i; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions for SetActiveIndex(). 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, SetActiveIndex) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonTestData common_data; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int new_index; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_data[] = { 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 250, 100, -10, 2, 0, 2, "0 4 8 98 148 150", "0 90 144 146 148 150"}, 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0 }, 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 250, 100, -10, 2, 0, 2, "0 4 8 98 148 150", "0 2 4 58 148 150"}, 4 }, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 250, 100, -10, 2, 0, 2, "0 4 8 98 148 150", "0 2 4 6 60 150"}, 5 }, 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 4, 250, 100, -10, 2, 1, 2, "0 4 8 98 148 150", "0 4 94 146 148 150"}, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0 }, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateLayout(test_data[i].common_data); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout_->SetActiveIndex(test_data[i].new_index); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_data[i].common_data.expected_bounds, BoundsString()) << 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " at " << i; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure don't crash when resized and only one tab. 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, EmptyTest) { 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StackedTabStripLayout layout(gfx::Size(160, 10), -27, 6, 4, &view_model_); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareChildViews(1); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout.AddTab(0, StackedTabStripLayout::kAddTypeActive, 0); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout.SetWidth(100); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout.SetWidth(50); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout.SetWidth(0); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout.SetWidth(500); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around removing tabs. 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, MoveTab) { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: add coverage of removing mini tabs! 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct CommonTestData common_data; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int from; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int to; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int new_active_index; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int new_start_x; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int new_mini_tab_count; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_data[] = { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Moves and unpins. 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 10, 300, 100, -10, 2, 2, 0, "", "0 5 10 100 190 198 200" }, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 1, 2, 5, 1 }, 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Moves and pins. 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 300, 100, -10, 2, 0, 4, "", "0 5 95 185 196 198 200" }, 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 0, 0, 5, 1 }, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 300, 100, -10, 2, 1, 2, "", "0 5 10 100 190 198 200" }, 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 0, 0, 10, 2 }, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 4, "0 2 4 6 96 98 100", "0 2 4 6 96 98 100" }, 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, 0, 4, 0, 0 }, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 200, 100, -10, 2, 0, 4, "0 2 4 6 96 98 100", "0 2 4 6 8 10 100" }, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 6, 6, 0, 0 }, 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateLayout(test_data[i].common_data); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_model_.MoveViewOnly(test_data[i].from, test_data[i].to); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < test_data[i].new_mini_tab_count; ++j) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_x(j * 5); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_model_.set_ideal_bounds(j, bounds); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout_->MoveTab(test_data[i].from, test_data[i].to, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data[i].new_active_index, test_data[i].new_start_x, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data[i].new_mini_tab_count); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_data[i].common_data.expected_bounds, BoundsString()) << 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " at " << i; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around IsStacked(). 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, IsStacked) { 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A single tab with enough space should never be stacked. 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareChildViews(1); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout_.reset(new StackedTabStripLayout( 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size(100, 10), -10, 2, 4, &view_model_)); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(layout_.get(), 0, 400, 0, 0); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(layout_->IsStacked(0)); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First tab active, remaining tabs stacked. 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareChildViews(8); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(layout_.get(), 0, 400, 0, 0); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(layout_->IsStacked(0)); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(layout_->IsStacked(7)); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Last tab active, preceeding tabs stacked. 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout_->SetActiveIndex(7); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(layout_->IsStacked(7)); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(layout_->IsStacked(0)); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around SetXAndMiniCount. 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, SetXAndMiniCount) { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies we don't crash when transitioning to all mini-tabs. 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareChildViews(1); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layout_.reset(new StackedTabStripLayout( 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size(100, 10), -10, 2, 4, &view_model_)); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(layout_.get(), 0, 400, 0, 0); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout_->SetXAndMiniCount(0, 1); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assertions around SetXAndMiniCount. 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(StackedTabStripLayoutTest, SetActiveTabLocation) { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestData { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct CommonTestData common_data; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int location; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } test_data[] = { 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Active tab is the first tab, can't be moved. 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 300, 100, -10, 2, 0, 0, "", "0 90 180 194 196 198 200" }, 50 }, 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Active tab is pinned; should result in nothing. 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 300, 100, -10, 2, 2, 1, "", "0 0 0 90 180 198 200" }, 199 }, 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Location is too far to the right, ends up being pushed in. 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 300, 100, -10, 2, 0, 3, "", "0 14 104 194 196 198 200" }, 199 }, 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Location can be honored. 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0, 300, 100, -10, 2, 0, 3, "", "0 2 4 40 130 198 200" }, 40 }, 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateLayout(test_data[i].common_data); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout_->SetActiveTabLocation(test_data[i].location); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_data[i].common_data.expected_bounds, BoundsString()) << 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " at " << i; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 561