1// Copyright (c) 2011 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#include "base/mac/mac_util.h"
6#include "base/mac/scoped_nsobject.h"
7#include "base/memory/scoped_ptr.h"
8#include "base/strings/string_util.h"
9#include "chrome/browser/chrome_notification_types.h"
10#include "chrome/browser/fullscreen.h"
11#include "chrome/browser/ui/bookmarks/bookmark_utils.h"
12#import "chrome/browser/ui/cocoa/browser_window_cocoa.h"
13#import "chrome/browser/ui/cocoa/browser_window_controller.h"
14#include "chrome/browser/ui/cocoa/cocoa_profile_test.h"
15#include "chrome/common/pref_names.h"
16#include "chrome/test/base/testing_profile.h"
17#include "content/public/browser/notification_details.h"
18#include "testing/gtest/include/gtest/gtest.h"
19#import "third_party/ocmock/OCMock/OCMock.h"
20#import "third_party/ocmock/gtest_support.h"
21
22// Main test class.
23class BrowserWindowCocoaTest : public CocoaProfileTest {
24  virtual void SetUp() {
25    CocoaProfileTest::SetUp();
26    ASSERT_TRUE(browser());
27
28    controller_ = [[BrowserWindowController alloc] initWithBrowser:browser()
29                                                     takeOwnership:NO];
30  }
31
32  virtual void TearDown() {
33    [controller_ close];
34    CocoaProfileTest::TearDown();
35  }
36
37 public:
38  BrowserWindowController* controller_;
39};
40
41TEST_F(BrowserWindowCocoaTest, TestBookmarkBarVisible) {
42  scoped_ptr<BrowserWindowCocoa> bwc(
43      new BrowserWindowCocoa(browser(), controller_));
44
45  bool before = bwc->IsBookmarkBarVisible();
46  chrome::ToggleBookmarkBarWhenVisible(profile());
47  EXPECT_NE(before, bwc->IsBookmarkBarVisible());
48
49  chrome::ToggleBookmarkBarWhenVisible(profile());
50  EXPECT_EQ(before, bwc->IsBookmarkBarVisible());
51}
52
53// Tests that BrowserWindowCocoa::Close mimics the behavior of
54// -[NSWindow performClose:].
55class BrowserWindowCocoaCloseTest : public CocoaProfileTest {
56 public:
57  BrowserWindowCocoaCloseTest()
58      : controller_(
59            [OCMockObject mockForClass:[BrowserWindowController class]]),
60        window_([OCMockObject mockForClass:[NSWindow class]]) {
61    [[[controller_ stub] andReturn:nil] overlayWindow];
62  }
63
64  void CreateAndCloseBrowserWindow() {
65    BrowserWindowCocoa browser_window(browser(), controller_);
66    browser_window.Close();
67  }
68
69  id ValueYES() {
70    BOOL v = YES;
71    return OCMOCK_VALUE(v);
72  }
73  id ValueNO() {
74    BOOL v = NO;
75    return OCMOCK_VALUE(v);
76  }
77
78 protected:
79  id controller_;
80  id window_;
81};
82
83TEST_F(BrowserWindowCocoaCloseTest, DelegateRespondsYes) {
84  [[[window_ stub] andReturn:controller_] delegate];
85  [[[controller_ stub] andReturn:window_] window];
86  [[[controller_ stub] andReturnValue:ValueYES()] windowShouldClose:window_];
87  [[window_ expect] orderOut:nil];
88  [[window_ expect] close];
89  CreateAndCloseBrowserWindow();
90  EXPECT_OCMOCK_VERIFY(controller_);
91  EXPECT_OCMOCK_VERIFY(window_);
92}
93
94TEST_F(BrowserWindowCocoaCloseTest, DelegateRespondsNo) {
95  [[[window_ stub] andReturn:controller_] delegate];
96  [[[controller_ stub] andReturn:window_] window];
97  [[[controller_ stub] andReturnValue:ValueNO()] windowShouldClose:window_];
98  // Window should not be closed.
99  CreateAndCloseBrowserWindow();
100  EXPECT_OCMOCK_VERIFY(controller_);
101  EXPECT_OCMOCK_VERIFY(window_);
102}
103
104// NSWindow does not implement |-windowShouldClose:|, but subclasses can
105// implement it, and |-performClose:| will invoke it if implemented.
106@interface BrowserWindowCocoaCloseWindow : NSWindow
107- (BOOL)windowShouldClose:(id)window;
108@end
109@implementation BrowserWindowCocoaCloseWindow
110- (BOOL)windowShouldClose:(id)window {
111  return YES;
112}
113@end
114
115TEST_F(BrowserWindowCocoaCloseTest, WindowRespondsYes) {
116  window_ = [OCMockObject mockForClass:[BrowserWindowCocoaCloseWindow class]];
117  [[[window_ stub] andReturn:nil] delegate];
118  [[[controller_ stub] andReturn:window_] window];
119  [[[window_ stub] andReturnValue:ValueYES()] windowShouldClose:window_];
120  [[window_ expect] orderOut:nil];
121  [[window_ expect] close];
122  CreateAndCloseBrowserWindow();
123  EXPECT_OCMOCK_VERIFY(controller_);
124  EXPECT_OCMOCK_VERIFY(window_);
125}
126
127TEST_F(BrowserWindowCocoaCloseTest, WindowRespondsNo) {
128  window_ = [OCMockObject mockForClass:[BrowserWindowCocoaCloseWindow class]];
129  [[[window_ stub] andReturn:nil] delegate];
130  [[[controller_ stub] andReturn:window_] window];
131  [[[window_ stub] andReturnValue:ValueNO()] windowShouldClose:window_];
132  // Window should not be closed.
133  CreateAndCloseBrowserWindow();
134  EXPECT_OCMOCK_VERIFY(controller_);
135  EXPECT_OCMOCK_VERIFY(window_);
136}
137
138TEST_F(BrowserWindowCocoaCloseTest, DelegateRespondsYesWindowRespondsNo) {
139  window_ = [OCMockObject mockForClass:[BrowserWindowCocoaCloseWindow class]];
140  [[[window_ stub] andReturn:controller_] delegate];
141  [[[controller_ stub] andReturn:window_] window];
142  [[[controller_ stub] andReturnValue:ValueYES()] windowShouldClose:window_];
143  [[[window_ stub] andReturnValue:ValueNO()] windowShouldClose:window_];
144  [[window_ expect] orderOut:nil];
145  [[window_ expect] close];
146  CreateAndCloseBrowserWindow();
147  EXPECT_OCMOCK_VERIFY(controller_);
148  EXPECT_OCMOCK_VERIFY(window_);
149}
150
151TEST_F(BrowserWindowCocoaCloseTest, DelegateRespondsNoWindowRespondsYes) {
152  window_ = [OCMockObject mockForClass:[BrowserWindowCocoaCloseWindow class]];
153  [[[window_ stub] andReturn:controller_] delegate];
154  [[[controller_ stub] andReturn:window_] window];
155  [[[controller_ stub] andReturnValue:ValueNO()] windowShouldClose:window_];
156  [[[window_ stub] andReturnValue:ValueYES()] windowShouldClose:window_];
157  // Window should not be closed.
158  CreateAndCloseBrowserWindow();
159  EXPECT_OCMOCK_VERIFY(controller_);
160  EXPECT_OCMOCK_VERIFY(window_);
161}
162
163TEST_F(BrowserWindowCocoaCloseTest, NoResponseFromDelegateNorWindow) {
164  [[[window_ stub] andReturn:nil] delegate];
165  [[[controller_ stub] andReturn:window_] window];
166  [[window_ expect] orderOut:nil];
167  [[window_ expect] close];
168  CreateAndCloseBrowserWindow();
169  EXPECT_OCMOCK_VERIFY(controller_);
170  EXPECT_OCMOCK_VERIFY(window_);
171}
172
173// TODO(???): test other methods of BrowserWindowCocoa
174