use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
use pi_async_fs::{RemoveFailure, RemoveTargetEvidence};
use pi_result::ErrorKind;
fn hash_of(value: &RemoveTargetEvidence) -> u64 {
let mut hasher = DefaultHasher::new();
value.hash(&mut hasher);
hasher.finish()
}
fn assert_send_sync_static<T: Send + Sync + 'static>() {}
#[test]
fn test_remove_target_evidence_value_traits_cover_every_variant() {
assert_send_sync_static::<RemoveTargetEvidence>();
let not_removed = RemoveTargetEvidence::NotRemovedByOperation;
let same_not_removed = RemoveTargetEvidence::NotRemovedByOperation;
let removed = RemoveTargetEvidence::RemovedByOperation;
let unknown = RemoveTargetEvidence::Unknown;
assert_eq!(format!("{not_removed:?}"), "NotRemovedByOperation");
assert_eq!(format!("{removed:?}"), "RemovedByOperation");
assert_eq!(format!("{unknown:?}"), "Unknown");
assert_eq!(not_removed.to_string(), "target not removed by operation");
assert_eq!(removed.to_string(), "target removed by operation");
assert_eq!(unknown.to_string(), "target removal outcome unknown");
assert_eq!(not_removed, same_not_removed);
assert_ne!(not_removed, removed);
assert!(not_removed < removed);
assert!(removed < unknown);
assert_eq!(hash_of(¬_removed), hash_of(&same_not_removed));
}
#[test]
fn test_remove_failure_preserves_error_and_target_evidence() {
let failure = RemoveFailure::new(
pi_result::error_stack::Report::new(ErrorKind::Conflict),
RemoveTargetEvidence::NotRemovedByOperation,
);
assert_eq!(failure.error().current_context(), &ErrorKind::Conflict);
assert_eq!(
failure.target_evidence(),
&RemoveTargetEvidence::NotRemovedByOperation
);
assert_eq!(
failure.to_string(),
"conflict; target: target not removed by operation"
);
let debug = format!("{failure:?}");
assert!(debug.contains("RemoveFailure"));
assert!(debug.contains("conflict"));
assert!(debug.contains("NotRemovedByOperation"));
let (error, evidence) = failure.into_parts();
assert_eq!(error.current_context(), &ErrorKind::Conflict);
assert_eq!(evidence, RemoveTargetEvidence::NotRemovedByOperation);
}