@@ -15,22 +15,59 @@ use rand::{Rng, XorShiftRng};
15
15
16
16
#[ test]
17
17
fn 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
+
18
26
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
+
27
35
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
+
29
40
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 ) ) ;
34
71
}
35
72
36
73
#[ test]
0 commit comments