bitbelay_tests/avalanche.rs
1//! Avalanche tests.
2
3use std::hash::BuildHasher;
4
5use bitbelay_report::section;
6
7use crate::r#trait::Test as _;
8
9pub mod sac;
10
11/// A type of avalanche test.
12#[derive(Debug)]
13pub enum Test<'a, H: BuildHasher, const N: usize> {
14 /// Strict Avalanche Criterion test.
15 StrictAvalancheCriterion(sac::Test<'a, H, N>),
16}
17
18impl<'a, H: BuildHasher, const N: usize> Test<'a, H, N> {
19 /// Gets a reference to a [`sac::Test`] wrapped in [`Some`] if
20 /// the [`Test`] is a [`Test::StrictAvalancheCriterion`]. Else, returns
21 /// [`None`].
22 ///
23 /// # Examples
24 ///
25 /// ```
26 /// use std::hash::RandomState;
27 /// use std::num::NonZeroUsize;
28 ///
29 /// use bitbelay_providers::ascii::AlphanumericProvider;
30 /// use bitbelay_tests::avalanche::sac;
31 /// use bitbelay_tests::avalanche::Test;
32 ///
33 /// let hasher = RandomState::new();
34 /// let test = Test::StrictAvalancheCriterion(
35 /// sac::Test::<RandomState, 64>::try_new(
36 /// &hasher,
37 /// Box::new(AlphanumericProvider::new(10)),
38 /// NonZeroUsize::try_from(1000).unwrap(),
39 /// 0.01,
40 /// )
41 /// .unwrap(),
42 /// );
43 ///
44 /// assert!(matches!(test.as_strict_avalanche_criterion_test(), Some(_)));
45 ///
46 /// # Ok::<(), Box<dyn std::error::Error>>(())
47 /// ```
48 pub fn as_strict_avalanche_criterion_test(&self) -> Option<&sac::Test<'a, H, N>> {
49 match self {
50 Test::StrictAvalancheCriterion(test) => Some(test),
51 }
52 }
53
54 /// Consumes the [`Test`] and returns a [`sac::Test`] wrapped in [`Some`] if
55 /// the [`Test`] is a [`Test::StrictAvalancheCriterion`]. Else, returns
56 /// [`None`].
57 ///
58 /// # Examples
59 ///
60 /// ```
61 /// use std::hash::RandomState;
62 /// use std::num::NonZeroUsize;
63 ///
64 /// use bitbelay_providers::ascii::AlphanumericProvider;
65 /// use bitbelay_tests::avalanche::sac;
66 /// use bitbelay_tests::avalanche::Test;
67 ///
68 /// let hasher = RandomState::new();
69 /// let test = Test::StrictAvalancheCriterion(
70 /// sac::Test::<RandomState, 64>::try_new(
71 /// &hasher,
72 /// Box::new(AlphanumericProvider::new(10)),
73 /// NonZeroUsize::try_from(1000).unwrap(),
74 /// 0.01,
75 /// )
76 /// .unwrap(),
77 /// );
78 ///
79 /// assert!(matches!(
80 /// test.into_strict_avalanche_criterion_test(),
81 /// Some(_)
82 /// ));
83 ///
84 /// # Ok::<(), Box<dyn std::error::Error>>(())
85 /// ```
86 pub fn into_strict_avalanche_criterion_test(self) -> Option<sac::Test<'a, H, N>> {
87 match self {
88 Test::StrictAvalancheCriterion(test) => Some(test),
89 }
90 }
91
92 /// Generates a report section for the [`Test`].
93 ///
94 /// # Examples
95 ///
96 /// ```
97 /// use std::hash::RandomState;
98 /// use std::num::NonZeroUsize;
99 ///
100 /// use bitbelay_providers::ascii::AlphanumericProvider;
101 /// use bitbelay_tests::avalanche::sac;
102 /// use bitbelay_tests::avalanche::Test;
103 ///
104 /// let hasher = RandomState::new();
105 /// let test = Test::StrictAvalancheCriterion(
106 /// sac::Test::<RandomState, 64>::try_new(
107 /// &hasher,
108 /// Box::new(AlphanumericProvider::new(10)),
109 /// NonZeroUsize::try_from(1000).unwrap(),
110 /// 0.01,
111 /// )
112 /// .unwrap(),
113 /// );
114 ///
115 /// let results = test.report_section();
116 /// // Include the section in a report.
117 /// ```
118 pub fn report_section(&self) -> section::Test {
119 match self {
120 Test::StrictAvalancheCriterion(test) => test.report_section(),
121 }
122 }
123}