@@ -336,6 +336,11 @@ fn slice_selector(q: &str) -> IResult<&str, Selector, InternalParseError> {
336
336
} ;
337
337
}
338
338
339
+ // Fixup the bounds - if start was not given and step is negative, the default must be reversed.
340
+ if slice. step . is_backward ( ) && opt_start. is_none ( ) {
341
+ slice. start = crate :: Slice :: default_start_backwards ( ) ;
342
+ }
343
+
339
344
Ok ( ( rest, Selector :: Slice ( slice) ) )
340
345
}
341
346
@@ -1020,8 +1025,8 @@ mod tests {
1020
1025
#[ test_case( "-3:-4:-5" , Index :: FromEnd ( 3 . try_into( ) . unwrap( ) ) , Some ( Index :: FromEnd ( 4 . try_into( ) . unwrap( ) ) ) , Step :: Backward ( 5 . try_into( ) . unwrap( ) ) ; "test m3cm4cm5" ) ]
1021
1026
#[ test_case( ":4:5" , Index :: FromStart ( 0 . into( ) ) , Some ( Index :: FromStart ( 4 . into( ) ) ) , Step :: Forward ( 5 . into( ) ) ; "test c4c5" ) ]
1022
1027
#[ test_case( ":-4:5" , Index :: FromStart ( 0 . into( ) ) , Some ( Index :: FromEnd ( 4 . try_into( ) . unwrap( ) ) ) , Step :: Forward ( 5 . into( ) ) ; "test cm4c5" ) ]
1023
- #[ test_case( ":4:-5" , Index :: FromStart ( 0 . into ( ) ) , Some ( Index :: FromStart ( 4 . into( ) ) ) , Step :: Backward ( 5 . try_into( ) . unwrap( ) ) ; "test c4cm5" ) ]
1024
- #[ test_case( ":-4:-5" , Index :: FromStart ( 0 . into ( ) ) , Some ( Index :: FromEnd ( 4 . try_into( ) . unwrap( ) ) ) , Step :: Backward ( 5 . try_into( ) . unwrap( ) ) ; "test cm4cm5" ) ]
1028
+ #[ test_case( ":4:-5" , Index :: FromEnd ( 1 . try_into ( ) . unwrap ( ) ) , Some ( Index :: FromStart ( 4 . into( ) ) ) , Step :: Backward ( 5 . try_into( ) . unwrap( ) ) ; "test c4cm5" ) ]
1029
+ #[ test_case( ":-4:-5" , Index :: FromEnd ( 1 . try_into ( ) . unwrap ( ) ) , Some ( Index :: FromEnd ( 4 . try_into( ) . unwrap( ) ) ) , Step :: Backward ( 5 . try_into( ) . unwrap( ) ) ; "test cm4cm5" ) ]
1025
1030
#[ test_case( "3::5" , Index :: FromStart ( 3 . into( ) ) , None , Step :: Forward ( 5 . into( ) ) ; "test 3cc5" ) ]
1026
1031
#[ test_case( "-3::5" , Index :: FromEnd ( 3 . try_into( ) . unwrap( ) ) , None , Step :: Forward ( 5 . into( ) ) ; "test m3cc5" ) ]
1027
1032
#[ test_case( "3::-5" , Index :: FromStart ( 3 . into( ) ) , None , Step :: Backward ( 5 . try_into( ) . unwrap( ) ) ; "test 3ccm5" ) ]
@@ -1039,9 +1044,12 @@ mod tests {
1039
1044
#[ test_case( ":4" , Index :: FromStart ( 0 . into( ) ) , Some ( Index :: FromStart ( 4 . into( ) ) ) , Step :: Forward ( 1 . into( ) ) ; "test c4" ) ]
1040
1045
#[ test_case( ":-4" , Index :: FromStart ( 0 . into( ) ) , Some ( Index :: FromEnd ( 4 . try_into( ) . unwrap( ) ) ) , Step :: Forward ( 1 . into( ) ) ; "test cm4" ) ]
1041
1046
#[ test_case( "::5" , Index :: FromStart ( 0 . into( ) ) , None , Step :: Forward ( 5 . into( ) ) ; "test cc5" ) ]
1042
- #[ test_case( "::-5" , Index :: FromStart ( 0 . into ( ) ) , None , Step :: Backward ( 5 . try_into( ) . unwrap( ) ) ; "test ccm5" ) ]
1047
+ #[ test_case( "::-5" , Index :: FromEnd ( 1 . try_into ( ) . unwrap ( ) ) , None , Step :: Backward ( 5 . try_into( ) . unwrap( ) ) ; "test ccm5" ) ]
1043
1048
#[ test_case( "::" , Index :: FromStart ( 0 . into( ) ) , None , Step :: Forward ( 1 . into( ) ) ; "test cc" ) ]
1044
- fn full_positive_slice ( input : & str , exp_start : Index , exp_end : Option < Index > , exp_step : Step ) {
1049
+ #[ test_case( "::-1" , Index :: FromEnd ( 1 . try_into( ) . unwrap( ) ) , None , Step :: Backward ( 1 . try_into( ) . unwrap( ) ) ; "test ccm1" ) ]
1050
+ #[ test_case( "0::-1" , Index :: FromStart ( 0 . into( ) ) , None , Step :: Backward ( 1 . try_into( ) . unwrap( ) ) ; "test 0ccm1" ) ]
1051
+ #[ test_case( "0:0:-1" , Index :: FromStart ( 0 . into( ) ) , Some ( Index :: FromStart ( 0 . into( ) ) ) , Step :: Backward ( 1 . try_into( ) . unwrap( ) ) ; "test 0c0cm1" ) ]
1052
+ fn slice ( input : & str , exp_start : Index , exp_end : Option < Index > , exp_step : Step ) {
1045
1053
let ( rest, selector) = super :: slice_selector ( input) . expect ( "should parse" ) ;
1046
1054
assert_eq ! ( "" , rest) ;
1047
1055
match selector {
0 commit comments