| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <memory> |
| 6 |
| 5 #include "ui/views/animation/ink_drop_impl.h" | 7 #include "ui/views/animation/ink_drop_impl.h" |
| 6 | 8 |
| 7 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/ptr_util.h" |
| 8 #include "base/test/test_simple_task_runner.h" | 11 #include "base/test/test_simple_task_runner.h" |
| 9 #include "base/threading/thread_task_runner_handle.h" | 12 #include "base/threading/thread_task_runner_handle.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "ui/views/animation/test/ink_drop_impl_test_api.h" | 14 #include "ui/views/animation/test/ink_drop_impl_test_api.h" |
| 12 #include "ui/views/animation/test/test_ink_drop_host.h" | 15 #include "ui/views/animation/test/test_ink_drop_host.h" |
| 13 | 16 |
| 14 namespace views { | 17 namespace views { |
| 15 | 18 |
| 16 // NOTE: The InkDropImpl class is also tested by the InkDropFactoryTest tests. | 19 // NOTE: The InkDropImpl class is also tested by the InkDropFactoryTest tests. |
| 17 class InkDropImplTest : public testing::Test { | 20 class InkDropImplTest : public testing::Test { |
| 18 public: | 21 public: |
| 19 InkDropImplTest(); | 22 InkDropImplTest(); |
| 20 ~InkDropImplTest() override; | 23 ~InkDropImplTest() override; |
| 21 | 24 |
| 22 protected: | 25 protected: |
| 23 TestInkDropHost ink_drop_host_; | 26 TestInkDropHost* ink_drop_host() { return ink_drop_host_.get(); } |
| 24 | 27 |
| 25 // The test target. | 28 InkDropImpl* ink_drop() { return ink_drop_.get(); } |
| 26 InkDropImpl ink_drop_; | |
| 27 | 29 |
| 28 // Allows privileged access to the the |ink_drop_highlight_|. | 30 test::InkDropImplTestApi* test_api() { return test_api_.get(); } |
| 29 test::InkDropImplTestApi test_api_; | 31 |
| 32 // Runs all the pending tasks in |task_runner_|. This can be used to progress |
| 33 // timers. e.g. HideHighlightOnRippleHiddenState's |
| 34 // |highlight_after_ripple_timer_|. |
| 35 void RunPendingTasks(); |
| 36 |
| 37 // Returns true if the ink drop layers have been added to |ink_drop_host_|. |
| 38 bool AreLayersAddedToHost() const; |
| 39 |
| 40 // Destroyes the |ink_drop_| and assocated |test_api_|. |
| 41 void DestroyInkDrop(); |
| 30 | 42 |
| 31 // Used to control the tasks scheduled by the InkDropImpl's Timer. | 43 // Used to control the tasks scheduled by the InkDropImpl's Timer. |
| 32 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 44 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 33 | 45 |
| 34 // Required by base::Timer's. | 46 // Required by base::Timer's. |
| 35 std::unique_ptr<base::ThreadTaskRunnerHandle> thread_task_runner_handle_; | 47 std::unique_ptr<base::ThreadTaskRunnerHandle> thread_task_runner_handle_; |
| 36 | 48 |
| 37 private: | 49 private: |
| 50 std::unique_ptr<TestInkDropHost> ink_drop_host_; |
| 51 |
| 52 // The test target. |
| 53 std::unique_ptr<InkDropImpl> ink_drop_; |
| 54 |
| 55 // Allows privileged access to the the |ink_drop_highlight_|. |
| 56 std::unique_ptr<test::InkDropImplTestApi> test_api_; |
| 57 |
| 38 DISALLOW_COPY_AND_ASSIGN(InkDropImplTest); | 58 DISALLOW_COPY_AND_ASSIGN(InkDropImplTest); |
| 39 }; | 59 }; |
| 40 | 60 |
| 41 InkDropImplTest::InkDropImplTest() | 61 InkDropImplTest::InkDropImplTest() |
| 42 : ink_drop_(&ink_drop_host_), | 62 : task_runner_(new base::TestSimpleTaskRunner), |
| 43 test_api_(&ink_drop_), | |
| 44 task_runner_(new base::TestSimpleTaskRunner), | |
| 45 thread_task_runner_handle_( | 63 thread_task_runner_handle_( |
| 46 new base::ThreadTaskRunnerHandle(task_runner_)) { | 64 new base::ThreadTaskRunnerHandle(task_runner_)), |
| 47 ink_drop_host_.set_disable_timers_for_test(true); | 65 ink_drop_host_(base::MakeUnique<TestInkDropHost>()), |
| 66 ink_drop_(base::MakeUnique<InkDropImpl>(ink_drop_host_.get())), |
| 67 test_api_(base::MakeUnique<test::InkDropImplTestApi>(ink_drop_.get())) { |
| 68 ink_drop_host_->set_disable_timers_for_test(true); |
| 48 } | 69 } |
| 49 | 70 |
| 50 InkDropImplTest::~InkDropImplTest() {} | 71 InkDropImplTest::~InkDropImplTest() {} |
| 51 | 72 |
| 52 TEST_F(InkDropImplTest, SetHoveredHighlightIsFadingInOrVisible) { | 73 void InkDropImplTest::RunPendingTasks() { |
| 53 ink_drop_host_.set_should_show_highlight(true); | 74 task_runner_->RunPendingTasks(); |
| 54 | |
| 55 ink_drop_.SetHovered(true); | |
| 56 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 57 | |
| 58 test_api_.CompleteAnimations(); | |
| 59 | |
| 60 ink_drop_.SetHovered(false); | |
| 61 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible()); | |
| 62 } | |
| 63 | |
| 64 TEST_F(InkDropImplTest, FocusAndHoverAtSameTime) { | |
| 65 ink_drop_host_.set_should_show_highlight(true); | |
| 66 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible()); | |
| 67 | |
| 68 ink_drop_.SetFocused(true); | |
| 69 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 70 | |
| 71 test_api_.CompleteAnimations(); | |
| 72 ink_drop_.SetHovered(false); | |
| 73 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 74 | |
| 75 test_api_.CompleteAnimations(); | |
| 76 ink_drop_.SetHovered(true); | |
| 77 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 78 | |
| 79 test_api_.CompleteAnimations(); | |
| 80 ink_drop_.SetFocused(false); | |
| 81 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 82 | |
| 83 test_api_.CompleteAnimations(); | |
| 84 ink_drop_.SetHovered(false); | |
| 85 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible()); | |
| 86 } | |
| 87 | |
| 88 TEST_F(InkDropImplTest, HighlightDoesntFadeInAfterAnimationIfHighlightNotSet) { | |
| 89 ink_drop_host_.set_should_show_highlight(true); | |
| 90 ink_drop_.SetHovered(false); | |
| 91 ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED); | |
| 92 test_api_.CompleteAnimations(); | |
| 93 | |
| 94 EXPECT_FALSE(task_runner_->HasPendingTask()); | 75 EXPECT_FALSE(task_runner_->HasPendingTask()); |
| 95 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible()); | 76 } |
| 96 } | 77 |
| 97 | 78 bool InkDropImplTest::AreLayersAddedToHost() const { |
| 98 TEST_F(InkDropImplTest, HighlightFadesInAfterAnimationWhenHostIsHovered) { | 79 return ink_drop_host_->num_ink_drop_layers() >= 1; |
| 99 ink_drop_host_.set_should_show_highlight(true); | 80 } |
| 100 ink_drop_.SetHovered(true); | 81 |
| 101 ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED); | 82 void InkDropImplTest::DestroyInkDrop() { |
| 102 test_api_.CompleteAnimations(); | 83 test_api_.reset(); |
| 103 | 84 ink_drop_.reset(); |
| 104 EXPECT_TRUE(task_runner_->HasPendingTask()); | 85 } |
| 105 | 86 |
| 106 task_runner_->RunPendingTasks(); | 87 // AutoHighlightMode parameterized test fixture. |
| 107 | 88 class InkDropImplAutoHighlightTest |
| 108 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | 89 : public InkDropImplTest, |
| 90 public testing::WithParamInterface< |
| 91 testing::tuple<InkDropImpl::AutoHighlightMode>> { |
| 92 public: |
| 93 InkDropImplAutoHighlightTest(); |
| 94 ~InkDropImplAutoHighlightTest() override; |
| 95 |
| 96 InkDropImpl::AutoHighlightMode GetAutoHighlightMode() const; |
| 97 |
| 98 private: |
| 99 DISALLOW_COPY_AND_ASSIGN(InkDropImplAutoHighlightTest); |
| 100 }; |
| 101 |
| 102 InkDropImplAutoHighlightTest::InkDropImplAutoHighlightTest() |
| 103 : InkDropImplTest() { |
| 104 ink_drop()->SetAutoHighlightMode(GetAutoHighlightMode()); |
| 105 } |
| 106 |
| 107 InkDropImplAutoHighlightTest::~InkDropImplAutoHighlightTest() {} |
| 108 |
| 109 InkDropImpl::AutoHighlightMode |
| 110 InkDropImplAutoHighlightTest::GetAutoHighlightMode() const { |
| 111 return testing::get<0>(GetParam()); |
| 112 } |
| 113 |
| 114 //////////////////////////////////////////////////////////////////////////////// |
| 115 // |
| 116 // InkDropImpl tests |
| 117 // |
| 118 |
| 119 TEST_F(InkDropImplTest, ShouldHighlight) { |
| 120 ink_drop()->SetShowHighlightOnHover(false); |
| 121 ink_drop()->SetHovered(false); |
| 122 ink_drop()->SetShowHighlightOnFocus(false); |
| 123 ink_drop()->SetFocused(false); |
| 124 EXPECT_FALSE(test_api()->ShouldHighlight()); |
| 125 |
| 126 ink_drop()->SetShowHighlightOnHover(true); |
| 127 ink_drop()->SetHovered(false); |
| 128 ink_drop()->SetShowHighlightOnFocus(false); |
| 129 ink_drop()->SetFocused(false); |
| 130 EXPECT_FALSE(test_api()->ShouldHighlight()); |
| 131 |
| 132 ink_drop()->SetShowHighlightOnHover(false); |
| 133 ink_drop()->SetHovered(true); |
| 134 ink_drop()->SetShowHighlightOnFocus(false); |
| 135 ink_drop()->SetFocused(false); |
| 136 EXPECT_FALSE(test_api()->ShouldHighlight()); |
| 137 |
| 138 ink_drop()->SetShowHighlightOnHover(false); |
| 139 ink_drop()->SetHovered(false); |
| 140 ink_drop()->SetShowHighlightOnFocus(true); |
| 141 ink_drop()->SetFocused(false); |
| 142 EXPECT_FALSE(test_api()->ShouldHighlight()); |
| 143 |
| 144 ink_drop()->SetShowHighlightOnHover(false); |
| 145 ink_drop()->SetHovered(false); |
| 146 ink_drop()->SetShowHighlightOnFocus(false); |
| 147 ink_drop()->SetFocused(true); |
| 148 EXPECT_FALSE(test_api()->ShouldHighlight()); |
| 149 |
| 150 ink_drop()->SetShowHighlightOnHover(true); |
| 151 ink_drop()->SetHovered(true); |
| 152 ink_drop()->SetShowHighlightOnFocus(false); |
| 153 ink_drop()->SetFocused(false); |
| 154 EXPECT_TRUE(test_api()->ShouldHighlight()); |
| 155 |
| 156 ink_drop()->SetShowHighlightOnHover(false); |
| 157 ink_drop()->SetHovered(false); |
| 158 ink_drop()->SetShowHighlightOnFocus(true); |
| 159 ink_drop()->SetFocused(true); |
| 160 EXPECT_TRUE(test_api()->ShouldHighlight()); |
| 161 |
| 162 test_api()->SetShouldHighlight(false); |
| 163 EXPECT_FALSE(test_api()->ShouldHighlight()); |
| 164 |
| 165 test_api()->SetShouldHighlight(true); |
| 166 EXPECT_TRUE(test_api()->ShouldHighlight()); |
| 109 } | 167 } |
| 110 | 168 |
| 111 TEST_F(InkDropImplTest, | 169 TEST_F(InkDropImplTest, |
| 112 HighlightDoesntFadeInAfterAnimationWhenHostIsNotHovered) { | 170 VerifyInkDropLayersRemovedWhenPresentDuringDestruction) { |
| 113 ink_drop_host_.set_should_show_highlight(false); | 171 test_api()->SetShouldHighlight(true); |
| 114 ink_drop_.SetHovered(true); | 172 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING); |
| 115 ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED); | 173 EXPECT_TRUE(AreLayersAddedToHost()); |
| 116 test_api_.CompleteAnimations(); | 174 DestroyInkDrop(); |
| 117 | 175 EXPECT_FALSE(AreLayersAddedToHost()); |
| 118 EXPECT_TRUE(task_runner_->HasPendingTask()); | |
| 119 | |
| 120 task_runner_->RunPendingTasks(); | |
| 121 | |
| 122 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible()); | |
| 123 } | |
| 124 | |
| 125 TEST_F(InkDropImplTest, HoveredStateNotVisibleOrFadingInAfterAnimateToState) { | |
| 126 ink_drop_host_.set_should_show_highlight(true); | |
| 127 | |
| 128 ink_drop_.SetHovered(true); | |
| 129 test_api_.CompleteAnimations(); | |
| 130 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 131 | |
| 132 ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED); | |
| 133 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible()); | |
| 134 } | |
| 135 | |
| 136 // Verifies that there is not a crash when setting hovered state and the host | |
| 137 // returns null for the highlight. | |
| 138 TEST_F(InkDropImplTest, SetHoveredFalseWorksWhenNoInkDropHighlightExists) { | |
| 139 ink_drop_host_.set_should_show_highlight(false); | |
| 140 ink_drop_.SetHovered(true); | |
| 141 EXPECT_FALSE(test_api_.highlight()); | |
| 142 ink_drop_.SetHovered(false); | |
| 143 EXPECT_FALSE(test_api_.highlight()); | |
| 144 } | |
| 145 | |
| 146 TEST_F(InkDropImplTest, HighlightFadesOutOnSnapToActivated) { | |
| 147 ink_drop_host_.set_should_show_highlight(true); | |
| 148 ink_drop_.SetHovered(true); | |
| 149 test_api_.CompleteAnimations(); | |
| 150 | |
| 151 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 152 | |
| 153 ink_drop_.SnapToActivated(); | |
| 154 | |
| 155 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible()); | |
| 156 } | |
| 157 | |
| 158 TEST_F(InkDropImplTest, LayersRemovedFromHostAfterHighlight) { | |
| 159 ink_drop_host_.set_should_show_highlight(true); | |
| 160 | |
| 161 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 162 | |
| 163 ink_drop_.SetHovered(true); | |
| 164 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 165 | |
| 166 test_api_.CompleteAnimations(); | |
| 167 | |
| 168 ink_drop_.SetHovered(false); | |
| 169 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 170 | |
| 171 test_api_.CompleteAnimations(); | |
| 172 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 173 } | |
| 174 | |
| 175 TEST_F(InkDropImplTest, LayersRemovedFromHostAfterInkDrop) { | |
| 176 ink_drop_host_.set_should_show_highlight(true); | |
| 177 | |
| 178 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 179 | |
| 180 ink_drop_.AnimateToState(InkDropState::ACTION_PENDING); | |
| 181 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 182 | |
| 183 ink_drop_.AnimateToState(InkDropState::HIDDEN); | |
| 184 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 185 | |
| 186 test_api_.CompleteAnimations(); | |
| 187 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 188 } | |
| 189 | |
| 190 TEST_F(InkDropImplTest, LayersAddedToHostWhenHighlightOrInkDropVisible) { | |
| 191 ink_drop_host_.set_should_show_highlight(true); | |
| 192 | |
| 193 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 194 | |
| 195 ink_drop_.SetHovered(true); | |
| 196 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 197 | |
| 198 ink_drop_.AnimateToState(InkDropState::ACTION_PENDING); | |
| 199 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 200 | |
| 201 ink_drop_.AnimateToState(InkDropState::HIDDEN); | |
| 202 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 203 | |
| 204 test_api_.CompleteAnimations(); | |
| 205 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 206 | |
| 207 EXPECT_TRUE(task_runner_->HasPendingTask()); | |
| 208 task_runner_->RunPendingTasks(); | |
| 209 | |
| 210 // Highlight should be fading back in. | |
| 211 EXPECT_TRUE(test_api_.HasActiveAnimations()); | |
| 212 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 213 } | |
| 214 | |
| 215 TEST_F(InkDropImplTest, LayersNotAddedToHostWhenHighlightTimeFires) { | |
| 216 ink_drop_host_.set_should_show_highlight(true); | |
| 217 | |
| 218 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 219 | |
| 220 ink_drop_.SetHovered(true); | |
| 221 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 222 | |
| 223 ink_drop_.AnimateToState(InkDropState::ACTION_PENDING); | |
| 224 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 225 | |
| 226 ink_drop_.AnimateToState(InkDropState::HIDDEN); | |
| 227 test_api_.CompleteAnimations(); | |
| 228 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 229 | |
| 230 ink_drop_host_.set_should_show_highlight(false); | |
| 231 | |
| 232 EXPECT_TRUE(task_runner_->HasPendingTask()); | |
| 233 task_runner_->RunPendingTasks(); | |
| 234 | |
| 235 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 236 } | |
| 237 | |
| 238 TEST_F(InkDropImplTest, LayersArentRemovedWhenPreemptingFadeOut) { | |
| 239 ink_drop_host_.set_should_show_highlight(true); | |
| 240 | |
| 241 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 242 | |
| 243 ink_drop_.SetHovered(true); | |
| 244 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 245 | |
| 246 test_api_.CompleteAnimations(); | |
| 247 | |
| 248 ink_drop_.SetHovered(false); | |
| 249 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 250 | |
| 251 ink_drop_.SetHovered(true); | |
| 252 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 253 } | |
| 254 | |
| 255 TEST_F(InkDropImplTest, AnimationWhenDeactivated) { | |
| 256 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 257 | |
| 258 ink_drop_.AnimateToState(InkDropState::ACTIVATED); | |
| 259 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 260 test_api_.CompleteAnimations(); | |
| 261 | |
| 262 ink_drop_.AnimateToState(InkDropState::DEACTIVATED); | |
| 263 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 264 EXPECT_TRUE(test_api_.HasActiveAnimations()); | |
| 265 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible()); | |
| 266 } | |
| 267 | |
| 268 TEST_F(InkDropImplTest, AnimationSkippedWhenFocusedAndDeactivated) { | |
| 269 ink_drop_host_.set_should_show_highlight(true); | |
| 270 | |
| 271 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 272 | |
| 273 ink_drop_.SetFocused(true); | |
| 274 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 275 | |
| 276 ink_drop_.AnimateToState(InkDropState::ACTIVATED); | |
| 277 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 278 test_api_.CompleteAnimations(); | |
| 279 | |
| 280 ink_drop_.AnimateToState(InkDropState::DEACTIVATED); | |
| 281 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 282 EXPECT_FALSE(test_api_.HasActiveAnimations()); | |
| 283 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 284 EXPECT_EQ(InkDropState::HIDDEN, ink_drop_.GetTargetInkDropState()); | |
| 285 } | |
| 286 | |
| 287 TEST_F(InkDropImplTest, FocusHighlightComesBackImmediatelyAfterAction) { | |
| 288 ink_drop_host_.set_should_show_highlight(true); | |
| 289 | |
| 290 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 291 | |
| 292 ink_drop_.SetFocused(true); | |
| 293 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 294 | |
| 295 ink_drop_.AnimateToState(InkDropState::ACTION_PENDING); | |
| 296 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 297 EXPECT_FALSE(test_api_.IsHighlightFadingInOrVisible()); | |
| 298 | |
| 299 ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED); | |
| 300 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 301 | |
| 302 test_api_.CompleteAnimations(); | |
| 303 | |
| 304 // No delay (unlike in the hover case). | |
| 305 EXPECT_FALSE(task_runner_->HasPendingTask()); | |
| 306 | |
| 307 // Highlight should be back. | |
| 308 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 309 } | |
| 310 | |
| 311 TEST_F(InkDropImplTest, HighlightCanCoexistWithRipple) { | |
| 312 ink_drop_host_.set_should_show_highlight(true); | |
| 313 ink_drop_host_.set_ripple_overrides_highlight(false); | |
| 314 | |
| 315 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 316 | |
| 317 ink_drop_.SetHovered(true); | |
| 318 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 319 | |
| 320 ink_drop_.AnimateToState(InkDropState::ACTION_PENDING); | |
| 321 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 322 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 323 | |
| 324 ink_drop_.AnimateToState(InkDropState::ACTION_TRIGGERED); | |
| 325 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 326 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 327 | |
| 328 test_api_.CompleteAnimations(); | |
| 329 | |
| 330 // Nothing to fade in because the highlight has always been visible. | |
| 331 EXPECT_FALSE(task_runner_->HasPendingTask()); | |
| 332 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 333 | |
| 334 // Now try with the ripple showing before the highlight comes in. | |
| 335 ink_drop_.AnimateToState(InkDropState::HIDDEN); | |
| 336 ink_drop_.SetHovered(false); | |
| 337 test_api_.CompleteAnimations(); | |
| 338 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 339 | |
| 340 ink_drop_.AnimateToState(InkDropState::ACTION_PENDING); | |
| 341 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 342 ink_drop_.SetHovered(true); | |
| 343 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 344 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 345 } | |
| 346 | |
| 347 TEST_F(InkDropImplTest, HighlightCanCoexistWithSnapToActivatedRipple) { | |
| 348 ink_drop_host_.set_should_show_highlight(true); | |
| 349 ink_drop_host_.set_ripple_overrides_highlight(false); | |
| 350 | |
| 351 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 352 | |
| 353 ink_drop_.SetHovered(true); | |
| 354 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 355 | |
| 356 ink_drop_.SnapToActivated(); | |
| 357 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 358 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 359 | |
| 360 // Now try with the ripple showing before the highlight comes in. | |
| 361 ink_drop_.AnimateToState(InkDropState::HIDDEN); | |
| 362 ink_drop_.SetHovered(false); | |
| 363 test_api_.CompleteAnimations(); | |
| 364 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers()); | |
| 365 | |
| 366 ink_drop_.SnapToActivated(); | |
| 367 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 368 ink_drop_.SetHovered(true); | |
| 369 EXPECT_EQ(1, ink_drop_host_.num_ink_drop_layers()); | |
| 370 EXPECT_TRUE(test_api_.IsHighlightFadingInOrVisible()); | |
| 371 } | 176 } |
| 372 | 177 |
| 373 // Test that (re-)hiding or un-hovering a hidden ink drop doesn't add layers. | 178 // Test that (re-)hiding or un-hovering a hidden ink drop doesn't add layers. |
| 374 TEST_F(InkDropImplTest, AlwaysHiddenInkDropHasNoLayers) { | 179 TEST_F(InkDropImplTest, AlwaysHiddenInkDropHasNoLayers) { |
| 375 ink_drop_host_.set_should_show_highlight(true); | 180 EXPECT_FALSE(AreLayersAddedToHost()); |
| 376 | 181 |
| 377 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers_added()); | 182 ink_drop()->AnimateToState(InkDropState::HIDDEN); |
| 378 | 183 EXPECT_FALSE(AreLayersAddedToHost()); |
| 379 ink_drop_.AnimateToState(InkDropState::HIDDEN); | 184 |
| 380 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers_added()); | 185 ink_drop()->SetHovered(false); |
| 381 | 186 EXPECT_FALSE(AreLayersAddedToHost()); |
| 382 ink_drop_.SetHovered(false); | 187 } |
| 383 EXPECT_EQ(0, ink_drop_host_.num_ink_drop_layers_added()); | 188 |
| 189 TEST_F(InkDropImplTest, LayersRemovedFromHostAfterHighlight) { |
| 190 EXPECT_FALSE(AreLayersAddedToHost()); |
| 191 |
| 192 test_api()->SetShouldHighlight(true); |
| 193 EXPECT_TRUE(AreLayersAddedToHost()); |
| 194 |
| 195 test_api()->CompleteAnimations(); |
| 196 |
| 197 test_api()->SetShouldHighlight(false); |
| 198 test_api()->CompleteAnimations(); |
| 199 EXPECT_FALSE(AreLayersAddedToHost()); |
| 200 } |
| 201 |
| 202 TEST_F(InkDropImplTest, LayersRemovedFromHostAfterInkDrop) { |
| 203 EXPECT_FALSE(AreLayersAddedToHost()); |
| 204 |
| 205 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING); |
| 206 EXPECT_TRUE(AreLayersAddedToHost()); |
| 207 |
| 208 test_api()->CompleteAnimations(); |
| 209 |
| 210 ink_drop()->AnimateToState(InkDropState::HIDDEN); |
| 211 EXPECT_TRUE(AreLayersAddedToHost()); |
| 212 |
| 213 test_api()->CompleteAnimations(); |
| 214 EXPECT_FALSE(AreLayersAddedToHost()); |
| 215 } |
| 216 |
| 217 TEST_F(InkDropImplTest, LayersArentRemovedWhenPreemptingFadeOut) { |
| 218 EXPECT_FALSE(AreLayersAddedToHost()); |
| 219 |
| 220 test_api()->SetShouldHighlight(true); |
| 221 EXPECT_TRUE(AreLayersAddedToHost()); |
| 222 |
| 223 test_api()->CompleteAnimations(); |
| 224 |
| 225 ink_drop()->SetHovered(false); |
| 226 EXPECT_TRUE(AreLayersAddedToHost()); |
| 227 |
| 228 ink_drop()->SetHovered(true); |
| 229 EXPECT_TRUE(AreLayersAddedToHost()); |
| 230 } |
| 231 |
| 232 #if DCHECK_IS_ON() |
| 233 TEST_F(InkDropImplTest, SettingHighlightStateDuringStateExitIsntAllowed) { |
| 234 test::InkDropImplTestApi::SetStateOnExitHighlightState::Install( |
| 235 test_api()->state_factory()); |
| 236 ASSERT_DEATH_IF_SUPPORTED( |
| 237 test::InkDropImplTestApi::AccessFactoryOnExitHighlightState::Install( |
| 238 test_api()->state_factory()), |
| 239 ".*HighlightStates should not be changed within a call to " |
| 240 "HighlightState::Exit\\(\\)\\..*"); |
| 241 } |
| 242 #endif |
| 243 |
| 244 // Verifies there is no use after free errors. |
| 245 TEST_F(InkDropImplTest, |
| 246 TearingDownHighlightStateThatAccessesTheStateFactoryIsSafe) { |
| 247 test::InkDropImplTestApi::AccessFactoryOnExitHighlightState::Install( |
| 248 test_api()->state_factory()); |
| 249 test::InkDropImplTestApi::AccessFactoryOnExitHighlightState::Install( |
| 250 test_api()->state_factory()); |
| 251 } |
| 252 |
| 253 //////////////////////////////////////////////////////////////////////////////// |
| 254 // |
| 255 // Common AutoHighlightMode tests |
| 256 // |
| 257 |
| 258 typedef InkDropImplAutoHighlightTest InkDropImplCommonAutoHighlightTest; |
| 259 // Note: First argument is optional and intentionally left blank. |
| 260 // (it's a prefix for the generated test cases) |
| 261 INSTANTIATE_TEST_CASE_P( |
| 262 , |
| 263 InkDropImplCommonAutoHighlightTest, |
| 264 testing::Values(InkDropImpl::AutoHighlightMode::NONE, |
| 265 InkDropImpl::AutoHighlightMode::HIDE_ON_RIPPLE, |
| 266 InkDropImpl::AutoHighlightMode::SHOW_ON_RIPPLE)); |
| 267 |
| 268 // Verifies InkDropImplTestApi::SetShouldHighlight() works as expected. |
| 269 TEST_P(InkDropImplCommonAutoHighlightTest, |
| 270 ShouldHighlightCausesHighlightToBeVisible) { |
| 271 test_api()->SetShouldHighlight(true); |
| 272 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 273 |
| 274 test_api()->SetShouldHighlight(false); |
| 275 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 276 } |
| 277 |
| 278 TEST_P(InkDropImplCommonAutoHighlightTest, |
| 279 HighlightVisibilityForFocusAndHoverStates) { |
| 280 ink_drop()->SetShowHighlightOnHover(true); |
| 281 ink_drop()->SetShowHighlightOnFocus(true); |
| 282 |
| 283 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 284 |
| 285 ink_drop()->SetFocused(true); |
| 286 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 287 |
| 288 ink_drop()->SetHovered(false); |
| 289 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 290 |
| 291 ink_drop()->SetHovered(true); |
| 292 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 293 |
| 294 ink_drop()->SetFocused(false); |
| 295 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 296 |
| 297 ink_drop()->SetHovered(false); |
| 298 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 299 } |
| 300 |
| 301 //////////////////////////////////////////////////////////////////////////////// |
| 302 // |
| 303 // InkDropImpl::AutoHighlightMode::NONE specific tests |
| 304 // |
| 305 |
| 306 typedef InkDropImplAutoHighlightTest InkDropImplNoAutoHighlightTest; |
| 307 // Note: First argument is optional and intentionally left blank. |
| 308 // (it's a prefix for the generated test cases) |
| 309 INSTANTIATE_TEST_CASE_P(, |
| 310 InkDropImplNoAutoHighlightTest, |
| 311 testing::Values(InkDropImpl::AutoHighlightMode::NONE)); |
| 312 |
| 313 TEST_P(InkDropImplNoAutoHighlightTest, VisibleHighlightDuringRippleAnimations) { |
| 314 test_api()->SetShouldHighlight(true); |
| 315 |
| 316 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING); |
| 317 test_api()->CompleteAnimations(); |
| 318 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 319 |
| 320 ink_drop()->AnimateToState(InkDropState::HIDDEN); |
| 321 test_api()->CompleteAnimations(); |
| 322 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 323 } |
| 324 |
| 325 TEST_P(InkDropImplNoAutoHighlightTest, HiddenHighlightDuringRippleAnimations) { |
| 326 test_api()->SetShouldHighlight(false); |
| 327 |
| 328 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING); |
| 329 test_api()->CompleteAnimations(); |
| 330 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 331 |
| 332 ink_drop()->AnimateToState(InkDropState::HIDDEN); |
| 333 test_api()->CompleteAnimations(); |
| 334 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 335 } |
| 336 |
| 337 //////////////////////////////////////////////////////////////////////////////// |
| 338 // |
| 339 // InkDropImpl::AutoHighlightMode::HIDE_ON_RIPPLE specific tests |
| 340 // |
| 341 |
| 342 typedef InkDropImplAutoHighlightTest InkDropImplHideAutoHighlightTest; |
| 343 // Note: First argument is optional and intentionally left blank. |
| 344 // (it's a prefix for the generated test cases) |
| 345 INSTANTIATE_TEST_CASE_P( |
| 346 , |
| 347 InkDropImplHideAutoHighlightTest, |
| 348 testing::Values(InkDropImpl::AutoHighlightMode::HIDE_ON_RIPPLE)); |
| 349 |
| 350 TEST_P(InkDropImplHideAutoHighlightTest, |
| 351 VisibleHighlightDuringRippleAnimations) { |
| 352 test_api()->SetShouldHighlight(true); |
| 353 |
| 354 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING); |
| 355 test_api()->CompleteAnimations(); |
| 356 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 357 |
| 358 ink_drop()->AnimateToState(InkDropState::HIDDEN); |
| 359 test_api()->CompleteAnimations(); |
| 360 RunPendingTasks(); |
| 361 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 362 } |
| 363 |
| 364 TEST_P(InkDropImplHideAutoHighlightTest, |
| 365 HiddenHighlightDuringRippleAnimations) { |
| 366 test_api()->SetShouldHighlight(false); |
| 367 |
| 368 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING); |
| 369 test_api()->CompleteAnimations(); |
| 370 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 371 |
| 372 ink_drop()->AnimateToState(InkDropState::HIDDEN); |
| 373 test_api()->CompleteAnimations(); |
| 374 RunPendingTasks(); |
| 375 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 376 } |
| 377 |
| 378 TEST_P(InkDropImplHideAutoHighlightTest, HighlightIsHiddenOnSnapToActivated) { |
| 379 test_api()->SetShouldHighlight(true); |
| 380 |
| 381 ink_drop()->SnapToActivated(); |
| 382 test_api()->CompleteAnimations(); |
| 383 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 384 |
| 385 ink_drop()->AnimateToState(InkDropState::HIDDEN); |
| 386 test_api()->CompleteAnimations(); |
| 387 RunPendingTasks(); |
| 388 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 389 } |
| 390 |
| 391 TEST_P(InkDropImplHideAutoHighlightTest, |
| 392 HighlightDoesntFadeInAfterAnimationIfHighlightNotSet) { |
| 393 test_api()->SetShouldHighlight(true); |
| 394 |
| 395 ink_drop()->AnimateToState(InkDropState::ACTION_TRIGGERED); |
| 396 test_api()->CompleteAnimations(); |
| 397 test_api()->SetShouldHighlight(false); |
| 398 ink_drop()->AnimateToState(InkDropState::HIDDEN); |
| 399 test_api()->CompleteAnimations(); |
| 400 RunPendingTasks(); |
| 401 |
| 402 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 403 } |
| 404 |
| 405 TEST_P(InkDropImplHideAutoHighlightTest, |
| 406 HighlightFadesInAfterAnimationIfHovered) { |
| 407 ink_drop()->SetShowHighlightOnHover(true); |
| 408 ink_drop()->SetHovered(true); |
| 409 |
| 410 ink_drop()->AnimateToState(InkDropState::ACTION_TRIGGERED); |
| 411 test_api()->CompleteAnimations(); |
| 412 ink_drop()->AnimateToState(InkDropState::HIDDEN); |
| 413 test_api()->CompleteAnimations(); |
| 414 |
| 415 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 416 EXPECT_TRUE(task_runner_->HasPendingTask()); |
| 417 |
| 418 RunPendingTasks(); |
| 419 |
| 420 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 421 } |
| 422 |
| 423 TEST_P(InkDropImplHideAutoHighlightTest, |
| 424 HighlightSnapsInAfterAnimationWhenHostIsFocused) { |
| 425 ink_drop()->SetShowHighlightOnFocus(true); |
| 426 ink_drop()->SetFocused(true); |
| 427 |
| 428 ink_drop()->AnimateToState(InkDropState::ACTION_TRIGGERED); |
| 429 test_api()->CompleteAnimations(); |
| 430 ink_drop()->AnimateToState(InkDropState::HIDDEN); |
| 431 test_api()->CompleteAnimations(); |
| 432 |
| 433 EXPECT_FALSE(task_runner_->HasPendingTask()); |
| 434 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 435 } |
| 436 |
| 437 TEST_P(InkDropImplHideAutoHighlightTest, DeactivatedAnimatesWhenNotFocused) { |
| 438 test_api()->SetShouldHighlight(false); |
| 439 |
| 440 ink_drop()->AnimateToState(InkDropState::ACTIVATED); |
| 441 test_api()->CompleteAnimations(); |
| 442 |
| 443 ink_drop()->AnimateToState(InkDropState::DEACTIVATED); |
| 444 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 445 EXPECT_TRUE(test_api()->HasActiveAnimations()); |
| 446 } |
| 447 |
| 448 TEST_P(InkDropImplHideAutoHighlightTest, |
| 449 DeactivatedAnimationSkippedWhenFocused) { |
| 450 ink_drop()->SetShowHighlightOnFocus(true); |
| 451 ink_drop()->SetFocused(true); |
| 452 |
| 453 ink_drop()->AnimateToState(InkDropState::ACTIVATED); |
| 454 test_api()->CompleteAnimations(); |
| 455 |
| 456 ink_drop()->AnimateToState(InkDropState::DEACTIVATED); |
| 457 EXPECT_TRUE(AreLayersAddedToHost()); |
| 458 |
| 459 test_api()->CompleteAnimations(); |
| 460 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 461 EXPECT_EQ(InkDropState::HIDDEN, ink_drop()->GetTargetInkDropState()); |
| 462 } |
| 463 |
| 464 TEST_P(InkDropImplHideAutoHighlightTest, |
| 465 FocusAndHoverChangesDontShowHighlightWhenRippleIsVisible) { |
| 466 test_api()->SetShouldHighlight(true); |
| 467 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING); |
| 468 test_api()->CompleteAnimations(); |
| 469 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 470 |
| 471 ink_drop()->SetHovered(false); |
| 472 ink_drop()->SetFocused(false); |
| 473 |
| 474 ink_drop()->SetHovered(true); |
| 475 ink_drop()->SetFocused(true); |
| 476 |
| 477 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 478 EXPECT_TRUE(test_api()->ShouldHighlight()); |
| 479 } |
| 480 |
| 481 //////////////////////////////////////////////////////////////////////////////// |
| 482 // |
| 483 // InkDropImpl::AutoHighlightMode::SHOW_ON_RIPPLE specific tests |
| 484 // |
| 485 |
| 486 typedef InkDropImplAutoHighlightTest InkDropImplShowAutoHighlightTest; |
| 487 // Note: First argument is optional and intentionally left blank. |
| 488 // (it's a prefix for the generated test cases) |
| 489 INSTANTIATE_TEST_CASE_P( |
| 490 , |
| 491 InkDropImplShowAutoHighlightTest, |
| 492 testing::Values(InkDropImpl::AutoHighlightMode::SHOW_ON_RIPPLE)); |
| 493 |
| 494 TEST_P(InkDropImplShowAutoHighlightTest, |
| 495 VisibleHighlightDuringRippleAnimations) { |
| 496 test_api()->SetShouldHighlight(true); |
| 497 |
| 498 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING); |
| 499 test_api()->CompleteAnimations(); |
| 500 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 501 |
| 502 ink_drop()->AnimateToState(InkDropState::HIDDEN); |
| 503 test_api()->CompleteAnimations(); |
| 504 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 505 } |
| 506 |
| 507 TEST_P(InkDropImplShowAutoHighlightTest, |
| 508 HiddenHighlightDuringRippleAnimations) { |
| 509 test_api()->SetShouldHighlight(false); |
| 510 |
| 511 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING); |
| 512 test_api()->CompleteAnimations(); |
| 513 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 514 |
| 515 ink_drop()->AnimateToState(InkDropState::HIDDEN); |
| 516 test_api()->CompleteAnimations(); |
| 517 EXPECT_FALSE(test_api()->IsHighlightFadingInOrVisible()); |
| 518 } |
| 519 |
| 520 TEST_P(InkDropImplShowAutoHighlightTest, |
| 521 FocusAndHoverChangesDontHideHighlightWhenRippleIsVisible) { |
| 522 test_api()->SetShouldHighlight(true); |
| 523 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING); |
| 524 test_api()->CompleteAnimations(); |
| 525 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 526 |
| 527 ink_drop()->SetHovered(false); |
| 528 ink_drop()->SetFocused(false); |
| 529 |
| 530 EXPECT_TRUE(test_api()->IsHighlightFadingInOrVisible()); |
| 531 EXPECT_FALSE(test_api()->ShouldHighlight()); |
| 384 } | 532 } |
| 385 | 533 |
| 386 } // namespace views | 534 } // namespace views |
| OLD | NEW |