position.rs (8578B)
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] 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] 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] 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 }