| OLD | NEW |
| (Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "ui/views/animation/ink_drop_ripple.h" |
| 6 |
| 7 #include <memory> |
| 8 |
| 9 #include "base/macros.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "ui/gfx/geometry/size.h" |
| 12 #include "ui/views/animation/flood_fill_ink_drop_ripple.h" |
| 13 #include "ui/views/animation/ink_drop_ripple_observer.h" |
| 14 #include "ui/views/animation/ink_drop_state.h" |
| 15 #include "ui/views/animation/square_ink_drop_ripple.h" |
| 16 #include "ui/views/animation/test/flood_fill_ink_drop_ripple_test_api.h" |
| 17 #include "ui/views/animation/test/ink_drop_ripple_test_api.h" |
| 18 #include "ui/views/animation/test/square_ink_drop_ripple_test_api.h" |
| 19 #include "ui/views/animation/test/test_ink_drop_ripple_observer.h" |
| 20 |
| 21 namespace views { |
| 22 namespace test { |
| 23 |
| 24 // Represents all the derivatives of the InkDropRipple class. To be used with |
| 25 // the InkDropRippleTest fixture to test all derviatives. |
| 26 enum InkDropRippleTestTypes { |
| 27 SQUARE_INK_DROP_RIPPLE, |
| 28 FLOOD_FILL_INK_DROP_RIPPLE |
| 29 }; |
| 30 |
| 31 // Test fixture for all InkDropRipple class derivatives. |
| 32 // |
| 33 // To add a new derivative: |
| 34 // 1. Add a value to the InkDropRippleTestTypes enum. |
| 35 // 2. Implement set up and tear down code for the new enum value in |
| 36 // InkDropRippleTest() and |
| 37 // ~InkDropRippleTest(). |
| 38 // 3. Add the new enum value to the INSTANTIATE_TEST_CASE_P) Values list. |
| 39 class InkDropRippleTest |
| 40 : public testing::TestWithParam<InkDropRippleTestTypes> { |
| 41 public: |
| 42 InkDropRippleTest(); |
| 43 ~InkDropRippleTest() override; |
| 44 |
| 45 protected: |
| 46 TestInkDropRippleObserver observer_; |
| 47 |
| 48 std::unique_ptr<InkDropRipple> ink_drop_ripple_; |
| 49 |
| 50 std::unique_ptr<InkDropRippleTestApi> test_api_; |
| 51 |
| 52 private: |
| 53 DISALLOW_COPY_AND_ASSIGN(InkDropRippleTest); |
| 54 }; |
| 55 |
| 56 InkDropRippleTest::InkDropRippleTest() { |
| 57 switch (GetParam()) { |
| 58 case SQUARE_INK_DROP_RIPPLE: { |
| 59 SquareInkDropRipple* square_ink_drop_ripple = |
| 60 new SquareInkDropRipple(gfx::Size(10, 10), 2, gfx::Size(8, 8), 1, |
| 61 gfx::Point(), SK_ColorBLACK); |
| 62 ink_drop_ripple_.reset(square_ink_drop_ripple); |
| 63 test_api_.reset(new SquareInkDropRippleTestApi(square_ink_drop_ripple)); |
| 64 break; |
| 65 } |
| 66 case FLOOD_FILL_INK_DROP_RIPPLE: { |
| 67 FloodFillInkDropRipple* flood_fill_ink_drop_ripple = |
| 68 new FloodFillInkDropRipple(gfx::Rect(0, 0, 10, 10), gfx::Point(), |
| 69 SK_ColorBLACK); |
| 70 ink_drop_ripple_.reset(flood_fill_ink_drop_ripple); |
| 71 test_api_.reset( |
| 72 new FloodFillInkDropRippleTestApi(flood_fill_ink_drop_ripple)); |
| 73 break; |
| 74 } |
| 75 } |
| 76 ink_drop_ripple_->set_observer(&observer_); |
| 77 observer_.set_ink_drop_ripple(ink_drop_ripple_.get()); |
| 78 test_api_->SetDisableAnimationTimers(true); |
| 79 } |
| 80 |
| 81 InkDropRippleTest::~InkDropRippleTest() {} |
| 82 |
| 83 // Note: First argument is optional and intentionally left blank. |
| 84 // (it's a prefix for the generated test cases) |
| 85 INSTANTIATE_TEST_CASE_P(, |
| 86 InkDropRippleTest, |
| 87 testing::Values(SQUARE_INK_DROP_RIPPLE, |
| 88 FLOOD_FILL_INK_DROP_RIPPLE)); |
| 89 |
| 90 TEST_P(InkDropRippleTest, InitialStateAfterConstruction) { |
| 91 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 92 ink_drop_ripple_->target_ink_drop_state()); |
| 93 } |
| 94 |
| 95 // Verify no animations are used when animating from HIDDEN to HIDDEN. |
| 96 TEST_P(InkDropRippleTest, AnimateToHiddenFromInvisibleState) { |
| 97 EXPECT_EQ(InkDropState::HIDDEN, ink_drop_ripple_->target_ink_drop_state()); |
| 98 |
| 99 ink_drop_ripple_->AnimateToState(InkDropState::HIDDEN); |
| 100 EXPECT_EQ(1, observer_.last_animation_started_ordinal()); |
| 101 EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); |
| 102 EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity()); |
| 103 EXPECT_FALSE(ink_drop_ripple_->IsVisible()); |
| 104 } |
| 105 |
| 106 TEST_P(InkDropRippleTest, AnimateToHiddenFromVisibleState) { |
| 107 ink_drop_ripple_->AnimateToState(InkDropState::ACTION_PENDING); |
| 108 test_api_->CompleteAnimations(); |
| 109 EXPECT_EQ(1, observer_.last_animation_started_ordinal()); |
| 110 EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); |
| 111 |
| 112 EXPECT_NE(InkDropState::HIDDEN, ink_drop_ripple_->target_ink_drop_state()); |
| 113 |
| 114 ink_drop_ripple_->AnimateToState(InkDropState::HIDDEN); |
| 115 test_api_->CompleteAnimations(); |
| 116 |
| 117 EXPECT_EQ(3, observer_.last_animation_started_ordinal()); |
| 118 EXPECT_EQ(4, observer_.last_animation_ended_ordinal()); |
| 119 EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity()); |
| 120 } |
| 121 |
| 122 TEST_P(InkDropRippleTest, ActionPendingOpacity) { |
| 123 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 124 test_api_->CompleteAnimations(); |
| 125 |
| 126 EXPECT_EQ(InkDropRipple::kVisibleOpacity, test_api_->GetCurrentOpacity()); |
| 127 } |
| 128 |
| 129 TEST_P(InkDropRippleTest, QuickActionOpacity) { |
| 130 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 131 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_TRIGGERED); |
| 132 test_api_->CompleteAnimations(); |
| 133 |
| 134 EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity()); |
| 135 } |
| 136 |
| 137 TEST_P(InkDropRippleTest, SlowActionPendingOpacity) { |
| 138 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 139 ink_drop_ripple_->AnimateToState( |
| 140 views::InkDropState::ALTERNATE_ACTION_PENDING); |
| 141 test_api_->CompleteAnimations(); |
| 142 |
| 143 EXPECT_EQ(InkDropRipple::kVisibleOpacity, test_api_->GetCurrentOpacity()); |
| 144 } |
| 145 |
| 146 TEST_P(InkDropRippleTest, SlowActionOpacity) { |
| 147 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 148 ink_drop_ripple_->AnimateToState( |
| 149 views::InkDropState::ALTERNATE_ACTION_PENDING); |
| 150 ink_drop_ripple_->AnimateToState( |
| 151 views::InkDropState::ALTERNATE_ACTION_TRIGGERED); |
| 152 test_api_->CompleteAnimations(); |
| 153 |
| 154 EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity()); |
| 155 } |
| 156 |
| 157 TEST_P(InkDropRippleTest, ActivatedOpacity) { |
| 158 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTIVATED); |
| 159 test_api_->CompleteAnimations(); |
| 160 |
| 161 EXPECT_EQ(InkDropRipple::kVisibleOpacity, test_api_->GetCurrentOpacity()); |
| 162 } |
| 163 |
| 164 TEST_P(InkDropRippleTest, DeactivatedOpacity) { |
| 165 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTIVATED); |
| 166 ink_drop_ripple_->AnimateToState(views::InkDropState::DEACTIVATED); |
| 167 test_api_->CompleteAnimations(); |
| 168 |
| 169 EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity()); |
| 170 } |
| 171 |
| 172 // Verify animations are aborted during deletion and the |
| 173 // InkDropRippleObservers are notified. |
| 174 TEST_P(InkDropRippleTest, AnimationsAbortedDuringDeletion) { |
| 175 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 176 ink_drop_ripple_.reset(); |
| 177 EXPECT_EQ(1, observer_.last_animation_started_ordinal()); |
| 178 EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); |
| 179 EXPECT_EQ(views::InkDropState::ACTION_PENDING, |
| 180 observer_.last_animation_ended_context()); |
| 181 EXPECT_EQ(InkDropAnimationEndedReason::PRE_EMPTED, |
| 182 observer_.last_animation_ended_reason()); |
| 183 } |
| 184 |
| 185 TEST_P(InkDropRippleTest, VerifyObserversAreNotified) { |
| 186 ink_drop_ripple_->AnimateToState(InkDropState::ACTION_PENDING); |
| 187 |
| 188 EXPECT_TRUE(test_api_->HasActiveAnimations()); |
| 189 EXPECT_EQ(1, observer_.last_animation_started_ordinal()); |
| 190 EXPECT_TRUE(observer_.AnimationHasNotEnded()); |
| 191 EXPECT_EQ(InkDropState::ACTION_PENDING, |
| 192 observer_.last_animation_started_context()); |
| 193 |
| 194 test_api_->CompleteAnimations(); |
| 195 |
| 196 EXPECT_FALSE(test_api_->HasActiveAnimations()); |
| 197 EXPECT_EQ(1, observer_.last_animation_started_ordinal()); |
| 198 EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); |
| 199 EXPECT_EQ(InkDropState::ACTION_PENDING, |
| 200 observer_.last_animation_ended_context()); |
| 201 } |
| 202 |
| 203 TEST_P(InkDropRippleTest, VerifyObserversAreNotifiedOfSuccessfulAnimations) { |
| 204 ink_drop_ripple_->AnimateToState(InkDropState::ACTION_PENDING); |
| 205 test_api_->CompleteAnimations(); |
| 206 |
| 207 EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); |
| 208 EXPECT_EQ(InkDropAnimationEndedReason::SUCCESS, |
| 209 observer_.last_animation_ended_reason()); |
| 210 } |
| 211 |
| 212 TEST_P(InkDropRippleTest, VerifyObserversAreNotifiedOfPreemptedAnimations) { |
| 213 ink_drop_ripple_->AnimateToState(InkDropState::ACTION_PENDING); |
| 214 ink_drop_ripple_->AnimateToState(InkDropState::ALTERNATE_ACTION_PENDING); |
| 215 |
| 216 EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); |
| 217 EXPECT_EQ(InkDropAnimationEndedReason::PRE_EMPTED, |
| 218 observer_.last_animation_ended_reason()); |
| 219 } |
| 220 |
| 221 TEST_P(InkDropRippleTest, InkDropStatesPersistWhenCallingAnimateToState) { |
| 222 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 223 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTIVATED); |
| 224 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 225 ink_drop_ripple_->target_ink_drop_state()); |
| 226 } |
| 227 |
| 228 TEST_P(InkDropRippleTest, HideImmediatelyWithoutActiveAnimations) { |
| 229 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 230 test_api_->CompleteAnimations(); |
| 231 EXPECT_EQ(1, observer_.last_animation_started_ordinal()); |
| 232 EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); |
| 233 |
| 234 EXPECT_FALSE(test_api_->HasActiveAnimations()); |
| 235 EXPECT_NE(InkDropState::HIDDEN, ink_drop_ripple_->target_ink_drop_state()); |
| 236 |
| 237 ink_drop_ripple_->HideImmediately(); |
| 238 |
| 239 EXPECT_FALSE(test_api_->HasActiveAnimations()); |
| 240 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 241 ink_drop_ripple_->target_ink_drop_state()); |
| 242 EXPECT_EQ(1, observer_.last_animation_started_ordinal()); |
| 243 EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); |
| 244 |
| 245 EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity()); |
| 246 EXPECT_FALSE(ink_drop_ripple_->IsVisible()); |
| 247 } |
| 248 |
| 249 // Verifies all active animations are aborted and the InkDropState is set to |
| 250 // HIDDEN after invoking HideImmediately(). |
| 251 TEST_P(InkDropRippleTest, HideImmediatelyWithActiveAnimations) { |
| 252 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 253 EXPECT_TRUE(test_api_->HasActiveAnimations()); |
| 254 EXPECT_NE(InkDropState::HIDDEN, ink_drop_ripple_->target_ink_drop_state()); |
| 255 EXPECT_EQ(1, observer_.last_animation_started_ordinal()); |
| 256 |
| 257 ink_drop_ripple_->HideImmediately(); |
| 258 |
| 259 EXPECT_FALSE(test_api_->HasActiveAnimations()); |
| 260 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 261 ink_drop_ripple_->target_ink_drop_state()); |
| 262 EXPECT_EQ(1, observer_.last_animation_started_ordinal()); |
| 263 EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); |
| 264 EXPECT_EQ(InkDropState::ACTION_PENDING, |
| 265 observer_.last_animation_ended_context()); |
| 266 EXPECT_EQ(InkDropAnimationEndedReason::PRE_EMPTED, |
| 267 observer_.last_animation_ended_reason()); |
| 268 |
| 269 EXPECT_EQ(InkDropRipple::kHiddenOpacity, test_api_->GetCurrentOpacity()); |
| 270 EXPECT_FALSE(ink_drop_ripple_->IsVisible()); |
| 271 } |
| 272 |
| 273 TEST_P(InkDropRippleTest, SnapToActivatedWithoutActiveAnimations) { |
| 274 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 275 test_api_->CompleteAnimations(); |
| 276 EXPECT_EQ(1, observer_.last_animation_started_ordinal()); |
| 277 EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); |
| 278 |
| 279 EXPECT_FALSE(test_api_->HasActiveAnimations()); |
| 280 EXPECT_NE(InkDropState::ACTIVATED, ink_drop_ripple_->target_ink_drop_state()); |
| 281 |
| 282 ink_drop_ripple_->SnapToActivated(); |
| 283 |
| 284 EXPECT_FALSE(test_api_->HasActiveAnimations()); |
| 285 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 286 ink_drop_ripple_->target_ink_drop_state()); |
| 287 EXPECT_EQ(3, observer_.last_animation_started_ordinal()); |
| 288 EXPECT_EQ(4, observer_.last_animation_ended_ordinal()); |
| 289 |
| 290 EXPECT_EQ(InkDropRipple::kVisibleOpacity, test_api_->GetCurrentOpacity()); |
| 291 EXPECT_TRUE(ink_drop_ripple_->IsVisible()); |
| 292 } |
| 293 |
| 294 // Verifies all active animations are aborted and the InkDropState is set to |
| 295 // ACTIVATED after invoking SnapToActivated(). |
| 296 TEST_P(InkDropRippleTest, SnapToActivatedWithActiveAnimations) { |
| 297 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 298 EXPECT_TRUE(test_api_->HasActiveAnimations()); |
| 299 EXPECT_NE(InkDropState::ACTIVATED, ink_drop_ripple_->target_ink_drop_state()); |
| 300 EXPECT_EQ(1, observer_.last_animation_started_ordinal()); |
| 301 |
| 302 ink_drop_ripple_->SnapToActivated(); |
| 303 |
| 304 EXPECT_FALSE(test_api_->HasActiveAnimations()); |
| 305 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 306 ink_drop_ripple_->target_ink_drop_state()); |
| 307 EXPECT_EQ(3, observer_.last_animation_started_ordinal()); |
| 308 EXPECT_EQ(4, observer_.last_animation_ended_ordinal()); |
| 309 EXPECT_EQ(InkDropState::ACTIVATED, observer_.last_animation_ended_context()); |
| 310 EXPECT_EQ(InkDropAnimationEndedReason::SUCCESS, |
| 311 observer_.last_animation_ended_reason()); |
| 312 |
| 313 EXPECT_EQ(InkDropRipple::kVisibleOpacity, test_api_->GetCurrentOpacity()); |
| 314 EXPECT_TRUE(ink_drop_ripple_->IsVisible()); |
| 315 } |
| 316 |
| 317 TEST_P(InkDropRippleTest, AnimateToVisibleFromHidden) { |
| 318 EXPECT_EQ(InkDropState::HIDDEN, ink_drop_ripple_->target_ink_drop_state()); |
| 319 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 320 EXPECT_TRUE(ink_drop_ripple_->IsVisible()); |
| 321 } |
| 322 |
| 323 // Verifies that the value of InkDropRipple::target_ink_drop_state() returns |
| 324 // the most recent value passed to AnimateToState() when notifying observers |
| 325 // that an animation has started within the AnimateToState() function call. |
| 326 TEST_P(InkDropRippleTest, TargetInkDropStateOnAnimationStarted) { |
| 327 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 328 ink_drop_ripple_->AnimateToState(views::InkDropState::HIDDEN); |
| 329 |
| 330 EXPECT_EQ(3, observer_.last_animation_started_ordinal()); |
| 331 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 332 observer_.target_state_at_last_animation_started()); |
| 333 } |
| 334 |
| 335 // Verifies that the value of InkDropRipple::target_ink_drop_state() returns |
| 336 // the most recent value passed to AnimateToState() when notifying observers |
| 337 // that an animation has ended within the AnimateToState() function call. |
| 338 TEST_P(InkDropRippleTest, TargetInkDropStateOnAnimationEnded) { |
| 339 ink_drop_ripple_->AnimateToState(views::InkDropState::ACTION_PENDING); |
| 340 ink_drop_ripple_->AnimateToState(views::InkDropState::HIDDEN); |
| 341 |
| 342 EXPECT_EQ(2, observer_.last_animation_ended_ordinal()); |
| 343 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 344 observer_.target_state_at_last_animation_ended()); |
| 345 } |
| 346 |
| 347 } // namespace test |
| 348 } // namespace views |
| OLD | NEW |