From a6ab5c9fd0516f03f67a8075affed18c8c6b7245 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Thu, 19 Jun 2025 12:37:36 +1000 Subject: [PATCH] Implement Arbitrary for result types Implement `Arbitrary` for the `NumOpResult` and `MathOp` types from the `result` module. --- units/src/result.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/units/src/result.rs b/units/src/result.rs index 36f9094e0..18f968ea5 100644 --- a/units/src/result.rs +++ b/units/src/result.rs @@ -5,6 +5,8 @@ use core::convert::Infallible; use core::fmt; +#[cfg(feature = "arbitrary")] +use arbitrary::{Arbitrary, Unstructured}; use NumOpResult as R; use crate::{Amount, FeeRate, SignedAmount, Weight}; @@ -320,6 +322,32 @@ impl fmt::Display for MathOp { } } +#[cfg(feature = "arbitrary")] +impl<'a, T: Arbitrary<'a>> Arbitrary<'a> for NumOpResult { + fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { + let choice = u.int_in_range(0..=1)?; + match choice { + 0 => Ok(NumOpResult::Valid(T::arbitrary(u)?)), + _ => Ok(NumOpResult::Error(NumOpError(MathOp::arbitrary(u)?))), + } + } +} + +#[cfg(feature = "arbitrary")] +impl<'a> Arbitrary<'a> for MathOp { + fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { + let choice = u.int_in_range(0..=5)?; + match choice { + 0 => Ok(MathOp::Add), + 1 => Ok(MathOp::Sub), + 2 => Ok(MathOp::Mul), + 3 => Ok(MathOp::Div), + 4 => Ok(MathOp::Rem), + _ => Ok(MathOp::Neg), + } + } +} + #[cfg(test)] mod tests { use crate::MathOp;