// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include <algorithm> #include <string> #include "base/string_number_conversions.h" #include "chrome/browser/tabs/tab_strip_selection_model.h" #include "testing/gtest/include/gtest/gtest.h" typedef testing::Test TabStripSelectionModelTest; // Returns the state of the selection model as a string. The format is: // 'active=X anchor=X selection=X X X...'. static std::string StateAsString(const TabStripSelectionModel& model) { std::string result = "active=" + base::IntToString(model.active()) + " anchor=" + base::IntToString(model.anchor()) + " selection="; const TabStripSelectionModel::SelectedIndices& selection( model.selected_indices()); for (size_t i = 0; i < selection.size(); ++i) { if (i != 0) result += " "; result += base::IntToString(selection[i]); } return result; } TEST_F(TabStripSelectionModelTest, InitialState) { TabStripSelectionModel model; EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model)); EXPECT_TRUE(model.empty()); } TEST_F(TabStripSelectionModelTest, SetSelectedIndex) { TabStripSelectionModel model; model.SetSelectedIndex(2); EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model)); EXPECT_FALSE(model.empty()); } TEST_F(TabStripSelectionModelTest, IncrementFrom) { TabStripSelectionModel model; model.SetSelectedIndex(1); model.IncrementFrom(1); EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model)); // Increment from 4. This shouldn't effect the selection as its past the // end of the selection. model.IncrementFrom(4); EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model)); } TEST_F(TabStripSelectionModelTest, DecrementFrom) { TabStripSelectionModel model; model.SetSelectedIndex(2); model.DecrementFrom(0); EXPECT_EQ("active=1 anchor=1 selection=1", StateAsString(model)); // Shift down from 1. As the selection as the index being removed, this should // clear the selection. model.DecrementFrom(1); EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model)); // Reset the selection to 2, and shift down from 4. This shouldn't do // anything. model.SetSelectedIndex(2); model.DecrementFrom(4); EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model)); } TEST_F(TabStripSelectionModelTest, IsSelected) { TabStripSelectionModel model; model.SetSelectedIndex(2); EXPECT_FALSE(model.IsSelected(0)); EXPECT_TRUE(model.IsSelected(2)); } TEST_F(TabStripSelectionModelTest, AddIndexToSelected) { TabStripSelectionModel model; model.AddIndexToSelection(2); EXPECT_EQ("active=-1 anchor=-1 selection=2", StateAsString(model)); model.AddIndexToSelection(4); EXPECT_EQ("active=-1 anchor=-1 selection=2 4", StateAsString(model)); } TEST_F(TabStripSelectionModelTest, RemoveIndexFromSelection) { TabStripSelectionModel model; model.SetSelectedIndex(2); model.AddIndexToSelection(4); EXPECT_EQ("active=2 anchor=2 selection=2 4", StateAsString(model)); model.RemoveIndexFromSelection(4); EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model)); model.RemoveIndexFromSelection(2); EXPECT_EQ("active=2 anchor=2 selection=", StateAsString(model)); } TEST_F(TabStripSelectionModelTest, Clear) { TabStripSelectionModel model; model.SetSelectedIndex(2); model.Clear(); EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model)); } TEST_F(TabStripSelectionModelTest, MoveToLeft) { TabStripSelectionModel model; model.SetSelectedIndex(0); model.AddIndexToSelection(4); model.AddIndexToSelection(10); model.set_anchor(4); model.set_active(4); model.Move(4, 0); EXPECT_EQ("active=0 anchor=0 selection=0 1 10", StateAsString(model)); } TEST_F(TabStripSelectionModelTest, MoveToRight) { TabStripSelectionModel model; model.SetSelectedIndex(0); model.AddIndexToSelection(4); model.AddIndexToSelection(10); model.set_anchor(0); model.set_active(0); model.Move(0, 3); EXPECT_EQ("active=3 anchor=3 selection=3 4 10", StateAsString(model)); } TEST_F(TabStripSelectionModelTest, Copy) { TabStripSelectionModel model; model.SetSelectedIndex(0); model.AddIndexToSelection(4); model.AddIndexToSelection(10); EXPECT_EQ("active=0 anchor=0 selection=0 4 10", StateAsString(model)); TabStripSelectionModel model2; model2.Copy(model); EXPECT_EQ("active=0 anchor=0 selection=0 4 10", StateAsString(model2)); } TEST_F(TabStripSelectionModelTest, AddSelectionFromAnchorTo) { TabStripSelectionModel model; model.SetSelectedIndex(2); model.AddSelectionFromAnchorTo(4); EXPECT_EQ("active=4 anchor=2 selection=2 3 4", StateAsString(model)); model.AddSelectionFromAnchorTo(0); EXPECT_EQ("active=0 anchor=2 selection=0 1 2 3 4", StateAsString(model)); }