Home | History | Annotate | Download | only in models
      1 // Copyright (c) 2012 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 "ui/base/models/list_selection_model.h"
      6 
      7 #include <algorithm>
      8 #include <string>
      9 
     10 #include "base/strings/string_number_conversions.h"
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 
     13 namespace ui {
     14 
     15 typedef testing::Test ListSelectionModelTest;
     16 
     17 // Returns the state of the selection model as a string. The format is:
     18 // 'active=X anchor=X selection=X X X...'.
     19 static std::string StateAsString(const ListSelectionModel& model) {
     20   std::string result = "active=" + base::IntToString(model.active()) +
     21       " anchor=" + base::IntToString(model.anchor()) +
     22       " selection=";
     23   const ListSelectionModel::SelectedIndices& selection(
     24       model.selected_indices());
     25   for (size_t i = 0; i < selection.size(); ++i) {
     26     if (i != 0)
     27       result += " ";
     28     result += base::IntToString(selection[i]);
     29   }
     30   return result;
     31 }
     32 
     33 TEST_F(ListSelectionModelTest, InitialState) {
     34   ListSelectionModel model;
     35   EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model));
     36   EXPECT_TRUE(model.empty());
     37 }
     38 
     39 TEST_F(ListSelectionModelTest, SetSelectedIndex) {
     40   ListSelectionModel model;
     41   model.SetSelectedIndex(2);
     42   EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
     43   EXPECT_FALSE(model.empty());
     44 }
     45 
     46 TEST_F(ListSelectionModelTest, SetSelectedIndexToEmpty) {
     47   ListSelectionModel model;
     48   model.SetSelectedIndex(-1);
     49   EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model));
     50   EXPECT_TRUE(model.empty());
     51 }
     52 
     53 TEST_F(ListSelectionModelTest, IncrementFrom) {
     54   ListSelectionModel model;
     55   model.SetSelectedIndex(1);
     56   model.IncrementFrom(1);
     57   EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
     58 
     59   // Increment from 4. This shouldn't effect the selection as its past the
     60   // end of the selection.
     61   model.IncrementFrom(4);
     62   EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
     63 }
     64 
     65 TEST_F(ListSelectionModelTest, DecrementFrom) {
     66   ListSelectionModel model;
     67   model.SetSelectedIndex(2);
     68   model.DecrementFrom(0);
     69   EXPECT_EQ("active=1 anchor=1 selection=1", StateAsString(model));
     70 
     71   // Shift down from 1. As the selection as the index being removed, this should
     72   // clear the selection.
     73   model.DecrementFrom(1);
     74   EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model));
     75 
     76   // Reset the selection to 2, and shift down from 4. This shouldn't do
     77   // anything.
     78   model.SetSelectedIndex(2);
     79   model.DecrementFrom(4);
     80   EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
     81 }
     82 
     83 TEST_F(ListSelectionModelTest, IsSelected) {
     84   ListSelectionModel model;
     85   model.SetSelectedIndex(2);
     86   EXPECT_FALSE(model.IsSelected(0));
     87   EXPECT_TRUE(model.IsSelected(2));
     88 }
     89 
     90 TEST_F(ListSelectionModelTest, AddIndexToSelected) {
     91   ListSelectionModel model;
     92   model.AddIndexToSelection(2);
     93   EXPECT_EQ("active=-1 anchor=-1 selection=2", StateAsString(model));
     94 
     95   model.AddIndexToSelection(4);
     96   EXPECT_EQ("active=-1 anchor=-1 selection=2 4", StateAsString(model));
     97 }
     98 
     99 TEST_F(ListSelectionModelTest, RemoveIndexFromSelection) {
    100   ListSelectionModel model;
    101   model.SetSelectedIndex(2);
    102   model.AddIndexToSelection(4);
    103   EXPECT_EQ("active=2 anchor=2 selection=2 4", StateAsString(model));
    104 
    105   model.RemoveIndexFromSelection(4);
    106   EXPECT_EQ("active=2 anchor=2 selection=2", StateAsString(model));
    107 
    108   model.RemoveIndexFromSelection(2);
    109   EXPECT_EQ("active=2 anchor=2 selection=", StateAsString(model));
    110 }
    111 
    112 TEST_F(ListSelectionModelTest, SetSelectionFromAnchorTo) {
    113   ListSelectionModel model;
    114   model.SetSelectedIndex(2);
    115   model.SetSelectionFromAnchorTo(7);
    116   EXPECT_EQ("active=7 anchor=2 selection=2 3 4 5 6 7", StateAsString(model));
    117 
    118   model.Clear();
    119   model.SetSelectedIndex(7);
    120   model.SetSelectionFromAnchorTo(2);
    121   EXPECT_EQ("active=2 anchor=7 selection=2 3 4 5 6 7", StateAsString(model));
    122 
    123   model.Clear();
    124   model.SetSelectionFromAnchorTo(7);
    125   EXPECT_EQ("active=7 anchor=7 selection=7", StateAsString(model));
    126 }
    127 
    128 TEST_F(ListSelectionModelTest, Clear) {
    129   ListSelectionModel model;
    130   model.SetSelectedIndex(2);
    131 
    132   model.Clear();
    133   EXPECT_EQ("active=-1 anchor=-1 selection=", StateAsString(model));
    134 }
    135 
    136 TEST_F(ListSelectionModelTest, MoveToLeft) {
    137   ListSelectionModel model;
    138   model.SetSelectedIndex(0);
    139   model.AddIndexToSelection(4);
    140   model.AddIndexToSelection(10);
    141   model.set_anchor(4);
    142   model.set_active(4);
    143   model.Move(4, 0);
    144   EXPECT_EQ("active=0 anchor=0 selection=0 1 10", StateAsString(model));
    145 }
    146 
    147 TEST_F(ListSelectionModelTest, MoveToRight) {
    148   ListSelectionModel model;
    149   model.SetSelectedIndex(0);
    150   model.AddIndexToSelection(4);
    151   model.AddIndexToSelection(10);
    152   model.set_anchor(0);
    153   model.set_active(0);
    154   model.Move(0, 3);
    155   EXPECT_EQ("active=3 anchor=3 selection=3 4 10", StateAsString(model));
    156 }
    157 
    158 TEST_F(ListSelectionModelTest, Copy) {
    159   ListSelectionModel model;
    160   model.SetSelectedIndex(0);
    161   model.AddIndexToSelection(4);
    162   model.AddIndexToSelection(10);
    163   EXPECT_EQ("active=0 anchor=0 selection=0 4 10", StateAsString(model));
    164   ListSelectionModel model2;
    165   model2.Copy(model);
    166   EXPECT_EQ("active=0 anchor=0 selection=0 4 10", StateAsString(model2));
    167 }
    168 
    169 TEST_F(ListSelectionModelTest, AddSelectionFromAnchorTo) {
    170   ListSelectionModel model;
    171   model.SetSelectedIndex(2);
    172 
    173   model.AddSelectionFromAnchorTo(4);
    174   EXPECT_EQ("active=4 anchor=2 selection=2 3 4", StateAsString(model));
    175 
    176   model.AddSelectionFromAnchorTo(0);
    177   EXPECT_EQ("active=0 anchor=2 selection=0 1 2 3 4", StateAsString(model));
    178 }
    179 
    180 TEST_F(ListSelectionModelTest, Equals) {
    181   ListSelectionModel model1;
    182   model1.SetSelectedIndex(0);
    183   model1.AddSelectionFromAnchorTo(4);
    184 
    185   ListSelectionModel model2;
    186   model2.SetSelectedIndex(0);
    187   model2.AddSelectionFromAnchorTo(4);
    188 
    189   EXPECT_TRUE(model1.Equals(model2));
    190   EXPECT_TRUE(model2.Equals(model1));
    191 
    192   model2.SetSelectedIndex(0);
    193   EXPECT_FALSE(model1.Equals(model2));
    194   EXPECT_FALSE(model2.Equals(model1));
    195 }
    196 
    197 }  // namespace ui
    198