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.
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/test/base/testing_profile.h"
16 #include "content/public/browser/notification_details.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18 #import "third_party/ocmock/OCMock/OCMock.h"
19 #import "third_party/ocmock/gtest_support.h"
22 class BrowserWindowCocoaTest : public CocoaProfileTest {
23 virtual void SetUp() {
24 CocoaProfileTest::SetUp();
25 ASSERT_TRUE(browser());
27 controller_ = [[BrowserWindowController alloc] initWithBrowser:browser()
31 virtual void TearDown() {
33 CocoaProfileTest::TearDown();
37 BrowserWindowController* controller_;
40 TEST_F(BrowserWindowCocoaTest, TestBookmarkBarVisible) {
41 scoped_ptr<BrowserWindowCocoa> bwc(
42 new BrowserWindowCocoa(browser(), controller_));
44 bool before = bwc->IsBookmarkBarVisible();
45 chrome::ToggleBookmarkBarWhenVisible(profile());
46 EXPECT_NE(before, bwc->IsBookmarkBarVisible());
48 chrome::ToggleBookmarkBarWhenVisible(profile());
49 EXPECT_EQ(before, bwc->IsBookmarkBarVisible());
52 // Tests that BrowserWindowCocoa::Close mimics the behavior of
53 // -[NSWindow performClose:].
54 class BrowserWindowCocoaCloseTest : public CocoaProfileTest {
56 BrowserWindowCocoaCloseTest()
58 [OCMockObject mockForClass:[BrowserWindowController class]]),
59 window_([OCMockObject mockForClass:[NSWindow class]]) {
60 [[[controller_ stub] andReturn:nil] overlayWindow];
63 void CreateAndCloseBrowserWindow() {
64 BrowserWindowCocoa browser_window(browser(), controller_);
65 browser_window.Close();
70 return OCMOCK_VALUE(v);
74 return OCMOCK_VALUE(v);
82 TEST_F(BrowserWindowCocoaCloseTest, DelegateRespondsYes) {
83 [[[window_ stub] andReturn:controller_] delegate];
84 [[[controller_ stub] andReturn:window_] window];
85 [[[controller_ stub] andReturnValue:ValueYES()] windowShouldClose:window_];
86 [[window_ expect] orderOut:nil];
87 [[window_ expect] close];
88 CreateAndCloseBrowserWindow();
89 EXPECT_OCMOCK_VERIFY(controller_);
90 EXPECT_OCMOCK_VERIFY(window_);
93 TEST_F(BrowserWindowCocoaCloseTest, DelegateRespondsNo) {
94 [[[window_ stub] andReturn:controller_] delegate];
95 [[[controller_ stub] andReturn:window_] window];
96 [[[controller_ stub] andReturnValue:ValueNO()] windowShouldClose:window_];
97 // Window should not be closed.
98 CreateAndCloseBrowserWindow();
99 EXPECT_OCMOCK_VERIFY(controller_);
100 EXPECT_OCMOCK_VERIFY(window_);
103 // NSWindow does not implement |-windowShouldClose:|, but subclasses can
104 // implement it, and |-performClose:| will invoke it if implemented.
105 @interface BrowserWindowCocoaCloseWindow : NSWindow
106 - (BOOL)windowShouldClose:(id)window;
108 @implementation BrowserWindowCocoaCloseWindow
109 - (BOOL)windowShouldClose:(id)window {
114 TEST_F(BrowserWindowCocoaCloseTest, WindowRespondsYes) {
115 window_ = [OCMockObject mockForClass:[BrowserWindowCocoaCloseWindow class]];
116 [[[window_ stub] andReturn:nil] delegate];
117 [[[controller_ stub] andReturn:window_] window];
118 [[[window_ stub] andReturnValue:ValueYES()] windowShouldClose:window_];
119 [[window_ expect] orderOut:nil];
120 [[window_ expect] close];
121 CreateAndCloseBrowserWindow();
122 EXPECT_OCMOCK_VERIFY(controller_);
123 EXPECT_OCMOCK_VERIFY(window_);
126 TEST_F(BrowserWindowCocoaCloseTest, WindowRespondsNo) {
127 window_ = [OCMockObject mockForClass:[BrowserWindowCocoaCloseWindow class]];
128 [[[window_ stub] andReturn:nil] delegate];
129 [[[controller_ stub] andReturn:window_] window];
130 [[[window_ stub] andReturnValue:ValueNO()] windowShouldClose:window_];
131 // Window should not be closed.
132 CreateAndCloseBrowserWindow();
133 EXPECT_OCMOCK_VERIFY(controller_);
134 EXPECT_OCMOCK_VERIFY(window_);
137 TEST_F(BrowserWindowCocoaCloseTest, DelegateRespondsYesWindowRespondsNo) {
138 window_ = [OCMockObject mockForClass:[BrowserWindowCocoaCloseWindow class]];
139 [[[window_ stub] andReturn:controller_] delegate];
140 [[[controller_ stub] andReturn:window_] window];
141 [[[controller_ stub] andReturnValue:ValueYES()] windowShouldClose:window_];
142 [[[window_ stub] andReturnValue:ValueNO()] windowShouldClose:window_];
143 [[window_ expect] orderOut:nil];
144 [[window_ expect] close];
145 CreateAndCloseBrowserWindow();
146 EXPECT_OCMOCK_VERIFY(controller_);
147 EXPECT_OCMOCK_VERIFY(window_);
150 TEST_F(BrowserWindowCocoaCloseTest, DelegateRespondsNoWindowRespondsYes) {
151 window_ = [OCMockObject mockForClass:[BrowserWindowCocoaCloseWindow class]];
152 [[[window_ stub] andReturn:controller_] delegate];
153 [[[controller_ stub] andReturn:window_] window];
154 [[[controller_ stub] andReturnValue:ValueNO()] windowShouldClose:window_];
155 [[[window_ stub] andReturnValue:ValueYES()] windowShouldClose:window_];
156 // Window should not be closed.
157 CreateAndCloseBrowserWindow();
158 EXPECT_OCMOCK_VERIFY(controller_);
159 EXPECT_OCMOCK_VERIFY(window_);
162 TEST_F(BrowserWindowCocoaCloseTest, NoResponseFromDelegateNorWindow) {
163 [[[window_ stub] andReturn:nil] delegate];
164 [[[controller_ stub] andReturn:window_] window];
165 [[window_ expect] orderOut:nil];
166 [[window_ expect] close];
167 CreateAndCloseBrowserWindow();
168 EXPECT_OCMOCK_VERIFY(controller_);
169 EXPECT_OCMOCK_VERIFY(window_);
172 // TODO(???): test other methods of BrowserWindowCocoa