Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / cc / animation / animation_unittest.cc
index 5f936ae..378bb7e 100644 (file)
@@ -18,7 +18,9 @@ static base::TimeTicks TicksFromSecondsF(double seconds) {
                                             base::Time::kMicrosecondsPerSecond);
 }
 
-scoped_ptr<Animation> CreateAnimation(double iterations, double duration) {
+scoped_ptr<Animation> CreateAnimation(double iterations,
+                                      double duration,
+                                      double playback_rate) {
   scoped_ptr<Animation> to_return(Animation::Create(
       make_scoped_ptr(
           new FakeFloatAnimationCurve(duration)).PassAs<AnimationCurve>(),
@@ -26,11 +28,16 @@ scoped_ptr<Animation> CreateAnimation(double iterations, double duration) {
       1,
       Animation::Opacity));
   to_return->set_iterations(iterations);
+  to_return->set_playback_rate(playback_rate);
   return to_return.Pass();
 }
 
+scoped_ptr<Animation> CreateAnimation(double iterations, double duration) {
+  return CreateAnimation(iterations, duration, 1);
+}
+
 scoped_ptr<Animation> CreateAnimation(double iterations) {
-  return CreateAnimation(iterations, 1);
+  return CreateAnimation(iterations, 1, 1);
 }
 
 TEST(AnimationTest, TrimTimeZeroIterations) {
@@ -429,5 +436,281 @@ TEST(AnimationTest, RunStateChangesIgnoredWhileSuspended) {
   EXPECT_EQ(Animation::Running, anim->run_state());
 }
 
+TEST(AnimationTest, TrimTimePlaybackNormal) {
+  scoped_ptr<Animation> anim(CreateAnimation(1, 1, 1));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+}
+
+TEST(AnimationTest, TrimTimePlaybackSlow) {
+  scoped_ptr<Animation> anim(CreateAnimation(1, 1, 0.5));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0)));
+}
+
+TEST(AnimationTest, TrimTimePlaybackFast) {
+  scoped_ptr<Animation> anim(CreateAnimation(1, 4, 2));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(3, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+  EXPECT_EQ(4, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(4, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
+}
+
+TEST(AnimationTest, TrimTimePlaybackNormalReverse) {
+  scoped_ptr<Animation> anim(CreateAnimation(1, 2, -1));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
+  EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
+}
+
+TEST(AnimationTest, TrimTimePlaybackSlowReverse) {
+  scoped_ptr<Animation> anim(CreateAnimation(1, 2, -0.5));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
+  EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0)));
+  EXPECT_EQ(1.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(1.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3)));
+  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)));
+}
+
+TEST(AnimationTest, TrimTimePlaybackFastReverse) {
+  scoped_ptr<Animation> anim(CreateAnimation(1, 2, -2));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
+  EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
+  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+}
+
+TEST(AnimationTest, TrimTimePlaybackFastInfiniteIterations) {
+  scoped_ptr<Animation> anim(CreateAnimation(-1, 4, 4));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1000.0)));
+  EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1000.5)));
+}
+
+TEST(AnimationTest, TrimTimePlaybackNormalDoubleReverse) {
+  scoped_ptr<Animation> anim(CreateAnimation(1, 1, -1));
+  anim->set_direction(Animation::Reverse);
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+}
+
+TEST(AnimationTest, TrimTimePlaybackFastDoubleReverse) {
+  scoped_ptr<Animation> anim(CreateAnimation(1, 4, -2));
+  anim->set_direction(Animation::Reverse);
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
+  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(3, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+  EXPECT_EQ(4, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(4, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
+}
+
+TEST(AnimationTest, TrimTimeAlternateTwoIterationsPlaybackFast) {
+  scoped_ptr<Animation> anim(CreateAnimation(2, 2, 2));
+  anim->set_direction(Animation::Alternate);
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
+  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
+}
+
+TEST(AnimationTest, TrimTimeAlternateTwoIterationsPlaybackFastReverse) {
+  scoped_ptr<Animation> anim(CreateAnimation(2, 2, 2));
+  anim->set_direction(Animation::AlternateReverse);
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
+  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
+  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
+}
+
+TEST(AnimationTest, TrimTimeAlternateTwoIterationsPlaybackFastDoubleReverse) {
+  scoped_ptr<Animation> anim(CreateAnimation(2, 2, -2));
+  anim->set_direction(Animation::AlternateReverse);
+  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
+  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
+}
+
+TEST(AnimationTest,
+     TrimTimeAlternateReverseThreeIterationsPlaybackFastAlternateReverse) {
+  scoped_ptr<Animation> anim(CreateAnimation(3, 2, -2));
+  anim->set_direction(Animation::AlternateReverse);
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
+  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.75)));
+  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0)));
+  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.25)));
+}
+
+TEST(AnimationTest,
+     TrimTimeAlternateReverseTwoIterationsPlaybackNormalAlternate) {
+  scoped_ptr<Animation> anim(CreateAnimation(2, 2, -1));
+  anim->set_direction(Animation::Alternate);
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)));
+}
+
+TEST(AnimationTest, TrimTimeIterationStart) {
+  scoped_ptr<Animation> anim(CreateAnimation(2, 1, 1));
+  anim->set_iteration_start(0.5);
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
+}
+
+TEST(AnimationTest, TrimTimeIterationStartAlternate) {
+  scoped_ptr<Animation> anim(CreateAnimation(2, 1, 1));
+  anim->set_direction(Animation::Alternate);
+  anim->set_iteration_start(0.3);
+  EXPECT_EQ(0.3, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(0.8, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.7)));
+  EXPECT_EQ(0.7, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.2)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.7)));
+}
+
+TEST(AnimationTest, TrimTimeIterationStartAlternateThreeIterations) {
+  scoped_ptr<Animation> anim(CreateAnimation(3, 1, 1));
+  anim->set_direction(Animation::Alternate);
+  anim->set_iteration_start(1);
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5)));
+}
+
+TEST(AnimationTest,
+     TrimTimeIterationStartAlternateThreeIterationsPlaybackReverse) {
+  scoped_ptr<Animation> anim(CreateAnimation(3, 1, -1));
+  anim->set_direction(Animation::Alternate);
+  anim->set_iteration_start(1);
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
+  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0)));
+  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5)));
+}
+
+TEST(AnimationTest, InEffectFillMode) {
+  scoped_ptr<Animation> anim(CreateAnimation(1));
+  anim->set_fill_mode(Animation::FillModeNone);
+  EXPECT_FALSE(anim->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
+
+  anim->set_fill_mode(Animation::FillModeForwards);
+  EXPECT_FALSE(anim->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
+
+  anim->set_fill_mode(Animation::FillModeBackwards);
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
+
+  anim->set_fill_mode(Animation::FillModeBoth);
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
+}
+
+TEST(AnimationTest, InEffectFillModePlayback) {
+  scoped_ptr<Animation> anim(CreateAnimation(1, 1, -1));
+  anim->set_fill_mode(Animation::FillModeNone);
+  EXPECT_FALSE(anim->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
+
+  anim->set_fill_mode(Animation::FillModeForwards);
+  EXPECT_FALSE(anim->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
+
+  anim->set_fill_mode(Animation::FillModeBackwards);
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
+
+  anim->set_fill_mode(Animation::FillModeBoth);
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
+}
+
 }  // namespace
 }  // namespace cc