1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 use parsing::{parse, parse_entirely};
6 use style::parser::Parse;
7 use style::values::specified::position::*;
8 use style_traits::ToCss;
9 
10 #[test]
test_position()11 fn test_position() {
12     // Serialization is not actually specced
13     // though these are the values expected by basic-shape
14     // https://github.com/w3c/csswg-drafts/issues/368
15     assert_roundtrip_with_context!(Position::parse, "center", "center center");
16     assert_roundtrip_with_context!(Position::parse, "top left", "left top");
17     assert_roundtrip_with_context!(Position::parse, "left top", "left top");
18     assert_roundtrip_with_context!(Position::parse, "top right", "right top");
19     assert_roundtrip_with_context!(Position::parse, "right top", "right top");
20     assert_roundtrip_with_context!(Position::parse, "bottom left", "left bottom");
21     assert_roundtrip_with_context!(Position::parse, "left bottom", "left bottom");
22     assert_roundtrip_with_context!(Position::parse, "left center", "left center");
23     assert_roundtrip_with_context!(Position::parse, "right center", "right center");
24     assert_roundtrip_with_context!(Position::parse, "center top", "center top");
25     assert_roundtrip_with_context!(Position::parse, "center bottom", "center bottom");
26     assert_roundtrip_with_context!(Position::parse, "center 10px", "center 10px");
27     assert_roundtrip_with_context!(Position::parse, "center 10%", "center 10%");
28     assert_roundtrip_with_context!(Position::parse, "right 10%", "right 10%");
29 
30     // Only keywords can be reordered
31     assert!(parse_entirely(Position::parse, "top 40%").is_err());
32     assert!(parse_entirely(Position::parse, "40% left").is_err());
33 
34     // 3 and 4 value serialization
35     assert_roundtrip_with_context!(Position::parse, "left 10px top 15px", "left 10px top 15px");
36     assert_roundtrip_with_context!(Position::parse, "top 15px left 10px", "left 10px top 15px");
37     assert_roundtrip_with_context!(Position::parse, "left 10% top 15px", "left 10% top 15px");
38     assert_roundtrip_with_context!(Position::parse, "top 15px left 10%", "left 10% top 15px");
39     assert_roundtrip_with_context!(Position::parse, "left top 15px", "left top 15px");
40     assert_roundtrip_with_context!(Position::parse, "top 15px left", "left top 15px");
41     assert_roundtrip_with_context!(Position::parse, "left 10px top", "left 10px top");
42     assert_roundtrip_with_context!(Position::parse, "top left 10px", "left 10px top");
43     assert_roundtrip_with_context!(Position::parse, "right 10px bottom", "right 10px bottom");
44     assert_roundtrip_with_context!(Position::parse, "bottom right 10px", "right 10px bottom");
45     assert_roundtrip_with_context!(Position::parse, "center right 10px", "right 10px center");
46     assert_roundtrip_with_context!(Position::parse, "center bottom 10px", "center bottom 10px");
47 
48     // Invalid 3 value positions
49     assert!(parse_entirely(Position::parse, "20px 30px 20px").is_err());
50     assert!(parse_entirely(Position::parse, "top 30px 20px").is_err());
51     assert!(parse_entirely(Position::parse, "50% bottom 20%").is_err());
52 
53     // Only horizontal and vertical keywords can have positions
54     assert!(parse_entirely(Position::parse, "center 10px left 15px").is_err());
55     assert!(parse_entirely(Position::parse, "center 10px 15px").is_err());
56     assert!(parse_entirely(Position::parse, "center 10px bottom").is_err());
57 
58     // "Horizontal Horizontal" or "Vertical Vertical" positions cause error
59     assert!(parse_entirely(Position::parse, "left right").is_err());
60     assert!(parse_entirely(Position::parse, "left 10px right").is_err());
61     assert!(parse_entirely(Position::parse, "left 10px right 15%").is_err());
62     assert!(parse_entirely(Position::parse, "top bottom").is_err());
63     assert!(parse_entirely(Position::parse, "top 10px bottom").is_err());
64     assert!(parse_entirely(Position::parse, "top 10px bottom 15%").is_err());
65 
66     // Logical keywords are not supported in Position yet.
67     assert!(parse(Position::parse, "x-start").is_err());
68     assert!(parse(Position::parse, "y-end").is_err());
69     assert!(parse(Position::parse, "x-start y-end").is_err());
70     assert!(parse(Position::parse, "x-end 10px").is_err());
71     assert!(parse(Position::parse, "y-start 20px").is_err());
72     assert!(parse(Position::parse, "x-start bottom 10%").is_err());
73     assert!(parse_entirely(Position::parse, "left y-start 10%").is_err());
74     assert!(parse(Position::parse, "x-start 20px y-end 10%").is_err());
75 }
76 
77 #[test]
test_horizontal_position()78 fn test_horizontal_position() {
79     // One value serializations.
80     assert_roundtrip_with_context!(HorizontalPosition::parse, "20px", "20px");
81     assert_roundtrip_with_context!(HorizontalPosition::parse, "25%", "25%");
82     assert_roundtrip_with_context!(HorizontalPosition::parse, "center", "center");
83     assert_roundtrip_with_context!(HorizontalPosition::parse, "left", "left");
84     assert_roundtrip_with_context!(HorizontalPosition::parse, "right", "right");
85 
86     // Two value serializations.
87     assert_roundtrip_with_context!(HorizontalPosition::parse, "right 10px", "right 10px");
88 
89     // Invalid horizontal positions.
90     assert!(parse(HorizontalPosition::parse, "top").is_err());
91     assert!(parse(HorizontalPosition::parse, "bottom").is_err());
92     assert!(parse(HorizontalPosition::parse, "y-start").is_err());
93     assert!(parse(HorizontalPosition::parse, "y-end").is_err());
94     assert!(parse(HorizontalPosition::parse, "y-end 20px ").is_err());
95     assert!(parse(HorizontalPosition::parse, "bottom 20px").is_err());
96     assert!(parse(HorizontalPosition::parse, "bottom top").is_err());
97     assert!(parse_entirely(HorizontalPosition::parse, "20px y-end").is_err());
98     assert!(parse_entirely(HorizontalPosition::parse, "20px top").is_err());
99     assert!(parse_entirely(HorizontalPosition::parse, "left center").is_err());
100     assert!(parse_entirely(HorizontalPosition::parse, "left top").is_err());
101     assert!(parse_entirely(HorizontalPosition::parse, "left right").is_err());
102     assert!(parse_entirely(HorizontalPosition::parse, "20px 30px").is_err());
103     assert!(parse_entirely(HorizontalPosition::parse, "10px left").is_err());
104     assert!(parse_entirely(HorizontalPosition::parse, "x-end 20%").is_err());
105     assert!(parse_entirely(HorizontalPosition::parse, "20px x-start").is_err());
106 
107     // Logical keywords are not supported in Position yet.
108     assert!(parse(HorizontalPosition::parse, "x-start").is_err());
109     assert!(parse(HorizontalPosition::parse, "x-end").is_err());
110 }
111 
112 #[test]
test_vertical_position()113 fn test_vertical_position() {
114     // One value serializations.
115     assert_roundtrip_with_context!(VerticalPosition::parse, "20px", "20px");
116     assert_roundtrip_with_context!(VerticalPosition::parse, "25%", "25%");
117     assert_roundtrip_with_context!(VerticalPosition::parse, "center", "center");
118     assert_roundtrip_with_context!(VerticalPosition::parse, "top", "top");
119     assert_roundtrip_with_context!(VerticalPosition::parse, "bottom", "bottom");
120 
121     // Two value serializations.
122     assert_roundtrip_with_context!(VerticalPosition::parse, "bottom 10px", "bottom 10px");
123 
124     // Invalid vertical positions.
125     assert!(parse(VerticalPosition::parse, "left").is_err());
126     assert!(parse(VerticalPosition::parse, "right").is_err());
127     assert!(parse(VerticalPosition::parse, "x-start").is_err());
128     assert!(parse(VerticalPosition::parse, "x-end").is_err());
129     assert!(parse(VerticalPosition::parse, "x-end 20px").is_err());
130     assert!(parse(VerticalPosition::parse, "left 20px").is_err());
131     assert!(parse(VerticalPosition::parse, "left center").is_err());
132     assert!(parse(VerticalPosition::parse, "left top").is_err());
133     assert!(parse(VerticalPosition::parse, "left right").is_err());
134     assert!(parse_entirely(VerticalPosition::parse, "20px x-end").is_err());
135     assert!(parse_entirely(VerticalPosition::parse, "20px right").is_err());
136     assert!(parse_entirely(VerticalPosition::parse, "bottom top").is_err());
137     assert!(parse_entirely(VerticalPosition::parse, "20px 30px").is_err());
138     assert!(parse_entirely(VerticalPosition::parse, "10px top").is_err());
139     assert!(parse_entirely(VerticalPosition::parse, "y-end 20%").is_err());
140     assert!(parse_entirely(VerticalPosition::parse, "20px y-start").is_err());
141 
142     // Logical keywords are not supported in Position yet.
143     assert!(parse(VerticalPosition::parse, "y-start").is_err());
144     assert!(parse(VerticalPosition::parse, "y-end").is_err());
145 }
146