| use std::fmt::Debug; |
| use std::ops::{Range, RangeBounds}; |
| use std::slice; |
| |
| use super::patterns; |
| |
| fn check_is_partial_sorted<T: Ord + Clone + Debug, R: RangeBounds<usize>>(v: &mut [T], range: R) { |
| let Range { start, end } = slice::range(range, ..v.len()); |
| v.partial_sort_unstable(start..end); |
| |
| let max_before = v[..start].iter().max().into_iter(); |
| let sorted_range = v[start..end].into_iter(); |
| let min_after = v[end..].iter().min().into_iter(); |
| let seq = max_before.chain(sorted_range).chain(min_after); |
| assert!(seq.is_sorted()); |
| } |
| |
| fn check_is_partial_sorted_ranges<T: Ord + Clone + Debug>(v: &[T]) { |
| let len = v.len(); |
| |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), ..); |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), 0..0); |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), len..len); |
| |
| if len > 0 { |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), len - 1..len - 1); |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), 0..1); |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), len - 1..len); |
| |
| for mid in 1..len { |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), 0..mid); |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), mid..len); |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), mid..mid); |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), mid - 1..mid + 1); |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), mid - 1..mid); |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), mid..mid + 1); |
| } |
| |
| let quarters = [0, len / 4, len / 2, (3 * len) / 4, len]; |
| for &start in &quarters { |
| for &end in &quarters { |
| if start < end { |
| check_is_partial_sorted::<T, _>(&mut v.to_vec(), start..end); |
| } |
| } |
| } |
| } |
| } |
| |
| #[test] |
| fn basic_impl() { |
| check_is_partial_sorted::<i32, _>(&mut [], ..); |
| check_is_partial_sorted::<(), _>(&mut [], ..); |
| check_is_partial_sorted::<(), _>(&mut [()], ..); |
| check_is_partial_sorted::<(), _>(&mut [(), ()], ..); |
| check_is_partial_sorted::<(), _>(&mut [(), (), ()], ..); |
| check_is_partial_sorted::<i32, _>(&mut [], ..); |
| |
| check_is_partial_sorted::<i32, _>(&mut [77], ..); |
| check_is_partial_sorted::<i32, _>(&mut [2, 3], ..); |
| check_is_partial_sorted::<i32, _>(&mut [2, 3, 6], ..); |
| check_is_partial_sorted::<i32, _>(&mut [2, 3, 99, 6], ..); |
| check_is_partial_sorted::<i32, _>(&mut [2, 7709, 400, 90932], ..); |
| check_is_partial_sorted::<i32, _>(&mut [15, -1, 3, -1, -3, -1, 7], ..); |
| |
| check_is_partial_sorted::<i32, _>(&mut [15, -1, 3, -1, -3, -1, 7], 0..0); |
| check_is_partial_sorted::<i32, _>(&mut [15, -1, 3, -1, -3, -1, 7], 0..1); |
| check_is_partial_sorted::<i32, _>(&mut [15, -1, 3, -1, -3, -1, 7], 0..5); |
| check_is_partial_sorted::<i32, _>(&mut [15, -1, 3, -1, -3, -1, 7], 0..7); |
| check_is_partial_sorted::<i32, _>(&mut [15, -1, 3, -1, -3, -1, 7], 7..7); |
| check_is_partial_sorted::<i32, _>(&mut [15, -1, 3, -1, -3, -1, 7], 6..7); |
| check_is_partial_sorted::<i32, _>(&mut [15, -1, 3, -1, -3, -1, 7], 5..7); |
| check_is_partial_sorted::<i32, _>(&mut [15, -1, 3, -1, -3, -1, 7], 5..5); |
| check_is_partial_sorted::<i32, _>(&mut [15, -1, 3, -1, -3, -1, 7], 4..5); |
| check_is_partial_sorted::<i32, _>(&mut [15, -1, 3, -1, -3, -1, 7], 4..6); |
| } |
| |
| #[test] |
| fn random_patterns() { |
| check_is_partial_sorted_ranges(&patterns::random(10)); |
| check_is_partial_sorted_ranges(&patterns::random(50)); |
| |
| // Longer tests would take hours to run under Miri. |
| if !cfg!(miri) { |
| check_is_partial_sorted_ranges(&patterns::random(100)); |
| check_is_partial_sorted_ranges(&patterns::random(1000)); |
| } |
| } |