Home | History | Annotate | Download | only in animation
      1 // Copyright 2012 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 "cc/animation/animation.h"
      6 
      7 #include "cc/test/animation_test_common.h"
      8 #include "testing/gmock/include/gmock/gmock.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 
     11 namespace cc {
     12 namespace {
     13 
     14 using base::TimeDelta;
     15 
     16 static base::TimeTicks TicksFromSecondsF(double seconds) {
     17   return base::TimeTicks::FromInternalValue(seconds *
     18                                             base::Time::kMicrosecondsPerSecond);
     19 }
     20 
     21 scoped_ptr<Animation> CreateAnimation(int iterations, double duration) {
     22   scoped_ptr<Animation> to_return(Animation::Create(
     23       make_scoped_ptr(
     24           new FakeFloatAnimationCurve(duration)).PassAs<AnimationCurve>(),
     25       0,
     26       1,
     27       Animation::Opacity));
     28   to_return->set_iterations(iterations);
     29   return to_return.Pass();
     30 }
     31 
     32 scoped_ptr<Animation> CreateAnimation(int iterations) {
     33   return CreateAnimation(iterations, 1);
     34 }
     35 
     36 TEST(AnimationTest, TrimTimeZeroIterations) {
     37   scoped_ptr<Animation> anim(CreateAnimation(0));
     38   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
     39   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
     40   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
     41 }
     42 
     43 TEST(AnimationTest, TrimTimeOneIteration) {
     44   scoped_ptr<Animation> anim(CreateAnimation(1));
     45   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
     46   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
     47   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
     48   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
     49 }
     50 
     51 TEST(AnimationTest, TrimTimeInfiniteIterations) {
     52   scoped_ptr<Animation> anim(CreateAnimation(-1));
     53   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
     54   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
     55   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
     56   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
     57 }
     58 
     59 TEST(AnimationTest, TrimTimeReverse) {
     60   scoped_ptr<Animation> anim(CreateAnimation(-1));
     61   anim->set_direction(Animation::Reverse);
     62   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0)));
     63   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
     64   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
     65   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
     66   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
     67   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
     68 }
     69 
     70 TEST(AnimationTest, TrimTimeAlternateInfiniteIterations) {
     71   scoped_ptr<Animation> anim(CreateAnimation(-1));
     72   anim->set_direction(Animation::Alternate);
     73   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
     74   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
     75   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
     76   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
     77   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
     78   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
     79 }
     80 
     81 TEST(AnimationTest, TrimTimeAlternateOneIteration) {
     82   scoped_ptr<Animation> anim(CreateAnimation(1));
     83   anim->set_direction(Animation::Alternate);
     84   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
     85   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
     86   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
     87   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
     88   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
     89   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
     90 }
     91 
     92 TEST(AnimationTest, TrimTimeAlternateTwoIterations) {
     93   scoped_ptr<Animation> anim(CreateAnimation(2));
     94   anim->set_direction(Animation::Alternate);
     95   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
     96   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
     97   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
     98   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
     99   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    100   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
    101   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
    102   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
    103   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
    104 }
    105 
    106 TEST(AnimationTest, TrimTimeAlternateReverseInfiniteIterations) {
    107   scoped_ptr<Animation> anim(CreateAnimation(-1));
    108   anim->set_direction(Animation::AlternateReverse);
    109   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    110   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
    111   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
    112   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
    113   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    114   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
    115 }
    116 
    117 TEST(AnimationTest, TrimTimeAlternateReverseOneIteration) {
    118   scoped_ptr<Animation> anim(CreateAnimation(1));
    119   anim->set_direction(Animation::AlternateReverse);
    120   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    121   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
    122   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
    123   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
    124   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    125   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
    126 }
    127 
    128 TEST(AnimationTest, TrimTimeAlternateReverseTwoIterations) {
    129   scoped_ptr<Animation> anim(CreateAnimation(2));
    130   anim->set_direction(Animation::AlternateReverse);
    131   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    132   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
    133   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
    134   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
    135   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    136   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
    137   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
    138   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
    139   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
    140 }
    141 
    142 TEST(AnimationTest, TrimTimeStartTime) {
    143   scoped_ptr<Animation> anim(CreateAnimation(1));
    144   anim->set_start_time(TicksFromSecondsF(4));
    145   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    146   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0)));
    147   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)));
    148   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0)));
    149   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(6.0)));
    150 }
    151 
    152 TEST(AnimationTest, TrimTimeStartTimeReverse) {
    153   scoped_ptr<Animation> anim(CreateAnimation(1));
    154   anim->set_start_time(TicksFromSecondsF(4));
    155   anim->set_direction(Animation::Reverse);
    156   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    157   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0)));
    158   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)));
    159   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0)));
    160   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(6.0)));
    161 }
    162 
    163 TEST(AnimationTest, TrimTimeTimeOffset) {
    164   scoped_ptr<Animation> anim(CreateAnimation(1));
    165   anim->set_time_offset(TimeDelta::FromMilliseconds(4000));
    166   anim->set_start_time(TicksFromSecondsF(4));
    167   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    168   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
    169   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    170   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    171 }
    172 
    173 TEST(AnimationTest, TrimTimeTimeOffsetReverse) {
    174   scoped_ptr<Animation> anim(CreateAnimation(1));
    175   anim->set_time_offset(TimeDelta::FromMilliseconds(4000));
    176   anim->set_start_time(TicksFromSecondsF(4));
    177   anim->set_direction(Animation::Reverse);
    178   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    179   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
    180   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    181   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    182 }
    183 
    184 TEST(AnimationTest, TrimTimeNegativeTimeOffset) {
    185   scoped_ptr<Animation> anim(CreateAnimation(1));
    186   anim->set_time_offset(TimeDelta::FromMilliseconds(-4000));
    187 
    188   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    189   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0)));
    190   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)));
    191   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0)));
    192 }
    193 
    194 TEST(AnimationTest, TrimTimeNegativeTimeOffsetReverse) {
    195   scoped_ptr<Animation> anim(CreateAnimation(1));
    196   anim->set_time_offset(TimeDelta::FromMilliseconds(-4000));
    197   anim->set_direction(Animation::Reverse);
    198 
    199   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    200   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0)));
    201   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)));
    202   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0)));
    203 }
    204 
    205 TEST(AnimationTest, TrimTimePauseResume) {
    206   scoped_ptr<Animation> anim(CreateAnimation(1));
    207   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    208   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    209   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
    210   anim->SetRunState(Animation::Paused, TicksFromSecondsF(0.5));
    211   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
    212   anim->SetRunState(Animation::Running, TicksFromSecondsF(1024.0));
    213   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
    214   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.5)));
    215 }
    216 
    217 TEST(AnimationTest, TrimTimePauseResumeReverse) {
    218   scoped_ptr<Animation> anim(CreateAnimation(1));
    219   anim->set_direction(Animation::Reverse);
    220   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    221   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    222   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
    223   anim->SetRunState(Animation::Paused, TicksFromSecondsF(0.25));
    224   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
    225   anim->SetRunState(Animation::Running, TicksFromSecondsF(1024.0));
    226   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
    227   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.75)));
    228 }
    229 
    230 TEST(AnimationTest, TrimTimeSuspendResume) {
    231   scoped_ptr<Animation> anim(CreateAnimation(1));
    232   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    233   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    234   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
    235   anim->Suspend(TicksFromSecondsF(0.5));
    236   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
    237   anim->Resume(TicksFromSecondsF(1024));
    238   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
    239   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.5)));
    240 }
    241 
    242 TEST(AnimationTest, TrimTimeSuspendResumeReverse) {
    243   scoped_ptr<Animation> anim(CreateAnimation(1));
    244   anim->set_direction(Animation::Reverse);
    245   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    246   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    247   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
    248   anim->Suspend(TicksFromSecondsF(0.75));
    249   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
    250   anim->Resume(TicksFromSecondsF(1024));
    251   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
    252   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.25)));
    253 }
    254 
    255 TEST(AnimationTest, TrimTimeZeroDuration) {
    256   scoped_ptr<Animation> anim(CreateAnimation(0, 0));
    257   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    258   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
    259   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    260   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    261 }
    262 
    263 TEST(AnimationTest, TrimTimeStarting) {
    264   scoped_ptr<Animation> anim(CreateAnimation(1, 5.0));
    265   anim->SetRunState(Animation::Starting, TicksFromSecondsF(0.0));
    266   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
    267   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    268   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    269   anim->set_time_offset(TimeDelta::FromMilliseconds(2000));
    270   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
    271   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    272   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    273   anim->set_start_time(TicksFromSecondsF(1.0));
    274   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
    275   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    276   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    277   EXPECT_EQ(3.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
    278 }
    279 
    280 TEST(AnimationTest, TrimTimeNeedsSynchronizedStartTime) {
    281   scoped_ptr<Animation> anim(CreateAnimation(1, 5.0));
    282   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    283   anim->set_needs_synchronized_start_time(true);
    284   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
    285   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    286   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    287   anim->set_time_offset(TimeDelta::FromMilliseconds(2000));
    288   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
    289   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    290   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    291   anim->set_start_time(TicksFromSecondsF(1.0));
    292   anim->set_needs_synchronized_start_time(false);
    293   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
    294   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
    295   EXPECT_EQ(3.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
    296 }
    297 
    298 TEST(AnimationTest, IsFinishedAtZeroIterations) {
    299   scoped_ptr<Animation> anim(CreateAnimation(0));
    300   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    301   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0)));
    302   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
    303   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
    304 }
    305 
    306 TEST(AnimationTest, IsFinishedAtOneIteration) {
    307   scoped_ptr<Animation> anim(CreateAnimation(1));
    308   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    309   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0)));
    310   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
    311   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
    312   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(2.0)));
    313 }
    314 
    315 TEST(AnimationTest, IsFinishedAtInfiniteIterations) {
    316   scoped_ptr<Animation> anim(CreateAnimation(-1));
    317   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    318   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
    319   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.5)));
    320   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
    321   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(1.5)));
    322 }
    323 
    324 TEST(AnimationTest, IsFinishedNegativeTimeOffset) {
    325   scoped_ptr<Animation> anim(CreateAnimation(1));
    326   anim->set_time_offset(TimeDelta::FromMilliseconds(-500));
    327   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    328 
    329   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0)));
    330   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
    331   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.5)));
    332   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
    333   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.5)));
    334   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(2.0)));
    335   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(2.5)));
    336 }
    337 
    338 TEST(AnimationTest, IsFinishedPositiveTimeOffset) {
    339   scoped_ptr<Animation> anim(CreateAnimation(1));
    340   anim->set_time_offset(TimeDelta::FromMilliseconds(500));
    341   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    342 
    343   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0)));
    344   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
    345   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.5)));
    346   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
    347 }
    348 
    349 TEST(AnimationTest, IsFinishedAtNotRunning) {
    350   scoped_ptr<Animation> anim(CreateAnimation(0));
    351   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    352   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
    353   anim->SetRunState(Animation::Paused, TicksFromSecondsF(0.0));
    354   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
    355   anim->SetRunState(Animation::WaitingForTargetAvailability,
    356                     TicksFromSecondsF(0.0));
    357   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
    358   anim->SetRunState(Animation::Finished, TicksFromSecondsF(0.0));
    359   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
    360   anim->SetRunState(Animation::Aborted, TicksFromSecondsF(0.0));
    361   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
    362 }
    363 
    364 TEST(AnimationTest, IsFinished) {
    365   scoped_ptr<Animation> anim(CreateAnimation(1));
    366   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    367   EXPECT_FALSE(anim->is_finished());
    368   anim->SetRunState(Animation::Paused, TicksFromSecondsF(0.0));
    369   EXPECT_FALSE(anim->is_finished());
    370   anim->SetRunState(Animation::WaitingForTargetAvailability,
    371                     TicksFromSecondsF(0.0));
    372   EXPECT_FALSE(anim->is_finished());
    373   anim->SetRunState(Animation::Finished, TicksFromSecondsF(0.0));
    374   EXPECT_TRUE(anim->is_finished());
    375   anim->SetRunState(Animation::Aborted, TicksFromSecondsF(0.0));
    376   EXPECT_TRUE(anim->is_finished());
    377 }
    378 
    379 TEST(AnimationTest, IsFinishedNeedsSynchronizedStartTime) {
    380   scoped_ptr<Animation> anim(CreateAnimation(1));
    381   anim->SetRunState(Animation::Running, TicksFromSecondsF(2.0));
    382   EXPECT_FALSE(anim->is_finished());
    383   anim->SetRunState(Animation::Paused, TicksFromSecondsF(2.0));
    384   EXPECT_FALSE(anim->is_finished());
    385   anim->SetRunState(Animation::WaitingForTargetAvailability,
    386                     TicksFromSecondsF(2.0));
    387   EXPECT_FALSE(anim->is_finished());
    388   anim->SetRunState(Animation::Finished, TicksFromSecondsF(0.0));
    389   EXPECT_TRUE(anim->is_finished());
    390   anim->SetRunState(Animation::Aborted, TicksFromSecondsF(0.0));
    391   EXPECT_TRUE(anim->is_finished());
    392 }
    393 
    394 TEST(AnimationTest, RunStateChangesIgnoredWhileSuspended) {
    395   scoped_ptr<Animation> anim(CreateAnimation(1));
    396   anim->Suspend(TicksFromSecondsF(0));
    397   EXPECT_EQ(Animation::Paused, anim->run_state());
    398   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    399   EXPECT_EQ(Animation::Paused, anim->run_state());
    400   anim->Resume(TicksFromSecondsF(0));
    401   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
    402   EXPECT_EQ(Animation::Running, anim->run_state());
    403 }
    404 
    405 }  // namespace
    406 }  // namespace cc
    407