Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ui / app_list / app_list_item_list_unittest.cc
index b21edba..92986ff 100644 (file)
@@ -17,34 +17,44 @@ namespace {
 
 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);
 }
 
@@ -53,21 +63,24 @@ std::string GetItemName(int 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)
@@ -75,15 +88,25 @@ class AppListItemListTest : public testing::Test {
     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() {
@@ -98,10 +121,10 @@ class AppListItemListTest : public testing::Test {
   }
 
   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;
@@ -121,9 +144,9 @@ class AppListItemListTest : public testing::Test {
 };
 
 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));
@@ -132,32 +155,31 @@ TEST_F(AppListItemListTest, FindItemIndex) {
   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);
@@ -166,9 +188,9 @@ TEST_F(AppListItemListTest, RemoveItemAt) {
 }
 
 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));
@@ -177,107 +199,131 @@ TEST_F(AppListItemListTest, RemoveItem) {
   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.