1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <algorithm>
6#include <string>
7
8#include "base/string_number_conversions.h"
9#include "chrome/browser/tabs/tab_strip_selection_model.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12typedef testing::Test TabStripSelectionModelTest;
13
14// Returns the state of the selection model as a string. The format is:
15// 'active=X anchor=X selection=X X X...'.
16static std::string StateAsString(const TabStripSelectionModel& model) {
17  std::string result = "active=" + base::IntToString(model.active()) +
18      " anchor=" + base::IntToString(model.anchor()) +
19      " selection=";
20  const TabStripSelectionModel::SelectedIndices& selection(
21      model.selected_indices());
22  for (size_t i = 0; i < selection.size(); ++i) {
23    if (i != 0)
24      result += " ";
25    result += base::IntToString(selection[i]);
26  }
27  return result;
28}
29
30TEST_F(TabStripSelectionModelTest, InitialState) {
31  TabStripSelectionModel model;
32  EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model));
33  EXPECT_TRUE(model.empty());
34}
35
36TEST_F(TabStripSelectionModelTest, SetSelectedIndex) {
37  TabStripSelectionModel model;
38  model.SetSelectedIndex(2);
39  EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
40  EXPECT_FALSE(model.empty());
41}
42
43TEST_F(TabStripSelectionModelTest, IncrementFrom) {
44  TabStripSelectionModel model;
45  model.SetSelectedIndex(1);
46  model.IncrementFrom(1);
47  EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
48
49  // Increment from 4. This shouldn't effect the selection as its past the
50  // end of the selection.
51  model.IncrementFrom(4);
52  EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
53}
54
55TEST_F(TabStripSelectionModelTest, DecrementFrom) {
56  TabStripSelectionModel model;
57  model.SetSelectedIndex(2);
58  model.DecrementFrom(0);
59  EXPECT_EQ("active=1 anchor=1 selection=1", StateAsString(model));
60
61  // Shift down from 1. As the selection as the index being removed, this should
62  // clear the selection.
63  model.DecrementFrom(1);
64  EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model));
65
66  // Reset the selection to 2, and shift down from 4. This shouldn't do
67  // anything.
68  model.SetSelectedIndex(2);
69  model.DecrementFrom(4);
70  EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
71}
72
73TEST_F(TabStripSelectionModelTest, IsSelected) {
74  TabStripSelectionModel model;
75  model.SetSelectedIndex(2);
76  EXPECT_FALSE(model.IsSelected(0));
77  EXPECT_TRUE(model.IsSelected(2));
78}
79
80TEST_F(TabStripSelectionModelTest, AddIndexToSelected) {
81  TabStripSelectionModel model;
82  model.AddIndexToSelection(2);
83  EXPECT_EQ("active=-1 anchor=-1 selection=2", StateAsString(model));
84
85  model.AddIndexToSelection(4);
86  EXPECT_EQ("active=-1 anchor=-1 selection=2 4", StateAsString(model));
87}
88
89TEST_F(TabStripSelectionModelTest, RemoveIndexFromSelection) {
90  TabStripSelectionModel model;
91  model.SetSelectedIndex(2);
92  model.AddIndexToSelection(4);
93  EXPECT_EQ("active=2 anchor=2 selection=2 4", StateAsString(model));
94
95  model.RemoveIndexFromSelection(4);
96  EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
97
98  model.RemoveIndexFromSelection(2);
99  EXPECT_EQ("active=2 anchor=2 selection=", StateAsString(model));
100}
101
102TEST_F(TabStripSelectionModelTest, Clear) {
103  TabStripSelectionModel model;
104  model.SetSelectedIndex(2);
105
106  model.Clear();
107  EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model));
108}
109
110TEST_F(TabStripSelectionModelTest, MoveToLeft) {
111  TabStripSelectionModel model;
112  model.SetSelectedIndex(0);
113  model.AddIndexToSelection(4);
114  model.AddIndexToSelection(10);
115  model.set_anchor(4);
116  model.set_active(4);
117  model.Move(4, 0);
118  EXPECT_EQ("active=0 anchor=0 selection=0 1 10", StateAsString(model));
119}
120
121TEST_F(TabStripSelectionModelTest, MoveToRight) {
122  TabStripSelectionModel model;
123  model.SetSelectedIndex(0);
124  model.AddIndexToSelection(4);
125  model.AddIndexToSelection(10);
126  model.set_anchor(0);
127  model.set_active(0);
128  model.Move(0, 3);
129  EXPECT_EQ("active=3 anchor=3 selection=3 4 10", StateAsString(model));
130}
131
132TEST_F(TabStripSelectionModelTest, Copy) {
133  TabStripSelectionModel model;
134  model.SetSelectedIndex(0);
135  model.AddIndexToSelection(4);
136  model.AddIndexToSelection(10);
137  EXPECT_EQ("active=0 anchor=0 selection=0 4 10", StateAsString(model));
138  TabStripSelectionModel model2;
139  model2.Copy(model);
140  EXPECT_EQ("active=0 anchor=0 selection=0 4 10", StateAsString(model2));
141}
142
143TEST_F(TabStripSelectionModelTest, AddSelectionFromAnchorTo) {
144  TabStripSelectionModel model;
145  model.SetSelectedIndex(2);
146
147  model.AddSelectionFromAnchorTo(4);
148  EXPECT_EQ("active=4 anchor=2 selection=2 3 4", StateAsString(model));
149
150  model.AddSelectionFromAnchorTo(0);
151  EXPECT_EQ("active=0 anchor=2 selection=0 1 2 3 4", StateAsString(model));
152}
153