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..c7b68fcf6921f86bfb275b69eff592b76710074b 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,120 @@ 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_]; |
+ // Window should not be closed. |
+ 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_]; |
+ // Window should not be closed. |
+ 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. |
+ 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 |