15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/apps_grid_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/command_line.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/app_list/app_list_constants.h"
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/app_list/app_list_folder_item.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/app_list/app_list_item.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/app_list/app_list_model.h"
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/app_list/app_list_switches.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/app_list/pagination_model.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/test/app_list_test_model.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/app_list_item_view.h"
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/app_list/views/apps_grid_view_folder_delegate.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/views/test/apps_grid_view_test_api.h"
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/views/test/views_test_base.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace app_list {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kCols = 2;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kRows = 2;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTilesPerPage = kCols * kRows;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kWidth = 320;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kHeight = 240;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PageFlipWaiter : public PaginationModelObserver {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PageFlipWaiter(base::MessageLoopForUI* ui_loop, PaginationModel* model)
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      : ui_loop_(ui_loop), model_(model), wait_(false) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->AddObserver(this);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PageFlipWaiter() {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    model_->RemoveObserver(this);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void Wait() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!wait_);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wait_ = true;
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_loop_->Run();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wait_ = false;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void Reset() { selected_pages_.clear(); }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const std::string& selected_pages() const { return selected_pages_; }
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PaginationModelObserver overrides:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TotalPagesChanged() OVERRIDE {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SelectedPageChanged(int old_selected,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int new_selected) OVERRIDE {
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!selected_pages_.empty())
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      selected_pages_ += ',';
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    selected_pages_ += base::IntToString(new_selected);
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wait_)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_loop_->Quit();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void TransitionStarted() OVERRIDE {
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TransitionChanged() OVERRIDE {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoopForUI* ui_loop_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaginationModel* model_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool wait_;
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string selected_pages_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PageFlipWaiter);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class AppsGridViewTest : public views::ViewsTestBase {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppsGridViewTest() {}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AppsGridViewTest() {}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // testing::Test overrides:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    views::ViewsTestBase::SetUp();
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_.reset(new AppListTestModel);
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    model_->SetFoldersEnabled(true);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    apps_grid_view_.reset(new AppsGridView(NULL));
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    apps_grid_view_->SetLayout(kCols, kRows);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    apps_grid_view_->SetBoundsRect(gfx::Rect(gfx::Size(kWidth, kHeight)));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    apps_grid_view_->SetModel(model_.get());
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    apps_grid_view_->SetItemList(model_->top_level_item_list());
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_api_.reset(new AppsGridViewTestApi(apps_grid_view_.get()));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    apps_grid_view_.reset();  // Release apps grid view before models.
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    views::ViewsTestBase::TearDown();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void EnsureFoldersEnabled() {
118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Folders require AppList sync to be enabled.
119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    CommandLine::ForCurrentProcess()->AppendSwitch(
120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        switches::kEnableSyncAppList);
121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppListItemView* GetItemViewAt(int index) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<AppListItemView*>(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_api_->GetViewAtModelIndex(index));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppListItemView* GetItemViewForPoint(const gfx::Point& point) {
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    for (size_t i = 0; i < model_->top_level_item_list()->item_count(); ++i) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AppListItemView* view = GetItemViewAt(i);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (view->bounds().Contains(point))
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return view;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect GetItemTileRectAt(int row, int col) {
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK_GT(model_->top_level_item_list()->item_count(), 0u);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Insets insets(apps_grid_view_->GetInsets());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect rect(gfx::Point(insets.left(), insets.top()),
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   GetItemViewAt(0)->bounds().size());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rect.Offset(col * rect.width(), row * rect.height());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return rect;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  PaginationModel* GetPaginationModel() {
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return apps_grid_view_->pagination_model();
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Points are in |apps_grid_view_|'s coordinates.
15234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  AppListItemView* SimulateDrag(AppsGridView::Pointer pointer,
15334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                                const gfx::Point& from,
15434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                                const gfx::Point& to) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppListItemView* view = GetItemViewForPoint(from);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(view);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point translated_from = gfx::PointAtOffsetFromOrigin(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        from - view->bounds().origin());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point translated_to = gfx::PointAtOffsetFromOrigin(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        to - view->bounds().origin());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent pressed_event(ui::ET_MOUSE_PRESSED,
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 translated_from, from, 0, 0);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    apps_grid_view_->InitiateDrag(view, pointer, pressed_event);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED,
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              translated_to, to, 0, 0);
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    apps_grid_view_->UpdateDragFromItem(pointer, drag_event);
17034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return view;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SimulateKeyPress(ui::KeyboardCode key_code) {
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ui::KeyEvent key_event(ui::ET_KEY_PRESSED, key_code, ui::EF_NONE);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    apps_grid_view_->OnKeyPressed(key_event);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AppListTestModel> model_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<AppsGridView> apps_grid_view_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<AppsGridViewTestApi> test_api_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AppsGridViewTest);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass TestAppsGridViewFolderDelegate : public AppsGridViewFolderDelegate {
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  TestAppsGridViewFolderDelegate() : show_bubble_(false) {}
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~TestAppsGridViewFolderDelegate() {}
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Overridden from AppsGridViewFolderDelegate:
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void UpdateFolderViewBackground(bool show_bubble) OVERRIDE {
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    show_bubble_ = show_bubble;
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void ReparentItem(AppListItemView* original_drag_view,
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            const gfx::Point& drag_point_in_folder_grid)
198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      OVERRIDE {}
199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2004ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  virtual void DispatchDragEventForReparent(
2014ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      AppsGridView::Pointer pointer,
2024ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch      const gfx::Point& drag_point_in_folder_grid) OVERRIDE {}
203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void DispatchEndDragEventForReparent(
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      bool events_forwarded_to_drag_drop_host,
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      bool cancel_drag) OVERRIDE {}
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual bool IsPointOutsideOfFolderBoundary(const gfx::Point& point)
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      OVERRIDE {
210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return false;
211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual bool IsOEMFolder() const OVERRIDE { return false; }
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SetRootLevelDragViewVisible(bool visible) OVERRIDE {}
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool show_bubble() { return show_bubble_; }
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool show_bubble_;
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TestAppsGridViewFolderDelegate);
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppsGridViewTest, CreatePage) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fully populates a page.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPages = 1;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_->PopulateApps(kPages * kTilesPerPage);
22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(kPages, GetPaginationModel()->total_pages());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds one more and gets a new page created.
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  model_->CreateAndAddItem("Extra");
23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(kPages + 1, GetPaginationModel()->total_pages());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppsGridViewTest, EnsureHighlightedVisible) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPages = 3;
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_->PopulateApps(kPages * kTilesPerPage);
23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(kPages, GetPaginationModel()->total_pages());
24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, GetPaginationModel()->selected_page());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Highlight first one and last one one first page and first page should be
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // selected.
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_->HighlightItemAt(0);
24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, GetPaginationModel()->selected_page());
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_->HighlightItemAt(kTilesPerPage - 1);
24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, GetPaginationModel()->selected_page());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Highlight first one on 2nd page and 2nd page should be selected.
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_->HighlightItemAt(kTilesPerPage + 1);
25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1, GetPaginationModel()->selected_page());
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Highlight last one in the model and last page should be selected.
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  model_->HighlightItemAt(model_->top_level_item_list()->item_count() - 1);
25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(kPages - 1, GetPaginationModel()->selected_page());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AppsGridViewTest, RemoveSelectedLastApp) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kTotalItems = 2;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kLastItemIndex = kTotalItems - 1;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_->PopulateApps(kTotalItems);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppListItemView* last_view = GetItemViewAt(kLastItemIndex);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apps_grid_view_->SetSelectedView(last_view);
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  model_->DeleteItem(model_->GetItemName(kLastItemIndex));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(apps_grid_view_->IsSelectedView(last_view));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No crash happens.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppListItemView* view = GetItemViewAt(0);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apps_grid_view_->SetSelectedView(view);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(view));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AppsGridViewTest, MouseDragWithFolderDisabled) {
27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  model_->SetFoldersEnabled(false);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kTotalItems = 4;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_->PopulateApps(kTotalItems);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            model_->GetModelContent());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point from = GetItemTileRectAt(0, 0).CenterPoint();
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point to = GetItemTileRectAt(0, 1).CenterPoint();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dragging changes model order.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateDrag(AppsGridView::MOUSE, from, to);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apps_grid_view_->EndDrag(false);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3"),
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            model_->GetModelContent());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->LayoutToIdealBounds();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Canceling drag should keep existing order.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateDrag(AppsGridView::MOUSE, from, to);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apps_grid_view_->EndDrag(true);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3"),
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            model_->GetModelContent());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->LayoutToIdealBounds();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deleting an item keeps remaining intact.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateDrag(AppsGridView::MOUSE, from, to);
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  model_->DeleteItem(model_->GetItemName(0));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apps_grid_view_->EndDrag(false);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("Item 1,Item 2,Item 3"),
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            model_->GetModelContent());
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->LayoutToIdealBounds();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adding a launcher item cancels the drag and respects the order.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateDrag(AppsGridView::MOUSE, from, to);
3106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->has_dragged_view());
3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  model_->CreateAndAddItem("Extra");
3126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // No need to EndDrag explicitly - adding an item should do this.
3136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(apps_grid_view_->has_dragged_view());
3146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Even though cancelled, mouse move events can still arrive via the item
3156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // view. Ensure that behaves sanely, and doesn't start a new drag.
3166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui::MouseEvent drag_event(
3176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ui::ET_MOUSE_DRAGGED, gfx::Point(1, 1), gfx::Point(2, 2), 0, 0);
3186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  apps_grid_view_->UpdateDragFromItem(AppsGridView::MOUSE, drag_event);
3196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(apps_grid_view_->has_dragged_view());
3206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("Item 1,Item 2,Item 3,Extra"),
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            model_->GetModelContent());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->LayoutToIdealBounds();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
326effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AppsGridViewTest, MouseDragItemIntoFolder) {
327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EnsureFoldersEnabled();
328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
329effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  size_t kTotalItems = 3;
330effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  model_->PopulateApps(kTotalItems);
331effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(model_->top_level_item_list()->item_count(), kTotalItems);
332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(std::string("Item 0,Item 1,Item 2"), model_->GetModelContent());
333effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
334effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Point from = GetItemTileRectAt(0, 1).CenterPoint();
335effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Point to = GetItemTileRectAt(0, 0).CenterPoint();
336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Dragging item_1 over item_0 creates a folder.
338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SimulateDrag(AppsGridView::MOUSE, from, to);
339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  apps_grid_view_->EndDrag(false);
340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(kTotalItems - 1, model_->top_level_item_list()->item_count());
341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(AppListFolderItem::kItemType,
342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            model_->top_level_item_list()->item_at(0)->GetItemType());
343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AppListFolderItem* folder_item = static_cast<AppListFolderItem*>(
344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      model_->top_level_item_list()->item_at(0));
345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(2u, folder_item->ChildItemCount());
346effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AppListItem* item_0 = model_->FindItem("Item 0");
347effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(item_0->IsInFolder());
348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(folder_item->id(), item_0->folder_id());
349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AppListItem* item_1 = model_->FindItem("Item 1");
350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(item_1->IsInFolder());
351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(folder_item->id(), item_1->folder_id());
352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string expected_items = folder_item->id() + ",Item 2";
353effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(expected_items, model_->GetModelContent());
354effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  test_api_->LayoutToIdealBounds();
355effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
356effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Dragging item_2 to the folder adds item_2 to the folder.
357effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SimulateDrag(AppsGridView::MOUSE, from, to);
358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  apps_grid_view_->EndDrag(false);
359effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
360effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(kTotalItems - 2, model_->top_level_item_list()->item_count());
361effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(folder_item->id(), model_->GetModelContent());
362effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(3u, folder_item->ChildItemCount());
363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  item_0 = model_->FindItem("Item 0");
364effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(item_0->IsInFolder());
365effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(folder_item->id(), item_0->folder_id());
366effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  item_1 = model_->FindItem("Item 1");
367effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(item_1->IsInFolder());
368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(folder_item->id(), item_1->folder_id());
369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AppListItem* item_2 = model_->FindItem("Item 2");
370effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(item_2->IsInFolder());
371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(folder_item->id(), item_2->folder_id());
372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  test_api_->LayoutToIdealBounds();
373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
375effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AppsGridViewTest, MouseDragMaxItemsInFolder) {
376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EnsureFoldersEnabled();
377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
378effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Create and add a folder with 15 items in it.
379effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  size_t kTotalItems = kMaxFolderItems - 1;
380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  model_->CreateAndPopulateFolderWithApps(kTotalItems);
381effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(1u, model_->top_level_item_list()->item_count());
382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(AppListFolderItem::kItemType,
383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            model_->top_level_item_list()->item_at(0)->GetItemType());
384effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AppListFolderItem* folder_item = static_cast<AppListFolderItem*>(
385effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      model_->top_level_item_list()->item_at(0));
386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(kTotalItems, folder_item->ChildItemCount());
387effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
388effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Create and add another 2 items.
389effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  model_->PopulateAppWithId(kTotalItems);
390effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  model_->PopulateAppWithId(kTotalItems + 1);
391effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(3u, model_->top_level_item_list()->item_count());
392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(folder_item->id(), model_->top_level_item_list()->item_at(0)->id());
393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(model_->GetItemName(kMaxFolderItems - 1),
394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            model_->top_level_item_list()->item_at(1)->id());
395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(model_->GetItemName(kMaxFolderItems),
396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            model_->top_level_item_list()->item_at(2)->id());
397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Point from = GetItemTileRectAt(0, 1).CenterPoint();
399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Point to = GetItemTileRectAt(0, 0).CenterPoint();
400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Dragging one item into the folder, the folder should accept the item.
402effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SimulateDrag(AppsGridView::MOUSE, from, to);
403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  apps_grid_view_->EndDrag(false);
404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(2u, model_->top_level_item_list()->item_count());
405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(folder_item->id(), model_->top_level_item_list()->item_at(0)->id());
406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(kMaxFolderItems, folder_item->ChildItemCount());
407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(model_->GetItemName(kMaxFolderItems),
408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            model_->top_level_item_list()->item_at(1)->id());
409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  test_api_->LayoutToIdealBounds();
410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Dragging the last item over the folder, the folder won't accept the new
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // item.
413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SimulateDrag(AppsGridView::MOUSE, from, to);
414effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  apps_grid_view_->EndDrag(false);
415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(2u, model_->top_level_item_list()->item_count());
416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(kMaxFolderItems, folder_item->ChildItemCount());
417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  test_api_->LayoutToIdealBounds();
41834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)}
41934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
42034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)// Check that moving items around doesn't allow a drop to happen into a full
42134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)// folder.
42234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)TEST_F(AppsGridViewTest, MouseDragMaxItemsInFolderWithMovement) {
42334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EnsureFoldersEnabled();
42434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
42534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // Create and add a folder with 16 items in it.
42634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  size_t kTotalItems = kMaxFolderItems;
42734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  model_->CreateAndPopulateFolderWithApps(kTotalItems);
42834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(1u, model_->top_level_item_list()->item_count());
42934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(AppListFolderItem::kItemType,
43034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)            model_->top_level_item_list()->item_at(0)->GetItemType());
43134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  AppListFolderItem* folder_item = static_cast<AppListFolderItem*>(
43234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      model_->top_level_item_list()->item_at(0));
43334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(kTotalItems, folder_item->ChildItemCount());
43434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
43534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // Create and add another item.
43634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  model_->PopulateAppWithId(kTotalItems);
43734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(2u, model_->top_level_item_list()->item_count());
43834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(folder_item->id(), model_->top_level_item_list()->item_at(0)->id());
43934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(model_->GetItemName(kMaxFolderItems),
44034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)            model_->top_level_item_list()->item_at(1)->id());
44134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
44234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  AppListItemView* folder_view =
44334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      GetItemViewForPoint(GetItemTileRectAt(0, 0).CenterPoint());
44434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
44534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // Drag the new item to the left so that the grid reorders.
44634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  gfx::Point from = GetItemTileRectAt(0, 1).CenterPoint();
44734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  gfx::Point to = GetItemTileRectAt(0, 0).bottom_left();
44834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  AppListItemView* dragged_view = SimulateDrag(AppsGridView::MOUSE, from, to);
44934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  test_api_->LayoutToIdealBounds();
45034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
45134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // The grid now looks like | blank | folder |.
45234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(NULL, GetItemViewForPoint(GetItemTileRectAt(0, 0).CenterPoint()));
45334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(folder_view,
45434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)            GetItemViewForPoint(GetItemTileRectAt(0, 1).CenterPoint()));
45534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
45634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // Move onto the folder and end the drag.
45734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  to = GetItemTileRectAt(0, 1).CenterPoint();
45834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  gfx::Point translated_to =
45934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      gfx::PointAtOffsetFromOrigin(to - dragged_view->bounds().origin());
46034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, translated_to, to, 0, 0);
46134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  apps_grid_view_->UpdateDragFromItem(AppsGridView::MOUSE, drag_event);
46234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  apps_grid_view_->EndDrag(false);
46334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
46434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // The item should not have moved into the folder.
46534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(2u, model_->top_level_item_list()->item_count());
46634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  EXPECT_EQ(kMaxFolderItems, folder_item->ChildItemCount());
46734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  test_api_->LayoutToIdealBounds();
468effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
469effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
470effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AppsGridViewTest, MouseDragItemReorder) {
471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // This test assumes Folders are enabled.
472c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EnsureFoldersEnabled();
473c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model_->PopulateApps(4);
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(4u, model_->top_level_item_list()->item_count());
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            model_->GetModelContent());
478effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Dragging an item towards its neighbours should not reorder until the drag
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // is past the folder drop point.
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Point top_right = GetItemTileRectAt(0, 1).CenterPoint();
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Vector2d drag_vector;
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int half_tile_width =
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (GetItemTileRectAt(0, 1).x() - GetItemTileRectAt(0, 0).x()) / 2;
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int tile_height = GetItemTileRectAt(1, 0).y() - GetItemTileRectAt(0, 0).y();
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Drag left but stop before the folder dropping circle.
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  drag_vector.set_x(-half_tile_width - 5);
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateDrag(AppsGridView::MOUSE, top_right, top_right + drag_vector);
490effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  apps_grid_view_->EndDrag(false);
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            model_->GetModelContent());
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Drag left, past the folder dropping circle.
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  drag_vector.set_x(-3 * half_tile_width + 5);
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateDrag(AppsGridView::MOUSE, top_right, top_right + drag_vector);
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  apps_grid_view_->EndDrag(false);
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3"),
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            model_->GetModelContent());
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Drag down, between apps 2 and 3. The gap should open up, making space for
5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // app 0 in the bottom left.
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  drag_vector.set_x(-half_tile_width);
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  drag_vector.set_y(tile_height);
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateDrag(AppsGridView::MOUSE, top_right, top_right + drag_vector);
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  apps_grid_view_->EndDrag(false);
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(std::string("Item 1,Item 2,Item 0,Item 3"),
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            model_->GetModelContent());
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Drag up, between apps 1 and 2. The gap should open up, making space for app
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // 0 in the top right.
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Point bottom_left = GetItemTileRectAt(1, 0).CenterPoint();
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  drag_vector.set_x(half_tile_width);
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  drag_vector.set_y(-tile_height);
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateDrag(AppsGridView::MOUSE, bottom_left, bottom_left + drag_vector);
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  apps_grid_view_->EndDrag(false);
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3"),
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            model_->GetModelContent());
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Dragging down past the last app should reorder to the last position.
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  drag_vector.set_x(half_tile_width);
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  drag_vector.set_y(2 * tile_height);
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateDrag(AppsGridView::MOUSE, top_right, top_right + drag_vector);
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  apps_grid_view_->EndDrag(false);
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(std::string("Item 1,Item 2,Item 3,Item 0"),
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            model_->GetModelContent());
527effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
528effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
529effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AppsGridViewTest, MouseDragFolderReorder) {
530c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EnsureFoldersEnabled();
531c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
532effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  size_t kTotalItems = 2;
533effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  model_->CreateAndPopulateFolderWithApps(kTotalItems);
534effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  model_->PopulateAppWithId(kTotalItems);
535effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(2u, model_->top_level_item_list()->item_count());
536effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(AppListFolderItem::kItemType,
537effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            model_->top_level_item_list()->item_at(0)->GetItemType());
538effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AppListFolderItem* folder_item = static_cast<AppListFolderItem*>(
539effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      model_->top_level_item_list()->item_at(0));
540effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ("Item 2", model_->top_level_item_list()->item_at(1)->id());
541effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
542effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Point from = GetItemTileRectAt(0, 0).CenterPoint();
543effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Point to = GetItemTileRectAt(0, 1).CenterPoint();
544effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
545effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Dragging folder over item_1 should leads to re-ordering these two
546effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // items.
547effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SimulateDrag(AppsGridView::MOUSE, from, to);
548effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  apps_grid_view_->EndDrag(false);
549effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(2u, model_->top_level_item_list()->item_count());
550effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ("Item 2", model_->top_level_item_list()->item_at(0)->id());
551effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(folder_item->id(), model_->top_level_item_list()->item_at(1)->id());
552effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  test_api_->LayoutToIdealBounds();
553effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
554effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
555effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AppsGridViewTest, MouseDragWithCancelDeleteAddItem) {
556effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  size_t kTotalItems = 4;
557effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  model_->PopulateApps(kTotalItems);
558effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(model_->top_level_item_list()->item_count(), kTotalItems);
559effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
560effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            model_->GetModelContent());
561effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
562effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Point from = GetItemTileRectAt(0, 0).CenterPoint();
563effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Point to = GetItemTileRectAt(0, 1).CenterPoint();
564effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
565effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Canceling drag should keep existing order.
566effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SimulateDrag(AppsGridView::MOUSE, from, to);
567effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  apps_grid_view_->EndDrag(true);
568effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
569effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            model_->GetModelContent());
570effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  test_api_->LayoutToIdealBounds();
571effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
572effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Deleting an item keeps remaining intact.
573effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SimulateDrag(AppsGridView::MOUSE, from, to);
574effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  model_->DeleteItem(model_->GetItemName(2));
575effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  apps_grid_view_->EndDrag(false);
576effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(std::string("Item 0,Item 1,Item 3"), model_->GetModelContent());
577effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  test_api_->LayoutToIdealBounds();
578effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
579effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Adding a launcher item cancels the drag and respects the order.
580effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SimulateDrag(AppsGridView::MOUSE, from, to);
581effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  model_->CreateAndAddItem("Extra");
582effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  apps_grid_view_->EndDrag(false);
583effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(std::string("Item 0,Item 1,Item 3,Extra"),
584effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            model_->GetModelContent());
585effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  test_api_->LayoutToIdealBounds();
586effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
587effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(AppsGridViewTest, MouseDragFlipPage) {
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->SetPageFlipDelay(10);
59046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GetPaginationModel()->SetTransitionDurations(10, 10);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  PageFlipWaiter page_flip_waiter(message_loop(), GetPaginationModel());
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kPages = 3;
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_->PopulateApps(kPages * kTilesPerPage);
59646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(kPages, GetPaginationModel()->total_pages());
59746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, GetPaginationModel()->selected_page());
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point from = GetItemTileRectAt(0, 0).CenterPoint();
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point to = gfx::Point(apps_grid_view_->width(),
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             apps_grid_view_->height() / 2);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drag to right edge.
604f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  page_flip_waiter.Reset();
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateDrag(AppsGridView::MOUSE, from, to);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Page should be flipped after sometime to hit page 1 and 2 then stop.
608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  while (test_api_->HasPendingPageFlip()) {
609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    page_flip_waiter.Wait();
610f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
611f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("1,2", page_flip_waiter.selected_pages());
61246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(2, GetPaginationModel()->selected_page());
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apps_grid_view_->EndDrag(true);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now drag to the left edge and test the other direction.
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to.set_x(0);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  page_flip_waiter.Reset();
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateDrag(AppsGridView::MOUSE, from, to);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  while (test_api_->HasPendingPageFlip()) {
623f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    page_flip_waiter.Wait();
624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
625f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ("1,0", page_flip_waiter.selected_pages());
62646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, GetPaginationModel()->selected_page());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apps_grid_view_->EndDrag(true);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AppsGridViewTest, SimultaneousDragWithFolderDisabled) {
63246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  model_->SetFoldersEnabled(false);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kTotalItems = 4;
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_->PopulateApps(kTotalItems);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            model_->GetModelContent());
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point mouse_from = GetItemTileRectAt(0, 0).CenterPoint();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point mouse_to = GetItemTileRectAt(0, 1).CenterPoint();
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point touch_from = GetItemTileRectAt(1, 0).CenterPoint();
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point touch_to = GetItemTileRectAt(1, 1).CenterPoint();
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts a mouse drag first then a touch drag.
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateDrag(AppsGridView::MOUSE, mouse_from, mouse_to);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateDrag(AppsGridView::TOUCH, touch_from, touch_to);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finishes the drag and mouse drag wins.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apps_grid_view_->EndDrag(false);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3"),
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            model_->GetModelContent());
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->LayoutToIdealBounds();
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts a touch drag first then a mouse drag.
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateDrag(AppsGridView::TOUCH, touch_from, touch_to);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateDrag(AppsGridView::MOUSE, mouse_from, mouse_to);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finishes the drag and touch drag wins.
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apps_grid_view_->EndDrag(false);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("Item 1,Item 0,Item 3,Item 2"),
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            model_->GetModelContent());
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api_->LayoutToIdealBounds();
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
663effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(AppsGridViewTest, UpdateFolderBackgroundOnCancelDrag) {
664c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EnsureFoldersEnabled();
665c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
666effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const int kTotalItems = 4;
667effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  TestAppsGridViewFolderDelegate folder_delegate;
668effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  apps_grid_view_->set_folder_delegate(&folder_delegate);
669effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  model_->PopulateApps(kTotalItems);
670effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
671effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            model_->GetModelContent());
672effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
673effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Point mouse_from = GetItemTileRectAt(0, 0).CenterPoint();
674effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Point mouse_to = GetItemTileRectAt(0, 1).CenterPoint();
675effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
676effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Starts a mouse drag and then cancels it.
677effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SimulateDrag(AppsGridView::MOUSE, mouse_from, mouse_to);
678effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(folder_delegate.show_bubble());
679effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  apps_grid_view_->EndDrag(true);
680effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(folder_delegate.show_bubble());
681effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
682effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            model_->GetModelContent());
683effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
684effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AppsGridViewTest, HighlightWithKeyboard) {
68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const int kPages = 3;
68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const int kItems = (kPages - 1) * kTilesPerPage + 1;
68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  model_->PopulateApps(kItems);
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int first_index = 0;
69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const int last_index = kItems - 1;
69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const int last_index_on_page1_first_row = kRows - 1;
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int last_index_on_page1 = kTilesPerPage - 1;
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int first_index_on_page2 = kTilesPerPage;
69590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const int first_index_on_page2_last_row = 2 * kTilesPerPage - kRows;
69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const int last_index_on_page2_last_row = 2 * kTilesPerPage - 1;
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try moving off the item beyond the first one.
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  apps_grid_view_->SetSelectedView(GetItemViewAt(first_index));
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_UP);
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(first_index)));
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_LEFT);
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(first_index)));
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move to the last item and try to go past it.
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  apps_grid_view_->SetSelectedView(GetItemViewAt(last_index));
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_DOWN);
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(last_index)));
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_RIGHT);
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(last_index)));
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
71290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Move right on last item on page 1 should get to first item on page 2's last
71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // row and vice versa.
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  apps_grid_view_->SetSelectedView(GetItemViewAt(last_index_on_page1));
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_RIGHT);
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(
71790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      first_index_on_page2_last_row)));
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_LEFT);
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      last_index_on_page1)));
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Up/down on page boundary does nothing.
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  apps_grid_view_->SetSelectedView(GetItemViewAt(last_index_on_page1));
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_DOWN);
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(
72690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      last_index_on_page1)));
72790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  apps_grid_view_->SetSelectedView(
72890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetItemViewAt(first_index_on_page2_last_row));
72990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  apps_grid_view_->
73090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      SetSelectedView(GetItemViewAt(last_index_on_page1_first_row));
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_UP);
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(
73390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      last_index_on_page1_first_row)));
73490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
73590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Page up and down should go to the same item on the next and last page.
73690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  apps_grid_view_->SetSelectedView(GetItemViewAt(first_index_on_page2));
73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_PRIOR);
73890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(
73990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      first_index)));
74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_NEXT);
74190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(
74290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      first_index_on_page2)));
74390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
74490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Moving onto a a page with too few apps to support the expected index snaps
74590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // to the last available index.
74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  apps_grid_view_->SetSelectedView(GetItemViewAt(last_index_on_page2_last_row));
74790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_RIGHT);
74890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(
74990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      last_index)));
75090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  apps_grid_view_->SetSelectedView(GetItemViewAt(last_index_on_page2_last_row));
75190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_NEXT);
75290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(
75390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      last_index)));
75490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
75590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // After page switch, arrow keys select first item on current page.
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  apps_grid_view_->SetSelectedView(GetItemViewAt(first_index));
75946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GetPaginationModel()->SelectPage(1, false);
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SimulateKeyPress(ui::VKEY_UP);
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(apps_grid_view_->IsSelectedView(GetItemViewAt(
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      first_index_on_page2)));
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
76558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AppsGridViewTest, ItemLabelShortNameOverride) {
76658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // If the app's full name and short name differ, the title label's tooltip
76758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // should always be the full name of the app.
76858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string expected_text("xyz");
76958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string expected_tooltip("tooltip");
770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AppListItem* item = model_->CreateAndAddItem("Item with short name");
771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  model_->SetItemNameAndShortName(item, expected_tooltip, expected_text);
77258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 actual_tooltip;
77458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AppListItemView* item_view = GetItemViewAt(0);
77558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(item_view);
77658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const views::Label* title_label = item_view->title();
77758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(title_label->GetTooltipText(
77858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      title_label->bounds().CenterPoint(), &actual_tooltip));
7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected_tooltip, base::UTF16ToUTF8(actual_tooltip));
7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(expected_text, base::UTF16ToUTF8(title_label->text()));
78158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
78258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
78358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(AppsGridViewTest, ItemLabelNoShortName) {
78458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // If the app's full name and short name are the same, use the default tooltip
78558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // behavior of the label (only show a tooltip if the title is truncated).
78658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string title("a");
787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AppListItem* item = model_->CreateAndAddItem(title);
788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  model_->SetItemNameAndShortName(item, title, "");
78958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 actual_tooltip;
79158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AppListItemView* item_view = GetItemViewAt(0);
79258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(item_view);
79358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const views::Label* title_label = item_view->title();
79458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(title_label->GetTooltipText(
79558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      title_label->bounds().CenterPoint(), &actual_tooltip));
7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(title, base::UTF16ToUTF8(title_label->text()));
79758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
79858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace app_list
801