diff --git a/units/src/block.rs b/units/src/block.rs index 4efe0547b..57cae8ed7 100644 --- a/units/src/block.rs +++ b/units/src/block.rs @@ -439,6 +439,7 @@ impl<'a> core::iter::Sum<&'a BlockMtpInterval> for BlockMtpInterval { #[cfg(test)] mod tests { use super::*; + use crate::locktime::relative::NumberOf512Seconds; #[test] fn sanity_check() { @@ -479,6 +480,7 @@ mod tests { // interval - interval = interval assert!(BlockHeightInterval(10) - BlockHeightInterval(7) == BlockHeightInterval(3)); + // Sum for BlockHeightInterval by reference and by value assert!( [BlockHeightInterval(1), BlockHeightInterval(2), BlockHeightInterval(3)] .iter() @@ -492,6 +494,20 @@ mod tests { == BlockHeightInterval(15) ); + // Sum for BlockMtpInterval by reference and by value + assert!( + [BlockMtpInterval(1), BlockMtpInterval(2), BlockMtpInterval(3)] + .iter() + .sum::() + == BlockMtpInterval(6) + ); + assert!( + [BlockMtpInterval(4), BlockMtpInterval(5), BlockMtpInterval(6)] + .into_iter() + .sum::() + == BlockMtpInterval(15) + ); + // interval += interval let mut int = BlockHeightInterval(1); int += BlockHeightInterval(2); @@ -502,4 +518,54 @@ mod tests { int -= BlockHeightInterval(7); assert_eq!(int, BlockHeightInterval(3)); } + + #[test] + fn block_height_checked() { + let a = BlockHeight(10); + let b = BlockHeight(5); + assert_eq!(a.checked_sub(b), Some(BlockHeightInterval(5))); + assert_eq!(a.checked_add(BlockHeightInterval(5)), Some(BlockHeight(15))); + assert_eq!(a.checked_sub(BlockHeight(11)), None); + assert_eq!(a.checked_add(BlockHeightInterval(u32::MAX - 5)), None); + } + + #[test] + fn block_height_interval_checked() { + let a = BlockHeightInterval(10); + let b = BlockHeightInterval(5); + assert_eq!(a.checked_sub(b), Some(BlockHeightInterval(5))); + assert_eq!(a.checked_add(b), Some(BlockHeightInterval(15))); + assert_eq!(a.checked_sub(BlockHeightInterval(11)), None); + assert_eq!(a.checked_add(BlockHeightInterval(u32::MAX - 5)), None); + } + + #[test] + fn block_mtp_interval_checked() { + let a = BlockMtpInterval(10); + let b = BlockMtpInterval(5); + assert_eq!(a.checked_sub(b), Some(BlockMtpInterval(5))); + assert_eq!(a.checked_add(b), Some(BlockMtpInterval(15))); + assert_eq!(a.checked_sub(BlockMtpInterval(11)), None); + assert_eq!(a.checked_add(BlockMtpInterval(u32::MAX - 5)), None); + } + + #[test] + fn block_mtp_checked() { + let a = BlockMtp(10); + let b = BlockMtp(5); + assert_eq!(a.checked_sub(b), Some(BlockMtpInterval(5))); + assert_eq!(a.checked_add(BlockMtpInterval(5)), Some(BlockMtp(15))); + assert_eq!(a.checked_sub(BlockMtp(11)), None); + assert_eq!(a.checked_add(BlockMtpInterval(u32::MAX - 5)), None); + } + + #[test] + fn block_mtp_interval_from_number_of_512seconds() { + let n = NumberOf512Seconds::from_seconds_floor(0).unwrap(); + let interval = BlockMtpInterval::from(n); + assert_eq!(interval, BlockMtpInterval(0)); + let n = NumberOf512Seconds::from_seconds_floor(1024).unwrap(); + let interval = BlockMtpInterval::from(n); + assert_eq!(interval, BlockMtpInterval(1024)); + } }