aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Grois <andi@grois.info>2022-11-03 22:05:24 +0100
committerAndreas Grois <andi@grois.info>2022-11-03 22:05:24 +0100
commitdb2e6ce5b648fa513009863e81a13f0e64281a78 (patch)
tree055338637a8f312dfb03dad70f8626453c4ed810
parent6ee6a65b30bdbd4956b18518009f25a0b7db0979 (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.rs53
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