summaryrefslogtreecommitdiffstats
path: root/servo/tests/unit/style/animated_properties.rs
diff options
context:
space:
mode:
Diffstat (limited to 'servo/tests/unit/style/animated_properties.rs')
-rw-r--r--servo/tests/unit/style/animated_properties.rs225
1 files changed, 225 insertions, 0 deletions
diff --git a/servo/tests/unit/style/animated_properties.rs b/servo/tests/unit/style/animated_properties.rs
new file mode 100644
index 0000000000..05b74de16c
--- /dev/null
+++ b/servo/tests/unit/style/animated_properties.rs
@@ -0,0 +1,225 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+use cssparser::RGBA;
+use style::values::animated::{Animate, Procedure, ToAnimatedValue};
+use style::values::computed::Percentage;
+use style::values::generics::transform::{Transform, TransformOperation};
+
+fn interpolate_rgba(from: RGBA, to: RGBA, progress: f64) -> RGBA {
+ let from = from.to_animated_value();
+ let to = to.to_animated_value();
+ RGBA::from_animated_value(
+ from.animate(&to, Procedure::Interpolate { progress })
+ .unwrap(),
+ )
+}
+
+// Color
+#[test]
+fn test_rgba_color_interepolation_preserves_transparent() {
+ assert_eq!(
+ interpolate_rgba(RGBA::transparent(), RGBA::transparent(), 0.5),
+ RGBA::transparent()
+ );
+}
+
+#[test]
+fn test_rgba_color_interepolation_alpha() {
+ assert_eq!(
+ interpolate_rgba(RGBA::new(200, 0, 0, 100), RGBA::new(0, 200, 0, 200), 0.5),
+ RGBA::new(67, 133, 0, 150)
+ );
+}
+
+#[test]
+fn test_rgba_color_interepolation_out_of_range_1() {
+ // Some cubic-bezier functions produce values that are out of range [0, 1].
+ // Unclamped cases.
+ assert_eq!(
+ interpolate_rgba(
+ RGBA::from_floats(0.3, 0.0, 0.0, 0.4),
+ RGBA::from_floats(0.0, 1.0, 0.0, 0.6),
+ -0.5
+ ),
+ RGBA::new(154, 0, 0, 77)
+ );
+}
+
+#[test]
+fn test_rgba_color_interepolation_out_of_range_2() {
+ assert_eq!(
+ interpolate_rgba(
+ RGBA::from_floats(1.0, 0.0, 0.0, 0.6),
+ RGBA::from_floats(0.0, 0.3, 0.0, 0.4),
+ 1.5
+ ),
+ RGBA::new(0, 154, 0, 77)
+ );
+}
+
+#[test]
+fn test_rgba_color_interepolation_out_of_range_clamped_1() {
+ assert_eq!(
+ interpolate_rgba(
+ RGBA::from_floats(1.0, 0.0, 0.0, 0.8),
+ RGBA::from_floats(0.0, 1.0, 0.0, 0.2),
+ -0.5
+ ),
+ RGBA::from_floats(1.0, 0.0, 0.0, 1.0)
+ );
+}
+
+#[test]
+fn test_rgba_color_interepolation_out_of_range_clamped_2() {
+ assert_eq!(
+ interpolate_rgba(
+ RGBA::from_floats(1.0, 0.0, 0.0, 0.8),
+ RGBA::from_floats(0.0, 1.0, 0.0, 0.2),
+ 1.5
+ ),
+ RGBA::from_floats(0.0, 0.0, 0.0, 0.0)
+ );
+}
+
+// Transform
+#[test]
+fn test_transform_interpolation_on_translate() {
+ use style::values::computed::{CalcLengthPercentage, Length, LengthPercentage};
+
+ let from = Transform(vec![TransformOperation::Translate3D(
+ LengthPercentage::Length(Length::new(0.)),
+ LengthPercentage::Length(Length::new(100.)),
+ Length::new(25.),
+ )]);
+ let to = Transform(vec![TransformOperation::Translate3D(
+ LengthPercentage::Length(Length::new(100.)),
+ LengthPercentage::Length(Length::new(0.)),
+ Length::new(75.),
+ )]);
+ assert_eq!(
+ from.animate(&to, Procedure::Interpolate { progress: 0.5 })
+ .unwrap(),
+ Transform(vec![TransformOperation::Translate3D(
+ LengthPercentage::Length(Length::new(50.)),
+ LengthPercentage::Length(Length::new(50.)),
+ Length::new(50.),
+ )])
+ );
+
+ let from = Transform(vec![TransformOperation::Translate3D(
+ LengthPercentage::Percentage(Percentage(0.5)),
+ LengthPercentage::Percentage(Percentage(1.0)),
+ Length::new(25.),
+ )]);
+ let to = Transform(vec![TransformOperation::Translate3D(
+ LengthPercentage::Length(Length::new(100.)),
+ LengthPercentage::Length(Length::new(50.)),
+ Length::new(75.),
+ )]);
+ assert_eq!(
+ from.animate(&to, Procedure::Interpolate { progress: 0.5 })
+ .unwrap(),
+ Transform(vec![TransformOperation::Translate3D(
+ // calc(50px + 25%)
+ LengthPercentage::Calc(CalcLengthPercentage::new(
+ Length::new(50.),
+ Some(Percentage(0.25))
+ )),
+ // calc(25px + 50%)
+ LengthPercentage::Calc(CalcLengthPercentage::new(
+ Length::new(25.),
+ Some(Percentage(0.5))
+ )),
+ Length::new(50.),
+ )])
+ );
+}
+
+#[test]
+fn test_transform_interpolation_on_scale() {
+ let from = Transform(vec![TransformOperation::Scale3D(1.0, 2.0, 1.0)]);
+ let to = Transform(vec![TransformOperation::Scale3D(2.0, 4.0, 2.0)]);
+ assert_eq!(
+ from.animate(&to, Procedure::Interpolate { progress: 0.5 })
+ .unwrap(),
+ Transform(vec![TransformOperation::Scale3D(1.5, 3.0, 1.5)])
+ );
+}
+
+#[test]
+fn test_transform_interpolation_on_rotate() {
+ use style::values::computed::Angle;
+
+ let from = Transform(vec![TransformOperation::Rotate3D(
+ 0.0,
+ 0.0,
+ 1.0,
+ Angle::from_radians(0.0),
+ )]);
+ let to = Transform(vec![TransformOperation::Rotate3D(
+ 0.0,
+ 0.0,
+ 1.0,
+ Angle::from_radians(100.0),
+ )]);
+ assert_eq!(
+ from.animate(&to, Procedure::Interpolate { progress: 0.5 })
+ .unwrap(),
+ Transform(vec![TransformOperation::Rotate3D(
+ 0.0,
+ 0.0,
+ 1.0,
+ Angle::from_radians(50.0)
+ ),])
+ );
+}
+
+#[test]
+fn test_transform_interpolation_on_skew() {
+ use style::values::computed::Angle;
+
+ let from = Transform(vec![TransformOperation::Skew(
+ Angle::from_radians(0.0),
+ Some(Angle::from_radians(100.0)),
+ )]);
+ let to = Transform(vec![TransformOperation::Skew(
+ Angle::from_radians(100.0),
+ Some(Angle::from_radians(0.0)),
+ )]);
+ assert_eq!(
+ from.animate(&to, Procedure::Interpolate { progress: 0.5 })
+ .unwrap(),
+ Transform(vec![TransformOperation::Skew(
+ Angle::from_radians(50.0),
+ Some(Angle::from_radians(50.0)),
+ )])
+ );
+}
+
+#[test]
+fn test_transform_interpolation_on_mismatched_lists() {
+ use style::values::computed::{Angle, Length, LengthPercentage};
+
+ let from = Transform(vec![TransformOperation::Rotate3D(
+ 0.0,
+ 0.0,
+ 1.0,
+ Angle::from_radians(100.0),
+ )]);
+ let to = Transform(vec![TransformOperation::Translate3D(
+ LengthPercentage::Length(Length::new(100.)),
+ LengthPercentage::Length(Length::new(0.)),
+ Length::new(0.),
+ )]);
+ assert_eq!(
+ from.animate(&to, Procedure::Interpolate { progress: 0.5 })
+ .unwrap(),
+ Transform(vec![TransformOperation::InterpolateMatrix {
+ from_list: from.clone(),
+ to_list: to.clone(),
+ progress: Percentage(0.5),
+ }])
+ );
+}