@@ -15,22 +15,59 @@ use rand::{Rng, XorShiftRng};
1515
1616#[ test]
1717fn test_binary_search ( ) {
18+ let b: [ i32 ; 0 ] = [ ] ;
19+ assert_eq ! ( b. binary_search( & 5 ) , Err ( 0 ) ) ;
20+
21+ let b = [ 4 ] ;
22+ assert_eq ! ( b. binary_search( & 3 ) , Err ( 0 ) ) ;
23+ assert_eq ! ( b. binary_search( & 4 ) , Ok ( 0 ) ) ;
24+ assert_eq ! ( b. binary_search( & 5 ) , Err ( 1 ) ) ;
25+
1826 let b = [ 1 , 2 , 4 , 6 , 8 , 9 ] ;
19- assert ! ( b. binary_search_by ( |v| v . cmp ( & 6 ) ) == Ok ( 3 ) ) ;
20- assert ! ( b. binary_search_by ( |v| v . cmp ( & 5 ) ) == Err ( 3 ) ) ;
21- let b = [ 1 , 2 , 4 , 6 , 7 , 8 , 9 ] ;
22- assert ! ( b. binary_search_by ( |v| v . cmp ( & 6 ) ) == Ok ( 3 ) ) ;
23- assert ! ( b . binary_search_by ( |v| v . cmp ( & 5 ) ) == Err ( 3 ) ) ;
24- let b = [ 1 , 2 , 4 , 6 , 8 , 9 ] ;
25- assert ! ( b. binary_search_by ( |v| v . cmp ( & 8 ) ) == Ok ( 4 ) ) ;
26- assert ! ( b . binary_search_by ( |v| v . cmp ( & 7 ) ) == Err ( 4 ) ) ;
27+ assert_eq ! ( b. binary_search ( & 5 ) , Err ( 3 ) ) ;
28+ assert_eq ! ( b. binary_search ( & 6 ) , Ok ( 3 ) ) ;
29+ assert_eq ! ( b . binary_search ( & 7 ) , Err ( 4 ) ) ;
30+ assert_eq ! ( b. binary_search ( & 8 ) , Ok ( 4 ) ) ;
31+
32+ let b = [ 1 , 2 , 4 , 5 , 6 , 8 ] ;
33+ assert_eq ! ( b. binary_search ( & 9 ) , Err ( 6 ) ) ;
34+
2735 let b = [ 1 , 2 , 4 , 6 , 7 , 8 , 9 ] ;
28- assert ! ( b. binary_search_by( |v| v. cmp( & 8 ) ) == Ok ( 5 ) ) ;
36+ assert_eq ! ( b. binary_search( & 6 ) , Ok ( 3 ) ) ;
37+ assert_eq ! ( b. binary_search( & 5 ) , Err ( 3 ) ) ;
38+ assert_eq ! ( b. binary_search( & 8 ) , Ok ( 5 ) ) ;
39+
2940 let b = [ 1 , 2 , 4 , 5 , 6 , 8 , 9 ] ;
30- assert ! ( b. binary_search_by( |v| v. cmp( & 7 ) ) == Err ( 5 ) ) ;
31- assert ! ( b. binary_search_by( |v| v. cmp( & 0 ) ) == Err ( 0 ) ) ;
32- let b = [ 1 , 2 , 4 , 5 , 6 , 8 ] ;
33- assert ! ( b. binary_search_by( |v| v. cmp( & 9 ) ) == Err ( 6 ) ) ;
41+ assert_eq ! ( b. binary_search( & 7 ) , Err ( 5 ) ) ;
42+ assert_eq ! ( b. binary_search( & 0 ) , Err ( 0 ) ) ;
43+
44+ let b = [ 1 , 3 , 3 , 3 , 7 ] ;
45+ assert_eq ! ( b. binary_search( & 0 ) , Err ( 0 ) ) ;
46+ assert_eq ! ( b. binary_search( & 1 ) , Ok ( 0 ) ) ;
47+ assert_eq ! ( b. binary_search( & 2 ) , Err ( 1 ) ) ;
48+ assert ! ( match b. binary_search( & 3 ) { Ok ( 1 ...3 ) => true , _ => false } ) ;
49+ assert ! ( match b. binary_search( & 3 ) { Ok ( 1 ...3 ) => true , _ => false } ) ;
50+ assert_eq ! ( b. binary_search( & 4 ) , Err ( 4 ) ) ;
51+ assert_eq ! ( b. binary_search( & 5 ) , Err ( 4 ) ) ;
52+ assert_eq ! ( b. binary_search( & 6 ) , Err ( 4 ) ) ;
53+ assert_eq ! ( b. binary_search( & 7 ) , Ok ( 4 ) ) ;
54+ assert_eq ! ( b. binary_search( & 8 ) , Err ( 5 ) ) ;
55+ }
56+
57+ #[ test]
58+ // Test implementation specific behavior when finding equivalent elements.
59+ // It is ok to break this test but when you do a crater run is highly advisable.
60+ fn test_binary_search_implementation_details ( ) {
61+ let b = [ 1 , 1 , 2 , 2 , 3 , 3 , 3 ] ;
62+ assert_eq ! ( b. binary_search( & 1 ) , Ok ( 1 ) ) ;
63+ assert_eq ! ( b. binary_search( & 2 ) , Ok ( 3 ) ) ;
64+ assert_eq ! ( b. binary_search( & 3 ) , Ok ( 6 ) ) ;
65+ let b = [ 1 , 1 , 1 , 1 , 1 , 3 , 3 , 3 , 3 ] ;
66+ assert_eq ! ( b. binary_search( & 1 ) , Ok ( 4 ) ) ;
67+ assert_eq ! ( b. binary_search( & 3 ) , Ok ( 8 ) ) ;
68+ let b = [ 1 , 1 , 1 , 1 , 3 , 3 , 3 , 3 , 3 ] ;
69+ assert_eq ! ( b. binary_search( & 1 ) , Ok ( 3 ) ) ;
70+ assert_eq ! ( b. binary_search( & 3 ) , Ok ( 8 ) ) ;
3471}
3572
3673#[ test]
0 commit comments