1 | #[cfg (test)] |
2 | macro_rules! test { |
3 | ($ty:ident) => { |
4 | mod $ty { |
5 | use quickcheck::TestResult; |
6 | use quickcheck::quickcheck; |
7 | use approx::relative_eq; |
8 | |
9 | use crate::stats::bivariate::regression::Slope; |
10 | use crate::stats::bivariate::Data; |
11 | |
12 | quickcheck! { |
13 | fn means(size: u8, start: u8, |
14 | offset: u8, nresamples: u8) -> TestResult { |
15 | let size = size as usize; |
16 | let start = start as usize; |
17 | let offset = offset as usize; |
18 | let nresamples = nresamples as usize; |
19 | if let Some(x) = crate::stats::test::vec::<$ty>(size, start) { |
20 | let y = crate::stats::test::vec::<$ty>(size + offset, start + offset).unwrap(); |
21 | let data = Data::new(&x[start..], &y[start+offset..]); |
22 | |
23 | let (x_means, y_means) = if nresamples > 0 { |
24 | data.bootstrap(nresamples, |d| (d.x().mean(), d.y().mean())) |
25 | } else { |
26 | return TestResult::discard(); |
27 | }; |
28 | |
29 | let x_min = data.x().min(); |
30 | let x_max = data.x().max(); |
31 | let y_min = data.y().min(); |
32 | let y_max = data.y().max(); |
33 | |
34 | TestResult::from_bool( |
35 | // Computed the correct number of resamples |
36 | x_means.len() == nresamples && |
37 | y_means.len() == nresamples && |
38 | // No uninitialized values |
39 | x_means.iter().all(|&x| { |
40 | (x > x_min || relative_eq!(x, x_min)) && |
41 | (x < x_max || relative_eq!(x, x_max)) |
42 | }) && |
43 | y_means.iter().all(|&y| { |
44 | (y > y_min || relative_eq!(y, y_min)) && |
45 | (y < y_max || relative_eq!(y, y_max)) |
46 | }) |
47 | ) |
48 | } else { |
49 | TestResult::discard() |
50 | } |
51 | } |
52 | } |
53 | |
54 | quickcheck! { |
55 | fn slope(size: u8, start: u8, |
56 | offset: u8, nresamples: u8) -> TestResult { |
57 | let size = size as usize; |
58 | let start = start as usize; |
59 | let offset = offset as usize; |
60 | let nresamples = nresamples as usize; |
61 | if let Some(x) = crate::stats::test::vec::<$ty>(size, start) { |
62 | let y = crate::stats::test::vec::<$ty>(size + offset, start + offset).unwrap(); |
63 | let data = Data::new(&x[start..], &y[start+offset..]); |
64 | |
65 | let slopes = if nresamples > 0 { |
66 | data.bootstrap(nresamples, |d| (Slope::fit(&d),)).0 |
67 | } else { |
68 | return TestResult::discard(); |
69 | }; |
70 | |
71 | TestResult::from_bool( |
72 | // Computed the correct number of resamples |
73 | slopes.len() == nresamples && |
74 | // No uninitialized values |
75 | slopes.iter().all(|s| s.0 > 0.) |
76 | ) |
77 | } else { |
78 | TestResult::discard() |
79 | } |
80 | } |
81 | } |
82 | |
83 | } |
84 | }; |
85 | } |
86 | |
87 | #[cfg (test)] |
88 | mod test { |
89 | test!(f32); |
90 | test!(f64); |
91 | } |
92 | |