From db29104e50f907947092e8f52186427c39ba0184 Mon Sep 17 00:00:00 2001 From: Mathspy Date: Mon, 6 Jun 2022 19:46:17 -0400 Subject: [PATCH 1/2] Add support for arrays powered by const generics --- src/arbitrary.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/arbitrary.rs b/src/arbitrary.rs index 92f893b..221f86c 100644 --- a/src/arbitrary.rs +++ b/src/arbitrary.rs @@ -248,6 +248,26 @@ impl_arb_for_tuples! { (H, 7), } +impl Arbitrary for [A; N] { + fn arbitrary(g: &mut Gen) -> [A; N] { + [(); N].map(|_| A::arbitrary(g)) + } + + fn shrink(&self) -> Box> { + let cloned = self.clone(); + let iter = (0..N).flat_map(move |n| { + let cloned = cloned.clone(); + cloned[n].shrink().map(move |shr_value| { + let mut result = cloned.clone(); + result[n] = shr_value; + result + }) + }); + + Box::new(iter) + } +} + impl Arbitrary for Vec { fn arbitrary(g: &mut Gen) -> Vec { let size = { From d8866d1d7175d2626b97239708d9ee9a7e8bb033 Mon Sep 17 00:00:00 2001 From: Mathspy Date: Mon, 6 Jun 2022 19:55:42 -0400 Subject: [PATCH 2/2] Add shrinking tests for arrays Heavily based on the tuples and vectors tests --- src/arbitrary.rs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/arbitrary.rs b/src/arbitrary.rs index 221f86c..c059cd1 100644 --- a/src/arbitrary.rs +++ b/src/arbitrary.rs @@ -1430,6 +1430,45 @@ mod test { eq(Wrapping(0i32), vec![]); } + #[test] + fn arrays() { + eq([false, false], vec![]); + eq([true, false], vec![[false, false]]); + eq([true, true], vec![[false, true], [true, false]]); + + eq([false, false, false], vec![]); + eq([true, false, false], vec![[false, false, false]]); + eq( + [true, true, false], + vec![[false, true, false], [true, false, false]], + ); + + eq([false, false, false, false], vec![]); + eq([true, false, false, false], vec![[false, false, false, false]]); + eq( + [true, true, false, false], + vec![[false, true, false, false], [true, false, false, false]], + ); + + eq( + { + let it: [isize; 0] = []; + it + }, + vec![], + ); + eq( + { + let it: [[isize; 0]; 1] = [[]]; + it + }, + vec![], + ); + eq([1isize; 1], vec![[0; 1]]); + eq([11isize; 1], vec![[0; 1], [6; 1], [9; 1], [10; 1]]); + eq([3isize, 5], vec![[0, 5], [2, 5], [3, 0], [3, 3], [3, 4]]); + } + #[test] fn vecs() { eq(