use bdk_wallet::descriptor;
use miniscript::AbsLockTime;
#[test]
fn test_older_with_invalid_rellocktime_too_large() {
let invalid_value = 0x80000000;
let result = descriptor!(wsh(older(invalid_value)));
assert!(
result.is_err(),
"Invalid RelLockTime {} should return an error",
invalid_value
);
if let Err(descriptor::DescriptorError::Miniscript(miniscript::Error::RelativeLockTime(_))) =
result
{
} else {
panic!("Expected RelLockTime error, got {:?}", result);
}
}
#[test]
fn test_older_with_valid_rellocktime_max() {
let max_valid_value = 65_535;
let result = descriptor!(wsh(older(max_valid_value)));
assert!(result.is_ok(), "Max valid RelLockTime should work");
}
#[test]
fn test_older_with_valid_rellocktime_min() {
let min_value = 1;
let result = descriptor!(wsh(older(min_value)));
assert!(result.is_ok(), "Min valid RelLockTime should work");
}
#[test]
fn test_older_with_valid_common_values() {
let test_cases = vec![
1, 144, 1000, 65535, 4_209_713, ];
for value in test_cases {
let result = descriptor!(wsh(older(value)));
assert!(result.is_ok(), "Valid RelLockTime {} should work", value);
}
}
#[test]
fn test_demonstrate_proper_error_handling() {
use miniscript::RelLockTime;
let valid_lock = RelLockTime::from_consensus(144);
assert!(
valid_lock.is_ok(),
"144 blocks should be a valid RelLockTime"
);
let invalid_value = 0x8000_0000;
let invalid_result = RelLockTime::from_consensus(invalid_value);
assert!(
invalid_result.is_err(),
"Value 0x{:x} should return a RelLockTime error",
invalid_value
);
}
#[test]
fn test_rel_lock_time_error() {
let invalid_value = 0x80000000u32;
let rel_lock_time_result = miniscript::RelLockTime::from_consensus(invalid_value);
assert!(rel_lock_time_result.is_err());
let rel_lock_time_error = rel_lock_time_result.unwrap_err();
let minisc_err = miniscript::Error::RelativeLockTime(rel_lock_time_error);
let error: descriptor::DescriptorError = minisc_err.into();
assert!(matches!(
error,
descriptor::DescriptorError::Miniscript(miniscript::Error::RelativeLockTime(_))
));
let display_string = format!("{}", error);
assert!(
display_string.contains("relative locktime"),
"Display string was: '{}'",
display_string
);
}
#[test]
fn test_after_with_invalid_abslocktime_zero() {
let invalid_value = 0;
let result = descriptor!(wsh(after(invalid_value)));
assert!(
result.is_err(),
"AbsLockTime of 0 should return an error in this context"
);
if let Err(descriptor::DescriptorError::Miniscript(miniscript::Error::AbsoluteLockTime(_))) =
result
{
} else {
panic!("Expected AbsLockTime error, got {:?}", result);
}
}
#[test]
fn test_after_with_valid_height() {
let block_height = 840_000; let result = descriptor!(wsh(after(block_height)));
assert!(result.is_ok(), "Valid block height should work");
}
#[test]
fn test_after_with_valid_timestamp() {
let timestamp = 1715817600; let result = descriptor!(wsh(after(timestamp)));
assert!(result.is_ok(), "Valid Unix timestamp should work");
}
#[test]
fn test_after_with_exact_max_valid_timestamp() {
let max_valid = 2_147_483_648;
let result = descriptor!(wsh(after(max_valid)));
assert!(
result.is_ok(),
"Value 2,147,483,648 should be the valid upper bound"
);
}
#[test]
fn test_after_with_invalid_just_above_max() {
let too_large = 2_147_483_649;
let result = descriptor!(wsh(after(too_large)));
assert!(
matches!(
result,
Err(descriptor::DescriptorError::Miniscript(
miniscript::Error::AbsoluteLockTime(_)
))
),
"Should fail specifically with a Miniscript AbsoluteLockTime error"
);
}
#[test]
fn test_after_with_u32_max_is_invalid() {
let max_value = u32::MAX;
let result = descriptor!(wsh(after(max_value)));
assert!(
result.is_err(),
"u32::MAX is often rejected as an invalid consensus locktime"
);
}
#[test]
fn test_abs_lock_time_error_mapping() {
let invalid_value = 0;
let abs_lock_result = AbsLockTime::from_consensus(invalid_value);
assert!(abs_lock_result.is_err());
let abs_err = abs_lock_result.unwrap_err();
let minisc_err = miniscript::Error::AbsoluteLockTime(abs_err);
let error: descriptor::DescriptorError = minisc_err.into();
assert!(matches!(error, descriptor::DescriptorError::Miniscript(_)));
let display_string = format!("{}", error);
assert!(
display_string.contains("absolute locktime"),
"Error message '{}' should mention locktime",
display_string
);
}