| // Copyright 2021 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 "components/media_message_center/media_notification_volume_slider_view.h" |
| |
| #include "base/memory/raw_ptr.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/events/base_event_utils.h" |
| #include "ui/views/test/views_test_base.h" |
| |
| namespace media_message_center { |
| |
| namespace { |
| constexpr gfx::Size kVolumeSliderSize = {50, 20}; |
| constexpr float kScrollVolumeDelta = 0.1f; |
| constexpr float kKeyVolumeDelta = 0.05f; |
| } // namespace |
| |
| class MediaNotificationVolumeSliderViewTest : public views::ViewsTestBase { |
| public: |
| void SetUp() override { |
| views::ViewsTestBase::SetUp(); |
| widget_ = CreateTestWidget(); |
| volume_slider_ = widget_->SetContentsView( |
| std::make_unique<MediaNotificationVolumeSliderView>(base::BindRepeating( |
| &MediaNotificationVolumeSliderViewTest::SetVolume, |
| base::Unretained(this)))); |
| |
| widget_->SetBounds(gfx::Rect(kVolumeSliderSize)); |
| widget_->Show(); |
| } |
| |
| void TearDown() override { |
| widget_.reset(); |
| views::ViewsTestBase::TearDown(); |
| } |
| |
| void SimulateMousePressed(const gfx::Point& point) { |
| volume_slider_->OnMousePressed(ui::MouseEvent( |
| ui::ET_MOUSE_PRESSED, point, point, ui::EventTimeForNow(), 0, 0)); |
| } |
| |
| void SimulateMouseWheelEvent(const gfx::Vector2d& vector) { |
| volume_slider_->OnMouseWheel(ui::MouseWheelEvent( |
| vector, gfx::Point(), gfx::Point(), ui::EventTimeForNow(), 0, 0)); |
| } |
| |
| void SimulateKeyEvent(const ui::KeyboardCode key_code) { |
| volume_slider_->OnKeyPressed(ui::KeyEvent(ui::ET_KEY_PRESSED, key_code, 0)); |
| } |
| |
| MediaNotificationVolumeSliderView* volume_slider() { return volume_slider_; } |
| |
| MOCK_METHOD1(SetVolume, void(float)); |
| |
| private: |
| std::unique_ptr<views::Widget> widget_; |
| raw_ptr<MediaNotificationVolumeSliderView> volume_slider_; |
| }; |
| |
| TEST_F(MediaNotificationVolumeSliderViewTest, SetVolume) { |
| EXPECT_CALL(*this, SetVolume(0.0f)); |
| SimulateMousePressed(gfx::Point(0, 0)); |
| |
| EXPECT_CALL(*this, SetVolume(0.5f)); |
| SimulateMousePressed(gfx::Point(kVolumeSliderSize.width() / 2, 0)); |
| |
| EXPECT_CALL(*this, SetVolume(1.0f)); |
| SimulateMousePressed(gfx::Point(kVolumeSliderSize.width(), 0)); |
| } |
| |
| TEST_F(MediaNotificationVolumeSliderViewTest, UpdateVolumeWithMouseWheel) { |
| const float volume = 0.8f; |
| volume_slider()->SetVolume(volume); |
| |
| EXPECT_CALL(*this, SetVolume(volume + kScrollVolumeDelta)); |
| SimulateMouseWheelEvent(gfx::Vector2d(0, 1)); |
| |
| EXPECT_CALL(*this, SetVolume(volume - kScrollVolumeDelta)); |
| SimulateMouseWheelEvent(gfx::Vector2d(0, -1)); |
| |
| // Test that volume set should be in between 0 and 1. |
| volume_slider()->SetVolume(0.95f); |
| EXPECT_CALL(*this, SetVolume(1.0f)); |
| SimulateMouseWheelEvent(gfx::Vector2d(0, 1)); |
| |
| volume_slider()->SetVolume(0.05f); |
| EXPECT_CALL(*this, SetVolume(0.0f)); |
| SimulateMouseWheelEvent(gfx::Vector2d(0, -1)); |
| } |
| |
| TEST_F(MediaNotificationVolumeSliderViewTest, UpdateVolumeWithKey) { |
| const float volume = 0.5; |
| volume_slider()->SetVolume(volume); |
| |
| EXPECT_CALL(*this, SetVolume(volume + kKeyVolumeDelta)).Times(2); |
| SimulateKeyEvent(ui::KeyboardCode::VKEY_UP); |
| SimulateKeyEvent(ui::KeyboardCode::VKEY_RIGHT); |
| |
| EXPECT_CALL(*this, SetVolume(volume - kKeyVolumeDelta)).Times(2); |
| SimulateKeyEvent(ui::KeyboardCode::VKEY_DOWN); |
| SimulateKeyEvent(ui::KeyboardCode::VKEY_LEFT); |
| } |
| |
| } // namespace media_message_center |