blob: b6fc8cebb0cfc2ecc281a84b1cc61e70a114f192 [file] [log] [blame]
// Copyright 2015 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/views/animation/ink_drop_impl.h"
#include "base/macros.h"
#include "base/test/test_simple_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/views/animation/ink_drop_ripple.h"
#include "ui/views/animation/test/ink_drop_impl_test_api.h"
#include "ui/views/animation/test/test_ink_drop_host.h"
namespace views {
// NOTE: The InkDropImpl class is also tested by the InkDropFactoryTest tests.
class InkDropImplTest : public testing::Test {
public:
InkDropImplTest();
~InkDropImplTest() override;
protected:
TestInkDropHost ink_drop_host_;
// The test target.
InkDropImpl ink_drop_;
// Allows privileged access to the the |ink_drop_highlight_|.
test::InkDropImplTestApi test_api_;
// Used to control the tasks scheduled by the InkDropImpl's Timer.
scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
// Required by base::Timer's.
std::unique_ptr<base::ThreadTaskRunnerHandle> thread_task_runner_handle_;
private:
DISALLOW_COPY_AND_ASSIGN(InkDropImplTest);
};
InkDropImplTest::InkDropImplTest()
: ink_drop_(&ink_drop_host_),
test_api_(&ink_drop_),
task_runner_(new base::TestSimpleTaskRunner),
thread_task_runner_handle_(
new base::ThreadTaskRunnerHandle(task_runner_)) {
ink_drop_host_.set_disable_timers_for_test(true);
}
InkDropImplTest::~InkDropImplTest() {}
TEST_F(InkDropImplTest, SetHoveredHighlightIsFadingInOrVisible) {
ink_drop_host_.set_should_show_highlight(true);
ink_drop_.SetHovered(true);
EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
test_api_.CompleteAnimations();
ink_drop_.SetHovered(false);
EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
}
TEST_F(InkDropImplTest, FocusAndHoverAtSameTime) {
ink_drop_host_.set_should_show_highlight(true);
EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
ink_drop_.SetFocused(true);
EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
test_api_.CompleteAnimations();
ink_drop_.SetHovered(false);
EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
test_api_.CompleteAnimations();
ink_drop_.SetHovered(true);
EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
test_api_.CompleteAnimations();
ink_drop_.SetFocused(false);
EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
test_api_.CompleteAnimations();
ink_drop_.SetHovered(false);
EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
}
TEST_F(InkDropImplTest, HighlightDoesntFadeInAfterAnimationIfHighlightNotSet) {
ink_drop_host_.set_should_show_highlight(true);
ink_drop_.SetHovered(false);
ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED);
test_api_.CompleteAnimations();
EXPECT_FALSE(task_runner_->HasPendingTask());
EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
}
TEST_F(InkDropImplTest, HighlightFadesInAfterAnimationWhenHostIsHovered) {
ink_drop_host_.set_should_show_highlight(true);
ink_drop_.SetHovered(true);
ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED);
test_api_.CompleteAnimations();
EXPECT_TRUE(task_runner_->HasPendingTask());
task_runner_->RunPendingTasks();
EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
}
TEST_F(InkDropImplTest,
HighlightDoesntFadeInAfterAnimationWhenHostIsNotHovered) {
ink_drop_host_.set_should_show_highlight(false);
ink_drop_.SetHovered(true);
ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED);
test_api_.CompleteAnimations();
EXPECT_TRUE(task_runner_->HasPendingTask());
task_runner_->RunPendingTasks();
EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
}
TEST_F(InkDropImplTest, HoveredStateNotVisibleOrFadingInAfterAnimateToState) {
ink_drop_host_.set_should_show_highlight(true);
ink_drop_.SetHovered(true);
test_api_.CompleteAnimations();
EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED);
EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
}
// Verifies that there is not a crash when setting hovered state and the host
// returns null for the highlight.
TEST_F(InkDropImplTest, SetHoveredFalseWorksWhenNoInkDropHighlightExists) {
ink_drop_host_.set_should_show_highlight(false);
ink_drop_.SetHovered(true);
EXPECT_FALSE(test_api_.highlight());
ink_drop_.SetHovered(false);
EXPECT_FALSE(test_api_.highlight());
}
TEST_F(InkDropImplTest, HighlightFadesOutOnSnapToActivated) {
ink_drop_host_.set_should_show_highlight(true);
ink_drop_.SetHovered(true);
test_api_.CompleteAnimations();
EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible());
ink_drop_.SnapToActivated();
EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible());
}
TEST_F(InkDropImplTest, LayersRemovedFromHostAfterHighlight) {
ink_drop_host_.set_should_show_highlight(true);
EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
ink_drop_.SetHovered(true);
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
test_api_.CompleteAnimations();
ink_drop_.SetHovered(false);
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
test_api_.CompleteAnimations();
EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
}
TEST_F(InkDropImplTest, LayersRemovedFromHostAfterInkDrop) {
ink_drop_host_.set_should_show_highlight(true);
EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
ink_drop_.AnimateToState(InkDropState::ACTION_PENDING);
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
ink_drop_.AnimateToState(InkDropState::HIDDEN);
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
test_api_.CompleteAnimations();
EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
}
TEST_F(InkDropImplTest, LayersAddedToHostWhenHighlightOrInkDropVisible) {
ink_drop_host_.set_should_show_highlight(true);
EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
ink_drop_.SetHovered(true);
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
ink_drop_.AnimateToState(InkDropState::ACTION_PENDING);
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
ink_drop_.AnimateToState(InkDropState::HIDDEN);
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
test_api_.CompleteAnimations();
EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
EXPECT_TRUE(task_runner_->HasPendingTask());
task_runner_->RunPendingTasks();
// Highlight should be fading back in.
EXPECT_TRUE(test_api_.HasActiveAnimations());
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
}
TEST_F(InkDropImplTest, LayersNotAddedToHostWhenHighlightTimeFires) {
ink_drop_host_.set_should_show_highlight(true);
EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
ink_drop_.SetHovered(true);
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
ink_drop_.AnimateToState(InkDropState::ACTION_PENDING);
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
ink_drop_.AnimateToState(InkDropState::HIDDEN);
test_api_.CompleteAnimations();
EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
ink_drop_host_.set_should_show_highlight(false);
EXPECT_TRUE(task_runner_->HasPendingTask());
task_runner_->RunPendingTasks();
EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
}
TEST_F(InkDropImplTest, LayersArentRemovedWhenPreemptingFadeOut) {
ink_drop_host_.set_should_show_highlight(true);
EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers());
ink_drop_.SetHovered(true);
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
test_api_.CompleteAnimations();
ink_drop_.SetHovered(false);
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
ink_drop_.SetHovered(true);
EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers());
}
} // namespace views