1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#import "ui/app_list/cocoa/test/apps_grid_controller_test_helper.h"
6
7#include "base/mac/foundation_util.h"
8#include "base/strings/stringprintf.h"
9#include "ui/app_list/app_list_item.h"
10#import "ui/app_list/cocoa/apps_grid_controller.h"
11#import "ui/app_list/cocoa/apps_grid_view_item.h"
12#import "ui/events/test/cocoa_test_event_utils.h"
13
14namespace app_list {
15namespace test {
16
17const size_t AppsGridControllerTestHelper::kItemsPerPage = 16;
18
19AppsGridControllerTestHelper::AppsGridControllerTestHelper() {
20  Init();
21  [AppsGridController setScrollAnimationDuration:0.0];
22}
23
24AppsGridControllerTestHelper::~AppsGridControllerTestHelper() {}
25
26void AppsGridControllerTestHelper::SetUpWithGridController(
27    AppsGridController* grid_controller) {
28  ui::CocoaTest::SetUp();
29  apps_grid_controller_ = grid_controller;
30}
31
32void AppsGridControllerTestHelper::SimulateClick(NSView* view) {
33  std::pair<NSEvent*, NSEvent*> events(
34      cocoa_test_event_utils::MouseClickInView(view, 1));
35  [NSApp postEvent:events.first atStart:NO];
36  [NSApp postEvent:events.second atStart:NO];
37}
38
39void AppsGridControllerTestHelper::SimulateKeyAction(SEL c) {
40  [apps_grid_controller_ handleCommandBySelector:c];
41}
42
43void AppsGridControllerTestHelper::SimulateMouseEnterItemAt(size_t index) {
44  [[apps_grid_controller_ itemAtIndex:index] mouseEntered:
45      cocoa_test_event_utils::EnterExitEventWithType(NSMouseEntered)];
46}
47
48void AppsGridControllerTestHelper::SimulateMouseExitItemAt(size_t index) {
49  [[apps_grid_controller_ itemAtIndex:index] mouseExited:
50      cocoa_test_event_utils::EnterExitEventWithType(NSMouseExited)];
51}
52
53std::string AppsGridControllerTestHelper::GetViewContent() const {
54  std::string s;
55  for (size_t page_index = 0; page_index < [apps_grid_controller_ pageCount];
56       ++page_index) {
57    s += '|';
58    NSCollectionView* page_view =
59        [apps_grid_controller_ collectionViewAtPageIndex:page_index];
60    for (size_t i = 0; i < [[page_view content] count]; ++i) {
61      AppsGridViewItem* item = base::mac::ObjCCastStrict<AppsGridViewItem>(
62          [page_view itemAtIndex:i]);
63      if (i != 0)
64        s += ',';
65      s += [item model]->id();
66    }
67    s += '|';
68  }
69  return s;
70}
71
72size_t AppsGridControllerTestHelper::GetPageIndexForItem(int item_id) const {
73  const std::string search = base::StringPrintf("Item %d", item_id);
74  size_t page_index = 0;
75  NSUInteger found_at_page_index = NSNotFound;
76  for (; page_index < [apps_grid_controller_ pageCount]; ++page_index) {
77    NSCollectionView* page_view =
78        [apps_grid_controller_ collectionViewAtPageIndex:page_index];
79    for (NSUInteger i = 0; i < [[page_view content] count]; ++i) {
80      AppsGridViewItem* item = base::mac::ObjCCastStrict<AppsGridViewItem>(
81          [page_view itemAtIndex:i]);
82      if ([item model]->id() == search) {
83        if (found_at_page_index != NSNotFound)
84          return NSNotFound;  // Duplicate.
85        found_at_page_index = page_index;
86      }
87    }
88  }
89  return found_at_page_index;
90}
91
92void AppsGridControllerTestHelper::DelayForCollectionView() {
93  message_loop_.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(),
94                                base::TimeDelta::FromMilliseconds(100));
95  message_loop_.Run();
96}
97
98void AppsGridControllerTestHelper::SinkEvents() {
99  message_loop_.PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
100  message_loop_.Run();
101}
102
103NSButton* AppsGridControllerTestHelper::GetItemViewAt(size_t index) {
104  if (index == NSNotFound)
105    return nil;
106
107  return [[apps_grid_controller_ itemAtIndex:index] button];
108}
109
110NSCollectionView* AppsGridControllerTestHelper::GetPageAt(size_t index) {
111  return [apps_grid_controller_ collectionViewAtPageIndex:index];
112}
113
114NSView* AppsGridControllerTestHelper::GetSelectedView() {
115  return GetItemViewAt([apps_grid_controller_ selectedItemIndex]);
116}
117
118}  // namespace test
119}  // namespace app_list
120