Index: cc/animation/keyframed_animation_curve_unittest.cc |
diff --git a/cc/animation/keyframed_animation_curve_unittest.cc b/cc/animation/keyframed_animation_curve_unittest.cc |
index eceba6fc9e550b3278c6ba7d3fbc871011272de2..516a3d23031243fa3b55daf99ae0d7c24f006477 100644 |
--- a/cc/animation/keyframed_animation_curve_unittest.cc |
+++ b/cc/animation/keyframed_animation_curve_unittest.cc |
@@ -545,5 +545,79 @@ TEST(KeyframedAnimationCurveTest, MaximumScale) { |
EXPECT_FALSE(curve->MaximumScale(&maximum_scale)); |
} |
+// Tests that an animation with a curve timing function works as expected. |
+TEST(KeyframedAnimationCurveTest, CurveTiming) { |
+ scoped_ptr<KeyframedFloatAnimationCurve> curve( |
+ KeyframedFloatAnimationCurve::Create()); |
+ curve->AddKeyframe( |
+ FloatKeyframe::Create(0.0, 0.f, scoped_ptr<TimingFunction>())); |
+ curve->AddKeyframe( |
+ FloatKeyframe::Create(1.0, 1.f, scoped_ptr<TimingFunction>())); |
+ curve->SetTimingFunction( |
+ CubicBezierTimingFunction::Create(0.75f, 0.f, 0.25f, 1.f) |
+ .PassAs<TimingFunction>()); |
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(-1.f)); |
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(0.f)); |
+ EXPECT_NEAR(0.05f, curve->GetValue(0.25f), 0.005f); |
+ EXPECT_FLOAT_EQ(0.5f, curve->GetValue(0.5f)); |
+ EXPECT_NEAR(0.95f, curve->GetValue(0.75f), 0.005f); |
+ EXPECT_FLOAT_EQ(1.f, curve->GetValue(1.f)); |
+ EXPECT_FLOAT_EQ(1.f, curve->GetValue(2.f)); |
+} |
+ |
+// Tests that an animation with a curve and keyframe timing function works as |
+// expected. |
+TEST(KeyframedAnimationCurveTest, CurveAndKeyframeTiming) { |
samli
2014/09/24 07:55:32
The keyframe doesn't have a specified timing funct
ikilpatrick
2014/09/25 04:33:26
Keyframe: 473-577.
Curve: 581-583.
?
samli
2014/09/25 07:03:48
Yep, missed it sorry.
|
+ scoped_ptr<KeyframedFloatAnimationCurve> curve( |
+ KeyframedFloatAnimationCurve::Create()); |
+ curve->AddKeyframe(FloatKeyframe::Create( |
+ 0.0, |
+ 0.f, |
+ CubicBezierTimingFunction::Create(0.35f, 0.f, 0.65f, 1.f) |
+ .PassAs<TimingFunction>())); |
+ curve->AddKeyframe( |
+ FloatKeyframe::Create(1.0, 1.f, scoped_ptr<TimingFunction>())); |
+ // Curve timing function producing outputs outside of range [0,1]. |
+ curve->SetTimingFunction( |
+ CubicBezierTimingFunction::Create(0.5f, -0.5f, 0.5f, 1.5f) |
+ .PassAs<TimingFunction>()); |
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(-1.f)); |
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(0.f)); |
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(0.25f)); // Clamped. c(.25) < 0 |
+ EXPECT_NEAR(0.17f, curve->GetValue(0.42f), 0.005f); // c(.42)=.27, k(.27)=.17 |
+ EXPECT_FLOAT_EQ(0.5f, curve->GetValue(0.5f)); |
+ EXPECT_NEAR(0.83f, curve->GetValue(0.58f), 0.005f); // c(.58)=.73, k(.73)=.83 |
+ EXPECT_FLOAT_EQ(1.f, curve->GetValue(0.75f)); // Clamped. c(.75) > 1 |
+ EXPECT_FLOAT_EQ(1.f, curve->GetValue(1.f)); |
+ EXPECT_FLOAT_EQ(1.f, curve->GetValue(2.f)); |
+} |
+ |
+// Tests that an animation with a curve timing function and multiple keyframes |
+// works as expected. |
+TEST(KeyframedAnimationCurveTest, CurveTimingMultipleKeyframes) { |
+ scoped_ptr<KeyframedFloatAnimationCurve> curve( |
+ KeyframedFloatAnimationCurve::Create()); |
+ curve->AddKeyframe( |
+ FloatKeyframe::Create(0.0, 0.f, scoped_ptr<TimingFunction>())); |
+ curve->AddKeyframe( |
+ FloatKeyframe::Create(1.0, 1.f, scoped_ptr<TimingFunction>())); |
+ curve->AddKeyframe( |
+ FloatKeyframe::Create(2.0, 3.f, scoped_ptr<TimingFunction>())); |
+ curve->AddKeyframe( |
+ FloatKeyframe::Create(3.0, 6.f, scoped_ptr<TimingFunction>())); |
+ curve->AddKeyframe( |
+ FloatKeyframe::Create(4.0, 9.f, scoped_ptr<TimingFunction>())); |
+ curve->SetTimingFunction(CubicBezierTimingFunction::Create( |
+ 0.5f, 0.f, 0.5f, 1.f).PassAs<TimingFunction>()); |
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(-1.f)); |
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(0.f)); |
+ EXPECT_NEAR(0.42f, curve->GetValue(1.f), 0.005f); |
+ EXPECT_NEAR(1.f, curve->GetValue(1.455f), 0.005f); |
+ EXPECT_FLOAT_EQ(3.f, curve->GetValue(2.f)); |
+ EXPECT_NEAR(7.73f, curve->GetValue(3.f), 0.01f); |
+ EXPECT_FLOAT_EQ(9.f, curve->GetValue(4.f)); |
+ EXPECT_FLOAT_EQ(9.f, curve->GetValue(5.f)); |
+} |
+ |
} // namespace |
} // namespace cc |