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