blob: a62507db9e8bb2026395f64bd1844d847b416508 [file] [log] [blame]
// 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