1
1
extern crate itertools;
2
2
3
+ #[ macro_use]
4
+ extern crate quickcheck;
5
+
3
6
use itertools:: { EitherOrBoth , Itertools } ;
4
7
5
8
use std:: fmt:: Debug ;
@@ -36,13 +39,17 @@ where
36
39
)
37
40
}
38
41
39
- fn check_specialized_count_last_nth_sizeh < ' a , IterItem , Iter > ( it : & Iter , expected_size : usize )
40
- where
42
+ fn check_specialized_count_last_nth_sizeh < ' a , IterItem , Iter > (
43
+ it : & Iter ,
44
+ known_expected_size : Option < usize > ,
45
+ ) where
41
46
IterItem : ' a + Eq + Debug ,
42
47
Iter : Iterator < Item = IterItem > + Clone + ' a ,
43
48
{
44
49
let size = it. clone ( ) . count ( ) ;
45
- assert_eq ! ( size, expected_size) ;
50
+ if let Some ( expected_size) = known_expected_size {
51
+ assert_eq ! ( size, expected_size) ;
52
+ }
46
53
check_specialized ( it, |i| i. count ( ) ) ;
47
54
check_specialized ( it, |i| i. last ( ) ) ;
48
55
for n in 0 ..size + 2 {
@@ -79,28 +86,36 @@ where
79
86
} ) ;
80
87
}
81
88
82
- #[ test]
83
- fn put_back ( ) {
84
- let test_vec = vec ! [ 7 , 4 , 1 ] ;
89
+ fn put_back_test ( test_vec : Vec < i32 > , known_expected_size : Option < usize > ) {
85
90
{
86
91
// Lexical lifetimes support
87
92
let pb = itertools:: put_back ( test_vec. iter ( ) ) ;
88
- check_specialized_count_last_nth_sizeh ( & pb, 3 ) ;
93
+ check_specialized_count_last_nth_sizeh ( & pb, known_expected_size ) ;
89
94
check_specialized_fold_xor ( & pb) ;
90
95
}
91
96
92
97
let mut pb = itertools:: put_back ( test_vec. into_iter ( ) ) ;
93
98
pb. put_back ( 1 ) ;
94
- check_specialized_count_last_nth_sizeh ( & pb, 4 ) ;
95
- check_specialized_fold_xor ( & pb) ;
99
+ check_specialized_count_last_nth_sizeh ( & pb, known_expected_size . map ( |x| x + 1 ) ) ;
100
+ check_specialized_fold_xor ( & pb)
96
101
}
97
102
98
103
#[ test]
99
- fn merge_join_by ( ) {
100
- let i1 = vec ! [ 1 , 3 , 5 , 7 , 8 , 9 ] . into_iter ( ) ;
101
- let i2 = vec ! [ 0 , 3 , 4 , 5 ] . into_iter ( ) ;
104
+ fn put_back ( ) {
105
+ put_back_test ( vec ! [ 7 , 4 , 1 ] , Some ( 3 ) ) ;
106
+ }
107
+
108
+ quickcheck ! {
109
+ fn put_back_qc( test_vec: Vec <i32 >) -> ( ) {
110
+ put_back_test( test_vec, None )
111
+ }
112
+ }
113
+
114
+ fn merge_join_by_test ( i1 : Vec < usize > , i2 : Vec < usize > , known_expected_size : Option < usize > ) {
115
+ let i1 = i1. into_iter ( ) ;
116
+ let i2 = i2. into_iter ( ) ;
102
117
let mjb = i1. clone ( ) . merge_join_by ( i2. clone ( ) , std:: cmp:: Ord :: cmp) ;
103
- check_specialized_count_last_nth_sizeh ( & mjb, 8 ) ;
118
+ check_specialized_count_last_nth_sizeh ( & mjb, known_expected_size ) ;
104
119
// Rust 1.24 compatibility:
105
120
fn eob_left_z ( eob : EitherOrBoth < usize , usize > ) -> usize {
106
121
eob. left ( ) . unwrap_or ( 0 )
@@ -117,10 +132,23 @@ fn merge_join_by() {
117
132
check_specialized_fold_xor ( & mjb. clone ( ) . map ( eob_right_z) ) ;
118
133
check_specialized_fold_xor ( & mjb. clone ( ) . map ( eob_both_z) ) ;
119
134
120
- // And the other way around
135
+ // And the other way around
121
136
let mjb = i2. merge_join_by ( i1, std:: cmp:: Ord :: cmp) ;
122
- check_specialized_count_last_nth_sizeh ( & mjb, 8 ) ;
137
+ check_specialized_count_last_nth_sizeh ( & mjb, known_expected_size ) ;
123
138
check_specialized_fold_xor ( & mjb. clone ( ) . map ( eob_left_z) ) ;
124
139
check_specialized_fold_xor ( & mjb. clone ( ) . map ( eob_right_z) ) ;
125
140
check_specialized_fold_xor ( & mjb. clone ( ) . map ( eob_both_z) ) ;
126
141
}
142
+
143
+ #[ test]
144
+ fn merge_join_by ( ) {
145
+ let i1 = vec ! [ 1 , 3 , 5 , 7 , 8 , 9 ] ;
146
+ let i2 = vec ! [ 0 , 3 , 4 , 5 ] ;
147
+ merge_join_by_test ( i1, i2, Some ( 8 ) ) ;
148
+ }
149
+
150
+ quickcheck ! {
151
+ fn merge_join_by_qc( i1: Vec <usize >, i2: Vec <usize >) -> ( ) {
152
+ merge_join_by_test( i1, i2, None )
153
+ }
154
+ }
0 commit comments