@@ -134,6 +134,47 @@ fn attributes_are_parsed_behind_various_whitespace_characters() {
134
134
) ;
135
135
}
136
136
137
+ #[ test]
138
+ fn attributes_come_in_different_flavors_due_to_prefixes ( ) {
139
+ assert_eq ! (
140
+ line( r#"p set -unset !unspecified -set"# ) ,
141
+ (
142
+ "p" . into( ) ,
143
+ Mode :: NO_SUB_DIR ,
144
+ vec![ set( "set" ) , unset( "unset" ) , unspecified( "unspecified" ) , unset( "set" ) ] ,
145
+ 1
146
+ ) ,
147
+ "the parser doesn't care about double-mentions either"
148
+ ) ;
149
+ }
150
+
151
+ #[ test]
152
+ fn attributes_can_have_values ( ) {
153
+ assert_eq ! (
154
+ line( r#"p a=one b=2 c=你好 "# ) ,
155
+ (
156
+ "p" . into( ) ,
157
+ Mode :: NO_SUB_DIR ,
158
+ vec![ value( "a" , "one" ) , value( "b" , "2" ) , value( "c" , "你好" ) ] ,
159
+ 1
160
+ ) ,
161
+ "only non-whitespace ascii values are allowed, no escaping or anything fancy is possible there"
162
+ ) ;
163
+ }
164
+
165
+ #[ test]
166
+ fn attributes_see_state_adjustments_over_value_assignments ( ) {
167
+ assert_eq ! (
168
+ line( r#"p set -unset=a !unspecified=b"# ) ,
169
+ (
170
+ "p" . into( ) ,
171
+ Mode :: NO_SUB_DIR ,
172
+ vec![ set( "set" ) , unset( "unset" ) , unspecified( "unspecified" ) ] ,
173
+ 1
174
+ )
175
+ ) ;
176
+ }
177
+
137
178
#[ test]
138
179
fn trailing_whitespace_in_attributes_is_ignored ( ) {
139
180
assert_eq ! ( line( "p a \r \t " ) , ( "p" . into( ) , Mode :: NO_SUB_DIR , vec![ set( "a" ) ] , 1 ) , ) ;
@@ -151,6 +192,18 @@ fn set(attr: &str) -> (&BStr, State) {
151
192
( attr. as_bytes ( ) . as_bstr ( ) , State :: Set )
152
193
}
153
194
195
+ fn unset ( attr : & str ) -> ( & BStr , State ) {
196
+ ( attr. as_bytes ( ) . as_bstr ( ) , State :: Unset )
197
+ }
198
+
199
+ fn unspecified ( attr : & str ) -> ( & BStr , State ) {
200
+ ( attr. as_bytes ( ) . as_bstr ( ) , State :: Unspecified )
201
+ }
202
+
203
+ fn value < ' a , ' b > ( attr : & ' a str , value : & ' b str ) -> ( & ' a BStr , State < ' b > ) {
204
+ ( attr. as_bytes ( ) . as_bstr ( ) , State :: Value ( value. as_bytes ( ) . as_bstr ( ) ) )
205
+ }
206
+
154
207
fn try_line ( input : & str ) -> Result < ExpandedAttribute , parse:: attribute:: Error > {
155
208
let mut lines = git_attributes:: parse ( input. as_bytes ( ) ) ;
156
209
let res = expand ( lines. next ( ) . unwrap ( ) ) ?;
0 commit comments