class TestObserver : public AppListItemListObserver {
public:
- TestObserver()
- : items_added_(0),
- items_removed_(0) {
- }
+ TestObserver() : items_added_(0), items_removed_(0), items_moved_(0) {}
- virtual ~TestObserver() {
- }
+ ~TestObserver() override {}
// AppListItemListObserver overriden:
- virtual void OnListItemAdded(size_t index, AppListItem* item) OVERRIDE {
+ void OnListItemAdded(size_t index, AppListItem* item) override {
++items_added_;
}
- virtual void OnListItemRemoved(size_t index, AppListItem* item) OVERRIDE {
+ void OnListItemRemoved(size_t index, AppListItem* item) override {
++items_removed_;
}
+ void OnListItemMoved(size_t from_index,
+ size_t to_index,
+ AppListItem* item) override {
+ ++items_moved_;
+ }
+
size_t items_added() const { return items_added_; }
size_t items_removed() const { return items_removed_; }
+ size_t items_moved() const { return items_moved_; }
+
+ void ResetCounts() {
+ items_added_ = 0;
+ items_removed_ = 0;
+ items_moved_ = 0;
+ }
private:
size_t items_added_;
size_t items_removed_;
+ size_t items_moved_;
DISALLOW_COPY_AND_ASSIGN(TestObserver);
};
-std::string GetItemName(int id) {
+std::string GetItemId(int id) {
return base::StringPrintf("Item %d", id);
}
class AppListItemListTest : public testing::Test {
public:
AppListItemListTest() {}
- virtual ~AppListItemListTest() {}
+ ~AppListItemListTest() override {}
// testing::Test overrides:
- virtual void SetUp() OVERRIDE {
- item_list_.AddObserver(&observer_);
+ void SetUp() override { item_list_.AddObserver(&observer_); }
+
+ void TearDown() override { item_list_.RemoveObserver(&observer_); }
+
+ protected:
+ AppListItem* FindItem(const std::string& id) {
+ return item_list_.FindItem(id);
}
- virtual void TearDown() OVERRIDE {
- item_list_.RemoveObserver(&observer_);
+ bool FindItemIndex(const std::string& id, size_t* index) {
+ return item_list_.FindItemIndex(id, index);
}
- protected:
- AppListItem* CreateItem(const std::string& title,
- const std::string& full_name) {
- AppListItem* item = new AppListItem(title);
+ scoped_ptr<AppListItem> CreateItem(const std::string& name) {
+ scoped_ptr<AppListItem> item(new AppListItem(name));
size_t nitems = item_list_.item_count();
syncer::StringOrdinal position;
if (nitems == 0)
else
position = item_list_.item_at(nitems - 1)->position().CreateAfter();
item->set_position(position);
- item->SetTitleAndFullName(title, full_name);
- return item;
+ return item.Pass();
+ }
+
+ AppListItem* CreateAndAddItem(const std::string& name) {
+ scoped_ptr<AppListItem> item(CreateItem(name));
+ return item_list_.AddItem(item.Pass());
+ }
+
+ scoped_ptr<AppListItem> RemoveItem(const std::string& id) {
+ return item_list_.RemoveItem(id);
}
- AppListItem* CreateAndAddItem(const std::string& title,
- const std::string& full_name) {
- AppListItem* item = CreateItem(title, full_name);
- item_list_.AddItem(item);
- return item;
+ scoped_ptr<AppListItem> RemoveItemAt(size_t index) {
+ return item_list_.RemoveItemAt(index);
+ }
+
+ syncer::StringOrdinal CreatePositionBefore(
+ const syncer::StringOrdinal& position) {
+ return item_list_.CreatePositionBefore(position);
}
bool VerifyItemListOrdinals() {
}
bool VerifyItemOrder4(size_t a, size_t b, size_t c, size_t d) {
- if ((GetItemName(a) == item_list_.item_at(0)->id()) &&
- (GetItemName(b) == item_list_.item_at(1)->id()) &&
- (GetItemName(c) == item_list_.item_at(2)->id()) &&
- (GetItemName(d) == item_list_.item_at(3)->id()))
+ if ((GetItemId(a) == item_list_.item_at(0)->id()) &&
+ (GetItemId(b) == item_list_.item_at(1)->id()) &&
+ (GetItemId(c) == item_list_.item_at(2)->id()) &&
+ (GetItemId(d) == item_list_.item_at(3)->id()))
return true;
PrintItems();
return false;
};
TEST_F(AppListItemListTest, FindItemIndex) {
- AppListItem* item_0 = CreateAndAddItem(GetItemName(0), GetItemName(0));
- AppListItem* item_1 = CreateAndAddItem(GetItemName(1), GetItemName(1));
- AppListItem* item_2 = CreateAndAddItem(GetItemName(2), GetItemName(2));
+ AppListItem* item_0 = CreateAndAddItem(GetItemId(0));
+ AppListItem* item_1 = CreateAndAddItem(GetItemId(1));
+ AppListItem* item_2 = CreateAndAddItem(GetItemId(2));
EXPECT_EQ(observer_.items_added(), 3u);
EXPECT_EQ(item_list_.item_count(), 3u);
EXPECT_EQ(item_0, item_list_.item_at(0));
EXPECT_TRUE(VerifyItemListOrdinals());
size_t index;
- EXPECT_TRUE(item_list_.FindItemIndex(item_0->id(), &index));
+ EXPECT_TRUE(FindItemIndex(item_0->id(), &index));
EXPECT_EQ(index, 0u);
- EXPECT_TRUE(item_list_.FindItemIndex(item_1->id(), &index));
+ EXPECT_TRUE(FindItemIndex(item_1->id(), &index));
EXPECT_EQ(index, 1u);
- EXPECT_TRUE(item_list_.FindItemIndex(item_2->id(), &index));
+ EXPECT_TRUE(FindItemIndex(item_2->id(), &index));
EXPECT_EQ(index, 2u);
- scoped_ptr<AppListItem> item_3(
- CreateItem(GetItemName(3), GetItemName(3)));
- EXPECT_FALSE(item_list_.FindItemIndex(item_3->id(), &index));
+ scoped_ptr<AppListItem> item_3(CreateItem(GetItemId(3)));
+ EXPECT_FALSE(FindItemIndex(item_3->id(), &index));
}
TEST_F(AppListItemListTest, RemoveItemAt) {
- AppListItem* item_0 = CreateAndAddItem(GetItemName(0), GetItemName(0));
- AppListItem* item_1 = CreateAndAddItem(GetItemName(1), GetItemName(1));
- AppListItem* item_2 = CreateAndAddItem(GetItemName(2), GetItemName(2));
+ AppListItem* item_0 = CreateAndAddItem(GetItemId(0));
+ AppListItem* item_1 = CreateAndAddItem(GetItemId(1));
+ AppListItem* item_2 = CreateAndAddItem(GetItemId(2));
EXPECT_EQ(item_list_.item_count(), 3u);
EXPECT_EQ(observer_.items_added(), 3u);
size_t index;
- EXPECT_TRUE(item_list_.FindItemIndex(item_1->id(), &index));
+ EXPECT_TRUE(FindItemIndex(item_1->id(), &index));
EXPECT_EQ(index, 1u);
EXPECT_TRUE(VerifyItemListOrdinals());
- scoped_ptr<AppListItem> item_removed = item_list_.RemoveItemAt(1);
+ scoped_ptr<AppListItem> item_removed = RemoveItemAt(1);
EXPECT_EQ(item_removed, item_1);
- EXPECT_FALSE(item_list_.FindItem(item_1->id()));
+ EXPECT_FALSE(FindItem(item_1->id()));
EXPECT_EQ(item_list_.item_count(), 2u);
EXPECT_EQ(observer_.items_removed(), 1u);
EXPECT_EQ(item_list_.item_at(0), item_0);
}
TEST_F(AppListItemListTest, RemoveItem) {
- AppListItem* item_0 = CreateAndAddItem(GetItemName(0), GetItemName(0));
- AppListItem* item_1 = CreateAndAddItem(GetItemName(1), GetItemName(1));
- AppListItem* item_2 = CreateAndAddItem(GetItemName(2), GetItemName(2));
+ AppListItem* item_0 = CreateAndAddItem(GetItemId(0));
+ AppListItem* item_1 = CreateAndAddItem(GetItemId(1));
+ AppListItem* item_2 = CreateAndAddItem(GetItemId(2));
EXPECT_EQ(item_list_.item_count(), 3u);
EXPECT_EQ(observer_.items_added(), 3u);
EXPECT_EQ(item_0, item_list_.item_at(0));
EXPECT_TRUE(VerifyItemListOrdinals());
size_t index;
- EXPECT_TRUE(item_list_.FindItemIndex(item_1->id(), &index));
+ EXPECT_TRUE(FindItemIndex(item_1->id(), &index));
EXPECT_EQ(index, 1u);
- scoped_ptr<AppListItem> item_removed =
- item_list_.RemoveItem(item_1->id());
+ scoped_ptr<AppListItem> item_removed = RemoveItem(item_1->id());
EXPECT_EQ(item_removed, item_1);
- EXPECT_FALSE(item_list_.FindItem(item_1->id()));
+ EXPECT_FALSE(FindItem(item_1->id()));
EXPECT_EQ(item_list_.item_count(), 2u);
EXPECT_EQ(observer_.items_removed(), 1u);
EXPECT_TRUE(VerifyItemListOrdinals());
-
- scoped_ptr<AppListItem> not_found_item = item_list_.RemoveItem("Bogus");
- EXPECT_FALSE(not_found_item.get());
}
-TEST_F(AppListItemListTest, InsertItemAt) {
- AppListItem* item_0 = CreateAndAddItem(GetItemName(0), GetItemName(0));
- AppListItem* item_1 = CreateAndAddItem(GetItemName(1), GetItemName(1));
- EXPECT_EQ(item_list_.item_count(), 2u);
- EXPECT_EQ(observer_.items_added(), 2u);
- EXPECT_EQ(item_list_.item_at(0), item_0);
- EXPECT_EQ(item_list_.item_at(1), item_1);
- EXPECT_TRUE(VerifyItemListOrdinals());
-
- // Insert an item at the beginning of the item_list_.
- AppListItem* item_2 = CreateItem(GetItemName(2), GetItemName(2));
- item_list_.InsertItemAt(item_2, 0);
- EXPECT_EQ(item_list_.item_count(), 3u);
- EXPECT_EQ(observer_.items_added(), 3u);
- EXPECT_EQ(item_list_.item_at(0), item_2);
- EXPECT_EQ(item_list_.item_at(1), item_0);
- EXPECT_EQ(item_list_.item_at(2), item_1);
- EXPECT_TRUE(VerifyItemListOrdinals());
-
- // Insert an item at the end of the item_list_.
- AppListItem* item_3 = CreateItem(GetItemName(3), GetItemName(3));
- item_list_.InsertItemAt(item_3, item_list_.item_count());
- EXPECT_EQ(item_list_.item_count(), 4u);
- EXPECT_EQ(observer_.items_added(), 4u);
- EXPECT_EQ(item_list_.item_at(0), item_2);
- EXPECT_EQ(item_list_.item_at(1), item_0);
- EXPECT_EQ(item_list_.item_at(2), item_1);
- EXPECT_EQ(item_list_.item_at(3), item_3);
- EXPECT_TRUE(VerifyItemListOrdinals());
-
- // Insert an item at the 2nd item of the item_list_.
- AppListItem* item_4 = CreateItem(GetItemName(4), GetItemName(4));
- item_list_.InsertItemAt(item_4, 1);
- EXPECT_EQ(item_list_.item_count(), 5u);
- EXPECT_EQ(observer_.items_added(), 5u);
- EXPECT_EQ(item_list_.item_at(0), item_2);
- EXPECT_EQ(item_list_.item_at(1), item_4);
- EXPECT_EQ(item_list_.item_at(2), item_0);
- EXPECT_EQ(item_list_.item_at(3), item_1);
- EXPECT_EQ(item_list_.item_at(4), item_3);
- EXPECT_TRUE(VerifyItemListOrdinals());
-}
+TEST_F(AppListItemListTest, MoveItem) {
+ CreateAndAddItem(GetItemId(0));
+ CreateAndAddItem(GetItemId(1));
+ CreateAndAddItem(GetItemId(2));
+ CreateAndAddItem(GetItemId(3));
-TEST_F(AppListItemListTest, InsertItemAtEmptyList) {
- AppListItem* item_0 = CreateItem(GetItemName(0), GetItemName(0));
- EXPECT_EQ(item_list_.item_count(), 0u);
- item_list_.InsertItemAt(item_0, 0);
- EXPECT_EQ(item_list_.item_count(), 1u);
- EXPECT_EQ(observer_.items_added(), 1u);
- EXPECT_EQ(item_list_.item_at(0), item_0);
- EXPECT_TRUE(VerifyItemListOrdinals());
-}
+ EXPECT_TRUE(VerifyItemOrder4(0, 1, 2, 3));
-TEST_F(AppListItemListTest, MoveItem) {
- CreateAndAddItem(GetItemName(0), GetItemName(0));
- CreateAndAddItem(GetItemName(1), GetItemName(1));
- CreateAndAddItem(GetItemName(2), GetItemName(2));
- CreateAndAddItem(GetItemName(3), GetItemName(3));
+ item_list_.MoveItem(0, 0);
+ EXPECT_EQ(0u, observer_.items_moved());
EXPECT_TRUE(VerifyItemOrder4(0, 1, 2, 3));
item_list_.MoveItem(0, 1);
+ EXPECT_EQ(1u, observer_.items_moved());
EXPECT_TRUE(VerifyItemListOrdinals());
EXPECT_TRUE(VerifyItemOrder4(1, 0, 2, 3));
item_list_.MoveItem(1, 2);
+ EXPECT_EQ(2u, observer_.items_moved());
EXPECT_TRUE(VerifyItemListOrdinals());
EXPECT_TRUE(VerifyItemOrder4(1, 2, 0, 3));
- item_list_.MoveItem(2, 3);
+ item_list_.MoveItem(2, 1);
+ EXPECT_EQ(3u, observer_.items_moved());
EXPECT_TRUE(VerifyItemListOrdinals());
- EXPECT_TRUE(VerifyItemOrder4(1, 2, 3, 0));
+ EXPECT_TRUE(VerifyItemOrder4(1, 0, 2, 3));
item_list_.MoveItem(3, 0);
+ EXPECT_EQ(4u, observer_.items_moved());
EXPECT_TRUE(VerifyItemListOrdinals());
- EXPECT_TRUE(VerifyItemOrder4(0, 1, 2, 3));
+ EXPECT_TRUE(VerifyItemOrder4(3, 1, 0, 2));
item_list_.MoveItem(0, 3);
+ EXPECT_EQ(5u, observer_.items_moved());
EXPECT_TRUE(VerifyItemListOrdinals());
- EXPECT_TRUE(VerifyItemOrder4(1, 2, 3, 0));
+ EXPECT_TRUE(VerifyItemOrder4(1, 0, 2, 3));
+}
+
+TEST_F(AppListItemListTest, SamePosition) {
+ CreateAndAddItem(GetItemId(0));
+ CreateAndAddItem(GetItemId(1));
+ CreateAndAddItem(GetItemId(2));
+ CreateAndAddItem(GetItemId(3));
+ item_list_.SetItemPosition(item_list_.item_at(2),
+ item_list_.item_at(1)->position());
+ EXPECT_TRUE(VerifyItemOrder4(0, 1, 2, 3));
+ EXPECT_TRUE(item_list_.item_at(1)->position().Equals(
+ item_list_.item_at(2)->position()));
+ // Moving an item to position 1 should fix the position.
+ observer_.ResetCounts();
+ item_list_.MoveItem(0, 1);
+ EXPECT_TRUE(VerifyItemOrder4(1, 0, 2, 3));
+ EXPECT_TRUE(item_list_.item_at(0)->position().LessThan(
+ item_list_.item_at(1)->position()));
+ EXPECT_TRUE(item_list_.item_at(1)->position().LessThan(
+ item_list_.item_at(2)->position()));
+ EXPECT_TRUE(item_list_.item_at(2)->position().LessThan(
+ item_list_.item_at(3)->position()));
+ // One extra move notification for fixed position.
+ EXPECT_EQ(2u, observer_.items_moved());
+
+ // Restore the original order.
+ item_list_.MoveItem(1, 0);
+ EXPECT_TRUE(VerifyItemOrder4(0, 1, 2, 3));
+
+ // Set all four items to the same position.
+ item_list_.SetItemPosition(item_list_.item_at(1),
+ item_list_.item_at(0)->position());
+ item_list_.SetItemPosition(item_list_.item_at(2),
+ item_list_.item_at(0)->position());
+ item_list_.SetItemPosition(item_list_.item_at(3),
+ item_list_.item_at(0)->position());
+ // Move should fix the position of the items.
+ observer_.ResetCounts();
+ item_list_.MoveItem(0, 1);
+ EXPECT_TRUE(VerifyItemOrder4(1, 0, 2, 3));
+ EXPECT_TRUE(item_list_.item_at(0)->position().LessThan(
+ item_list_.item_at(1)->position()));
+ EXPECT_TRUE(item_list_.item_at(1)->position().LessThan(
+ item_list_.item_at(2)->position()));
+ EXPECT_TRUE(item_list_.item_at(2)->position().LessThan(
+ item_list_.item_at(3)->position()));
+ // One extra move notification for fixed position.
+ EXPECT_EQ(2u, observer_.items_moved());
+}
+
+TEST_F(AppListItemListTest, CreatePositionBefore) {
+ CreateAndAddItem(GetItemId(0));
+ syncer::StringOrdinal position0 = item_list_.item_at(0)->position();
+ syncer::StringOrdinal new_position;
+ new_position = CreatePositionBefore(position0.CreateBefore());
+ EXPECT_TRUE(new_position.LessThan(position0));
+ new_position = CreatePositionBefore(position0);
+ EXPECT_TRUE(new_position.LessThan(position0));
+ new_position = CreatePositionBefore(position0.CreateAfter());
+ EXPECT_TRUE(new_position.GreaterThan(position0));
+
+ CreateAndAddItem(GetItemId(1));
+ syncer::StringOrdinal position1 = item_list_.item_at(1)->position();
+ EXPECT_TRUE(position1.GreaterThan(position0));
+ new_position = CreatePositionBefore(position1);
+ EXPECT_TRUE(new_position.GreaterThan(position0));
+ EXPECT_TRUE(new_position.LessThan(position1));
+
+ // Invalid ordinal should return a position at the end of the list.
+ new_position = CreatePositionBefore(syncer::StringOrdinal());
+ EXPECT_TRUE(new_position.GreaterThan(position1));
}
TEST_F(AppListItemListTest, SetItemPosition) {
- CreateAndAddItem(GetItemName(0), GetItemName(0));
- CreateAndAddItem(GetItemName(1), GetItemName(1));
- CreateAndAddItem(GetItemName(2), GetItemName(2));
- CreateAndAddItem(GetItemName(3), GetItemName(3));
+ CreateAndAddItem(GetItemId(0));
+ CreateAndAddItem(GetItemId(1));
+ CreateAndAddItem(GetItemId(2));
+ CreateAndAddItem(GetItemId(3));
EXPECT_TRUE(VerifyItemOrder4(0, 1, 2, 3));
// No change to position.