//! Helpers module test utilities //! //! This module now uses the centralized test infrastructure for consistency. //! Module-specific utilities are kept here, while common functionality is imported from test_utils. #[cfg(test)] pub use crate::test_utils::*; // Module-specific test utilities that are unique to helpers module #[cfg(test)] pub mod helpers_test_utils { use super::*; use common_data::math::{try_mul_div, Rounding}; /// Calculate expected shares using the vault's conversion formula /// This is specific to the helpers module's math testing pub fn calculate_expected_shares( assets: u128, share_price: u128, extra_decimals: u8, share_price_decimals: u8, ) -> u128 { let extra_decimal_scale = 10u128.pow(extra_decimals as u32); let share_price_scale = 10u128.pow(share_price_decimals as u32); // Formula: shares = (assets * extra_decimal_scale * share_price_scale) / share_price let scaled_assets = try_mul_div(assets, extra_decimal_scale, 1, Rounding::Down).unwrap(); try_mul_div( scaled_assets, share_price_scale, share_price, Rounding::Down, ) .unwrap() } /// Calculate expected assets using the vault's conversion formula /// This is specific to the helpers module's math testing pub fn calculate_expected_assets( shares: u128, share_price: u128, extra_decimals: u8, share_price_decimals: u8, ) -> u128 { let extra_decimal_scale = 10u128.pow(extra_decimals as u32); let share_price_scale = 10u128.pow(share_price_decimals as u32); // Formula: assets = (shares * share_price / share_price_scale) / extra_decimal_scale let intermediate = try_mul_div(shares, share_price, share_price_scale, Rounding::Down).unwrap(); try_mul_div(intermediate, 1, extra_decimal_scale, Rounding::Down).unwrap() } /// Generate test cases for mathematical precision testing pub fn precision_test_cases() -> Vec<(u128, u128, u8, u8)> { vec![ // (assets, share_price, extra_decimals, share_price_decimals) (TEST_USDC_AMOUNT, DEFAULT_SHARE_PRICE, EXTRA_DECIMALS, 18), (TEST_LARGE_AMOUNT, DEFAULT_SHARE_PRICE, EXTRA_DECIMALS, 18), ( TEST_SMALL_AMOUNT, DEFAULT_SHARE_PRICE * 2, EXTRA_DECIMALS, 18, ), ( TEST_USDC_AMOUNT * 100, DEFAULT_SHARE_PRICE / 2, EXTRA_DECIMALS, 18, ), ] } /// Test rounding behavior with different scenarios pub fn rounding_test_scenarios() -> Vec<(&'static str, u128, u128, Rounding)> { vec![ ("Round down small remainder", 1000, 3, Rounding::Down), ("Round up small remainder", 1000, 3, Rounding::Up), ("Round down large remainder", 10000, 7, Rounding::Down), ("Round up large remainder", 10000, 7, Rounding::Up), ] } } // Include the security tests module #[cfg(test)] mod security;