@@ -1532,6 +1532,7 @@ mod tests {
1532
1532
use super:: * ;
1533
1533
use prelude : : * ;
1534
1534
1535
+ use cmp;
1535
1536
use uint;
1536
1537
1537
1538
#[ test]
@@ -1924,6 +1925,26 @@ mod tests {
1924
1925
assert_eq ! ( it. next_back( ) , None )
1925
1926
}
1926
1927
1928
+ #[ cfg( test) ]
1929
+ fn check_randacc_iter< A : Eq , T : Clone + RandomAccessIterator < A > > ( a : T , len : uint )
1930
+ {
1931
+ let mut b = a. clone ( ) ;
1932
+ assert_eq ! ( len, b. indexable( ) ) ;
1933
+ let mut n = 0 ;
1934
+ for a. enumerate( ) . advance |( i, elt) | {
1935
+ assert_eq ! ( Some ( elt) , b. idx( i) ) ;
1936
+ n += 1 ;
1937
+ }
1938
+ assert_eq ! ( n, len) ;
1939
+ assert_eq ! ( None , b. idx( n) ) ;
1940
+ // call recursively to check after picking off an element
1941
+ if len > 0 {
1942
+ b. next( ) ;
1943
+ check_randacc_iter( b, len-1 ) ;
1944
+ }
1945
+ }
1946
+
1947
+
1927
1948
#[ test]
1928
1949
fn test_double_ended_flat_map( ) {
1929
1950
let u = [ 0 u, 1 ] ;
@@ -1958,5 +1979,71 @@ mod tests {
1958
1979
assert_eq ! ( it. idx( 0 ) . unwrap( ) , & 3 ) ;
1959
1980
assert_eq ! ( it. idx( 4 ) . unwrap( ) , & 9 ) ;
1960
1981
assert ! ( it. idx( 6 ) . is_none( ) ) ;
1982
+
1983
+ check_randacc_iter( it, xs. len( ) + ys. len( ) - 3 ) ;
1984
+ }
1985
+
1986
+ #[ test]
1987
+ fn test_random_access_enumerate( ) {
1988
+ let xs = [ 1 , 2 , 3 , 4 , 5 ] ;
1989
+ check_randacc_iter( xs. iter( ) . enumerate( ) , xs. len( ) ) ;
1990
+ }
1991
+
1992
+ #[ test]
1993
+ fn test_random_access_zip( ) {
1994
+ let xs = [ 1 , 2 , 3 , 4 , 5 ] ;
1995
+ let ys = [ 7 , 9 , 11 ] ;
1996
+ check_randacc_iter( xs. iter( ) . zip( ys. iter( ) ) , cmp:: min( xs. len( ) , ys. len( ) ) ) ;
1997
+ }
1998
+
1999
+ #[ test]
2000
+ fn test_random_access_take( ) {
2001
+ let xs = [ 1 , 2 , 3 , 4 , 5 ] ;
2002
+ let empty: & [ int] = [ ] ;
2003
+ check_randacc_iter( xs. iter( ) . take_( 3 ) , 3 ) ;
2004
+ check_randacc_iter( xs. iter( ) . take_( 20 ) , xs. len( ) ) ;
2005
+ check_randacc_iter( xs. iter( ) . take_( 0 ) , 0 ) ;
2006
+ check_randacc_iter( empty. iter( ) . take_( 2 ) , 0 ) ;
2007
+ }
2008
+
2009
+ #[ test]
2010
+ fn test_random_access_skip( ) {
2011
+ let xs = [ 1 , 2 , 3 , 4 , 5 ] ;
2012
+ let empty: & [ int] = [ ] ;
2013
+ check_randacc_iter( xs. iter( ) . skip( 2 ) , xs. len( ) - 2 ) ;
2014
+ check_randacc_iter( empty. iter( ) . skip( 2 ) , 0 ) ;
2015
+ }
2016
+
2017
+ #[ test]
2018
+ fn test_random_access_peek( ) {
2019
+ let xs = [ 1 , 2 , 3 , 4 , 5 ] ;
2020
+
2021
+ // test .transform and .peek_ that don't implement Clone
2022
+ let it = xs. iter( ) . peek_( |_| { } ) ;
2023
+ assert_eq ! ( xs. len( ) , it. indexable( ) ) ;
2024
+ for xs. iter( ) . enumerate( ) . advance |( i, elt) | {
2025
+ assert_eq ! ( Some ( elt) , it. idx( i) ) ;
2026
+ }
2027
+
2028
+ }
2029
+
2030
+ #[ test]
2031
+ fn test_random_access_transform( ) {
2032
+ let xs = [ 1 , 2 , 3 , 4 , 5 ] ;
2033
+
2034
+ // test .transform and .peek_ that don't implement Clone
2035
+ let it = xs. iter( ) . transform( |x| * x) ;
2036
+ assert_eq ! ( xs. len( ) , it. indexable( ) ) ;
2037
+ for xs. iter( ) . enumerate( ) . advance |( i, elt) | {
2038
+ assert_eq ! ( Some ( * elt) , it. idx( i) ) ;
2039
+ }
2040
+ }
2041
+
2042
+ #[ test]
2043
+ fn test_random_access_cycle( ) {
2044
+ let xs = [ 1 , 2 , 3 , 4 , 5 ] ;
2045
+ let empty: & [ int] = [ ] ;
2046
+ check_randacc_iter( xs. iter( ) . cycle( ) . take_( 27 ) , 27 ) ;
2047
+ check_randacc_iter( empty. iter( ) . cycle( ) , 0 ) ;
1961
2048
}
1962
2049
}
0 commit comments