#include "ui/native_theme/scrollbar_animator_mac.h"
#include "base/logging.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using testing::Return;
namespace ui {
namespace {
constexpr int kExpandedWidth = 32;
constexpr int kUnexpandedWidth = 16;
constexpr auto kTimeToFadeOut = base::Milliseconds(500);
constexpr auto kAnimationTime = base::Milliseconds(250);
class MockClient : public OverlayScrollbarAnimatorMac::Client {
public:
MOCK_CONST_METHOD0(IsMouseInScrollbarFrameRect, bool());
MOCK_METHOD1(SetHidden, void(bool));
MOCK_METHOD0(SetThumbNeedsDisplay, void());
MOCK_METHOD0(SetTrackNeedsDisplay, void());
};
class MacScrollbarAnimatorTest : public ::testing::Test {
public:
MacScrollbarAnimatorTest()
: task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
scrollbar_ = std::make_unique<OverlayScrollbarAnimatorMac>(
&client_, kExpandedWidth, kUnexpandedWidth,
task_environment_.GetMainThreadTaskRunner());
}
~MacScrollbarAnimatorTest() override = default;
base::test::TaskEnvironment task_environment_;
MockClient client_;
std::unique_ptr<OverlayScrollbarAnimatorMac> scrollbar_;
};
TEST_F(MacScrollbarAnimatorTest, DidScrollThenFadeOut) {
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 0.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_CALL(client_, IsMouseInScrollbarFrameRect()).WillOnce(Return(false));
EXPECT_CALL(client_, SetHidden(false));
EXPECT_CALL(client_, SetThumbNeedsDisplay());
scrollbar_->DidScroll();
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(0);
task_environment_.FastForwardBy(kTimeToFadeOut);
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).WillRepeatedly(Return());
task_environment_.FastForwardBy(kAnimationTime / 2);
EXPECT_GT(scrollbar_->GetThumbAlpha(), 0.f);
EXPECT_LT(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
EXPECT_CALL(client_, SetHidden(true));
task_environment_.FastForwardBy(kAnimationTime);
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 0.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
}
TEST_F(MacScrollbarAnimatorTest, DidScrollStartsInTrack) {
EXPECT_CALL(client_, IsMouseInScrollbarFrameRect()).WillOnce(Return(true));
EXPECT_CALL(client_, SetHidden(false));
EXPECT_CALL(client_, SetThumbNeedsDisplay());
EXPECT_CALL(client_, SetTrackNeedsDisplay());
scrollbar_->DidScroll();
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(0);
EXPECT_CALL(client_, SetTrackNeedsDisplay()).Times(0);
task_environment_.FastForwardBy(10 * kTimeToFadeOut);
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
scrollbar_->DidScroll();
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
scrollbar_->MouseDidExit();
task_environment_.FastForwardBy(kTimeToFadeOut / 2);
scrollbar_->MouseDidEnter();
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
scrollbar_->MouseDidExit();
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
task_environment_.FastForwardBy(3 * kTimeToFadeOut / 4);
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).WillRepeatedly(Return());
EXPECT_CALL(client_, SetTrackNeedsDisplay()).WillRepeatedly(Return());
task_environment_.FastForwardBy(kTimeToFadeOut / 4 + kAnimationTime / 2);
EXPECT_GT(scrollbar_->GetThumbAlpha(), 0.f);
EXPECT_LT(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_GT(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_LT(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(1);
EXPECT_CALL(client_, SetTrackNeedsDisplay()).Times(1);
scrollbar_->DidScroll();
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(0);
EXPECT_CALL(client_, SetTrackNeedsDisplay()).Times(0);
task_environment_.FastForwardBy(3 * kTimeToFadeOut / 4);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).WillRepeatedly(Return());
EXPECT_CALL(client_, SetTrackNeedsDisplay()).WillRepeatedly(Return());
task_environment_.FastForwardBy(kTimeToFadeOut / 4 + kAnimationTime / 2);
EXPECT_GT(scrollbar_->GetThumbAlpha(), 0.f);
EXPECT_LT(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_GT(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_LT(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
EXPECT_CALL(client_, SetHidden(true));
task_environment_.FastForwardBy(kAnimationTime);
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 0.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
}
TEST_F(MacScrollbarAnimatorTest, EnterTrack) {
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 0.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
scrollbar_->MouseDidEnter();
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 0.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_CALL(client_, IsMouseInScrollbarFrameRect()).WillOnce(Return(false));
EXPECT_CALL(client_, SetHidden(false));
EXPECT_CALL(client_, SetThumbNeedsDisplay());
scrollbar_->DidScroll();
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
scrollbar_->MouseDidEnter();
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).WillRepeatedly(Return());
EXPECT_CALL(client_, SetTrackNeedsDisplay()).WillRepeatedly(Return());
task_environment_.FastForwardBy(kAnimationTime / 2);
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_GT(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_LT(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_GT(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
EXPECT_LT(scrollbar_->GetThumbWidth(), kExpandedWidth);
task_environment_.FastForwardBy(kAnimationTime);
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(0);
EXPECT_CALL(client_, SetTrackNeedsDisplay()).Times(0);
task_environment_.FastForwardBy(10 * kTimeToFadeOut);
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
scrollbar_->MouseDidExit();
task_environment_.FastForwardBy(kTimeToFadeOut);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).WillRepeatedly(Return());
EXPECT_CALL(client_, SetTrackNeedsDisplay()).WillRepeatedly(Return());
task_environment_.FastForwardBy(kAnimationTime / 2);
EXPECT_GT(scrollbar_->GetThumbAlpha(), 0.f);
EXPECT_LT(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_GT(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_LT(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(1);
EXPECT_CALL(client_, SetTrackNeedsDisplay()).Times(1);
scrollbar_->MouseDidEnter();
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(0);
EXPECT_CALL(client_, SetTrackNeedsDisplay()).Times(0);
task_environment_.FastForwardBy(10 * kTimeToFadeOut);
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
scrollbar_->MouseDidExit();
task_environment_.FastForwardBy(kTimeToFadeOut);
EXPECT_CALL(client_, SetThumbNeedsDisplay()).WillRepeatedly(Return());
EXPECT_CALL(client_, SetTrackNeedsDisplay()).WillRepeatedly(Return());
task_environment_.FastForwardBy(kAnimationTime / 2);
EXPECT_GT(scrollbar_->GetThumbAlpha(), 0.f);
EXPECT_LT(scrollbar_->GetThumbAlpha(), 1.f);
EXPECT_GT(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_LT(scrollbar_->GetTrackAlpha(), 1.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
EXPECT_CALL(client_, SetHidden(true));
task_environment_.FastForwardBy(kAnimationTime);
EXPECT_EQ(scrollbar_->GetThumbAlpha(), 0.f);
EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
EXPECT_EQ(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
}
}
}