Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ui / message_center / views / message_center_view_unittest.cc
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.
4
5 #include <map>
6
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"
18
19 namespace message_center {
20
21 /* Types **********************************************************************/
22
23 enum CallType {
24   GET_PREFERRED_SIZE,
25   GET_HEIGHT_FOR_WIDTH,
26   LAYOUT
27 };
28
29 /* Instrumented/Mock NotificationView subclass ********************************/
30
31 class MockNotificationView : public NotificationView {
32  public:
33   class Test {
34    public:
35     virtual void RegisterCall(CallType type) = 0;
36   };
37
38   explicit MockNotificationView(MessageCenterController* controller,
39                                 const Notification& notification,
40                                 Test* test);
41   ~MockNotificationView() override;
42
43   gfx::Size GetPreferredSize() const override;
44   int GetHeightForWidth(int w) const override;
45   void Layout() override;
46
47  private:
48   Test* test_;
49
50   DISALLOW_COPY_AND_ASSIGN(MockNotificationView);
51 };
52
53 MockNotificationView::MockNotificationView(MessageCenterController* controller,
54                                            const Notification& notification,
55                                            Test* test)
56     : NotificationView(controller, notification),
57       test_(test) {
58 }
59
60 MockNotificationView::~MockNotificationView() {
61 }
62
63 gfx::Size MockNotificationView::GetPreferredSize() const {
64   test_->RegisterCall(GET_PREFERRED_SIZE);
65   DCHECK(child_count() > 0);
66   return NotificationView::GetPreferredSize();
67 }
68
69 int MockNotificationView::GetHeightForWidth(int width) const {
70   test_->RegisterCall(GET_HEIGHT_FOR_WIDTH);
71   DCHECK(child_count() > 0);
72   return NotificationView::GetHeightForWidth(width);
73 }
74
75 void MockNotificationView::Layout() {
76   test_->RegisterCall(LAYOUT);
77   DCHECK(child_count() > 0);
78   NotificationView::Layout();
79 }
80
81 /* Test fixture ***************************************************************/
82
83 class MessageCenterViewTest : public testing::Test,
84                               public MockNotificationView::Test,
85                               public MessageCenterController {
86  public:
87   MessageCenterViewTest();
88   ~MessageCenterViewTest() override;
89
90   void SetUp() override;
91   void TearDown() override;
92
93   MessageCenterView* GetMessageCenterView();
94   int GetNotificationCount();
95   int GetCallCount(CallType type);
96
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;
107
108   // Overridden from MockNotificationView::Test
109   void RegisterCall(CallType type) override;
110
111   void LogBounds(int depth, views::View* view);
112
113  private:
114   views::View* MakeParent(views::View* child1, views::View* child2);
115
116
117   scoped_ptr<MessageCenterView> message_center_view_;
118   FakeMessageCenter message_center_;
119   std::map<CallType,int> callCounts_;
120
121   DISALLOW_COPY_AND_ASSIGN(MessageCenterViewTest);
122 };
123
124 MessageCenterViewTest::MessageCenterViewTest() {
125 }
126
127 MessageCenterViewTest::~MessageCenterViewTest() {
128 }
129
130 void MessageCenterViewTest::SetUp() {
131   // Create a dummy notification.
132   Notification notification(NOTIFICATION_TYPE_SIMPLE,
133                             std::string("notification id"),
134                             base::UTF8ToUTF16("title"),
135                             base::UTF8ToUTF16("message"),
136                             gfx::Image(),
137                             base::UTF8ToUTF16("display source"),
138                             NotifierId(NotifierId::APPLICATION, "extension_id"),
139                             message_center::RichNotificationData(),
140                             NULL);
141
142   // ...and a list for it.
143   NotificationList::Notifications notifications;
144   notifications.insert(&notification);
145
146   // Then create a new MessageCenterView with that single notification.
147   base::string16 title;
148   message_center_view_.reset(new MessageCenterView(
149       &message_center_, NULL, 100, false, /*top_down =*/false, title));
150   message_center_view_->SetNotifications(notifications);
151
152   // Remove and delete the NotificationView now owned by the MessageCenterView's
153   // MessageListView and replace it with an instrumented MockNotificationView
154   // that will become owned by the MessageListView.
155   MockNotificationView* mock;
156   mock = new MockNotificationView(this, notification, this);
157   message_center_view_->notification_views_[notification.id()] = mock;
158   message_center_view_->SetNotificationViewForTest(mock);
159 }
160
161 void MessageCenterViewTest::TearDown() {
162   message_center_view_.reset();
163 }
164
165 MessageCenterView* MessageCenterViewTest::GetMessageCenterView() {
166   return message_center_view_.get();
167 }
168
169 int MessageCenterViewTest::GetNotificationCount() {
170   return 1;
171 }
172
173 int MessageCenterViewTest::GetCallCount(CallType type) {
174   return callCounts_[type];
175 }
176
177 void MessageCenterViewTest::ClickOnNotification(
178     const std::string& notification_id) {
179   // For this test, this method should not be invoked.
180   NOTREACHED();
181 }
182
183 void MessageCenterViewTest::RemoveNotification(
184     const std::string& notification_id,
185     bool by_user) {
186   // For this test, this method should not be invoked.
187   NOTREACHED();
188 }
189
190 scoped_ptr<ui::MenuModel> MessageCenterViewTest::CreateMenuModel(
191     const NotifierId& notifier_id,
192     const base::string16& display_source) {
193   // For this test, this method should not be invoked.
194   NOTREACHED();
195   return scoped_ptr<ui::MenuModel>();
196 }
197
198 bool MessageCenterViewTest::HasClickedListener(
199     const std::string& notification_id) {
200   return true;
201 }
202
203 void MessageCenterViewTest::ClickOnNotificationButton(
204     const std::string& notification_id,
205     int button_index) {
206   // For this test, this method should not be invoked.
207   NOTREACHED();
208 }
209
210 void MessageCenterViewTest::RegisterCall(CallType type) {
211   callCounts_[type] += 1;
212 }
213
214 void MessageCenterViewTest::LogBounds(int depth, views::View* view) {
215   base::string16 inset;
216   for (int i = 0; i < depth; ++i)
217     inset.append(base::UTF8ToUTF16("  "));
218   gfx::Rect bounds = view->bounds();
219   DVLOG(0) << inset << bounds.width() << " x " << bounds.height()
220            << " @ " << bounds.x() << ", " << bounds.y();
221   for (int i = 0; i < view->child_count(); ++i)
222     LogBounds(depth + 1, view->child_at(i));
223 }
224
225 /* Unit tests *****************************************************************/
226
227 TEST_F(MessageCenterViewTest, CallTest) {
228   // Exercise (with size values that just need to be large enough).
229   GetMessageCenterView()->SetBounds(0, 0, 100, 100);
230
231   // Verify that this didn't generate more than 2 Layout() call per descendant
232   // NotificationView or more than a total of 20 GetPreferredSize() and
233   // GetHeightForWidth() calls per descendant NotificationView. 20 is a very
234   // large number corresponding to the current reality. That number will be
235   // ratcheted down over time as the code improves.
236   EXPECT_LE(GetCallCount(LAYOUT), GetNotificationCount() * 2);
237   EXPECT_LE(GetCallCount(GET_PREFERRED_SIZE) +
238             GetCallCount(GET_HEIGHT_FOR_WIDTH),
239             GetNotificationCount() * 20);
240 }
241
242 }  // namespace message_center