From 4fb4fc20b2c4d46ea1f13fa63303953ec4385a87 Mon Sep 17 00:00:00 2001 From: 0xgleb Date: Wed, 11 Jun 2025 18:44:54 +0400 Subject: [PATCH 1/3] expose and test abs --- crates/float/src/lib.rs | 50 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/crates/float/src/lib.rs b/crates/float/src/lib.rs index 208f0fe2..817b875f 100644 --- a/crates/float/src/lib.rs +++ b/crates/float/src/lib.rs @@ -230,6 +230,16 @@ impl Float { Ok(decoded) }) } + + pub fn abs(&mut self, float: Float) -> Result { + let Float(a) = float; + let calldata = DecimalFloat::absCall { a }.abi_encode(); + + self.execute_call(Bytes::from(calldata), |output| { + let decoded = DecimalFloat::absCall::abi_decode_returns(output.as_ref())?; + Ok(Float(decoded)) + }) + } } impl Add for Float { @@ -415,4 +425,44 @@ mod tests { prop_assert!(!(lt && gt), "both less than and greater than: a: {a_str}, b: {b_str}"); } } + + #[test] + fn test_abs() { + let mut calculator = Calculator::new().unwrap(); + + let float = calculator.parse("-3613.1324123".to_string()).unwrap(); + let abs = calculator.abs(float).unwrap(); + let formatted = calculator.format(abs).unwrap(); + assert_eq!(formatted, "3613.1324123"); + + let float = calculator.parse("3613.1324123".to_string()).unwrap(); + let abs = calculator.abs(float).unwrap(); + let formatted = calculator.format(abs).unwrap(); + assert_eq!(formatted, "3613.1324123"); + + let float = calculator.parse("0".to_string()).unwrap(); + let abs = calculator.abs(float).unwrap(); + let formatted = calculator.format(abs).unwrap(); + assert_eq!(formatted, "0"); + } + + proptest! { + #[test] + fn test_abs_no_minus_sign(float in valid_float()) { + let mut calculator = Calculator::new().unwrap(); + + let abs = calculator.abs(float).unwrap(); + let formatted = calculator.format(abs).unwrap(); + prop_assert!(!formatted.starts_with("-")); + } + + #[test] + fn test_abs_abs(float in valid_float()) { + let mut calculator = Calculator::new().unwrap(); + + let abs = calculator.abs(float).unwrap(); + let abs_abs = calculator.abs(abs).unwrap(); + prop_assert!(calculator.eq(abs, abs_abs).unwrap()); + } + } } From 0068caadf9aed066fff64b290895f2ddc5234463 Mon Sep 17 00:00:00 2001 From: 0xgleb Date: Mon, 16 Jun 2025 19:50:32 +0400 Subject: [PATCH 2/3] rm calculator --- crates/float/src/lib.rs | 44 ++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/crates/float/src/lib.rs b/crates/float/src/lib.rs index 817b875f..9b04e78b 100644 --- a/crates/float/src/lib.rs +++ b/crates/float/src/lib.rs @@ -231,11 +231,11 @@ impl Float { }) } - pub fn abs(&mut self, float: Float) -> Result { - let Float(a) = float; + pub fn abs(self) -> Result { + let Float(a) = self; let calldata = DecimalFloat::absCall { a }.abi_encode(); - self.execute_call(Bytes::from(calldata), |output| { + execute_call(Bytes::from(calldata), |output| { let decoded = DecimalFloat::absCall::abi_decode_returns(output.as_ref())?; Ok(Float(decoded)) }) @@ -428,41 +428,35 @@ mod tests { #[test] fn test_abs() { - let mut calculator = Calculator::new().unwrap(); - - let float = calculator.parse("-3613.1324123".to_string()).unwrap(); - let abs = calculator.abs(float).unwrap(); - let formatted = calculator.format(abs).unwrap(); + let float = Float::parse("-3613.1324123".to_string()).unwrap(); + let abs = float.abs().unwrap(); + let formatted = abs.format().unwrap(); assert_eq!(formatted, "3613.1324123"); - let float = calculator.parse("3613.1324123".to_string()).unwrap(); - let abs = calculator.abs(float).unwrap(); - let formatted = calculator.format(abs).unwrap(); + let float = Float::parse("3613.1324123".to_string()).unwrap(); + let abs = float.abs().unwrap(); + let formatted = abs.format().unwrap(); assert_eq!(formatted, "3613.1324123"); - let float = calculator.parse("0".to_string()).unwrap(); - let abs = calculator.abs(float).unwrap(); - let formatted = calculator.format(abs).unwrap(); + let float = Float::parse("0".to_string()).unwrap(); + let abs = float.abs().unwrap(); + let formatted = abs.format().unwrap(); assert_eq!(formatted, "0"); } proptest! { #[test] - fn test_abs_no_minus_sign(float in valid_float()) { - let mut calculator = Calculator::new().unwrap(); - - let abs = calculator.abs(float).unwrap(); - let formatted = calculator.format(abs).unwrap(); + fn test_abs_no_minus_sign(float in arb_float()) { + let abs = float.abs().unwrap(); + let formatted = abs.format().unwrap(); prop_assert!(!formatted.starts_with("-")); } #[test] - fn test_abs_abs(float in valid_float()) { - let mut calculator = Calculator::new().unwrap(); - - let abs = calculator.abs(float).unwrap(); - let abs_abs = calculator.abs(abs).unwrap(); - prop_assert!(calculator.eq(abs, abs_abs).unwrap()); + fn test_abs_abs(float in arb_float()) { + let abs = float.abs().unwrap(); + let abs_abs = abs.abs().unwrap(); + prop_assert!(abs.eq(abs_abs).unwrap()); } } } From 350525dda38a0ae41570173c0d10a5f215bd7983 Mon Sep 17 00:00:00 2001 From: 0xgleb Date: Mon, 16 Jun 2025 19:52:00 +0400 Subject: [PATCH 3/3] fix minus sign test --- crates/float/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/float/src/lib.rs b/crates/float/src/lib.rs index 9b04e78b..2778dd02 100644 --- a/crates/float/src/lib.rs +++ b/crates/float/src/lib.rs @@ -446,7 +446,7 @@ mod tests { proptest! { #[test] - fn test_abs_no_minus_sign(float in arb_float()) { + fn test_abs_no_minus_sign(float in reasonable_float()) { let abs = float.abs().unwrap(); let formatted = abs.format().unwrap(); prop_assert!(!formatted.starts_with("-"));