| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2013 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 #import "ui/message_center/cocoa/tray_view_controller.h" | |
| 6 | |
| 7 #include "base/mac/scoped_nsobject.h" | |
| 8 #include "base/message_loop/message_loop.h" | |
| 9 #include "base/run_loop.h" | |
| 10 #include "base/strings/utf_string_conversions.h" | |
| 11 #import "ui/gfx/test/ui_cocoa_test_helper.h" | |
| 12 #include "ui/message_center/fake_notifier_settings_provider.h" | |
| 13 #include "ui/message_center/message_center.h" | |
| 14 #include "ui/message_center/message_center_impl.h" | |
| 15 #include "ui/message_center/message_center_style.h" | |
| 16 #include "ui/message_center/notification.h" | |
| 17 #include "ui/message_center/notifier_settings.h" | |
| 18 | |
| 19 using base::ASCIIToUTF16; | |
| 20 | |
| 21 namespace message_center { | |
| 22 | |
| 23 class TrayViewControllerTest : public ui::CocoaTest { | |
| 24 public: | |
| 25 TrayViewControllerTest() | |
| 26 : center_(NULL) { | |
| 27 } | |
| 28 | |
| 29 void SetUp() override { | |
| 30 ui::CocoaTest::SetUp(); | |
| 31 message_center::MessageCenter::Initialize(); | |
| 32 center_ = message_center::MessageCenter::Get(); | |
| 33 center_->DisableTimersForTest(); | |
| 34 tray_.reset([[MCTrayViewController alloc] initWithMessageCenter:center_]); | |
| 35 [tray_ setAnimationDuration:0.002]; | |
| 36 [tray_ setAnimateClearingNextNotificationDelay:0.001]; | |
| 37 [tray_ setAnimationEndedCallback:^{ | |
| 38 if (nested_run_loop_.get()) | |
| 39 nested_run_loop_->Quit(); | |
| 40 }]; | |
| 41 [tray_ view]; // Create the view. | |
| 42 } | |
| 43 | |
| 44 void TearDown() override { | |
| 45 tray_.reset(); | |
| 46 message_center::MessageCenter::Shutdown(); | |
| 47 ui::CocoaTest::TearDown(); | |
| 48 } | |
| 49 | |
| 50 void WaitForAnimationEnded() { | |
| 51 if (![tray_ isAnimating]) | |
| 52 return; | |
| 53 nested_run_loop_.reset(new base::RunLoop()); | |
| 54 nested_run_loop_->Run(); | |
| 55 nested_run_loop_.reset(); | |
| 56 } | |
| 57 | |
| 58 protected: | |
| 59 message_center::NotifierId DummyNotifierId() { | |
| 60 return message_center::NotifierId(); | |
| 61 } | |
| 62 | |
| 63 message_center::MessageCenter* center_; // Weak, global. | |
| 64 | |
| 65 base::MessageLoopForUI message_loop_; | |
| 66 scoped_ptr<base::RunLoop> nested_run_loop_; | |
| 67 base::scoped_nsobject<MCTrayViewController> tray_; | |
| 68 }; | |
| 69 | |
| 70 TEST_F(TrayViewControllerTest, AddRemoveOne) { | |
| 71 NSScrollView* view = [[tray_ scrollView] documentView]; | |
| 72 EXPECT_EQ(0u, [[view subviews] count]); | |
| 73 scoped_ptr<message_center::Notification> notification_data; | |
| 74 notification_data.reset(new message_center::Notification( | |
| 75 message_center::NOTIFICATION_TYPE_SIMPLE, "1", | |
| 76 ASCIIToUTF16("First notification"), | |
| 77 ASCIIToUTF16("This is a simple test."), gfx::Image(), base::string16(), | |
| 78 GURL(), DummyNotifierId(), message_center::RichNotificationData(), NULL)); | |
| 79 center_->AddNotification(notification_data.Pass()); | |
| 80 [tray_ onMessageCenterTrayChanged]; | |
| 81 ASSERT_EQ(1u, [[view subviews] count]); | |
| 82 | |
| 83 // The view should have padding around it. | |
| 84 NSView* notification = [[view subviews] objectAtIndex:0]; | |
| 85 NSRect notification_frame = [notification frame]; | |
| 86 EXPECT_CGFLOAT_EQ(2 * message_center::kMarginBetweenItems, | |
| 87 NSHeight([view frame]) - NSHeight(notification_frame)); | |
| 88 EXPECT_CGFLOAT_EQ(2 * message_center::kMarginBetweenItems, | |
| 89 NSWidth([view frame]) - NSWidth(notification_frame)); | |
| 90 EXPECT_GT(NSHeight([[tray_ view] frame]), | |
| 91 NSHeight([[tray_ scrollView] frame])); | |
| 92 | |
| 93 center_->RemoveNotification("1", true); | |
| 94 [tray_ onMessageCenterTrayChanged]; | |
| 95 EXPECT_EQ(0u, [[view subviews] count]); | |
| 96 // The empty tray is now 100px tall to accommodate | |
| 97 // the empty message. | |
| 98 EXPECT_CGFLOAT_EQ(message_center::kMinScrollViewHeight, | |
| 99 NSHeight([view frame])); | |
| 100 } | |
| 101 | |
| 102 TEST_F(TrayViewControllerTest, AddThreeClearAll) { | |
| 103 NSScrollView* view = [[tray_ scrollView] documentView]; | |
| 104 EXPECT_EQ(0u, [[view subviews] count]); | |
| 105 scoped_ptr<message_center::Notification> notification; | |
| 106 notification.reset(new message_center::Notification( | |
| 107 message_center::NOTIFICATION_TYPE_SIMPLE, "1", | |
| 108 ASCIIToUTF16("First notification"), | |
| 109 ASCIIToUTF16("This is a simple test."), gfx::Image(), base::string16(), | |
| 110 GURL(), DummyNotifierId(), message_center::RichNotificationData(), NULL)); | |
| 111 center_->AddNotification(notification.Pass()); | |
| 112 notification.reset(new message_center::Notification( | |
| 113 message_center::NOTIFICATION_TYPE_SIMPLE, "2", | |
| 114 ASCIIToUTF16("Second notification"), | |
| 115 ASCIIToUTF16("This is a simple test."), gfx::Image(), base::string16(), | |
| 116 GURL(), DummyNotifierId(), message_center::RichNotificationData(), NULL)); | |
| 117 center_->AddNotification(notification.Pass()); | |
| 118 notification.reset(new message_center::Notification( | |
| 119 message_center::NOTIFICATION_TYPE_SIMPLE, "3", | |
| 120 ASCIIToUTF16("Third notification"), | |
| 121 ASCIIToUTF16("This is a simple test."), gfx::Image(), base::string16(), | |
| 122 GURL(), DummyNotifierId(), message_center::RichNotificationData(), NULL)); | |
| 123 center_->AddNotification(notification.Pass()); | |
| 124 [tray_ onMessageCenterTrayChanged]; | |
| 125 ASSERT_EQ(3u, [[view subviews] count]); | |
| 126 | |
| 127 [tray_ clearAllNotifications:nil]; | |
| 128 WaitForAnimationEnded(); | |
| 129 [tray_ onMessageCenterTrayChanged]; | |
| 130 | |
| 131 EXPECT_EQ(0u, [[view subviews] count]); | |
| 132 // The empty tray is now 100px tall to accommodate | |
| 133 // the empty message. | |
| 134 EXPECT_CGFLOAT_EQ(message_center::kMinScrollViewHeight, | |
| 135 NSHeight([view frame])); | |
| 136 } | |
| 137 | |
| 138 TEST_F(TrayViewControllerTest, NoClearAllWhenNoNotifications) { | |
| 139 EXPECT_TRUE([tray_ pauseButton]); | |
| 140 EXPECT_TRUE([tray_ clearAllButton]); | |
| 141 | |
| 142 // With no notifications, the clear all button should be hidden. | |
| 143 EXPECT_TRUE([[tray_ clearAllButton] isHidden]); | |
| 144 EXPECT_LT(NSMinX([[tray_ clearAllButton] frame]), | |
| 145 NSMinX([[tray_ pauseButton] frame])); | |
| 146 | |
| 147 // Add a notification. | |
| 148 scoped_ptr<message_center::Notification> notification; | |
| 149 notification.reset(new message_center::Notification( | |
| 150 message_center::NOTIFICATION_TYPE_SIMPLE, "1", | |
| 151 ASCIIToUTF16("First notification"), | |
| 152 ASCIIToUTF16("This is a simple test."), gfx::Image(), base::string16(), | |
| 153 GURL(), DummyNotifierId(), message_center::RichNotificationData(), NULL)); | |
| 154 center_->AddNotification(notification.Pass()); | |
| 155 [tray_ onMessageCenterTrayChanged]; | |
| 156 | |
| 157 // Clear all should now be visible. | |
| 158 EXPECT_FALSE([[tray_ clearAllButton] isHidden]); | |
| 159 EXPECT_GT(NSMinX([[tray_ clearAllButton] frame]), | |
| 160 NSMinX([[tray_ pauseButton] frame])); | |
| 161 | |
| 162 // Adding a second notification should keep things still visible. | |
| 163 notification.reset(new message_center::Notification( | |
| 164 message_center::NOTIFICATION_TYPE_SIMPLE, "2", | |
| 165 ASCIIToUTF16("Second notification"), | |
| 166 ASCIIToUTF16("This is a simple test."), gfx::Image(), base::string16(), | |
| 167 GURL(), DummyNotifierId(), message_center::RichNotificationData(), NULL)); | |
| 168 center_->AddNotification(notification.Pass()); | |
| 169 [tray_ onMessageCenterTrayChanged]; | |
| 170 EXPECT_FALSE([[tray_ clearAllButton] isHidden]); | |
| 171 EXPECT_GT(NSMinX([[tray_ clearAllButton] frame]), | |
| 172 NSMinX([[tray_ pauseButton] frame])); | |
| 173 | |
| 174 // Clear all notifications. | |
| 175 [tray_ clearAllNotifications:nil]; | |
| 176 WaitForAnimationEnded(); | |
| 177 [tray_ onMessageCenterTrayChanged]; | |
| 178 | |
| 179 // The button should be hidden again. | |
| 180 EXPECT_TRUE([[tray_ clearAllButton] isHidden]); | |
| 181 EXPECT_LT(NSMinX([[tray_ clearAllButton] frame]), | |
| 182 NSMinX([[tray_ pauseButton] frame])); | |
| 183 } | |
| 184 | |
| 185 namespace { | |
| 186 | |
| 187 Notifier* NewNotifier(const std::string& id, | |
| 188 const std::string& title, | |
| 189 bool enabled) { | |
| 190 NotifierId notifier_id(NotifierId::APPLICATION, id); | |
| 191 return new Notifier(notifier_id, base::UTF8ToUTF16(title), enabled); | |
| 192 } | |
| 193 | |
| 194 } // namespace | |
| 195 | |
| 196 | |
| 197 TEST_F(TrayViewControllerTest, Settings) { | |
| 198 std::vector<Notifier*> notifiers; | |
| 199 notifiers.push_back(NewNotifier("id", "title", /*enabled=*/true)); | |
| 200 notifiers.push_back(NewNotifier("id2", "other title", /*enabled=*/false)); | |
| 201 | |
| 202 FakeNotifierSettingsProvider provider(notifiers); | |
| 203 center_->SetNotifierSettingsProvider(&provider); | |
| 204 | |
| 205 CGFloat trayHeight = NSHeight([[tray_ view] frame]); | |
| 206 EXPECT_EQ(0, provider.closed_called_count()); | |
| 207 | |
| 208 [tray_ showSettings:nil]; | |
| 209 EXPECT_FALSE(center_->IsMessageCenterVisible()); | |
| 210 | |
| 211 // There are 0 notifications, but 2 notifiers. The settings pane should be | |
| 212 // higher than the empty tray bubble. | |
| 213 EXPECT_LT(trayHeight, NSHeight([[tray_ view] frame])); | |
| 214 | |
| 215 [tray_ showMessages:nil]; | |
| 216 EXPECT_EQ(1, provider.closed_called_count()); | |
| 217 EXPECT_TRUE(center_->IsMessageCenterVisible()); | |
| 218 | |
| 219 // The tray should be back at its previous height now. | |
| 220 EXPECT_EQ(trayHeight, NSHeight([[tray_ view] frame])); | |
| 221 | |
| 222 // Clean up since this frame owns FakeNotifierSettingsProvider. | |
| 223 center_->SetNotifierSettingsProvider(NULL); | |
| 224 } | |
| 225 | |
| 226 TEST_F(TrayViewControllerTest, EmptyCenter) { | |
| 227 EXPECT_FALSE([[tray_ emptyDescription] isHidden]); | |
| 228 | |
| 229 // With no notifications, the divider should be hidden. | |
| 230 EXPECT_TRUE([[tray_ divider] isHidden]); | |
| 231 EXPECT_TRUE([[tray_ scrollView] isHidden]); | |
| 232 | |
| 233 scoped_ptr<message_center::Notification> notification; | |
| 234 notification.reset(new message_center::Notification( | |
| 235 message_center::NOTIFICATION_TYPE_SIMPLE, "1", | |
| 236 ASCIIToUTF16("First notification"), | |
| 237 ASCIIToUTF16("This is a simple test."), gfx::Image(), base::string16(), | |
| 238 GURL(), DummyNotifierId(), message_center::RichNotificationData(), NULL)); | |
| 239 center_->AddNotification(notification.Pass()); | |
| 240 [tray_ onMessageCenterTrayChanged]; | |
| 241 | |
| 242 EXPECT_FALSE([[tray_ divider] isHidden]); | |
| 243 EXPECT_FALSE([[tray_ scrollView] isHidden]); | |
| 244 EXPECT_TRUE([[tray_ emptyDescription] isHidden]); | |
| 245 } | |
| 246 | |
| 247 } // namespace message_center | |
| OLD | NEW |