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