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}