Skip to main content

css_ast/values/transforms/
impls.rs

1use super::TransformOriginStyleValue;
2use crate::{Length, PositionOne, PositionTwo};
3use css_parse::{Cursor, Diagnostic, Parse, Parser, Peek, Result as ParseResult, T};
4
5impl<'a> Parse<'a> for TransformOriginStyleValue {
6	fn parse<I>(p: &mut Parser<'a, I>) -> ParseResult<Self>
7	where
8		I: Iterator<Item = Cursor> + Clone,
9	{
10		let first = p.parse::<PositionOne>()?;
11		let Some(second) = p.parse_if_peek::<PositionOne>()? else { return Ok(Self::PositionOne(first)) };
12		let two = PositionTwo::from_two(p, first, second)?;
13		Ok(Self::PositionTwo(two, p.parse_if_peek::<Length>()?))
14	}
15}
16
17#[cfg(test)]
18mod tests {
19	use super::super::*;
20	use crate::CssAtomSet;
21	use css_parse::{assert_parse, assert_parse_error, assert_peek_false};
22
23	#[test]
24	fn size_test() {
25		assert_eq!(std::mem::size_of::<TransformStyleValue>(), 32);
26		// assert_eq!(std::mem::size_of::<TransformOriginStyleValue>(), 16);
27		assert_eq!(std::mem::size_of::<TransformBoxStyleValue>(), 16);
28		assert_eq!(std::mem::size_of::<TranslateStyleValue>(), 48);
29		// assert_eq!(std::mem::size_of::<RotateStyleValue>(), 16);
30		assert_eq!(std::mem::size_of::<ScaleStyleValue>(), 48);
31		assert_eq!(std::mem::size_of::<TransformStyleStyleValue>(), 16);
32		assert_eq!(std::mem::size_of::<PerspectiveStyleValue>(), 16);
33		assert_eq!(std::mem::size_of::<PerspectiveOriginStyleValue>(), 68);
34		assert_eq!(std::mem::size_of::<BackfaceVisibilityStyleValue>(), 16);
35	}
36
37	#[test]
38	fn test_writes() {
39		assert_parse!(CssAtomSet::ATOMS, TransformStyleValue, "none");
40		assert_parse!(CssAtomSet::ATOMS, TransformStyleValue, "scale(1)");
41		assert_parse!(CssAtomSet::ATOMS, TransformBoxStyleValue, "fill-box");
42		assert_parse!(CssAtomSet::ATOMS, ScaleStyleValue, "none");
43		assert_parse!(CssAtomSet::ATOMS, ScaleStyleValue, "1%");
44		assert_parse!(CssAtomSet::ATOMS, ScaleStyleValue, "1 2 3");
45		assert_parse!(CssAtomSet::ATOMS, ScaleStyleValue, "1.7 50%");
46		assert_parse!(CssAtomSet::ATOMS, TransformStyleStyleValue, "flat");
47		assert_parse!(CssAtomSet::ATOMS, PerspectiveOriginStyleValue, "1px");
48		assert_parse!(CssAtomSet::ATOMS, BackfaceVisibilityStyleValue, "visible");
49	}
50
51	#[test]
52	fn test_errors() {
53		assert_peek_false!(CssAtomSet::ATOMS, TransformStyleValue, "auto");
54		assert_parse_error!(CssAtomSet::ATOMS, ScaleStyleValue, "none none");
55	}
56
57	#[test]
58	fn test_transform_origin() {
59		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "left");
60		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "center");
61		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "right");
62		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "top");
63		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "bottom");
64		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "50%");
65		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "10px");
66		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "0");
67		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "left top");
68		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "left center");
69		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "left bottom");
70		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "center top");
71		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "center center");
72		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "center bottom");
73		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "right top");
74		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "right center");
75		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "right bottom");
76		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "50% 50%");
77		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "10px 20px");
78		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "0 0");
79		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "left 50%");
80		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "right 25%");
81		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "center 10px");
82		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "50% top");
83		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "75% bottom");
84		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "10px center");
85		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "left top 5px");
86		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "center center 0px");
87		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "50% 50% 10px");
88		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "right bottom 100px");
89		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "10px 20px 30px");
90		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "top left");
91		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "top center");
92		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "top right");
93		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "bottom left");
94		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "bottom center");
95		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "bottom right");
96		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "top left 5px");
97		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "bottom right 20px");
98		assert_parse!(CssAtomSet::ATOMS, TransformOriginStyleValue, "top center 0px");
99	}
100
101	#[test]
102	fn test_transform_origin_errors() {
103		assert_peek_false!(CssAtomSet::ATOMS, TransformOriginStyleValue, "auto");
104		assert_parse_error!(CssAtomSet::ATOMS, TransformOriginStyleValue, "top top");
105		assert_parse_error!(CssAtomSet::ATOMS, TransformOriginStyleValue, "left left");
106		assert_parse_error!(CssAtomSet::ATOMS, TransformOriginStyleValue, "left top 50%");
107		assert_parse_error!(CssAtomSet::ATOMS, TransformOriginStyleValue, "left top 0px extra");
108	}
109}