| Index: ui/message_center/views/notification_view_md_unittest.cc
|
| diff --git a/ui/message_center/views/notification_view_md_unittest.cc b/ui/message_center/views/notification_view_md_unittest.cc
|
| deleted file mode 100644
|
| index 9baa68cd0bd87ba625a2281411219f8d92d63228..0000000000000000000000000000000000000000
|
| --- a/ui/message_center/views/notification_view_md_unittest.cc
|
| +++ /dev/null
|
| @@ -1,501 +0,0 @@
|
| -// Copyright 2017 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "ui/message_center/views/notification_view_md.h"
|
| -
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "build/build_config.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "ui/compositor/scoped_animation_duration_scale_mode.h"
|
| -#include "ui/events/event_processor.h"
|
| -#include "ui/events/event_utils.h"
|
| -#include "ui/events/test/event_generator.h"
|
| -#include "ui/gfx/canvas.h"
|
| -#include "ui/message_center/message_center_style.h"
|
| -#include "ui/message_center/views/message_center_controller.h"
|
| -#include "ui/message_center/views/notification_header_view.h"
|
| -#include "ui/message_center/views/proportional_image_view.h"
|
| -#include "ui/views/controls/button/image_button.h"
|
| -#include "ui/views/controls/button/label_button.h"
|
| -#include "ui/views/test/views_test_base.h"
|
| -#include "ui/views/test/widget_test.h"
|
| -
|
| -namespace message_center {
|
| -
|
| -/* Test fixture ***************************************************************/
|
| -
|
| -// Used to fill bitmaps returned by CreateBitmap().
|
| -static const SkColor kBitmapColor = SK_ColorGREEN;
|
| -
|
| -class NotificationViewMDTest : public views::ViewsTestBase,
|
| - public MessageCenterController {
|
| - public:
|
| - NotificationViewMDTest();
|
| - ~NotificationViewMDTest() override;
|
| -
|
| - // Overridden from ViewsTestBase:
|
| - void SetUp() override;
|
| - void TearDown() override;
|
| -
|
| - // Overridden from MessageCenterController:
|
| - void ClickOnNotification(const std::string& notification_id) override;
|
| - void RemoveNotification(const std::string& notification_id,
|
| - bool by_user) override;
|
| - std::unique_ptr<ui::MenuModel> CreateMenuModel(
|
| - const NotifierId& notifier_id,
|
| - const base::string16& display_source) override;
|
| - bool HasClickedListener(const std::string& notification_id) override;
|
| - void ClickOnNotificationButton(const std::string& notification_id,
|
| - int button_index) override;
|
| - void ClickOnSettingsButton(const std::string& notification_id) override;
|
| - void UpdateNotificationSize(const std::string& notification_id) override;
|
| -
|
| - NotificationViewMD* notification_view() const {
|
| - return notification_view_.get();
|
| - }
|
| - Notification* notification() const { return notification_.get(); }
|
| - views::Widget* widget() const {
|
| - DCHECK_EQ(widget_, notification_view()->GetWidget());
|
| - return widget_;
|
| - }
|
| -
|
| - protected:
|
| - const gfx::Image CreateTestImage(int width, int height);
|
| - const SkBitmap CreateBitmap(int width, int height);
|
| - std::vector<ButtonInfo> CreateButtons(int number);
|
| -
|
| - // Paints |view| and returns the size that the original image (which must have
|
| - // been created by CreateBitmap()) was scaled to.
|
| - gfx::Size GetImagePaintSize(ProportionalImageView* view);
|
| -
|
| - void UpdateNotificationViews();
|
| - float GetNotificationSlideAmount() const;
|
| - bool IsRemoved(const std::string& notification_id) const;
|
| - void DispatchGesture(const ui::GestureEventDetails& details);
|
| - void BeginScroll();
|
| - void EndScroll();
|
| - void ScrollBy(int dx);
|
| - views::ImageButton* GetCloseButton();
|
| -
|
| - private:
|
| - std::set<std::string> removed_ids_;
|
| -
|
| - std::unique_ptr<RichNotificationData> data_;
|
| - std::unique_ptr<Notification> notification_;
|
| - std::unique_ptr<NotificationViewMD> notification_view_;
|
| - views::Widget* widget_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(NotificationViewMDTest);
|
| -};
|
| -
|
| -NotificationViewMDTest::NotificationViewMDTest() = default;
|
| -NotificationViewMDTest::~NotificationViewMDTest() = default;
|
| -
|
| -void NotificationViewMDTest::SetUp() {
|
| - views::ViewsTestBase::SetUp();
|
| - // Create a dummy notification.
|
| - data_.reset(new RichNotificationData());
|
| - notification_.reset(new Notification(
|
| - NOTIFICATION_TYPE_BASE_FORMAT, std::string("notification id"),
|
| - base::UTF8ToUTF16("title"), base::UTF8ToUTF16("message"),
|
| - CreateTestImage(80, 80), base::UTF8ToUTF16("display source"), GURL(),
|
| - NotifierId(NotifierId::APPLICATION, "extension_id"), *data_, nullptr));
|
| - notification_->set_small_image(CreateTestImage(16, 16));
|
| - notification_->set_image(CreateTestImage(320, 240));
|
| -
|
| - // Then create a new NotificationView with that single notification.
|
| - // In the actual code path, this is instantiated by
|
| - // MessageViewFactory::Create.
|
| - // TODO(tetsui): Confirm that NotificationViewMD options are same as one
|
| - // created by the method.
|
| - notification_view_.reset(new NotificationViewMD(this, *notification_));
|
| - notification_view_->SetIsNested();
|
| - notification_view_->set_owned_by_client();
|
| -
|
| - views::Widget::InitParams init_params(
|
| - CreateParams(views::Widget::InitParams::TYPE_POPUP));
|
| - widget_ = new views::Widget();
|
| - widget_->Init(init_params);
|
| - widget_->SetContentsView(notification_view_.get());
|
| - widget_->SetSize(notification_view_->GetPreferredSize());
|
| - widget_->Show();
|
| -}
|
| -
|
| -void NotificationViewMDTest::TearDown() {
|
| - widget()->Close();
|
| - notification_view_.reset();
|
| - views::ViewsTestBase::TearDown();
|
| -}
|
| -
|
| -void NotificationViewMDTest::ClickOnNotification(
|
| - const std::string& notification_id) {
|
| - // For this test, this method should not be invoked.
|
| - NOTREACHED();
|
| -}
|
| -
|
| -void NotificationViewMDTest::RemoveNotification(
|
| - const std::string& notification_id,
|
| - bool by_user) {
|
| - removed_ids_.insert(notification_id);
|
| -}
|
| -
|
| -std::unique_ptr<ui::MenuModel> NotificationViewMDTest::CreateMenuModel(
|
| - const NotifierId& notifier_id,
|
| - const base::string16& display_source) {
|
| - // For this test, this method should not be invoked.
|
| - NOTREACHED();
|
| - return nullptr;
|
| -}
|
| -
|
| -bool NotificationViewMDTest::HasClickedListener(
|
| - const std::string& notification_id) {
|
| - return true;
|
| -}
|
| -
|
| -void NotificationViewMDTest::ClickOnNotificationButton(
|
| - const std::string& notification_id,
|
| - int button_index) {
|
| - // For this test, this method should not be invoked.
|
| - NOTREACHED();
|
| -}
|
| -
|
| -void NotificationViewMDTest::ClickOnSettingsButton(
|
| - const std::string& notification_id) {
|
| - // For this test, this method should not be invoked.
|
| - NOTREACHED();
|
| -}
|
| -
|
| -void NotificationViewMDTest::UpdateNotificationSize(
|
| - const std::string& notification_id) {
|
| - widget()->SetSize(notification_view()->GetPreferredSize());
|
| -}
|
| -
|
| -const gfx::Image NotificationViewMDTest::CreateTestImage(int width,
|
| - int height) {
|
| - return gfx::Image::CreateFrom1xBitmap(CreateBitmap(width, height));
|
| -}
|
| -
|
| -const SkBitmap NotificationViewMDTest::CreateBitmap(int width, int height) {
|
| - SkBitmap bitmap;
|
| - bitmap.allocN32Pixels(width, height);
|
| - bitmap.eraseColor(kBitmapColor);
|
| - return bitmap;
|
| -}
|
| -
|
| -std::vector<ButtonInfo> NotificationViewMDTest::CreateButtons(int number) {
|
| - ButtonInfo info(base::ASCIIToUTF16("Test button."));
|
| - info.icon = CreateTestImage(4, 4);
|
| - return std::vector<ButtonInfo>(number, info);
|
| -}
|
| -
|
| -gfx::Size NotificationViewMDTest::GetImagePaintSize(
|
| - ProportionalImageView* view) {
|
| - CHECK(view);
|
| - if (view->bounds().IsEmpty())
|
| - return gfx::Size();
|
| -
|
| - gfx::Size canvas_size = view->bounds().size();
|
| - gfx::Canvas canvas(canvas_size, 1.0 /* image_scale */, true /* is_opaque */);
|
| - static_assert(kBitmapColor != SK_ColorBLACK,
|
| - "The bitmap color must match the background color");
|
| - canvas.DrawColor(SK_ColorBLACK);
|
| - view->OnPaint(&canvas);
|
| -
|
| - SkBitmap bitmap = canvas.GetBitmap();
|
| - // Incrementally inset each edge at its midpoint to find the bounds of the
|
| - // rect containing the image's color. This assumes that the image is
|
| - // centered in the canvas.
|
| - const int kHalfWidth = canvas_size.width() / 2;
|
| - const int kHalfHeight = canvas_size.height() / 2;
|
| - gfx::Rect rect(canvas_size);
|
| - while (rect.width() > 0 &&
|
| - bitmap.getColor(rect.x(), kHalfHeight) != kBitmapColor)
|
| - rect.Inset(1, 0, 0, 0);
|
| - while (rect.height() > 0 &&
|
| - bitmap.getColor(kHalfWidth, rect.y()) != kBitmapColor)
|
| - rect.Inset(0, 1, 0, 0);
|
| - while (rect.width() > 0 &&
|
| - bitmap.getColor(rect.right() - 1, kHalfHeight) != kBitmapColor)
|
| - rect.Inset(0, 0, 1, 0);
|
| - while (rect.height() > 0 &&
|
| - bitmap.getColor(kHalfWidth, rect.bottom() - 1) != kBitmapColor)
|
| - rect.Inset(0, 0, 0, 1);
|
| -
|
| - return rect.size();
|
| -}
|
| -
|
| -void NotificationViewMDTest::UpdateNotificationViews() {
|
| - notification_view()->UpdateWithNotification(*notification());
|
| -}
|
| -
|
| -float NotificationViewMDTest::GetNotificationSlideAmount() const {
|
| - return notification_view_->GetSlideOutLayer()
|
| - ->transform()
|
| - .To2dTranslation()
|
| - .x();
|
| -}
|
| -
|
| -bool NotificationViewMDTest::IsRemoved(
|
| - const std::string& notification_id) const {
|
| - return (removed_ids_.find(notification_id) != removed_ids_.end());
|
| -}
|
| -
|
| -void NotificationViewMDTest::DispatchGesture(
|
| - const ui::GestureEventDetails& details) {
|
| - ui::test::EventGenerator generator(
|
| - notification_view()->GetWidget()->GetNativeWindow());
|
| - ui::GestureEvent event(0, 0, 0, ui::EventTimeForNow(), details);
|
| - generator.Dispatch(&event);
|
| -}
|
| -
|
| -void NotificationViewMDTest::BeginScroll() {
|
| - DispatchGesture(ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
|
| -}
|
| -
|
| -void NotificationViewMDTest::EndScroll() {
|
| - DispatchGesture(ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END));
|
| -}
|
| -
|
| -void NotificationViewMDTest::ScrollBy(int dx) {
|
| - DispatchGesture(ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, dx, 0));
|
| -}
|
| -
|
| -views::ImageButton* NotificationViewMDTest::GetCloseButton() {
|
| - return notification_view()->header_row_->close_button();
|
| -}
|
| -
|
| -/* Unit tests *****************************************************************/
|
| -
|
| -// TODO(tetsui): Following tests are not yet ported from NotificationViewTest.
|
| -// * CreateOrUpdateTestSettingsButton
|
| -// * TestLineLimits
|
| -// * TestImageSizing
|
| -// * SettingsButtonTest
|
| -// * ViewOrderingTest
|
| -// * FormatContextMessageTest
|
| -
|
| -TEST_F(NotificationViewMDTest, CreateOrUpdateTest) {
|
| - EXPECT_NE(nullptr, notification_view()->title_view_);
|
| - EXPECT_NE(nullptr, notification_view()->message_view_);
|
| - EXPECT_NE(nullptr, notification_view()->icon_view_);
|
| - EXPECT_NE(nullptr, notification_view()->image_view_);
|
| -
|
| - notification()->set_image(gfx::Image());
|
| - notification()->set_title(base::string16());
|
| - notification()->set_message(base::string16());
|
| - notification()->set_icon(gfx::Image());
|
| -
|
| - notification_view()->CreateOrUpdateViews(*notification());
|
| -
|
| - EXPECT_EQ(nullptr, notification_view()->title_view_);
|
| - EXPECT_EQ(nullptr, notification_view()->message_view_);
|
| - EXPECT_EQ(nullptr, notification_view()->image_view_);
|
| - // We still expect an icon view for all layouts.
|
| - EXPECT_NE(nullptr, notification_view()->icon_view_);
|
| -}
|
| -
|
| -TEST_F(NotificationViewMDTest, TestIconSizing) {
|
| - // TODO(tetsui): Remove duplicated integer literal in CreateOrUpdateIconView.
|
| - const int kNotificationIconSize = 30;
|
| -
|
| - notification()->set_type(NOTIFICATION_TYPE_SIMPLE);
|
| - ProportionalImageView* view = notification_view()->icon_view_;
|
| -
|
| - // Icons smaller than the maximum size should remain unscaled.
|
| - notification()->set_icon(
|
| - CreateTestImage(kNotificationIconSize / 2, kNotificationIconSize / 4));
|
| - UpdateNotificationViews();
|
| - EXPECT_EQ(gfx::Size(kNotificationIconSize / 2, kNotificationIconSize / 4)
|
| - .ToString(),
|
| - GetImagePaintSize(view).ToString());
|
| -
|
| - // Icons of exactly the intended icon size should remain unscaled.
|
| - notification()->set_icon(
|
| - CreateTestImage(kNotificationIconSize, kNotificationIconSize));
|
| - UpdateNotificationViews();
|
| - EXPECT_EQ(gfx::Size(kNotificationIconSize, kNotificationIconSize).ToString(),
|
| - GetImagePaintSize(view).ToString());
|
| -
|
| - // Icons over the maximum size should be scaled down, maintaining proportions.
|
| - notification()->set_icon(
|
| - CreateTestImage(2 * kNotificationIconSize, 2 * kNotificationIconSize));
|
| - UpdateNotificationViews();
|
| - EXPECT_EQ(gfx::Size(kNotificationIconSize, kNotificationIconSize).ToString(),
|
| - GetImagePaintSize(view).ToString());
|
| -
|
| - notification()->set_icon(
|
| - CreateTestImage(4 * kNotificationIconSize, 2 * kNotificationIconSize));
|
| - UpdateNotificationViews();
|
| - EXPECT_EQ(
|
| - gfx::Size(kNotificationIconSize, kNotificationIconSize / 2).ToString(),
|
| - GetImagePaintSize(view).ToString());
|
| -}
|
| -
|
| -TEST_F(NotificationViewMDTest, UpdateButtonsStateTest) {
|
| - notification()->set_buttons(CreateButtons(2));
|
| - notification_view()->CreateOrUpdateViews(*notification());
|
| - widget()->Show();
|
| -
|
| - // Action buttons are hidden by collapsed state.
|
| - if (!notification_view()->expanded_)
|
| - notification_view()->ToggleExpanded();
|
| - EXPECT_TRUE(notification_view()->actions_row_->visible());
|
| -
|
| - EXPECT_EQ(views::CustomButton::STATE_NORMAL,
|
| - notification_view()->action_buttons_[0]->state());
|
| -
|
| - // Now construct a mouse move event 1 pixel inside the boundary of the action
|
| - // button.
|
| - gfx::Point cursor_location(1, 1);
|
| - views::View::ConvertPointToWidget(notification_view()->action_buttons_[0],
|
| - &cursor_location);
|
| - ui::MouseEvent move(ui::ET_MOUSE_MOVED, cursor_location, cursor_location,
|
| - ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE);
|
| - widget()->OnMouseEvent(&move);
|
| -
|
| - EXPECT_EQ(views::CustomButton::STATE_HOVERED,
|
| - notification_view()->action_buttons_[0]->state());
|
| -
|
| - notification_view()->CreateOrUpdateViews(*notification());
|
| -
|
| - EXPECT_EQ(views::CustomButton::STATE_HOVERED,
|
| - notification_view()->action_buttons_[0]->state());
|
| -
|
| - // Now construct a mouse move event 1 pixel outside the boundary of the
|
| - // widget.
|
| - cursor_location = gfx::Point(-1, -1);
|
| - move = ui::MouseEvent(ui::ET_MOUSE_MOVED, cursor_location, cursor_location,
|
| - ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE);
|
| - widget()->OnMouseEvent(&move);
|
| -
|
| - EXPECT_EQ(views::CustomButton::STATE_NORMAL,
|
| - notification_view()->action_buttons_[0]->state());
|
| -}
|
| -
|
| -TEST_F(NotificationViewMDTest, UpdateButtonCountTest) {
|
| - notification()->set_buttons(CreateButtons(2));
|
| - notification_view()->UpdateWithNotification(*notification());
|
| - widget()->Show();
|
| -
|
| - // Action buttons are hidden by collapsed state.
|
| - if (!notification_view()->expanded_)
|
| - notification_view()->ToggleExpanded();
|
| - EXPECT_TRUE(notification_view()->actions_row_->visible());
|
| -
|
| - EXPECT_EQ(views::CustomButton::STATE_NORMAL,
|
| - notification_view()->action_buttons_[0]->state());
|
| - EXPECT_EQ(views::CustomButton::STATE_NORMAL,
|
| - notification_view()->action_buttons_[1]->state());
|
| -
|
| - // Now construct a mouse move event 1 pixel inside the boundary of the action
|
| - // button.
|
| - gfx::Point cursor_location(1, 1);
|
| - views::View::ConvertPointToScreen(notification_view()->action_buttons_[0],
|
| - &cursor_location);
|
| - ui::MouseEvent move(ui::ET_MOUSE_MOVED, cursor_location, cursor_location,
|
| - ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE);
|
| - ui::EventDispatchDetails details =
|
| - views::test::WidgetTest::GetEventSink(widget())->OnEventFromSource(&move);
|
| - EXPECT_FALSE(details.dispatcher_destroyed);
|
| -
|
| - EXPECT_EQ(views::CustomButton::STATE_HOVERED,
|
| - notification_view()->action_buttons_[0]->state());
|
| - EXPECT_EQ(views::CustomButton::STATE_NORMAL,
|
| - notification_view()->action_buttons_[1]->state());
|
| -
|
| - notification()->set_buttons(CreateButtons(1));
|
| - notification_view()->UpdateWithNotification(*notification());
|
| -
|
| - EXPECT_EQ(views::CustomButton::STATE_HOVERED,
|
| - notification_view()->action_buttons_[0]->state());
|
| - EXPECT_EQ(1u, notification_view()->action_buttons_.size());
|
| -
|
| - // Now construct a mouse move event 1 pixel outside the boundary of the
|
| - // widget.
|
| - cursor_location = gfx::Point(-1, -1);
|
| - move = ui::MouseEvent(ui::ET_MOUSE_MOVED, cursor_location, cursor_location,
|
| - ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE);
|
| - widget()->OnMouseEvent(&move);
|
| -
|
| - EXPECT_EQ(views::CustomButton::STATE_NORMAL,
|
| - notification_view()->action_buttons_[0]->state());
|
| -}
|
| -
|
| -TEST_F(NotificationViewMDTest, SlideOut) {
|
| - ui::ScopedAnimationDurationScaleMode zero_duration_scope(
|
| - ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
|
| -
|
| - UpdateNotificationViews();
|
| - std::string notification_id = notification()->id();
|
| -
|
| - BeginScroll();
|
| - ScrollBy(-10);
|
| - EXPECT_FALSE(IsRemoved(notification_id));
|
| - EXPECT_EQ(-10.f, GetNotificationSlideAmount());
|
| - EndScroll();
|
| - EXPECT_FALSE(IsRemoved(notification_id));
|
| - EXPECT_EQ(0.f, GetNotificationSlideAmount());
|
| -
|
| - BeginScroll();
|
| - ScrollBy(-200);
|
| - EXPECT_FALSE(IsRemoved(notification_id));
|
| - EXPECT_EQ(-200.f, GetNotificationSlideAmount());
|
| - EndScroll();
|
| - EXPECT_TRUE(IsRemoved(notification_id));
|
| -}
|
| -
|
| -TEST_F(NotificationViewMDTest, SlideOutNested) {
|
| - ui::ScopedAnimationDurationScaleMode zero_duration_scope(
|
| - ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
|
| -
|
| - UpdateNotificationViews();
|
| - notification_view()->SetIsNested();
|
| - std::string notification_id = notification()->id();
|
| -
|
| - BeginScroll();
|
| - ScrollBy(-10);
|
| - EXPECT_FALSE(IsRemoved(notification_id));
|
| - EXPECT_EQ(-10.f, GetNotificationSlideAmount());
|
| - EndScroll();
|
| - EXPECT_FALSE(IsRemoved(notification_id));
|
| - EXPECT_EQ(0.f, GetNotificationSlideAmount());
|
| -
|
| - BeginScroll();
|
| - ScrollBy(-200);
|
| - EXPECT_FALSE(IsRemoved(notification_id));
|
| - EXPECT_EQ(-200.f, GetNotificationSlideAmount());
|
| - EndScroll();
|
| - EXPECT_TRUE(IsRemoved(notification_id));
|
| -}
|
| -
|
| -// Pinning notification is ChromeOS only feature.
|
| -#if defined(OS_CHROMEOS)
|
| -
|
| -TEST_F(NotificationViewMDTest, SlideOutPinned) {
|
| - ui::ScopedAnimationDurationScaleMode zero_duration_scope(
|
| - ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
|
| -
|
| - notification()->set_pinned(true);
|
| - UpdateNotificationViews();
|
| - std::string notification_id = notification()->id();
|
| -
|
| - BeginScroll();
|
| - ScrollBy(-200);
|
| - EXPECT_FALSE(IsRemoved(notification_id));
|
| - EXPECT_LT(-200.f, GetNotificationSlideAmount());
|
| - EndScroll();
|
| - EXPECT_FALSE(IsRemoved(notification_id));
|
| -}
|
| -
|
| -TEST_F(NotificationViewMDTest, Pinned) {
|
| - notification()->set_pinned(true);
|
| -
|
| - UpdateNotificationViews();
|
| - EXPECT_FALSE(GetCloseButton()->visible());
|
| -}
|
| -
|
| -#endif // defined(OS_CHROMEOS)
|
| -
|
| -} // namespace message_center
|
|
|