css_ast/values/transforms/
impls.rs1use 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::<TransformBoxStyleValue>(), 16);
28 assert_eq!(std::mem::size_of::<TranslateStyleValue>(), 48);
29 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}