Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 112 additions & 0 deletions src/wallet/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -278,4 +278,116 @@ mod test {
shuffle_slice(&mut test, &mut rng);
assert_eq!(test, &[0, 4, 1, 2, 5]);
}

// --- Older::check_older boundary tests (addresses TODO on line 111) ---

use super::{After, Older};
use bitcoin::{absolute, relative, PublicKey};
use miniscript::Satisfier;

#[test]
fn test_check_older_at_boundary() {
// current_height == create_height + n → should pass (>=)
let older = Older::new(Some(110), Some(100), false);
assert!(Satisfier::<PublicKey>::check_older(
&older,
relative::LockTime::from_height(10)
));
}

#[test]
fn test_check_older_above_boundary() {
// current_height > create_height + n → should pass
let older = Older::new(Some(111), Some(100), false);
assert!(Satisfier::<PublicKey>::check_older(
&older,
relative::LockTime::from_height(10)
));
}

#[test]
fn test_check_older_below_boundary() {
// current_height < create_height + n → should fail
let older = Older::new(Some(109), Some(100), false);
assert!(!Satisfier::<PublicKey>::check_older(
&older,
relative::LockTime::from_height(10)
));
}

#[test]
fn test_check_older_none_height_assume_true() {
let older = Older::new(None, Some(100), true);
assert!(Satisfier::<PublicKey>::check_older(
&older,
relative::LockTime::from_height(10)
));
}

#[test]
fn test_check_older_none_height_assume_false() {
let older = Older::new(None, Some(100), false);
assert!(!Satisfier::<PublicKey>::check_older(
&older,
relative::LockTime::from_height(10)
));
}

#[test]
fn test_check_older_none_create_height() {
// create_height defaults to 0, so current_height >= 0 + 10
let older = Older::new(Some(10), None, false);
assert!(Satisfier::<PublicKey>::check_older(
&older,
relative::LockTime::from_height(10)
));
}

// --- After::check_after boundary tests ---

#[test]
fn test_check_after_at_boundary() {
// current_height == locktime → should pass (>=)
let after = After::new(Some(100_000), false);
assert!(Satisfier::<PublicKey>::check_after(
&after,
absolute::LockTime::from_consensus(100_000)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

absolute::LockTime can also represent Unix timestamps (>= 500_000_000), but After only has current_height and no current_time. So a timestamp-based locktime would end up being compared against a block height. I also noticed the existing tests don't cover this. Is this intentionally limited to height-based locktimes for now?

));
}

#[test]
fn test_check_after_above_boundary() {
let after = After::new(Some(100_001), false);
assert!(Satisfier::<PublicKey>::check_after(
&after,
absolute::LockTime::from_consensus(100_000)
));
}

#[test]
fn test_check_after_below_boundary() {
let after = After::new(Some(99_999), false);
assert!(!Satisfier::<PublicKey>::check_after(
&after,
absolute::LockTime::from_consensus(100_000)
));
}

#[test]
fn test_check_after_none_height_assume_true() {
let after = After::new(None, true);
assert!(Satisfier::<PublicKey>::check_after(
&after,
absolute::LockTime::from_consensus(100_000)
));
}

#[test]
fn test_check_after_none_height_assume_false() {
let after = After::new(None, false);
assert!(!Satisfier::<PublicKey>::check_after(
&after,
absolute::LockTime::from_consensus(100_000)
));
}
}