#[cfg(test)] macro_rules! test { ($ty:ident) => { mod $ty { use quickcheck::TestResult; use quickcheck::quickcheck; use approx::relative_eq; use crate::stats::bivariate::regression::Slope; use crate::stats::bivariate::Data; quickcheck! { fn means(size: u8, start: u8, offset: u8, nresamples: u8) -> TestResult { let size = size as usize; let start = start as usize; let offset = offset as usize; let nresamples = nresamples as usize; if let Some(x) = crate::stats::test::vec::<$ty>(size, start) { let y = crate::stats::test::vec::<$ty>(size + offset, start + offset).unwrap(); let data = Data::new(&x[start..], &y[start+offset..]); let (x_means, y_means) = if nresamples > 0 { data.bootstrap(nresamples, |d| (d.x().mean(), d.y().mean())) } else { return TestResult::discard(); }; let x_min = data.x().min(); let x_max = data.x().max(); let y_min = data.y().min(); let y_max = data.y().max(); TestResult::from_bool( // Computed the correct number of resamples x_means.len() == nresamples && y_means.len() == nresamples && // No uninitialized values x_means.iter().all(|&x| { (x > x_min || relative_eq!(x, x_min)) && (x < x_max || relative_eq!(x, x_max)) }) && y_means.iter().all(|&y| { (y > y_min || relative_eq!(y, y_min)) && (y < y_max || relative_eq!(y, y_max)) }) ) } else { TestResult::discard() } } } quickcheck! { fn slope(size: u8, start: u8, offset: u8, nresamples: u8) -> TestResult { let size = size as usize; let start = start as usize; let offset = offset as usize; let nresamples = nresamples as usize; if let Some(x) = crate::stats::test::vec::<$ty>(size, start) { let y = crate::stats::test::vec::<$ty>(size + offset, start + offset).unwrap(); let data = Data::new(&x[start..], &y[start+offset..]); let slopes = if nresamples > 0 { data.bootstrap(nresamples, |d| (Slope::fit(&d),)).0 } else { return TestResult::discard(); }; TestResult::from_bool( // Computed the correct number of resamples slopes.len() == nresamples && // No uninitialized values slopes.iter().all(|s| s.0 > 0.) ) } else { TestResult::discard() } } } } }; } #[cfg(test)] mod test { test!(f32); test!(f64); }