diff options
author | Andreas Grois <andi@grois.info> | 2022-11-03 22:05:24 +0100 |
---|---|---|
committer | Andreas Grois <andi@grois.info> | 2022-11-03 22:05:24 +0100 |
commit | db2e6ce5b648fa513009863e81a13f0e64281a78 (patch) | |
tree | 055338637a8f312dfb03dad70f8626453c4ed810 | |
parent | 6ee6a65b30bdbd4956b18518009f25a0b7db0979 (diff) |
Test that compare iterative conversion with div.
These tests compare the code for iterative base conversion with the
alternative formula that spits out digits in reverse order.
-rw-r--r-- | src/passwordmaker/base_conversion/iterative_conversion_impl/mod.rs | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/src/passwordmaker/base_conversion/iterative_conversion_impl/mod.rs b/src/passwordmaker/base_conversion/iterative_conversion_impl/mod.rs index 0a03192..6c6193d 100644 --- a/src/passwordmaker/base_conversion/iterative_conversion_impl/mod.rs +++ b/src/passwordmaker/base_conversion/iterative_conversion_impl/mod.rs @@ -524,6 +524,8 @@ fn u64_from_u32s(msb : u32, lsb : u32) -> u64{ #[cfg(test)] mod arbitrary_bytes_tests{ + use std::iter::successors; + use super::*; use rand::RngCore; use rand_xoshiro::rand_core::SeedableRng; @@ -566,7 +568,7 @@ mod arbitrary_bytes_tests{ assert!(min_divisor_digits <= max_divisor_digits); let mut rng = Xoshiro256Plus::seed_from_u64(0); let mut res = Vec::new(); - for _i in 0..1000000 { + for _i in 0..100000 { let dx = rng.next_u32() % (max_dividend_digits + 1 - min_dividend_digits) + min_dividend_digits; let dy = rng.next_u32() % (max_divisor_digits + 1 - min_divisor_digits) + min_divisor_digits; let ds = dx.min(dy); @@ -952,4 +954,53 @@ mod arbitrary_bytes_tests{ assert_eq!(a.0[7], 0xcd705aef); assert!(a.0[..7].iter().all(|x| *x==0)); } + + fn convert_by_division<const N : usize>(value : ArbitraryBytes<N>, base : usize) -> impl Iterator<Item = usize>{ + successors(Some((value, 0)),|(v, _)| { + if *v == (&0usize).into() { + None + } else { + let mut v = v.clone(); + let remainder = v.div_assign_with_remainder_usize(&base); + Some((v, remainder)) + } + }).skip(1).map(|(_,b)| b).collect::<Vec<_>>().into_iter().rev() + } + #[test] + fn compare_conversion_by_division_randoms_8(){ + let mut rng = Xoshiro256Plus::seed_from_u64(0); + for _ in 0..10000 { + let v = ArbitraryBytes::new([ + rng.next_u32(), + rng.next_u32(), + rng.next_u32(), + rng.next_u32(), + rng.next_u32(), + rng.next_u32(), + rng.next_u32(), + rng.next_u32(), + ]); + let b = rng.next_u32() as usize; + let i1 = super::super::IterativeBaseConversion::new(v.clone(),b).skip_while(|v| *v == 0); + let i2 = convert_by_division(v,b); + assert!(i1.eq(i2)); + } + } + #[test] + fn compare_conversion_by_division_randoms_5(){ + let mut rng = Xoshiro256Plus::seed_from_u64(0); + for _ in 0..10000 { + let v = ArbitraryBytes::new([ + rng.next_u32(), + rng.next_u32(), + rng.next_u32(), + rng.next_u32(), + rng.next_u32(), + ]); + let b = rng.next_u32() as usize; + let i1 = super::super::IterativeBaseConversion::new(v.clone(),b).skip_while(|v| *v == 0); + let i2 = convert_by_division(v,b); + assert!(i1.eq(i2)); + } + } }
\ No newline at end of file |