use proptest::prelude::*;
use zan_sort::prelude::*;
#[allow(dead_code)]
#[derive(Debug, Clone)]
struct FuzzHeavyItem {
key: u32,
payload: [u64; 4],
}
impl SortKey for FuzzHeavyItem {
fn sort_key(&self) -> u64 {
self.key as u64
}
}
prop_compose! {
fn heavy_item_strategy()(
key in any::<u32>(),
p0 in any::<u64>(), p1 in any::<u64>(), p2 in any::<u64>(), p3 in any::<u64>()
) -> FuzzHeavyItem {
FuzzHeavyItem { key, payload: [p0, p1, p2, p3] }
}
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(1000))]
#[test]
fn proptest_u32_random_arrays(mut data in prop::collection::vec(any::<u32>(), 0..50_000)) {
let mut expected = data.clone();
expected.sort_unstable();
zan_sort(&mut data);
prop_assert_eq!(data, expected);
}
#[test]
fn proptest_heavy_struct_random_arrays(mut data in prop::collection::vec(heavy_item_strategy(), 0..10_000)) {
let original_len = data.len();
zan_sort(&mut data);
prop_assert_eq!(data.len(), original_len);
if !data.is_empty() {
for i in 0..(data.len() - 1) {
prop_assert!(
data[i].key <= data[i + 1].key,
"Sort failed at index {}: {} is not <= {}",
i, data[i].key, data[i + 1].key
);
}
}
}
}