diff --git a/src/wallet/locked_outpoints.rs b/src/wallet/locked_outpoints.rs index 6ab2cbc3..dfee71b6 100644 --- a/src/wallet/locked_outpoints.rs +++ b/src/wallet/locked_outpoints.rs @@ -24,3 +24,81 @@ impl Merge for ChangeSet { self.outpoints.is_empty() } } + +#[cfg(test)] +mod test { + use super::*; + use bdk_chain::Merge; + use bitcoin::{hashes::Hash, OutPoint, Txid}; + + /// Helper to create an `OutPoint` from an index byte. + fn outpoint(vout: u32) -> OutPoint { + OutPoint { + txid: Txid::from_byte_array([vout as u8; 32]), + vout, + } + } + + #[test] + fn test_is_empty_default() { + let cs = ChangeSet::default(); + assert!(cs.is_empty()); + } + + #[test] + fn test_is_empty_with_entries() { + let cs = ChangeSet { + outpoints: [(outpoint(0), true)].into(), + }; + assert!(!cs.is_empty()); + } + + #[test] + fn test_merge_into_empty() { + let mut cs = ChangeSet::default(); + let other = ChangeSet { + outpoints: [(outpoint(1), true)].into(), + }; + cs.merge(other); + assert_eq!(cs.outpoints.len(), 1); + assert!(cs.outpoints[&outpoint(1)]); + } + + #[test] + fn test_merge_empty_into_non_empty() { + let mut cs = ChangeSet { + outpoints: [(outpoint(0), true)].into(), + }; + let snapshot = cs.clone(); + cs.merge(ChangeSet::default()); + assert_eq!(cs, snapshot); + } + + #[test] + fn test_merge_disjoint() { + let mut cs = ChangeSet { + outpoints: [(outpoint(0), true)].into(), + }; + let other = ChangeSet { + outpoints: [(outpoint(1), false)].into(), + }; + cs.merge(other); + assert_eq!(cs.outpoints.len(), 2); + assert!(cs.outpoints[&outpoint(0)]); + assert!(!cs.outpoints[&outpoint(1)]); + } + + #[test] + fn test_merge_overwrites_duplicate() { + let op = outpoint(0); + let mut cs = ChangeSet { + outpoints: [(op, true)].into(), + }; + let other = ChangeSet { + outpoints: [(op, false)].into(), + }; + cs.merge(other); + assert_eq!(cs.outpoints.len(), 1); + assert!(!cs.outpoints[&op], "other's value should overwrite self"); + } +}