1 /* 2 * Copyright (c) 2013, Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "core/animation/AnimationNode.h" 33 34 #include <gtest/gtest.h> 35 36 using namespace blink; 37 38 namespace { 39 40 class TestAnimationNodeEventDelegate : public AnimationNode::EventDelegate { 41 public: 42 virtual void onEventCondition(const AnimationNode* animationNode) OVERRIDE 43 { 44 m_eventTriggered = true; 45 46 } 47 void reset() 48 { 49 m_eventTriggered = false; 50 } 51 bool eventTriggered() { return m_eventTriggered; } 52 53 private: 54 bool m_eventTriggered; 55 }; 56 57 class TestAnimationNode : public AnimationNode { 58 public: 59 static PassRefPtrWillBeRawPtr<TestAnimationNode> create(const Timing& specified) 60 { 61 return adoptRefWillBeNoop(new TestAnimationNode(specified, new TestAnimationNodeEventDelegate())); 62 } 63 64 void updateInheritedTime(double time) 65 { 66 updateInheritedTime(time, TimingUpdateForAnimationFrame); 67 } 68 69 void updateInheritedTime(double time, TimingUpdateReason reason) 70 { 71 m_eventDelegate->reset(); 72 AnimationNode::updateInheritedTime(time, reason); 73 } 74 75 virtual void updateChildrenAndEffects() const OVERRIDE { } 76 void willDetach() { } 77 TestAnimationNodeEventDelegate* eventDelegate() { return m_eventDelegate.get(); } 78 virtual double calculateTimeToEffectChange(bool forwards, double localTime, double timeToNextIteration) const OVERRIDE 79 { 80 m_localTime = localTime; 81 m_timeToNextIteration = timeToNextIteration; 82 return -1; 83 } 84 double takeLocalTime() 85 { 86 const double result = m_localTime; 87 m_localTime = nullValue(); 88 return result; 89 } 90 91 double takeTimeToNextIteration() 92 { 93 const double result = m_timeToNextIteration; 94 m_timeToNextIteration = nullValue(); 95 return result; 96 } 97 98 virtual void trace(Visitor* visitor) OVERRIDE 99 { 100 visitor->trace(m_eventDelegate); 101 AnimationNode::trace(visitor); 102 } 103 104 private: 105 TestAnimationNode(const Timing& specified, TestAnimationNodeEventDelegate* eventDelegate) 106 : AnimationNode(specified, adoptPtrWillBeNoop(eventDelegate)) 107 , m_eventDelegate(eventDelegate) 108 { 109 } 110 111 RawPtrWillBeMember<TestAnimationNodeEventDelegate> m_eventDelegate; 112 mutable double m_localTime; 113 mutable double m_timeToNextIteration; 114 }; 115 116 TEST(AnimationAnimationNodeTest, Sanity) 117 { 118 Timing timing; 119 timing.iterationDuration = 2; 120 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 121 122 EXPECT_EQ(0, animationNode->startTime()); 123 124 animationNode->updateInheritedTime(0); 125 126 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 127 EXPECT_TRUE(animationNode->isInPlay()); 128 EXPECT_TRUE(animationNode->isCurrent()); 129 EXPECT_TRUE(animationNode->isInEffect()); 130 EXPECT_EQ(0, animationNode->currentIteration()); 131 EXPECT_EQ(0, animationNode->startTime()); 132 EXPECT_EQ(2, animationNode->activeDurationInternal()); 133 EXPECT_EQ(0, animationNode->timeFraction()); 134 135 animationNode->updateInheritedTime(1); 136 137 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 138 EXPECT_TRUE(animationNode->isInPlay()); 139 EXPECT_TRUE(animationNode->isCurrent()); 140 EXPECT_TRUE(animationNode->isInEffect()); 141 EXPECT_EQ(0, animationNode->currentIteration()); 142 EXPECT_EQ(0, animationNode->startTime()); 143 EXPECT_EQ(2, animationNode->activeDurationInternal()); 144 EXPECT_EQ(0.5, animationNode->timeFraction()); 145 146 animationNode->updateInheritedTime(2); 147 148 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 149 EXPECT_FALSE(animationNode->isInPlay()); 150 EXPECT_FALSE(animationNode->isCurrent()); 151 EXPECT_TRUE(animationNode->isInEffect()); 152 EXPECT_EQ(0, animationNode->currentIteration()); 153 EXPECT_EQ(0, animationNode->startTime()); 154 EXPECT_EQ(2, animationNode->activeDurationInternal()); 155 EXPECT_EQ(1, animationNode->timeFraction()); 156 157 animationNode->updateInheritedTime(3); 158 159 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 160 EXPECT_FALSE(animationNode->isInPlay()); 161 EXPECT_FALSE(animationNode->isCurrent()); 162 EXPECT_TRUE(animationNode->isInEffect()); 163 EXPECT_EQ(0, animationNode->currentIteration()); 164 EXPECT_EQ(0, animationNode->startTime()); 165 EXPECT_EQ(2, animationNode->activeDurationInternal()); 166 EXPECT_EQ(1, animationNode->timeFraction()); 167 } 168 169 TEST(AnimationAnimationNodeTest, FillAuto) 170 { 171 Timing timing; 172 timing.iterationDuration = 1; 173 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 174 175 animationNode->updateInheritedTime(-1); 176 EXPECT_EQ(0, animationNode->timeFraction()); 177 178 animationNode->updateInheritedTime(2); 179 EXPECT_EQ(1, animationNode->timeFraction()); 180 } 181 182 TEST(AnimationAnimationNodeTest, FillForwards) 183 { 184 Timing timing; 185 timing.iterationDuration = 1; 186 timing.fillMode = Timing::FillModeForwards; 187 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 188 189 animationNode->updateInheritedTime(-1); 190 EXPECT_TRUE(isNull(animationNode->timeFraction())); 191 192 animationNode->updateInheritedTime(2); 193 EXPECT_EQ(1, animationNode->timeFraction()); 194 } 195 196 TEST(AnimationAnimationNodeTest, FillBackwards) 197 { 198 Timing timing; 199 timing.iterationDuration = 1; 200 timing.fillMode = Timing::FillModeBackwards; 201 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 202 203 animationNode->updateInheritedTime(-1); 204 EXPECT_EQ(0, animationNode->timeFraction()); 205 206 animationNode->updateInheritedTime(2); 207 EXPECT_TRUE(isNull(animationNode->timeFraction())); 208 } 209 210 TEST(AnimationAnimationNodeTest, FillBoth) 211 { 212 Timing timing; 213 timing.iterationDuration = 1; 214 timing.fillMode = Timing::FillModeBoth; 215 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 216 217 animationNode->updateInheritedTime(-1); 218 EXPECT_EQ(0, animationNode->timeFraction()); 219 220 animationNode->updateInheritedTime(2); 221 EXPECT_EQ(1, animationNode->timeFraction()); 222 } 223 224 TEST(AnimationAnimationNodeTest, StartDelay) 225 { 226 Timing timing; 227 timing.iterationDuration = 1; 228 timing.fillMode = Timing::FillModeForwards; 229 timing.startDelay = 0.5; 230 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 231 232 animationNode->updateInheritedTime(0); 233 EXPECT_TRUE(isNull(animationNode->timeFraction())); 234 235 animationNode->updateInheritedTime(0.5); 236 EXPECT_EQ(0, animationNode->timeFraction()); 237 238 animationNode->updateInheritedTime(1.5); 239 EXPECT_EQ(1, animationNode->timeFraction()); 240 } 241 242 TEST(AnimationAnimationNodeTest, ZeroIteration) 243 { 244 Timing timing; 245 timing.iterationDuration = 1; 246 timing.fillMode = Timing::FillModeForwards; 247 timing.iterationCount = 0; 248 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 249 250 animationNode->updateInheritedTime(-1); 251 EXPECT_EQ(0, animationNode->activeDurationInternal()); 252 EXPECT_TRUE(isNull(animationNode->currentIteration())); 253 EXPECT_TRUE(isNull(animationNode->timeFraction())); 254 255 animationNode->updateInheritedTime(0); 256 EXPECT_EQ(0, animationNode->activeDurationInternal()); 257 EXPECT_EQ(0, animationNode->currentIteration()); 258 EXPECT_EQ(0, animationNode->timeFraction()); 259 } 260 261 TEST(AnimationAnimationNodeTest, InfiniteIteration) 262 { 263 Timing timing; 264 timing.iterationDuration = 1; 265 timing.fillMode = Timing::FillModeForwards; 266 timing.iterationCount = std::numeric_limits<double>::infinity(); 267 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 268 269 animationNode->updateInheritedTime(-1); 270 EXPECT_TRUE(isNull(animationNode->currentIteration())); 271 EXPECT_TRUE(isNull(animationNode->timeFraction())); 272 273 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 274 275 animationNode->updateInheritedTime(0); 276 EXPECT_EQ(0, animationNode->currentIteration()); 277 EXPECT_EQ(0, animationNode->timeFraction()); 278 } 279 280 TEST(AnimationAnimationNodeTest, Iteration) 281 { 282 Timing timing; 283 timing.iterationCount = 2; 284 timing.iterationDuration = 2; 285 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 286 287 animationNode->updateInheritedTime(0); 288 EXPECT_EQ(0, animationNode->currentIteration()); 289 EXPECT_EQ(0, animationNode->timeFraction()); 290 291 animationNode->updateInheritedTime(1); 292 EXPECT_EQ(0, animationNode->currentIteration()); 293 EXPECT_EQ(0.5, animationNode->timeFraction()); 294 295 animationNode->updateInheritedTime(2); 296 EXPECT_EQ(1, animationNode->currentIteration()); 297 EXPECT_EQ(0, animationNode->timeFraction()); 298 299 animationNode->updateInheritedTime(2); 300 EXPECT_EQ(1, animationNode->currentIteration()); 301 EXPECT_EQ(0, animationNode->timeFraction()); 302 303 animationNode->updateInheritedTime(5); 304 EXPECT_EQ(1, animationNode->currentIteration()); 305 EXPECT_EQ(1, animationNode->timeFraction()); 306 } 307 308 TEST(AnimationAnimationNodeTest, IterationStart) 309 { 310 Timing timing; 311 timing.iterationStart = 1.2; 312 timing.iterationCount = 2.2; 313 timing.iterationDuration = 1; 314 timing.fillMode = Timing::FillModeBoth; 315 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 316 317 animationNode->updateInheritedTime(-1); 318 EXPECT_EQ(1, animationNode->currentIteration()); 319 EXPECT_NEAR(0.2, animationNode->timeFraction(), 0.000000000000001); 320 321 animationNode->updateInheritedTime(0); 322 EXPECT_EQ(1, animationNode->currentIteration()); 323 EXPECT_NEAR(0.2, animationNode->timeFraction(), 0.000000000000001); 324 325 animationNode->updateInheritedTime(10); 326 EXPECT_EQ(3, animationNode->currentIteration()); 327 EXPECT_NEAR(0.4, animationNode->timeFraction(), 0.000000000000001); 328 } 329 330 TEST(AnimationAnimationNodeTest, IterationAlternate) 331 { 332 Timing timing; 333 timing.iterationCount = 10; 334 timing.iterationDuration = 1; 335 timing.direction = Timing::PlaybackDirectionAlternate; 336 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 337 338 animationNode->updateInheritedTime(0.75); 339 EXPECT_EQ(0, animationNode->currentIteration()); 340 EXPECT_EQ(0.75, animationNode->timeFraction()); 341 342 animationNode->updateInheritedTime(1.75); 343 EXPECT_EQ(1, animationNode->currentIteration()); 344 EXPECT_EQ(0.25, animationNode->timeFraction()); 345 346 animationNode->updateInheritedTime(2.75); 347 EXPECT_EQ(2, animationNode->currentIteration()); 348 EXPECT_EQ(0.75, animationNode->timeFraction()); 349 } 350 351 TEST(AnimationAnimationNodeTest, IterationAlternateReverse) 352 { 353 Timing timing; 354 timing.iterationCount = 10; 355 timing.iterationDuration = 1; 356 timing.direction = Timing::PlaybackDirectionAlternateReverse; 357 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 358 359 animationNode->updateInheritedTime(0.75); 360 EXPECT_EQ(0, animationNode->currentIteration()); 361 EXPECT_EQ(0.25, animationNode->timeFraction()); 362 363 animationNode->updateInheritedTime(1.75); 364 EXPECT_EQ(1, animationNode->currentIteration()); 365 EXPECT_EQ(0.75, animationNode->timeFraction()); 366 367 animationNode->updateInheritedTime(2.75); 368 EXPECT_EQ(2, animationNode->currentIteration()); 369 EXPECT_EQ(0.25, animationNode->timeFraction()); 370 } 371 372 TEST(AnimationAnimationNodeTest, ZeroDurationSanity) 373 { 374 Timing timing; 375 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 376 377 EXPECT_EQ(0, animationNode->startTime()); 378 379 animationNode->updateInheritedTime(0); 380 381 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 382 EXPECT_FALSE(animationNode->isInPlay()); 383 EXPECT_FALSE(animationNode->isCurrent()); 384 EXPECT_TRUE(animationNode->isInEffect()); 385 EXPECT_EQ(0, animationNode->currentIteration()); 386 EXPECT_EQ(0, animationNode->startTime()); 387 EXPECT_EQ(0, animationNode->activeDurationInternal()); 388 EXPECT_EQ(1, animationNode->timeFraction()); 389 390 animationNode->updateInheritedTime(1); 391 392 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 393 EXPECT_FALSE(animationNode->isInPlay()); 394 EXPECT_FALSE(animationNode->isCurrent()); 395 EXPECT_TRUE(animationNode->isInEffect()); 396 EXPECT_EQ(0, animationNode->currentIteration()); 397 EXPECT_EQ(0, animationNode->startTime()); 398 EXPECT_EQ(0, animationNode->activeDurationInternal()); 399 EXPECT_EQ(1, animationNode->timeFraction()); 400 } 401 402 TEST(AnimationAnimationNodeTest, ZeroDurationFillForwards) 403 { 404 Timing timing; 405 timing.fillMode = Timing::FillModeForwards; 406 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 407 408 animationNode->updateInheritedTime(-1); 409 EXPECT_TRUE(isNull(animationNode->timeFraction())); 410 411 animationNode->updateInheritedTime(0); 412 EXPECT_EQ(1, animationNode->timeFraction()); 413 414 animationNode->updateInheritedTime(1); 415 EXPECT_EQ(1, animationNode->timeFraction()); 416 } 417 418 TEST(AnimationAnimationNodeTest, ZeroDurationFillBackwards) 419 { 420 Timing timing; 421 timing.fillMode = Timing::FillModeBackwards; 422 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 423 424 animationNode->updateInheritedTime(-1); 425 EXPECT_EQ(0, animationNode->timeFraction()); 426 427 animationNode->updateInheritedTime(0); 428 EXPECT_TRUE(isNull(animationNode->timeFraction())); 429 430 animationNode->updateInheritedTime(1); 431 EXPECT_TRUE(isNull(animationNode->timeFraction())); 432 } 433 434 TEST(AnimationAnimationNodeTest, ZeroDurationFillBoth) 435 { 436 Timing timing; 437 timing.fillMode = Timing::FillModeBoth; 438 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 439 440 animationNode->updateInheritedTime(-1); 441 EXPECT_EQ(0, animationNode->timeFraction()); 442 443 animationNode->updateInheritedTime(0); 444 EXPECT_EQ(1, animationNode->timeFraction()); 445 446 animationNode->updateInheritedTime(1); 447 EXPECT_EQ(1, animationNode->timeFraction()); 448 } 449 450 TEST(AnimationAnimationNodeTest, ZeroDurationStartDelay) 451 { 452 Timing timing; 453 timing.fillMode = Timing::FillModeForwards; 454 timing.startDelay = 0.5; 455 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 456 457 animationNode->updateInheritedTime(0); 458 EXPECT_TRUE(isNull(animationNode->timeFraction())); 459 460 animationNode->updateInheritedTime(0.5); 461 EXPECT_EQ(1, animationNode->timeFraction()); 462 463 animationNode->updateInheritedTime(1.5); 464 EXPECT_EQ(1, animationNode->timeFraction()); 465 } 466 467 TEST(AnimationAnimationNodeTest, ZeroDurationIterationStartAndCount) 468 { 469 Timing timing; 470 timing.iterationStart = 0.1; 471 timing.iterationCount = 0.2; 472 timing.fillMode = Timing::FillModeBoth; 473 timing.startDelay = 0.3; 474 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 475 476 animationNode->updateInheritedTime(0); 477 EXPECT_EQ(0.1, animationNode->timeFraction()); 478 479 animationNode->updateInheritedTime(0.3); 480 EXPECT_DOUBLE_EQ(0.3, animationNode->timeFraction()); 481 482 animationNode->updateInheritedTime(1); 483 EXPECT_DOUBLE_EQ(0.3, animationNode->timeFraction()); 484 } 485 486 // FIXME: Needs specification work. 487 TEST(AnimationAnimationNodeTest, ZeroDurationInfiniteIteration) 488 { 489 Timing timing; 490 timing.fillMode = Timing::FillModeForwards; 491 timing.iterationCount = std::numeric_limits<double>::infinity(); 492 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 493 494 animationNode->updateInheritedTime(-1); 495 EXPECT_EQ(0, animationNode->activeDurationInternal()); 496 EXPECT_TRUE(isNull(animationNode->currentIteration())); 497 EXPECT_TRUE(isNull(animationNode->timeFraction())); 498 499 animationNode->updateInheritedTime(0); 500 EXPECT_EQ(0, animationNode->activeDurationInternal()); 501 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->currentIteration()); 502 EXPECT_EQ(1, animationNode->timeFraction()); 503 } 504 505 TEST(AnimationAnimationNodeTest, ZeroDurationIteration) 506 { 507 Timing timing; 508 timing.fillMode = Timing::FillModeForwards; 509 timing.iterationCount = 2; 510 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 511 512 animationNode->updateInheritedTime(-1); 513 EXPECT_TRUE(isNull(animationNode->currentIteration())); 514 EXPECT_TRUE(isNull(animationNode->timeFraction())); 515 516 animationNode->updateInheritedTime(0); 517 EXPECT_EQ(1, animationNode->currentIteration()); 518 EXPECT_EQ(1, animationNode->timeFraction()); 519 520 animationNode->updateInheritedTime(1); 521 EXPECT_EQ(1, animationNode->currentIteration()); 522 EXPECT_EQ(1, animationNode->timeFraction()); 523 } 524 525 TEST(AnimationAnimationNodeTest, ZeroDurationIterationStart) 526 { 527 Timing timing; 528 timing.iterationStart = 1.2; 529 timing.iterationCount = 2.2; 530 timing.fillMode = Timing::FillModeBoth; 531 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 532 533 animationNode->updateInheritedTime(-1); 534 EXPECT_EQ(1, animationNode->currentIteration()); 535 EXPECT_NEAR(0.2, animationNode->timeFraction(), 0.000000000000001); 536 537 animationNode->updateInheritedTime(0); 538 EXPECT_EQ(3, animationNode->currentIteration()); 539 EXPECT_NEAR(0.4, animationNode->timeFraction(), 0.000000000000001); 540 541 animationNode->updateInheritedTime(10); 542 EXPECT_EQ(3, animationNode->currentIteration()); 543 EXPECT_NEAR(0.4, animationNode->timeFraction(), 0.000000000000001); 544 } 545 546 TEST(AnimationAnimationNodeTest, ZeroDurationIterationAlternate) 547 { 548 Timing timing; 549 timing.fillMode = Timing::FillModeForwards; 550 timing.iterationCount = 2; 551 timing.direction = Timing::PlaybackDirectionAlternate; 552 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 553 554 animationNode->updateInheritedTime(-1); 555 EXPECT_TRUE(isNull(animationNode->currentIteration())); 556 EXPECT_TRUE(isNull(animationNode->timeFraction())); 557 558 animationNode->updateInheritedTime(0); 559 EXPECT_EQ(1, animationNode->currentIteration()); 560 EXPECT_EQ(0, animationNode->timeFraction()); 561 562 animationNode->updateInheritedTime(1); 563 EXPECT_EQ(1, animationNode->currentIteration()); 564 EXPECT_EQ(0, animationNode->timeFraction()); 565 } 566 567 TEST(AnimationAnimationNodeTest, ZeroDurationIterationAlternateReverse) 568 { 569 Timing timing; 570 timing.fillMode = Timing::FillModeForwards; 571 timing.iterationCount = 2; 572 timing.direction = Timing::PlaybackDirectionAlternateReverse; 573 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 574 575 animationNode->updateInheritedTime(-1); 576 EXPECT_TRUE(isNull(animationNode->currentIteration())); 577 EXPECT_TRUE(isNull(animationNode->timeFraction())); 578 579 animationNode->updateInheritedTime(0); 580 EXPECT_EQ(1, animationNode->currentIteration()); 581 EXPECT_EQ(1, animationNode->timeFraction()); 582 583 animationNode->updateInheritedTime(1); 584 EXPECT_EQ(1, animationNode->currentIteration()); 585 EXPECT_EQ(1, animationNode->timeFraction()); 586 } 587 588 TEST(AnimationAnimationNodeTest, InfiniteDurationSanity) 589 { 590 Timing timing; 591 timing.iterationDuration = std::numeric_limits<double>::infinity(); 592 timing.iterationCount = 1; 593 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 594 595 EXPECT_EQ(0, animationNode->startTime()); 596 597 animationNode->updateInheritedTime(0); 598 599 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 600 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 601 EXPECT_TRUE(animationNode->isInPlay()); 602 EXPECT_TRUE(animationNode->isCurrent()); 603 EXPECT_TRUE(animationNode->isInEffect()); 604 EXPECT_EQ(0, animationNode->currentIteration()); 605 EXPECT_EQ(0, animationNode->timeFraction()); 606 607 animationNode->updateInheritedTime(1); 608 609 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 610 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 611 EXPECT_TRUE(animationNode->isInPlay()); 612 EXPECT_TRUE(animationNode->isCurrent()); 613 EXPECT_TRUE(animationNode->isInEffect()); 614 EXPECT_EQ(0, animationNode->currentIteration()); 615 EXPECT_EQ(0, animationNode->timeFraction()); 616 } 617 618 // FIXME: Needs specification work. 619 TEST(AnimationAnimationNodeTest, InfiniteDurationZeroIterations) 620 { 621 Timing timing; 622 timing.iterationDuration = std::numeric_limits<double>::infinity(); 623 timing.iterationCount = 0; 624 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 625 626 EXPECT_EQ(0, animationNode->startTime()); 627 628 animationNode->updateInheritedTime(0); 629 630 EXPECT_EQ(0, animationNode->activeDurationInternal()); 631 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 632 EXPECT_FALSE(animationNode->isInPlay()); 633 EXPECT_FALSE(animationNode->isCurrent()); 634 EXPECT_TRUE(animationNode->isInEffect()); 635 EXPECT_EQ(0, animationNode->currentIteration()); 636 EXPECT_EQ(0, animationNode->timeFraction()); 637 638 animationNode->updateInheritedTime(1); 639 640 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 641 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 642 EXPECT_FALSE(animationNode->isInPlay()); 643 EXPECT_FALSE(animationNode->isCurrent()); 644 EXPECT_TRUE(animationNode->isInEffect()); 645 EXPECT_EQ(0, animationNode->currentIteration()); 646 EXPECT_EQ(0, animationNode->timeFraction()); 647 } 648 649 TEST(AnimationAnimationNodeTest, InfiniteDurationInfiniteIterations) 650 { 651 Timing timing; 652 timing.iterationDuration = std::numeric_limits<double>::infinity(); 653 timing.iterationCount = std::numeric_limits<double>::infinity(); 654 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 655 656 EXPECT_EQ(0, animationNode->startTime()); 657 658 animationNode->updateInheritedTime(0); 659 660 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 661 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 662 EXPECT_TRUE(animationNode->isInPlay()); 663 EXPECT_TRUE(animationNode->isCurrent()); 664 EXPECT_TRUE(animationNode->isInEffect()); 665 EXPECT_EQ(0, animationNode->currentIteration()); 666 EXPECT_EQ(0, animationNode->timeFraction()); 667 668 animationNode->updateInheritedTime(1); 669 670 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 671 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 672 EXPECT_TRUE(animationNode->isInPlay()); 673 EXPECT_TRUE(animationNode->isCurrent()); 674 EXPECT_TRUE(animationNode->isInEffect()); 675 EXPECT_EQ(0, animationNode->currentIteration()); 676 EXPECT_EQ(0, animationNode->timeFraction()); 677 } 678 679 TEST(AnimationAnimationNodeTest, InfiniteDurationZeroPlaybackRate) 680 { 681 Timing timing; 682 timing.iterationDuration = std::numeric_limits<double>::infinity(); 683 timing.playbackRate = 0; 684 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 685 686 EXPECT_EQ(0, animationNode->startTime()); 687 688 animationNode->updateInheritedTime(0); 689 690 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 691 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 692 EXPECT_TRUE(animationNode->isInPlay()); 693 EXPECT_TRUE(animationNode->isCurrent()); 694 EXPECT_TRUE(animationNode->isInEffect()); 695 EXPECT_EQ(0, animationNode->currentIteration()); 696 EXPECT_EQ(0, animationNode->timeFraction()); 697 698 animationNode->updateInheritedTime(std::numeric_limits<double>::infinity()); 699 700 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 701 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 702 EXPECT_FALSE(animationNode->isInPlay()); 703 EXPECT_FALSE(animationNode->isCurrent()); 704 EXPECT_TRUE(animationNode->isInEffect()); 705 EXPECT_EQ(0, animationNode->currentIteration()); 706 EXPECT_EQ(0, animationNode->timeFraction()); 707 } 708 709 TEST(AnimationAnimationNodeTest, EndTime) 710 { 711 Timing timing; 712 timing.startDelay = 1; 713 timing.endDelay = 2; 714 timing.iterationDuration = 4; 715 timing.iterationCount = 2; 716 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 717 EXPECT_EQ(11, animationNode->endTimeInternal()); 718 } 719 720 TEST(AnimationAnimationNodeTest, Events) 721 { 722 Timing timing; 723 timing.iterationDuration = 1; 724 timing.fillMode = Timing::FillModeForwards; 725 timing.iterationCount = 2; 726 timing.startDelay = 1; 727 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 728 729 animationNode->updateInheritedTime(0.0, TimingUpdateOnDemand); 730 EXPECT_FALSE(animationNode->eventDelegate()->eventTriggered()); 731 732 animationNode->updateInheritedTime(0.0, TimingUpdateForAnimationFrame); 733 EXPECT_TRUE(animationNode->eventDelegate()->eventTriggered()); 734 735 animationNode->updateInheritedTime(1.5, TimingUpdateOnDemand); 736 EXPECT_FALSE(animationNode->eventDelegate()->eventTriggered()); 737 738 animationNode->updateInheritedTime(1.5, TimingUpdateForAnimationFrame); 739 EXPECT_TRUE(animationNode->eventDelegate()->eventTriggered()); 740 741 } 742 743 TEST(AnimationAnimationNodeTest, TimeToEffectChange) 744 { 745 Timing timing; 746 timing.iterationDuration = 1; 747 timing.fillMode = Timing::FillModeForwards; 748 timing.iterationStart = 0.2; 749 timing.iterationCount = 2.5; 750 timing.startDelay = 1; 751 timing.direction = Timing::PlaybackDirectionAlternate; 752 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 753 754 animationNode->updateInheritedTime(0); 755 EXPECT_EQ(0, animationNode->takeLocalTime()); 756 EXPECT_TRUE(std::isinf(animationNode->takeTimeToNextIteration())); 757 758 // Normal iteration. 759 animationNode->updateInheritedTime(1.75); 760 EXPECT_EQ(1.75, animationNode->takeLocalTime()); 761 EXPECT_NEAR(0.05, animationNode->takeTimeToNextIteration(), 0.000000000000001); 762 763 // Reverse iteration. 764 animationNode->updateInheritedTime(2.75); 765 EXPECT_EQ(2.75, animationNode->takeLocalTime()); 766 EXPECT_NEAR(0.05, animationNode->takeTimeToNextIteration(), 0.000000000000001); 767 768 // Item ends before iteration finishes. 769 animationNode->updateInheritedTime(3.4); 770 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 771 EXPECT_EQ(3.4, animationNode->takeLocalTime()); 772 EXPECT_TRUE(std::isinf(animationNode->takeTimeToNextIteration())); 773 774 // Item has finished. 775 animationNode->updateInheritedTime(3.5); 776 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 777 EXPECT_EQ(3.5, animationNode->takeLocalTime()); 778 EXPECT_TRUE(std::isinf(animationNode->takeTimeToNextIteration())); 779 } 780 781 } 782