diff --git a/primitives/src/transaction.rs b/primitives/src/transaction.rs index ef322e62b..6dec85fa6 100644 --- a/primitives/src/transaction.rs +++ b/primitives/src/transaction.rs @@ -729,9 +729,20 @@ mod tests { // Check the number of bytes OutPoint contributes to the transaction is equal to SIZE let outpoint_size = outpoint.txid.as_byte_array().len() + outpoint.vout.to_le_bytes().len(); assert_eq!(outpoint_size, OutPoint::SIZE); + } - // Check TooLong error - outpoint_str.push_str("0000000000"); + #[test] + #[cfg(feature = "hex")] + fn outpoint_from_str_too_long() { + // Check edge case: length exactly 75 + let mut outpoint_str = "0".repeat(64); + outpoint_str.push_str(":1234567890"); + assert_eq!(outpoint_str.len(), 75); + assert!(outpoint_str.parse::().is_ok()); + + // Check TooLong error (length 76) + outpoint_str.push('0'); + assert_eq!(outpoint_str.len(), 76); let outpoint: Result = outpoint_str.parse(); assert_eq!(outpoint, Err(ParseOutPointError::TooLong)); } diff --git a/units/src/amount/tests.rs b/units/src/amount/tests.rs index 9c1d616f1..088497504 100644 --- a/units/src/amount/tests.rs +++ b/units/src/amount/tests.rs @@ -256,6 +256,7 @@ fn checked_arithmetic() { #[test] fn positive_sub() { assert_eq!(ssat(10).positive_sub(ssat(7)).unwrap(), ssat(3)); + assert_eq!(ssat(10).positive_sub(ssat(10)).unwrap(), ssat(0)); assert!(ssat(-10).positive_sub(ssat(7)).is_none()); assert!(ssat(10).positive_sub(ssat(-7)).is_none()); assert!(ssat(10).positive_sub(ssat(11)).is_none()); diff --git a/units/src/fee_rate/mod.rs b/units/src/fee_rate/mod.rs index 6c223f956..b61e24d39 100644 --- a/units/src/fee_rate/mod.rs +++ b/units/src/fee_rate/mod.rs @@ -384,17 +384,20 @@ mod tests { } #[test] - fn from_sat_per_vb() { - let fee_rate = FeeRate::from_sat_per_vb(10); - assert_eq!(fee_rate, FeeRate::from_sat_per_kwu(2500)); - } + fn fee_rate_to_sat_per_x() { + let fee_rate = FeeRate::from_sat_per_mvb(2_000_400); - #[test] - fn raw_feerate() { - let fee_rate = FeeRate::from_sat_per_kwu(749); - assert_eq!(fee_rate.to_sat_per_kwu_floor(), 749); + // sat/kwu: 2_000_400 / 4_000 = 500.1 + assert_eq!(fee_rate.to_sat_per_kwu_floor(), 500); + assert_eq!(fee_rate.to_sat_per_kwu_ceil(), 501); + + // sat/vB: 2_000_400 / 1_000_000 = 2.0004 assert_eq!(fee_rate.to_sat_per_vb_floor(), 2); assert_eq!(fee_rate.to_sat_per_vb_ceil(), 3); + + // sat/kvb: 2_000_400 / 1_000 = 2_000.4 + assert_eq!(fee_rate.to_sat_per_kvb_floor(), 2_000); + assert_eq!(fee_rate.to_sat_per_kvb_ceil(), 2_001); } #[test] diff --git a/units/src/locktime/relative.rs b/units/src/locktime/relative.rs index 5edafe01e..ca2fbe8af 100644 --- a/units/src/locktime/relative.rs +++ b/units/src/locktime/relative.rs @@ -307,6 +307,13 @@ mod tests { assert_eq!(NumberOf512Seconds::from_512_second_intervals(1).to_seconds(), 512); } + #[test] + fn from_512_second_intervals_roundtrip() { + let intervals = 100_u16; + let locktime = NumberOf512Seconds::from_512_second_intervals(intervals); + assert_eq!(locktime.to_512_second_intervals(), intervals); + } + #[test] fn from_seconds_ceil_success() { let actual = NumberOf512Seconds::from_seconds_ceil(100).unwrap();