@@ -993,6 +993,80 @@ fn test_rsplitnator() {
993993 assert ! ( xs. rsplitn( 0 , |x| * x % 2 == 0 ) . next( ) . is_none( ) ) ;
994994}
995995
996+ #[ test]
997+ fn test_split_iterators_size_hint ( ) {
998+ for len in 0 ..=2 {
999+ let mut v: Vec < u8 > = ( 0 ..len) . collect ( ) ;
1000+ fn verify_descending ( sequence : & [ usize ] , context : & str ) {
1001+ let len = sequence. len ( ) ;
1002+ let target: Vec < usize > = ( 0 ..len) . rev ( ) . collect ( ) ;
1003+ assert_eq ! ( sequence, target, "while testing: {}" , context) ;
1004+ }
1005+
1006+ macro_rules! test_size_hint {
1007+ ( $create_iterator: expr) => { {
1008+ // with a predicate always returning false, the split*-iterators
1009+ // become maximally short, so the size_hint lower bounds are correct
1010+
1011+ macro_rules! p {
1012+ ( ) => {
1013+ |_| false
1014+ } ;
1015+ }
1016+ let mut short_iterator = $create_iterator;
1017+ let mut lower_bounds = vec![ short_iterator. size_hint( ) . 0 ] ;
1018+ while let Some ( _) = short_iterator. next( ) {
1019+ lower_bounds. push( short_iterator. size_hint( ) . 0 ) ;
1020+ }
1021+ verify_descending( & lower_bounds, stringify!( $create_iterator) ) ;
1022+ }
1023+ {
1024+ // with a predicate always returning true, the split*-iterators
1025+ // become maximally long, so the size_hint upper bounds are correct
1026+
1027+ macro_rules! p {
1028+ ( ) => {
1029+ |_| true
1030+ } ;
1031+ }
1032+ let mut long_iterator = $create_iterator;
1033+ let mut upper_bounds = vec![
1034+ long_iterator. size_hint( ) . 1 . expect( "split*-methods have known upper bound" ) ,
1035+ ] ;
1036+ while let Some ( _) = long_iterator. next( ) {
1037+ upper_bounds. push(
1038+ long_iterator. size_hint( ) . 1 . expect( "split*-methods have known upper bound" ) ,
1039+ ) ;
1040+ }
1041+ verify_descending( & upper_bounds, stringify!( $create_iterator) ) ;
1042+ } } ;
1043+ }
1044+
1045+ test_size_hint ! ( v. split( p!( ) ) ) ;
1046+ test_size_hint ! ( v. split_mut( p!( ) ) ) ;
1047+ test_size_hint ! ( v. splitn( 0 , p!( ) ) ) ;
1048+ test_size_hint ! ( v. splitn( 1 , p!( ) ) ) ;
1049+ test_size_hint ! ( v. splitn( 2 , p!( ) ) ) ;
1050+ test_size_hint ! ( v. splitn( 3 , p!( ) ) ) ;
1051+ test_size_hint ! ( v. splitn_mut( 0 , p!( ) ) ) ;
1052+ test_size_hint ! ( v. splitn_mut( 1 , p!( ) ) ) ;
1053+ test_size_hint ! ( v. splitn_mut( 2 , p!( ) ) ) ;
1054+ test_size_hint ! ( v. splitn_mut( 3 , p!( ) ) ) ;
1055+ test_size_hint ! ( v. split_inclusive( p!( ) ) ) ;
1056+ test_size_hint ! ( v. split_inclusive_mut( p!( ) ) ) ;
1057+ test_size_hint ! ( v. rsplit( p!( ) ) ) ;
1058+ test_size_hint ! ( v. rsplit_mut( p!( ) ) ) ;
1059+ test_size_hint ! ( v. rsplitn( 0 , p!( ) ) ) ;
1060+ test_size_hint ! ( v. rsplitn( 1 , p!( ) ) ) ;
1061+ test_size_hint ! ( v. rsplitn( 2 , p!( ) ) ) ;
1062+ test_size_hint ! ( v. rsplitn( 3 , p!( ) ) ) ;
1063+ test_size_hint ! ( v. rsplitn_mut( 0 , p!( ) ) ) ;
1064+ test_size_hint ! ( v. rsplitn_mut( 1 , p!( ) ) ) ;
1065+ test_size_hint ! ( v. rsplitn_mut( 2 , p!( ) ) ) ;
1066+ test_size_hint ! ( v. rsplitn_mut( 3 , p!( ) ) ) ;
1067+ }
1068+ }
1069+
9961070#[ test]
9971071fn test_windowsator ( ) {
9981072 let v = & [ 1 , 2 , 3 , 4 ] ;
0 commit comments