Linux: Depend on liberation-fonts package for RPMs.
[chromium-blink-merge.git] / ui / message_center / views / message_center_view_unittest.cc
blob0953f5315502583053662baae31626d5c8fa4344
1 // Copyright 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.
5 #include <map>
7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "ui/message_center/fake_message_center.h"
12 #include "ui/message_center/notification.h"
13 #include "ui/message_center/notification_list.h"
14 #include "ui/message_center/notification_types.h"
15 #include "ui/message_center/views/message_center_controller.h"
16 #include "ui/message_center/views/message_center_view.h"
17 #include "ui/message_center/views/notification_view.h"
19 namespace message_center {
21 /* Types **********************************************************************/
23 enum CallType {
24 GET_PREFERRED_SIZE,
25 GET_HEIGHT_FOR_WIDTH,
26 LAYOUT
29 /* Instrumented/Mock NotificationView subclass ********************************/
31 class MockNotificationView : public NotificationView {
32 public:
33 class Test {
34 public:
35 virtual void RegisterCall(CallType type) = 0;
38 explicit MockNotificationView(MessageCenterController* controller,
39 const Notification& notification,
40 Test* test);
41 ~MockNotificationView() override;
43 gfx::Size GetPreferredSize() const override;
44 int GetHeightForWidth(int w) const override;
45 void Layout() override;
47 private:
48 Test* test_;
50 DISALLOW_COPY_AND_ASSIGN(MockNotificationView);
53 MockNotificationView::MockNotificationView(MessageCenterController* controller,
54 const Notification& notification,
55 Test* test)
56 : NotificationView(controller, notification),
57 test_(test) {
60 MockNotificationView::~MockNotificationView() {
63 gfx::Size MockNotificationView::GetPreferredSize() const {
64 test_->RegisterCall(GET_PREFERRED_SIZE);
65 DCHECK(child_count() > 0);
66 return NotificationView::GetPreferredSize();
69 int MockNotificationView::GetHeightForWidth(int width) const {
70 test_->RegisterCall(GET_HEIGHT_FOR_WIDTH);
71 DCHECK(child_count() > 0);
72 return NotificationView::GetHeightForWidth(width);
75 void MockNotificationView::Layout() {
76 test_->RegisterCall(LAYOUT);
77 DCHECK(child_count() > 0);
78 NotificationView::Layout();
81 /* Test fixture ***************************************************************/
83 class MessageCenterViewTest : public testing::Test,
84 public MockNotificationView::Test,
85 public MessageCenterController {
86 public:
87 MessageCenterViewTest();
88 ~MessageCenterViewTest() override;
90 void SetUp() override;
91 void TearDown() override;
93 MessageCenterView* GetMessageCenterView();
94 int GetNotificationCount();
95 int GetCallCount(CallType type);
97 // Overridden from MessageCenterController:
98 void ClickOnNotification(const std::string& notification_id) override;
99 void RemoveNotification(const std::string& notification_id,
100 bool by_user) override;
101 scoped_ptr<ui::MenuModel> CreateMenuModel(
102 const NotifierId& notifier_id,
103 const base::string16& display_source) override;
104 bool HasClickedListener(const std::string& notification_id) override;
105 void ClickOnNotificationButton(const std::string& notification_id,
106 int button_index) override;
108 // Overridden from MockNotificationView::Test
109 void RegisterCall(CallType type) override;
111 void LogBounds(int depth, views::View* view);
113 private:
114 views::View* MakeParent(views::View* child1, views::View* child2);
117 scoped_ptr<MessageCenterView> message_center_view_;
118 FakeMessageCenter message_center_;
119 std::map<CallType,int> callCounts_;
121 DISALLOW_COPY_AND_ASSIGN(MessageCenterViewTest);
124 MessageCenterViewTest::MessageCenterViewTest() {
127 MessageCenterViewTest::~MessageCenterViewTest() {
130 void MessageCenterViewTest::SetUp() {
131 // Create a dummy notification.
132 Notification notification(
133 NOTIFICATION_TYPE_SIMPLE, std::string("notification id"),
134 base::UTF8ToUTF16("title"), base::UTF8ToUTF16("message"), gfx::Image(),
135 base::UTF8ToUTF16("display source"), GURL(),
136 NotifierId(NotifierId::APPLICATION, "extension_id"),
137 message_center::RichNotificationData(), NULL);
139 // ...and a list for it.
140 NotificationList::Notifications notifications;
141 notifications.insert(&notification);
143 // Then create a new MessageCenterView with that single notification.
144 base::string16 title;
145 message_center_view_.reset(new MessageCenterView(
146 &message_center_, NULL, 100, false, /*top_down =*/false, title));
147 message_center_view_->SetNotifications(notifications);
149 // Remove and delete the NotificationView now owned by the MessageCenterView's
150 // MessageListView and replace it with an instrumented MockNotificationView
151 // that will become owned by the MessageListView.
152 MockNotificationView* mock;
153 mock = new MockNotificationView(this, notification, this);
154 message_center_view_->notification_views_[notification.id()] = mock;
155 message_center_view_->SetNotificationViewForTest(mock);
158 void MessageCenterViewTest::TearDown() {
159 message_center_view_.reset();
162 MessageCenterView* MessageCenterViewTest::GetMessageCenterView() {
163 return message_center_view_.get();
166 int MessageCenterViewTest::GetNotificationCount() {
167 return 1;
170 int MessageCenterViewTest::GetCallCount(CallType type) {
171 return callCounts_[type];
174 void MessageCenterViewTest::ClickOnNotification(
175 const std::string& notification_id) {
176 // For this test, this method should not be invoked.
177 NOTREACHED();
180 void MessageCenterViewTest::RemoveNotification(
181 const std::string& notification_id,
182 bool by_user) {
183 // For this test, this method should not be invoked.
184 NOTREACHED();
187 scoped_ptr<ui::MenuModel> MessageCenterViewTest::CreateMenuModel(
188 const NotifierId& notifier_id,
189 const base::string16& display_source) {
190 // For this test, this method should not be invoked.
191 NOTREACHED();
192 return nullptr;
195 bool MessageCenterViewTest::HasClickedListener(
196 const std::string& notification_id) {
197 return true;
200 void MessageCenterViewTest::ClickOnNotificationButton(
201 const std::string& notification_id,
202 int button_index) {
203 // For this test, this method should not be invoked.
204 NOTREACHED();
207 void MessageCenterViewTest::RegisterCall(CallType type) {
208 callCounts_[type] += 1;
211 void MessageCenterViewTest::LogBounds(int depth, views::View* view) {
212 base::string16 inset;
213 for (int i = 0; i < depth; ++i)
214 inset.append(base::UTF8ToUTF16(" "));
215 gfx::Rect bounds = view->bounds();
216 DVLOG(0) << inset << bounds.width() << " x " << bounds.height()
217 << " @ " << bounds.x() << ", " << bounds.y();
218 for (int i = 0; i < view->child_count(); ++i)
219 LogBounds(depth + 1, view->child_at(i));
222 /* Unit tests *****************************************************************/
224 TEST_F(MessageCenterViewTest, CallTest) {
225 // Exercise (with size values that just need to be large enough).
226 GetMessageCenterView()->SetBounds(0, 0, 100, 100);
228 // Verify that this didn't generate more than 2 Layout() call per descendant
229 // NotificationView or more than a total of 20 GetPreferredSize() and
230 // GetHeightForWidth() calls per descendant NotificationView. 20 is a very
231 // large number corresponding to the current reality. That number will be
232 // ratcheted down over time as the code improves.
233 EXPECT_LE(GetCallCount(LAYOUT), GetNotificationCount() * 2);
234 EXPECT_LE(GetCallCount(GET_PREFERRED_SIZE) +
235 GetCallCount(GET_HEIGHT_FOR_WIDTH),
236 GetNotificationCount() * 20);
239 } // namespace message_center