From 33daf597c3fdebeaddfa361d6b962e0699f30b92 Mon Sep 17 00:00:00 2001 From: mi_sawa Date: Wed, 6 Mar 2024 22:08:20 +0900 Subject: [PATCH 1/3] Add prop tests that fail --- src/lib.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index bd73ea9..a7e51a1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1745,3 +1745,51 @@ where RotatedArraySet::new() } } + +#[cfg(test)] +mod test { + use super::RotatedArraySet; + use proptest::prelude::*; + + fn assert_sum_invariant(n: usize) -> Result<(), TestCaseError> { + let sum = RotatedArraySet::::integer_sum(n); + let inv = RotatedArraySet::::integer_sum_inverse(sum); + prop_assert_eq!(n, inv); + Ok(()) + } + + fn assert_inverse_invariant(n: usize) -> Result<(), TestCaseError> { + let inv = RotatedArraySet::::integer_sum_inverse(n); + let sum_lower = RotatedArraySet::::integer_sum(inv); + let sum_upper = RotatedArraySet::::integer_sum(inv + 1); + prop_assert!(sum_lower <= n); + prop_assert!(n < sum_upper); + Ok(()) + } + + prop_compose! { + /// generates integer_sum(?) - 1, integer_sum(?), and integer_sum(?) + 1. + fn inverse_boundary()(n in 0..(1usize<<31), d in 0usize..3) -> usize { + RotatedArraySet::::integer_sum(n) + .wrapping_add(d) + .wrapping_sub(1) + } + } + + proptest! { + #[test] + fn take_sum_and_inverse(n in 0..(((usize::MAX/2) as f64).sqrt() as usize)) { + assert_sum_invariant(n)? + } + + #[test] + fn take_inverse_and_sum(n in 0..usize::MAX/2) { + assert_inverse_invariant(n)? + } + + #[test] + fn take_inverse_and_sum_on_inverse_boundary(n in inverse_boundary()) { + assert_inverse_invariant(n)? + } + } +} From 8348e9a20e5e15a98422c3fbe7a2fa9176ffb66d Mon Sep 17 00:00:00 2001 From: mi_sawa Date: Wed, 6 Mar 2024 22:09:01 +0900 Subject: [PATCH 2/3] Fix integer_sum_inverse to be able to handle large index --- src/lib.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index a7e51a1..1928783 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1192,7 +1192,14 @@ where fn integer_sum_inverse(n: usize) -> usize { // y = (x * (x + 1)) / 2 // x = (sqrt(8 * y + 1) - 1) / 2 - ((f64::from((n * 8 + 1) as u32).sqrt() as usize) - 1) / 2 + let floaty = ((n as f64 * 8.0 + 1.0).sqrt() - 1.0) / 2.0; + let tmp = floaty as usize; + let sum = Self::integer_sum(tmp); + if sum <= n { + tmp + } else { + tmp - 1 + } } fn get_subarray_idx_from_array_idx(idx: usize) -> usize { From b308d9c2a493c649d1152b0d9f9deb42f072405a Mon Sep 17 00:00:00 2001 From: mi_sawa Date: Thu, 7 Mar 2024 22:01:16 +0900 Subject: [PATCH 3/3] Make test usize-width agnostic --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 1928783..cc2c1c6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1776,7 +1776,7 @@ mod test { prop_compose! { /// generates integer_sum(?) - 1, integer_sum(?), and integer_sum(?) + 1. - fn inverse_boundary()(n in 0..(1usize<<31), d in 0usize..3) -> usize { + fn inverse_boundary()(n in 0..(((usize::MAX/2) as f64).sqrt() as usize), d in 0usize..3) -> usize { RotatedArraySet::::integer_sum(n) .wrapping_add(d) .wrapping_sub(1)