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 WebCore; 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; } 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 private: 99 TestAnimationNode(const Timing& specified, TestAnimationNodeEventDelegate* eventDelegate) 100 : AnimationNode(specified, adoptPtr(eventDelegate)) 101 , m_eventDelegate(eventDelegate) 102 { 103 } 104 105 TestAnimationNodeEventDelegate* m_eventDelegate; 106 mutable double m_localTime; 107 mutable double m_timeToNextIteration; 108 }; 109 110 TEST(AnimationAnimationNodeTest, Sanity) 111 { 112 Timing timing; 113 timing.iterationDuration = 2; 114 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 115 116 EXPECT_EQ(0, animationNode->startTime()); 117 118 animationNode->updateInheritedTime(0); 119 120 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 121 EXPECT_TRUE(animationNode->isInPlay()); 122 EXPECT_TRUE(animationNode->isCurrent()); 123 EXPECT_TRUE(animationNode->isInEffect()); 124 EXPECT_EQ(0, animationNode->currentIteration()); 125 EXPECT_EQ(0, animationNode->startTime()); 126 EXPECT_EQ(2, animationNode->activeDurationInternal()); 127 EXPECT_EQ(0, animationNode->timeFraction()); 128 129 animationNode->updateInheritedTime(1); 130 131 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 132 EXPECT_TRUE(animationNode->isInPlay()); 133 EXPECT_TRUE(animationNode->isCurrent()); 134 EXPECT_TRUE(animationNode->isInEffect()); 135 EXPECT_EQ(0, animationNode->currentIteration()); 136 EXPECT_EQ(0, animationNode->startTime()); 137 EXPECT_EQ(2, animationNode->activeDurationInternal()); 138 EXPECT_EQ(0.5, animationNode->timeFraction()); 139 140 animationNode->updateInheritedTime(2); 141 142 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 143 EXPECT_FALSE(animationNode->isInPlay()); 144 EXPECT_FALSE(animationNode->isCurrent()); 145 EXPECT_TRUE(animationNode->isInEffect()); 146 EXPECT_EQ(0, animationNode->currentIteration()); 147 EXPECT_EQ(0, animationNode->startTime()); 148 EXPECT_EQ(2, animationNode->activeDurationInternal()); 149 EXPECT_EQ(1, animationNode->timeFraction()); 150 151 animationNode->updateInheritedTime(3); 152 153 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 154 EXPECT_FALSE(animationNode->isInPlay()); 155 EXPECT_FALSE(animationNode->isCurrent()); 156 EXPECT_TRUE(animationNode->isInEffect()); 157 EXPECT_EQ(0, animationNode->currentIteration()); 158 EXPECT_EQ(0, animationNode->startTime()); 159 EXPECT_EQ(2, animationNode->activeDurationInternal()); 160 EXPECT_EQ(1, animationNode->timeFraction()); 161 } 162 163 TEST(AnimationAnimationNodeTest, FillAuto) 164 { 165 Timing timing; 166 timing.iterationDuration = 1; 167 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 168 169 animationNode->updateInheritedTime(-1); 170 EXPECT_EQ(0, animationNode->timeFraction()); 171 172 animationNode->updateInheritedTime(2); 173 EXPECT_EQ(1, animationNode->timeFraction()); 174 } 175 176 TEST(AnimationAnimationNodeTest, FillForwards) 177 { 178 Timing timing; 179 timing.iterationDuration = 1; 180 timing.fillMode = Timing::FillModeForwards; 181 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 182 183 animationNode->updateInheritedTime(-1); 184 EXPECT_TRUE(isNull(animationNode->timeFraction())); 185 186 animationNode->updateInheritedTime(2); 187 EXPECT_EQ(1, animationNode->timeFraction()); 188 } 189 190 TEST(AnimationAnimationNodeTest, FillBackwards) 191 { 192 Timing timing; 193 timing.iterationDuration = 1; 194 timing.fillMode = Timing::FillModeBackwards; 195 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 196 197 animationNode->updateInheritedTime(-1); 198 EXPECT_EQ(0, animationNode->timeFraction()); 199 200 animationNode->updateInheritedTime(2); 201 EXPECT_TRUE(isNull(animationNode->timeFraction())); 202 } 203 204 TEST(AnimationAnimationNodeTest, FillBoth) 205 { 206 Timing timing; 207 timing.iterationDuration = 1; 208 timing.fillMode = Timing::FillModeBoth; 209 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 210 211 animationNode->updateInheritedTime(-1); 212 EXPECT_EQ(0, animationNode->timeFraction()); 213 214 animationNode->updateInheritedTime(2); 215 EXPECT_EQ(1, animationNode->timeFraction()); 216 } 217 218 TEST(AnimationAnimationNodeTest, StartDelay) 219 { 220 Timing timing; 221 timing.iterationDuration = 1; 222 timing.fillMode = Timing::FillModeForwards; 223 timing.startDelay = 0.5; 224 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 225 226 animationNode->updateInheritedTime(0); 227 EXPECT_TRUE(isNull(animationNode->timeFraction())); 228 229 animationNode->updateInheritedTime(0.5); 230 EXPECT_EQ(0, animationNode->timeFraction()); 231 232 animationNode->updateInheritedTime(1.5); 233 EXPECT_EQ(1, animationNode->timeFraction()); 234 } 235 236 TEST(AnimationAnimationNodeTest, ZeroIteration) 237 { 238 Timing timing; 239 timing.iterationDuration = 1; 240 timing.fillMode = Timing::FillModeForwards; 241 timing.iterationCount = 0; 242 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 243 244 animationNode->updateInheritedTime(-1); 245 EXPECT_EQ(0, animationNode->activeDurationInternal()); 246 EXPECT_TRUE(isNull(animationNode->currentIteration())); 247 EXPECT_TRUE(isNull(animationNode->timeFraction())); 248 249 animationNode->updateInheritedTime(0); 250 EXPECT_EQ(0, animationNode->activeDurationInternal()); 251 EXPECT_EQ(0, animationNode->currentIteration()); 252 EXPECT_EQ(0, animationNode->timeFraction()); 253 } 254 255 TEST(AnimationAnimationNodeTest, InfiniteIteration) 256 { 257 Timing timing; 258 timing.iterationDuration = 1; 259 timing.fillMode = Timing::FillModeForwards; 260 timing.iterationCount = std::numeric_limits<double>::infinity(); 261 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 262 263 animationNode->updateInheritedTime(-1); 264 EXPECT_TRUE(isNull(animationNode->currentIteration())); 265 EXPECT_TRUE(isNull(animationNode->timeFraction())); 266 267 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 268 269 animationNode->updateInheritedTime(0); 270 EXPECT_EQ(0, animationNode->currentIteration()); 271 EXPECT_EQ(0, animationNode->timeFraction()); 272 } 273 274 TEST(AnimationAnimationNodeTest, Iteration) 275 { 276 Timing timing; 277 timing.iterationCount = 2; 278 timing.iterationDuration = 2; 279 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 280 281 animationNode->updateInheritedTime(0); 282 EXPECT_EQ(0, animationNode->currentIteration()); 283 EXPECT_EQ(0, animationNode->timeFraction()); 284 285 animationNode->updateInheritedTime(1); 286 EXPECT_EQ(0, animationNode->currentIteration()); 287 EXPECT_EQ(0.5, animationNode->timeFraction()); 288 289 animationNode->updateInheritedTime(2); 290 EXPECT_EQ(1, animationNode->currentIteration()); 291 EXPECT_EQ(0, animationNode->timeFraction()); 292 293 animationNode->updateInheritedTime(2); 294 EXPECT_EQ(1, animationNode->currentIteration()); 295 EXPECT_EQ(0, animationNode->timeFraction()); 296 297 animationNode->updateInheritedTime(5); 298 EXPECT_EQ(1, animationNode->currentIteration()); 299 EXPECT_EQ(1, animationNode->timeFraction()); 300 } 301 302 TEST(AnimationAnimationNodeTest, IterationStart) 303 { 304 Timing timing; 305 timing.iterationStart = 1.2; 306 timing.iterationCount = 2.2; 307 timing.iterationDuration = 1; 308 timing.fillMode = Timing::FillModeBoth; 309 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 310 311 animationNode->updateInheritedTime(-1); 312 EXPECT_EQ(1, animationNode->currentIteration()); 313 EXPECT_NEAR(0.2, animationNode->timeFraction(), 0.000000000000001); 314 315 animationNode->updateInheritedTime(0); 316 EXPECT_EQ(1, animationNode->currentIteration()); 317 EXPECT_NEAR(0.2, animationNode->timeFraction(), 0.000000000000001); 318 319 animationNode->updateInheritedTime(10); 320 EXPECT_EQ(3, animationNode->currentIteration()); 321 EXPECT_NEAR(0.4, animationNode->timeFraction(), 0.000000000000001); 322 } 323 324 TEST(AnimationAnimationNodeTest, IterationAlternate) 325 { 326 Timing timing; 327 timing.iterationCount = 10; 328 timing.iterationDuration = 1; 329 timing.direction = Timing::PlaybackDirectionAlternate; 330 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 331 332 animationNode->updateInheritedTime(0.75); 333 EXPECT_EQ(0, animationNode->currentIteration()); 334 EXPECT_EQ(0.75, animationNode->timeFraction()); 335 336 animationNode->updateInheritedTime(1.75); 337 EXPECT_EQ(1, animationNode->currentIteration()); 338 EXPECT_EQ(0.25, animationNode->timeFraction()); 339 340 animationNode->updateInheritedTime(2.75); 341 EXPECT_EQ(2, animationNode->currentIteration()); 342 EXPECT_EQ(0.75, animationNode->timeFraction()); 343 } 344 345 TEST(AnimationAnimationNodeTest, IterationAlternateReverse) 346 { 347 Timing timing; 348 timing.iterationCount = 10; 349 timing.iterationDuration = 1; 350 timing.direction = Timing::PlaybackDirectionAlternateReverse; 351 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 352 353 animationNode->updateInheritedTime(0.75); 354 EXPECT_EQ(0, animationNode->currentIteration()); 355 EXPECT_EQ(0.25, animationNode->timeFraction()); 356 357 animationNode->updateInheritedTime(1.75); 358 EXPECT_EQ(1, animationNode->currentIteration()); 359 EXPECT_EQ(0.75, animationNode->timeFraction()); 360 361 animationNode->updateInheritedTime(2.75); 362 EXPECT_EQ(2, animationNode->currentIteration()); 363 EXPECT_EQ(0.25, animationNode->timeFraction()); 364 } 365 366 TEST(AnimationAnimationNodeTest, ZeroDurationSanity) 367 { 368 Timing timing; 369 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 370 371 EXPECT_EQ(0, animationNode->startTime()); 372 373 animationNode->updateInheritedTime(0); 374 375 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 376 EXPECT_FALSE(animationNode->isInPlay()); 377 EXPECT_FALSE(animationNode->isCurrent()); 378 EXPECT_TRUE(animationNode->isInEffect()); 379 EXPECT_EQ(0, animationNode->currentIteration()); 380 EXPECT_EQ(0, animationNode->startTime()); 381 EXPECT_EQ(0, animationNode->activeDurationInternal()); 382 EXPECT_EQ(1, animationNode->timeFraction()); 383 384 animationNode->updateInheritedTime(1); 385 386 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 387 EXPECT_FALSE(animationNode->isInPlay()); 388 EXPECT_FALSE(animationNode->isCurrent()); 389 EXPECT_TRUE(animationNode->isInEffect()); 390 EXPECT_EQ(0, animationNode->currentIteration()); 391 EXPECT_EQ(0, animationNode->startTime()); 392 EXPECT_EQ(0, animationNode->activeDurationInternal()); 393 EXPECT_EQ(1, animationNode->timeFraction()); 394 } 395 396 TEST(AnimationAnimationNodeTest, ZeroDurationFillForwards) 397 { 398 Timing timing; 399 timing.fillMode = Timing::FillModeForwards; 400 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 401 402 animationNode->updateInheritedTime(-1); 403 EXPECT_TRUE(isNull(animationNode->timeFraction())); 404 405 animationNode->updateInheritedTime(0); 406 EXPECT_EQ(1, animationNode->timeFraction()); 407 408 animationNode->updateInheritedTime(1); 409 EXPECT_EQ(1, animationNode->timeFraction()); 410 } 411 412 TEST(AnimationAnimationNodeTest, ZeroDurationFillBackwards) 413 { 414 Timing timing; 415 timing.fillMode = Timing::FillModeBackwards; 416 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 417 418 animationNode->updateInheritedTime(-1); 419 EXPECT_EQ(0, animationNode->timeFraction()); 420 421 animationNode->updateInheritedTime(0); 422 EXPECT_TRUE(isNull(animationNode->timeFraction())); 423 424 animationNode->updateInheritedTime(1); 425 EXPECT_TRUE(isNull(animationNode->timeFraction())); 426 } 427 428 TEST(AnimationAnimationNodeTest, ZeroDurationFillBoth) 429 { 430 Timing timing; 431 timing.fillMode = Timing::FillModeBoth; 432 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 433 434 animationNode->updateInheritedTime(-1); 435 EXPECT_EQ(0, animationNode->timeFraction()); 436 437 animationNode->updateInheritedTime(0); 438 EXPECT_EQ(1, animationNode->timeFraction()); 439 440 animationNode->updateInheritedTime(1); 441 EXPECT_EQ(1, animationNode->timeFraction()); 442 } 443 444 TEST(AnimationAnimationNodeTest, ZeroDurationStartDelay) 445 { 446 Timing timing; 447 timing.fillMode = Timing::FillModeForwards; 448 timing.startDelay = 0.5; 449 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 450 451 animationNode->updateInheritedTime(0); 452 EXPECT_TRUE(isNull(animationNode->timeFraction())); 453 454 animationNode->updateInheritedTime(0.5); 455 EXPECT_EQ(1, animationNode->timeFraction()); 456 457 animationNode->updateInheritedTime(1.5); 458 EXPECT_EQ(1, animationNode->timeFraction()); 459 } 460 461 TEST(AnimationAnimationNodeTest, ZeroDurationIterationStartAndCount) 462 { 463 Timing timing; 464 timing.iterationStart = 0.1; 465 timing.iterationCount = 0.2; 466 timing.fillMode = Timing::FillModeBoth; 467 timing.startDelay = 0.3; 468 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 469 470 animationNode->updateInheritedTime(0); 471 EXPECT_EQ(0.1, animationNode->timeFraction()); 472 473 animationNode->updateInheritedTime(0.3); 474 EXPECT_DOUBLE_EQ(0.3, animationNode->timeFraction()); 475 476 animationNode->updateInheritedTime(1); 477 EXPECT_DOUBLE_EQ(0.3, animationNode->timeFraction()); 478 } 479 480 // FIXME: Needs specification work. 481 TEST(AnimationAnimationNodeTest, ZeroDurationInfiniteIteration) 482 { 483 Timing timing; 484 timing.fillMode = Timing::FillModeForwards; 485 timing.iterationCount = std::numeric_limits<double>::infinity(); 486 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 487 488 animationNode->updateInheritedTime(-1); 489 EXPECT_EQ(0, animationNode->activeDurationInternal()); 490 EXPECT_TRUE(isNull(animationNode->currentIteration())); 491 EXPECT_TRUE(isNull(animationNode->timeFraction())); 492 493 animationNode->updateInheritedTime(0); 494 EXPECT_EQ(0, animationNode->activeDurationInternal()); 495 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->currentIteration()); 496 EXPECT_EQ(1, animationNode->timeFraction()); 497 } 498 499 TEST(AnimationAnimationNodeTest, ZeroDurationIteration) 500 { 501 Timing timing; 502 timing.fillMode = Timing::FillModeForwards; 503 timing.iterationCount = 2; 504 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 505 506 animationNode->updateInheritedTime(-1); 507 EXPECT_TRUE(isNull(animationNode->currentIteration())); 508 EXPECT_TRUE(isNull(animationNode->timeFraction())); 509 510 animationNode->updateInheritedTime(0); 511 EXPECT_EQ(1, animationNode->currentIteration()); 512 EXPECT_EQ(1, animationNode->timeFraction()); 513 514 animationNode->updateInheritedTime(1); 515 EXPECT_EQ(1, animationNode->currentIteration()); 516 EXPECT_EQ(1, animationNode->timeFraction()); 517 } 518 519 TEST(AnimationAnimationNodeTest, ZeroDurationIterationStart) 520 { 521 Timing timing; 522 timing.iterationStart = 1.2; 523 timing.iterationCount = 2.2; 524 timing.fillMode = Timing::FillModeBoth; 525 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 526 527 animationNode->updateInheritedTime(-1); 528 EXPECT_EQ(1, animationNode->currentIteration()); 529 EXPECT_NEAR(0.2, animationNode->timeFraction(), 0.000000000000001); 530 531 animationNode->updateInheritedTime(0); 532 EXPECT_EQ(3, animationNode->currentIteration()); 533 EXPECT_NEAR(0.4, animationNode->timeFraction(), 0.000000000000001); 534 535 animationNode->updateInheritedTime(10); 536 EXPECT_EQ(3, animationNode->currentIteration()); 537 EXPECT_NEAR(0.4, animationNode->timeFraction(), 0.000000000000001); 538 } 539 540 TEST(AnimationAnimationNodeTest, ZeroDurationIterationAlternate) 541 { 542 Timing timing; 543 timing.fillMode = Timing::FillModeForwards; 544 timing.iterationCount = 2; 545 timing.direction = Timing::PlaybackDirectionAlternate; 546 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 547 548 animationNode->updateInheritedTime(-1); 549 EXPECT_TRUE(isNull(animationNode->currentIteration())); 550 EXPECT_TRUE(isNull(animationNode->timeFraction())); 551 552 animationNode->updateInheritedTime(0); 553 EXPECT_EQ(1, animationNode->currentIteration()); 554 EXPECT_EQ(0, animationNode->timeFraction()); 555 556 animationNode->updateInheritedTime(1); 557 EXPECT_EQ(1, animationNode->currentIteration()); 558 EXPECT_EQ(0, animationNode->timeFraction()); 559 } 560 561 TEST(AnimationAnimationNodeTest, ZeroDurationIterationAlternateReverse) 562 { 563 Timing timing; 564 timing.fillMode = Timing::FillModeForwards; 565 timing.iterationCount = 2; 566 timing.direction = Timing::PlaybackDirectionAlternateReverse; 567 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 568 569 animationNode->updateInheritedTime(-1); 570 EXPECT_TRUE(isNull(animationNode->currentIteration())); 571 EXPECT_TRUE(isNull(animationNode->timeFraction())); 572 573 animationNode->updateInheritedTime(0); 574 EXPECT_EQ(1, animationNode->currentIteration()); 575 EXPECT_EQ(1, animationNode->timeFraction()); 576 577 animationNode->updateInheritedTime(1); 578 EXPECT_EQ(1, animationNode->currentIteration()); 579 EXPECT_EQ(1, animationNode->timeFraction()); 580 } 581 582 TEST(AnimationAnimationNodeTest, InfiniteDurationSanity) 583 { 584 Timing timing; 585 timing.iterationDuration = std::numeric_limits<double>::infinity(); 586 timing.iterationCount = 1; 587 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 588 589 EXPECT_EQ(0, animationNode->startTime()); 590 591 animationNode->updateInheritedTime(0); 592 593 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 594 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 595 EXPECT_TRUE(animationNode->isInPlay()); 596 EXPECT_TRUE(animationNode->isCurrent()); 597 EXPECT_TRUE(animationNode->isInEffect()); 598 EXPECT_EQ(0, animationNode->currentIteration()); 599 EXPECT_EQ(0, animationNode->timeFraction()); 600 601 animationNode->updateInheritedTime(1); 602 603 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 604 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 605 EXPECT_TRUE(animationNode->isInPlay()); 606 EXPECT_TRUE(animationNode->isCurrent()); 607 EXPECT_TRUE(animationNode->isInEffect()); 608 EXPECT_EQ(0, animationNode->currentIteration()); 609 EXPECT_EQ(0, animationNode->timeFraction()); 610 } 611 612 // FIXME: Needs specification work. 613 TEST(AnimationAnimationNodeTest, InfiniteDurationZeroIterations) 614 { 615 Timing timing; 616 timing.iterationDuration = std::numeric_limits<double>::infinity(); 617 timing.iterationCount = 0; 618 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 619 620 EXPECT_EQ(0, animationNode->startTime()); 621 622 animationNode->updateInheritedTime(0); 623 624 EXPECT_EQ(0, animationNode->activeDurationInternal()); 625 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 626 EXPECT_FALSE(animationNode->isInPlay()); 627 EXPECT_FALSE(animationNode->isCurrent()); 628 EXPECT_TRUE(animationNode->isInEffect()); 629 EXPECT_EQ(0, animationNode->currentIteration()); 630 EXPECT_EQ(0, animationNode->timeFraction()); 631 632 animationNode->updateInheritedTime(1); 633 634 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 635 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 636 EXPECT_FALSE(animationNode->isInPlay()); 637 EXPECT_FALSE(animationNode->isCurrent()); 638 EXPECT_TRUE(animationNode->isInEffect()); 639 EXPECT_EQ(0, animationNode->currentIteration()); 640 EXPECT_EQ(0, animationNode->timeFraction()); 641 } 642 643 TEST(AnimationAnimationNodeTest, InfiniteDurationInfiniteIterations) 644 { 645 Timing timing; 646 timing.iterationDuration = std::numeric_limits<double>::infinity(); 647 timing.iterationCount = std::numeric_limits<double>::infinity(); 648 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 649 650 EXPECT_EQ(0, animationNode->startTime()); 651 652 animationNode->updateInheritedTime(0); 653 654 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 655 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 656 EXPECT_TRUE(animationNode->isInPlay()); 657 EXPECT_TRUE(animationNode->isCurrent()); 658 EXPECT_TRUE(animationNode->isInEffect()); 659 EXPECT_EQ(0, animationNode->currentIteration()); 660 EXPECT_EQ(0, animationNode->timeFraction()); 661 662 animationNode->updateInheritedTime(1); 663 664 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 665 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 666 EXPECT_TRUE(animationNode->isInPlay()); 667 EXPECT_TRUE(animationNode->isCurrent()); 668 EXPECT_TRUE(animationNode->isInEffect()); 669 EXPECT_EQ(0, animationNode->currentIteration()); 670 EXPECT_EQ(0, animationNode->timeFraction()); 671 } 672 673 TEST(AnimationAnimationNodeTest, InfiniteDurationZeroPlaybackRate) 674 { 675 Timing timing; 676 timing.iterationDuration = std::numeric_limits<double>::infinity(); 677 timing.playbackRate = 0; 678 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 679 680 EXPECT_EQ(0, animationNode->startTime()); 681 682 animationNode->updateInheritedTime(0); 683 684 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 685 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 686 EXPECT_TRUE(animationNode->isInPlay()); 687 EXPECT_TRUE(animationNode->isCurrent()); 688 EXPECT_TRUE(animationNode->isInEffect()); 689 EXPECT_EQ(0, animationNode->currentIteration()); 690 EXPECT_EQ(0, animationNode->timeFraction()); 691 692 animationNode->updateInheritedTime(std::numeric_limits<double>::infinity()); 693 694 EXPECT_EQ(std::numeric_limits<double>::infinity(), animationNode->activeDurationInternal()); 695 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 696 EXPECT_FALSE(animationNode->isInPlay()); 697 EXPECT_FALSE(animationNode->isCurrent()); 698 EXPECT_TRUE(animationNode->isInEffect()); 699 EXPECT_EQ(0, animationNode->currentIteration()); 700 EXPECT_EQ(0, animationNode->timeFraction()); 701 } 702 703 TEST(AnimationAnimationNodeTest, EndTime) 704 { 705 Timing timing; 706 timing.startDelay = 1; 707 timing.endDelay = 2; 708 timing.iterationDuration = 4; 709 timing.iterationCount = 2; 710 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 711 EXPECT_EQ(11, animationNode->endTimeInternal()); 712 } 713 714 TEST(AnimationAnimationNodeTest, Events) 715 { 716 Timing timing; 717 timing.iterationDuration = 1; 718 timing.fillMode = Timing::FillModeForwards; 719 timing.iterationCount = 2; 720 timing.startDelay = 1; 721 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 722 723 animationNode->updateInheritedTime(0.0, TimingUpdateOnDemand); 724 EXPECT_FALSE(animationNode->eventDelegate()->eventTriggered()); 725 726 animationNode->updateInheritedTime(0.0, TimingUpdateForAnimationFrame); 727 EXPECT_TRUE(animationNode->eventDelegate()->eventTriggered()); 728 729 animationNode->updateInheritedTime(1.5, TimingUpdateOnDemand); 730 EXPECT_FALSE(animationNode->eventDelegate()->eventTriggered()); 731 732 animationNode->updateInheritedTime(1.5, TimingUpdateForAnimationFrame); 733 EXPECT_TRUE(animationNode->eventDelegate()->eventTriggered()); 734 735 } 736 737 TEST(AnimationAnimationNodeTest, TimeToEffectChange) 738 { 739 Timing timing; 740 timing.iterationDuration = 1; 741 timing.fillMode = Timing::FillModeForwards; 742 timing.iterationStart = 0.2; 743 timing.iterationCount = 2.5; 744 timing.startDelay = 1; 745 timing.direction = Timing::PlaybackDirectionAlternate; 746 RefPtrWillBeRawPtr<TestAnimationNode> animationNode = TestAnimationNode::create(timing); 747 748 animationNode->updateInheritedTime(0); 749 EXPECT_EQ(0, animationNode->takeLocalTime()); 750 EXPECT_TRUE(std::isinf(animationNode->takeTimeToNextIteration())); 751 752 // Normal iteration. 753 animationNode->updateInheritedTime(1.75); 754 EXPECT_EQ(1.75, animationNode->takeLocalTime()); 755 EXPECT_NEAR(0.05, animationNode->takeTimeToNextIteration(), 0.000000000000001); 756 757 // Reverse iteration. 758 animationNode->updateInheritedTime(2.75); 759 EXPECT_EQ(2.75, animationNode->takeLocalTime()); 760 EXPECT_NEAR(0.05, animationNode->takeTimeToNextIteration(), 0.000000000000001); 761 762 // Item ends before iteration finishes. 763 animationNode->updateInheritedTime(3.4); 764 EXPECT_EQ(AnimationNode::PhaseActive, animationNode->phase()); 765 EXPECT_EQ(3.4, animationNode->takeLocalTime()); 766 EXPECT_TRUE(std::isinf(animationNode->takeTimeToNextIteration())); 767 768 // Item has finished. 769 animationNode->updateInheritedTime(3.5); 770 EXPECT_EQ(AnimationNode::PhaseAfter, animationNode->phase()); 771 EXPECT_EQ(3.5, animationNode->takeLocalTime()); 772 EXPECT_TRUE(std::isinf(animationNode->takeTimeToNextIteration())); 773 } 774 775 } 776