use urng::{Rng32, Rng64, Seed32, Seed64};
use crate::{
BirthdayConfig, BirthdayError, BirthdayResult, ChiSqConfig, ChiSqError, ChiSqResult, KsConfig,
KsError, KsResult, McPiConfig, McPiError, McPiResult, NistConfig, NistError, NistResult,
RunsConfig, RunsError, RunsResult, SerialConfig, SerialError, SerialResult, run_birthday,
run_chisq, run_ks, run_mcpi, run_nist, run_runs, run_serial, unit_f64_from_u32,
unit_f64_from_u64,
};
pub trait Test32: Rng32 + Seed32 + Sized {
fn run_chisq(&mut self, name: impl Into<String>) -> Result<ChiSqResult, ChiSqError> {
let mut sampler = || unit_f64_from_u32(self.nextu());
run_chisq(name, &mut sampler, ChiSqConfig::default())
}
fn run_mcpi(&mut self, name: impl Into<String>) -> Result<McPiResult, McPiError> {
let mut sampler = || unit_f64_from_u32(self.nextu());
run_mcpi(name, &mut sampler, McPiConfig::default())
}
fn run_serial(&mut self, name: impl Into<String>) -> Result<SerialResult, SerialError> {
let mut sampler = || unit_f64_from_u32(self.nextu());
run_serial(name, &mut sampler, SerialConfig::default())
}
fn run_runs(&mut self, name: impl Into<String>) -> Result<RunsResult, RunsError> {
let mut sampler = || unit_f64_from_u32(self.nextu());
run_runs(name, &mut sampler, RunsConfig::default())
}
fn run_ks(&mut self, name: impl Into<String>) -> Result<KsResult, KsError> {
let mut sampler = || unit_f64_from_u32(self.nextu());
run_ks(name, &mut sampler, KsConfig::default())
}
fn run_birthday(&mut self, name: impl Into<String>) -> Result<BirthdayResult, BirthdayError> {
let mut sampler = || self.nextu() as u64;
run_birthday(name, &mut sampler, BirthdayConfig::default())
}
fn run_nist(&mut self, name: impl Into<String>) -> Result<NistResult, NistError> {
let mut sampler = || self.nextu() as u64;
run_nist(name, &mut sampler, 32, NistConfig::default())
}
}
impl<T: Rng32 + Seed32> Test32 for T {}
pub trait Test64: Rng64 + Seed64 + Sized {
fn run_chisq(&mut self, name: impl Into<String>) -> Result<ChiSqResult, ChiSqError> {
let mut sampler = || unit_f64_from_u64(self.nextu());
run_chisq(name, &mut sampler, ChiSqConfig::default())
}
fn run_mcpi(&mut self, name: impl Into<String>) -> Result<McPiResult, McPiError> {
let mut sampler = || unit_f64_from_u64(self.nextu());
run_mcpi(name, &mut sampler, McPiConfig::default())
}
fn run_serial(&mut self, name: impl Into<String>) -> Result<SerialResult, SerialError> {
let mut sampler = || unit_f64_from_u64(self.nextu());
run_serial(name, &mut sampler, SerialConfig::default())
}
fn run_runs(&mut self, name: impl Into<String>) -> Result<RunsResult, RunsError> {
let mut sampler = || unit_f64_from_u64(self.nextu());
run_runs(name, &mut sampler, RunsConfig::default())
}
fn run_ks(&mut self, name: impl Into<String>) -> Result<KsResult, KsError> {
let mut sampler = || unit_f64_from_u64(self.nextu());
run_ks(name, &mut sampler, KsConfig::default())
}
fn run_birthday(&mut self, name: impl Into<String>) -> Result<BirthdayResult, BirthdayError> {
let mut sampler = || self.nextu();
run_birthday(name, &mut sampler, BirthdayConfig::default())
}
fn run_nist(&mut self, name: impl Into<String>) -> Result<NistResult, NistError> {
let mut sampler = || self.nextu();
run_nist(name, &mut sampler, 64, NistConfig::default())
}
}
impl<T: Rng64 + Seed64> Test64 for T {}
#[cfg(test)]
mod tests {
use super::*;
use urng::{Sfc32, Sfc64};
#[test]
fn test32_run_chisq_works_directly_on_rng() {
let mut rng = Sfc32::new(0);
let result = rng.run_chisq("Sfc32").unwrap();
assert_eq!(result.verdict, crate::ChiSqVerdict::Pass);
}
#[test]
fn test64_run_chisq_works_directly_on_rng() {
let mut rng = Sfc64::new(0);
let result = rng.run_chisq("Sfc64").unwrap();
assert_eq!(result.verdict, crate::ChiSqVerdict::Pass);
}
#[test]
fn test32_nist_and_birthday_work_directly_on_rng() {
let mut rng = Sfc32::new(1);
assert_eq!(
rng.run_nist("Sfc32").unwrap().verdict,
crate::NistVerdict::Pass
);
assert!(rng.run_birthday("Sfc32").is_ok());
}
}