Chromium Code Reviews| Index: chrome/browser/ui/cocoa/browser_window_cocoa_unittest.mm | 
| diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa_unittest.mm b/chrome/browser/ui/cocoa/browser_window_cocoa_unittest.mm | 
| index 5f6d5c25a223d8d4af68b1c1e6a411c4bf42c8c2..cd958341eda94a8b3398e4175abe4df6f06c954a 100644 | 
| --- a/chrome/browser/ui/cocoa/browser_window_cocoa_unittest.mm | 
| +++ b/chrome/browser/ui/cocoa/browser_window_cocoa_unittest.mm | 
| @@ -6,13 +6,15 @@ | 
| #include "base/memory/scoped_ptr.h" | 
| #include "base/string_util.h" | 
| #include "chrome/browser/bookmarks/bookmark_utils.h" | 
| -#include "chrome/browser/ui/cocoa/browser_window_cocoa.h" | 
| -#include "chrome/browser/ui/cocoa/browser_window_controller.h" | 
| +#import "chrome/browser/ui/cocoa/browser_window_cocoa.h" | 
| +#import "chrome/browser/ui/cocoa/browser_window_controller.h" | 
| #include "chrome/browser/ui/cocoa/cocoa_profile_test.h" | 
| #include "chrome/common/chrome_notification_types.h" | 
| #include "chrome/common/pref_names.h" | 
| #include "content/public/browser/notification_details.h" | 
| #include "testing/gtest/include/gtest/gtest.h" | 
| +#import "third_party/ocmock/gtest_support.h" | 
| +#import "third_party/ocmock/ocmock/OCMock.h" | 
| // A BrowserWindowCocoa that goes PONG when | 
| // BOOKMARK_BAR_VISIBILITY_PREF_CHANGED is sent. This is so we can be | 
| @@ -126,4 +128,118 @@ TEST_F(BrowserWindowCocoaTest, TestFullscreen) { | 
| [fake_controller close]; | 
| } | 
| +// Tests that BrowserWindowCocoa::Close mimics the behavior of | 
| +// -[NSWindow performClose:]. | 
| +class BrowserWindowCocoaCloseTest : public CocoaProfileTest { | 
| + public: | 
| + BrowserWindowCocoaCloseTest() | 
| + : controller_( | 
| + [OCMockObject mockForClass:[BrowserWindowController class]]), | 
| + window_([OCMockObject mockForClass:[NSWindow class]]) { | 
| + [[[controller_ stub] andReturn:nil] overlayWindow]; | 
| + } | 
| + | 
| + void CreateAndCloseBrowserWindow() { | 
| + BrowserWindowCocoa browser_window(browser(), controller_); | 
| + browser_window.Close(); | 
| + } | 
| + | 
| + id ValueYES() { | 
| + BOOL v = YES; | 
| + return OCMOCK_VALUE(v); | 
| + } | 
| + id ValueNO() { | 
| + BOOL v = NO; | 
| + return OCMOCK_VALUE(v); | 
| + } | 
| + | 
| + protected: | 
| + id controller_; | 
| + id window_; | 
| +}; | 
| + | 
| +TEST_F(BrowserWindowCocoaCloseTest, DelegateRespondsYes) { | 
| + [[[window_ stub] andReturn:controller_] delegate]; | 
| + [[[controller_ stub] andReturn:window_] window]; | 
| + [[[controller_ stub] andReturnValue:ValueYES()] windowShouldClose:window_]; | 
| + [[window_ expect] close]; | 
| + CreateAndCloseBrowserWindow(); | 
| + EXPECT_OCMOCK_VERIFY(controller_); | 
| + EXPECT_OCMOCK_VERIFY(window_); | 
| +} | 
| + | 
| +TEST_F(BrowserWindowCocoaCloseTest, DelegateRespondsNo) { | 
| + [[[window_ stub] andReturn:controller_] delegate]; | 
| + [[[controller_ stub] andReturn:window_] window]; | 
| + [[[controller_ stub] andReturnValue:ValueNO()] windowShouldClose:window_]; | 
| + CreateAndCloseBrowserWindow(); | 
| + EXPECT_OCMOCK_VERIFY(controller_); | 
| + EXPECT_OCMOCK_VERIFY(window_); | 
| +} | 
| + | 
| +// NSWindow does not implement |-windowShouldClose:|, but subclasses can | 
| +// implement it, and |-performClose:| will invoke it if implemented. | 
| +@interface BrowserWindowCocoaCloseWindow : NSWindow | 
| +- (BOOL)windowShouldClose:(id)window; | 
| +@end | 
| +@implementation BrowserWindowCocoaCloseWindow | 
| +- (BOOL)windowShouldClose:(id)window { | 
| + return YES; | 
| +} | 
| +@end | 
| + | 
| +TEST_F(BrowserWindowCocoaCloseTest, WindowRespondsYes) { | 
| + window_ = [OCMockObject mockForClass:[BrowserWindowCocoaCloseWindow class]]; | 
| + [[[window_ stub] andReturn:nil] delegate]; | 
| + [[[controller_ stub] andReturn:window_] window]; | 
| + [[[window_ stub] andReturnValue:ValueYES()] windowShouldClose:window_]; | 
| + [[window_ expect] close]; | 
| + CreateAndCloseBrowserWindow(); | 
| + EXPECT_OCMOCK_VERIFY(controller_); | 
| + EXPECT_OCMOCK_VERIFY(window_); | 
| +} | 
| + | 
| +TEST_F(BrowserWindowCocoaCloseTest, WindowRespondsNo) { | 
| + window_ = [OCMockObject mockForClass:[BrowserWindowCocoaCloseWindow class]]; | 
| + [[[window_ stub] andReturn:nil] delegate]; | 
| + [[[controller_ stub] andReturn:window_] window]; | 
| + [[[window_ stub] andReturnValue:ValueNO()] windowShouldClose:window_]; | 
| + CreateAndCloseBrowserWindow(); | 
| + EXPECT_OCMOCK_VERIFY(controller_); | 
| + EXPECT_OCMOCK_VERIFY(window_); | 
| +} | 
| + | 
| +TEST_F(BrowserWindowCocoaCloseTest, DelegateRespondsYesWindowRespondsNo) { | 
| + window_ = [OCMockObject mockForClass:[BrowserWindowCocoaCloseWindow class]]; | 
| + [[[window_ stub] andReturn:controller_] delegate]; | 
| + [[[controller_ stub] andReturn:window_] window]; | 
| + [[[controller_ stub] andReturnValue:ValueYES()] windowShouldClose:window_]; | 
| + [[[window_ stub] andReturnValue:ValueNO()] windowShouldClose:window_]; | 
| + [[window_ expect] close]; | 
| + CreateAndCloseBrowserWindow(); | 
| + EXPECT_OCMOCK_VERIFY(controller_); | 
| + EXPECT_OCMOCK_VERIFY(window_); | 
| +} | 
| + | 
| +TEST_F(BrowserWindowCocoaCloseTest, DelegateRespondsNoWindowRespondsYes) { | 
| + window_ = [OCMockObject mockForClass:[BrowserWindowCocoaCloseWindow class]]; | 
| + [[[window_ stub] andReturn:controller_] delegate]; | 
| + [[[controller_ stub] andReturn:window_] window]; | 
| + [[[controller_ stub] andReturnValue:ValueNO()] windowShouldClose:window_]; | 
| + [[[window_ stub] andReturnValue:ValueYES()] windowShouldClose:window_]; | 
| + // Window should not be closed. | 
| 
 
Mark Mentovai
2012/10/11 16:04:03
I like this comment. You should put it into the ot
 
Robert Sesek
2012/10/11 16:06:54
Yeah, mock expectations are strict. An unexpected
 
 | 
| + CreateAndCloseBrowserWindow(); | 
| + EXPECT_OCMOCK_VERIFY(controller_); | 
| + EXPECT_OCMOCK_VERIFY(window_); | 
| +} | 
| + | 
| +TEST_F(BrowserWindowCocoaCloseTest, NoResponseFromDelegateNorWindow) { | 
| + [[[window_ stub] andReturn:nil] delegate]; | 
| + [[[controller_ stub] andReturn:window_] window]; | 
| + [[window_ expect] close]; | 
| + CreateAndCloseBrowserWindow(); | 
| + EXPECT_OCMOCK_VERIFY(controller_); | 
| + EXPECT_OCMOCK_VERIFY(window_); | 
| +} | 
| + | 
| // TODO(???): test other methods of BrowserWindowCocoa |