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 "base/mac/scoped_nsobject.h"
6#include "base/strings/utf_string_conversions.h"
7#import "testing/gtest_mac.h"
8#include "ui/app_list/app_list_view_delegate.h"
9#import "ui/app_list/cocoa/app_list_view_controller.h"
10#import "ui/app_list/cocoa/app_list_window_controller.h"
11#include "ui/app_list/search_box_model.h"
12#include "ui/app_list/test/app_list_test_view_delegate.h"
13#import "ui/gfx/test/ui_cocoa_test_helper.h"
14
15namespace {
16
17class AppListWindowControllerTest : public ui::CocoaTest {
18 public:
19  AppListWindowControllerTest();
20
21 protected:
22  virtual void TearDown() OVERRIDE;
23
24  base::scoped_nsobject<AppListWindowController> controller_;
25
26  app_list::test::AppListTestViewDelegate* delegate() {
27    return delegate_.get();
28  }
29
30 private:
31  scoped_ptr<app_list::test::AppListTestViewDelegate> delegate_;
32
33  DISALLOW_COPY_AND_ASSIGN(AppListWindowControllerTest);
34};
35
36AppListWindowControllerTest::AppListWindowControllerTest()
37    : delegate_(new app_list::test::AppListTestViewDelegate) {
38  Init();
39  controller_.reset([[AppListWindowController alloc] init]);
40  [[controller_ appListViewController] setDelegate:delegate()];
41}
42
43void AppListWindowControllerTest::TearDown() {
44  EXPECT_TRUE(controller_.get());
45  [[controller_ window] close];
46  [[controller_ appListViewController] setDelegate:NULL];
47  controller_.reset();
48  ui::CocoaTest::TearDown();
49}
50
51}  // namespace
52
53// Test showing, hiding and closing the app list window.
54TEST_F(AppListWindowControllerTest, ShowHideCloseRelease) {
55  EXPECT_TRUE([controller_ window]);
56  [[controller_ window] makeKeyAndOrderFront:nil];
57  EXPECT_TRUE([[controller_ window] isVisible]);
58  EXPECT_TRUE([[[controller_ window] contentView] superview]);
59  [[controller_ window] close];  // Hide.
60  EXPECT_FALSE([[controller_ window] isVisible]);
61  [[controller_ window] makeKeyAndOrderFront:nil];
62}
63
64// Test that the key bound to cancel (usually Escape) asks the controller to
65// dismiss the window.
66TEST_F(AppListWindowControllerTest, DismissWithEscape) {
67  [[controller_ window] makeKeyAndOrderFront:nil];
68  EXPECT_EQ(0, delegate()->dismiss_count());
69  [[controller_ window] cancelOperation:controller_];
70  EXPECT_EQ(1, delegate()->dismiss_count());
71}
72
73// Test that search results are cleared when the window closes, not when a
74// search result is selected. If cleared upon selection, the animation showing
75// the results sliding away is seen as the window closes, which looks weird.
76TEST_F(AppListWindowControllerTest, CloseClearsSearch) {
77  [[controller_ window] makeKeyAndOrderFront:nil];
78  app_list::SearchBoxModel* model = delegate()->GetModel()->search_box();
79  AppListViewController* view_controller = [controller_ appListViewController];
80
81  EXPECT_FALSE([view_controller showingSearchResults]);
82
83  const base::string16 search_text(base::ASCIIToUTF16("test"));
84  model->SetText(search_text);
85  EXPECT_TRUE([view_controller showingSearchResults]);
86
87  EXPECT_EQ(0, delegate()->open_search_result_count());
88  [view_controller openResult:nil];
89  EXPECT_EQ(1, delegate()->open_search_result_count());
90
91  EXPECT_TRUE([view_controller showingSearchResults]);
92  [[controller_ window] close];  // Hide.
93  EXPECT_FALSE([view_controller showingSearchResults]);
94}
95