diff options
Diffstat (limited to 'tests/specializations.rs')
-rw-r--r-- | tests/specializations.rs | 85 |
1 files changed, 69 insertions, 16 deletions
diff --git a/tests/specializations.rs b/tests/specializations.rs index bc337c2..199cf56 100644 --- a/tests/specializations.rs +++ b/tests/specializations.rs @@ -15,16 +15,16 @@ where } } -fn check_specialized<'a, V, IterItem, Iter, F>(iterator: &Iter, mapper: F) -where - V: Eq + Debug, - Iter: Iterator<Item = IterItem> + Clone + 'a, - F: Fn(Box<dyn Iterator<Item = IterItem> + 'a>) -> V, -{ - assert_eq!( - mapper(Box::new(Unspecialized(iterator.clone()))), - mapper(Box::new(iterator.clone())) - ) +macro_rules! check_specialized { + ($src:expr, |$it:pat| $closure:expr) => { + let $it = $src.clone(); + let v1 = $closure; + + let $it = Unspecialized($src.clone()); + let v2 = $closure; + + assert_eq!(v1, v2); + } } fn test_specializations<IterItem, Iter>( @@ -33,10 +33,10 @@ fn test_specializations<IterItem, Iter>( IterItem: Eq + Debug + Clone, Iter: Iterator<Item = IterItem> + Clone, { - check_specialized(it, |i| i.count()); - check_specialized(it, |i| i.last()); - check_specialized(it, |i| i.collect::<Vec<_>>()); - check_specialized(it, |i| { + check_specialized!(it, |i| i.count()); + check_specialized!(it, |i| i.last()); + check_specialized!(it, |i| i.collect::<Vec<_>>()); + check_specialized!(it, |i| { let mut parameters_from_fold = vec![]; let fold_result = i.fold(vec![], |mut acc, v: IterItem| { parameters_from_fold.push((acc.clone(), v.clone())); @@ -45,7 +45,7 @@ fn test_specializations<IterItem, Iter>( }); (parameters_from_fold, fold_result) }); - check_specialized(it, |mut i| { + check_specialized!(it, |mut i| { let mut parameters_from_all = vec![]; let first = i.next(); let all_result = i.all(|x| { @@ -56,7 +56,7 @@ fn test_specializations<IterItem, Iter>( }); let size = it.clone().count(); for n in 0..size + 2 { - check_specialized(it, |mut i| i.nth(n)); + check_specialized!(it, |mut i| i.nth(n)); } // size_hint is a bit harder to check let mut it_sh = it.clone(); @@ -73,6 +73,12 @@ fn test_specializations<IterItem, Iter>( } quickcheck! { + fn intersperse(v: Vec<u8>) -> () { + test_specializations(&v.into_iter().intersperse(0)); + } +} + +quickcheck! { fn put_back_qc(test_vec: Vec<i32>) -> () { test_specializations(&itertools::put_back(test_vec.iter())); let mut pb = itertools::put_back(test_vec.into_iter()); @@ -98,3 +104,50 @@ quickcheck! { test_specializations(&v.into_iter().map_ok(|u| u.checked_add(1))); } } + +quickcheck! { + fn process_results(v: Vec<Result<u8, u8>>) -> () { + helper(v.iter().copied()); + helper(v.iter().copied().filter(Result::is_ok)); + + fn helper(it: impl Iterator<Item = Result<u8, u8>> + Clone) { + macro_rules! check_results_specialized { + ($src:expr, |$it:pat| $closure:expr) => { + assert_eq!( + itertools::process_results($src.clone(), |$it| $closure), + itertools::process_results($src.clone(), |i| { + let $it = Unspecialized(i); + $closure + }), + ) + } + } + + check_results_specialized!(it, |i| i.count()); + check_results_specialized!(it, |i| i.last()); + check_results_specialized!(it, |i| i.collect::<Vec<_>>()); + check_results_specialized!(it, |i| { + let mut parameters_from_fold = vec![]; + let fold_result = i.fold(vec![], |mut acc, v| { + parameters_from_fold.push((acc.clone(), v.clone())); + acc.push(v); + acc + }); + (parameters_from_fold, fold_result) + }); + check_results_specialized!(it, |mut i| { + let mut parameters_from_all = vec![]; + let first = i.next(); + let all_result = i.all(|x| { + parameters_from_all.push(x.clone()); + Some(x)==first + }); + (parameters_from_all, all_result) + }); + let size = it.clone().count(); + for n in 0..size + 2 { + check_results_specialized!(it, |mut i| i.nth(n)); + } + } + } +} |