use super::util::*;
#[test]
fn transform() {
fn assert_affine_close(actual: Affine, expected: Affine) {
let a = actual.as_coeffs();
let e = expected.as_coeffs();
for i in 0..6 {
let diff = (a[i] - e[i]).abs();
assert!(diff <= 1e-9, "affine coeff[{}] differs too much: actual={} expected={} diff={}", i, a[i], e[i], diff);
}
}
let styles = apply_css_to_tree(".root { transform: none; }", single_node_tree);
assert_eq!(styles[0].transform, Affine::IDENTITY);
let styles = apply_css_to_tree(".root { transform: matrix(1, 0, 0, 1, 10, 20); }", single_node_tree);
assert_eq!(styles[0].transform, Affine::new([1.0, 0.0, 0.0, 1.0, 10.0, 20.0]));
let styles = apply_css_to_tree(".root { transform: translate(10px, 20px); }", single_node_tree);
assert_eq!(styles[0].transform, Affine::new([1.0, 0.0, 0.0, 1.0, 10.0, 20.0]));
let styles = apply_css_to_tree(".root { transform: scale(2, 3); }", single_node_tree);
assert_eq!(styles[0].transform, Affine::new([2.0, 0.0, 0.0, 3.0, 0.0, 0.0]));
let styles = apply_css_to_tree(".root { transform: rotate(90deg); }", single_node_tree);
let theta = std::f64::consts::PI / 2.0;
let expected = Affine::new([theta.cos(), theta.sin(), -theta.sin(), theta.cos(), 0.0, 0.0]);
assert_affine_close(styles[0].transform, expected);
let styles = apply_css_to_tree(".root { transform: skew(45deg, 0deg); }", single_node_tree);
let ax = std::f64::consts::PI / 4.0;
let expected = Affine::new([1.0, 0.0, ax.tan(), 1.0, 0.0, 0.0]);
assert_affine_close(styles[0].transform, expected);
let styles = apply_css_to_tree(".child { transform: matrix(1, 0, 0, 1, 10, 20); } .right { transform: initial; }", two_child_tree);
assert_eq!(styles[1].transform, Affine::new([1.0, 0.0, 0.0, 1.0, 10.0, 20.0]));
assert_eq!(styles[2].transform, Affine::IDENTITY);
let styles = apply_css_to_tree(".parent { transform: matrix(1, 0, 0, 1, 10, 20); } .child { transform: inherit; }", one_child_tree);
assert_eq!(styles[0].transform, Affine::new([1.0, 0.0, 0.0, 1.0, 10.0, 20.0]));
assert_eq!(styles[1].transform, Affine::new([1.0, 0.0, 0.0, 1.0, 10.0, 20.0]));
let styles = apply_css_to_tree(".parent { transform: matrix(1, 0, 0, 1, 10, 20); }", one_child_tree);
assert_eq!(styles[0].transform, Affine::new([1.0, 0.0, 0.0, 1.0, 10.0, 20.0]));
assert_eq!(styles[1].transform, Affine::IDENTITY);
}
#[test]
fn transform_reject() {
fn reject(value: &str) {
let css = format!(".root {{ transform: {}; }}", value);
let styles = apply_css_to_tree(&css, single_node_tree);
assert_eq!(styles[0].transform, Style::default().transform, "expected parser to reject transform: {}", value);
}
for value in [
"auto", "foo", "#fff", "10px", "rotate", "matrix", "translate", "scale", "skew", "none rotate(10deg)", "matrix(1,0,0,1,10,20) extra", "matrix(1,0,0,1,10,20)!important", "matrix(1, 0, 0, 1, 10, 20", "matrix(1, 0, 0, 1, 10, 20))", "matrix((1, 0, 0, 1, 10, 20)", "matrix[1, 0, 0, 1, 10, 20]", "matrix(1, 0, 0, 1, 10, 20),", "matrix()", "matrix(1)", "matrix(1, 0, 0, 1, 10)", "matrix(1, 0, 0, 1, 10, 20, 30)", "matrix(1, 0, 0, 1, 10,, 20)", "matrix(,1, 0, 0, 1, 10, 20)", "matrix(1, 0, 0, 1, 10, 20,)", "matrix(1, 0, 0, 1, , 20)", "matrix(1, 0, 0, 1, 10, )", "matrix(1, 0, 0, 1, 10px, 20)", "matrix(1, 0, 0, 1, 10, 20px)", "matrix(1, 0, 0, 1, 10%, 20)", "matrix(1, 0, 0, 1, NaN, 20)", "matrix(1, 0, 0, 1, inf, 20)", "matrix(1, 0, 0, 1, -inf, 20)", "matrix(a, 0, 0, 1, 10, 20)", "translate()", "translate(10)", "translate(10, 20)", "translate(10px,)", "translate(, 10px)", "translate(10px, 20px, 30px)", "translate(10%, 20px)", "translate(10px, 20%)", "translate(foo, 20px)", "translate(10px, bar)", "translate(-)", "scale()", "scale(,)", "scale(2,)", "scale(,2)", "scale(2, 3, 4)", "scale(2px, 3)", "scale(2, 3px)", "scale(2%)", "scale(foo)", "rotate()", "rotate(90)", "rotate(90px)", "rotate(90deg, 1)", "rotate(,90deg)", "rotate(90deg,)", "rotate(foo)", "rotate(10% )", "rotate(10deg 20deg)", "skew()", "skew(10)", "skew(10px)", "skew(10deg,)", "skew(,10deg)", "skew(10deg, 20deg, 30deg)", "skew(foo, 10deg)", "skew(10deg, bar)", ] {
reject(value);
}
}