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/memory/scoped_nsobject.h"
6#include "base/memory/scoped_ptr.h"
7#include "base/string_util.h"
8#include "chrome/browser/bookmarks/bookmark_utils.h"
9#include "chrome/browser/ui/cocoa/browser_test_helper.h"
10#include "chrome/browser/ui/cocoa/browser_window_cocoa.h"
11#include "chrome/browser/ui/cocoa/browser_window_controller.h"
12#include "chrome/browser/ui/cocoa/cocoa_test_helper.h"
13#include "content/common/notification_type.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
16// A BrowserWindowCocoa that goes PONG when
17// BOOKMARK_BAR_VISIBILITY_PREF_CHANGED is sent.  This is so we can be
18// sure we are observing it.
19class BrowserWindowCocoaPong : public BrowserWindowCocoa {
20 public:
21  BrowserWindowCocoaPong(Browser* browser,
22                         BrowserWindowController* controller) :
23  BrowserWindowCocoa(browser, controller, [controller window]) {
24    pong_ = false;
25  }
26  virtual ~BrowserWindowCocoaPong() { }
27
28  void Observe(NotificationType type,
29               const NotificationSource& source,
30               const NotificationDetails& details) {
31    if (type.value == NotificationType::BOOKMARK_BAR_VISIBILITY_PREF_CHANGED)
32      pong_ = true;
33    BrowserWindowCocoa::Observe(type, source, details);
34  }
35
36  bool pong_;
37};
38
39// Main test class.
40class BrowserWindowCocoaTest : public CocoaTest {
41  virtual void SetUp() {
42    CocoaTest::SetUp();
43    Browser* browser = browser_helper_.browser();
44    controller_ = [[BrowserWindowController alloc] initWithBrowser:browser
45                                                     takeOwnership:NO];
46  }
47
48  virtual void TearDown() {
49    [controller_ close];
50    CocoaTest::TearDown();
51  }
52
53 public:
54  BrowserTestHelper browser_helper_;
55  BrowserWindowController* controller_;
56};
57
58
59TEST_F(BrowserWindowCocoaTest, TestNotification) {
60  BrowserWindowCocoaPong *bwc =
61      new BrowserWindowCocoaPong(browser_helper_.browser(), controller_);
62
63  EXPECT_FALSE(bwc->pong_);
64  bookmark_utils::ToggleWhenVisible(browser_helper_.profile());
65  // Confirm we are listening
66  EXPECT_TRUE(bwc->pong_);
67  delete bwc;
68  // If this does NOT crash it confirms we stopped listening in the destructor.
69  bookmark_utils::ToggleWhenVisible(browser_helper_.profile());
70}
71
72
73TEST_F(BrowserWindowCocoaTest, TestBookmarkBarVisible) {
74  BrowserWindowCocoaPong *bwc = new BrowserWindowCocoaPong(
75    browser_helper_.browser(),
76    controller_);
77  scoped_ptr<BrowserWindowCocoaPong> scoped_bwc(bwc);
78
79  bool before = bwc->IsBookmarkBarVisible();
80  bookmark_utils::ToggleWhenVisible(browser_helper_.profile());
81  EXPECT_NE(before, bwc->IsBookmarkBarVisible());
82
83  bookmark_utils::ToggleWhenVisible(browser_helper_.profile());
84  EXPECT_EQ(before, bwc->IsBookmarkBarVisible());
85}
86
87@interface FakeController : NSWindowController {
88  BOOL fullscreen_;
89}
90@end
91
92@implementation FakeController
93- (void)setFullscreen:(BOOL)fullscreen {
94  fullscreen_ = fullscreen;
95}
96- (BOOL)isFullscreen {
97  return fullscreen_;
98}
99@end
100
101TEST_F(BrowserWindowCocoaTest, TestFullscreen) {
102  // Wrap the FakeController in a scoped_nsobject instead of autoreleasing in
103  // windowWillClose: because we never actually open a window in this test (so
104  // windowWillClose: never gets called).
105  scoped_nsobject<FakeController> fake_controller(
106      [[FakeController alloc] init]);
107  BrowserWindowCocoaPong *bwc = new BrowserWindowCocoaPong(
108    browser_helper_.browser(),
109    (BrowserWindowController*)fake_controller.get());
110  scoped_ptr<BrowserWindowCocoaPong> scoped_bwc(bwc);
111
112  EXPECT_FALSE(bwc->IsFullscreen());
113  bwc->SetFullscreen(true);
114  EXPECT_TRUE(bwc->IsFullscreen());
115  bwc->SetFullscreen(false);
116  EXPECT_FALSE(bwc->IsFullscreen());
117  [fake_controller close];
118}
119
120// TODO(???): test other methods of BrowserWindowCocoa
121