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 |