use dig_block::CheckpointError;
use std::error::Error as StdError;
#[test]
fn err003_invalid_data_display_contains_message() {
let e = CheckpointError::InvalidData("bad field".into());
let s = e.to_string();
assert!(s.contains("invalid checkpoint data"), "{}", s);
assert!(s.contains("bad field"), "{}", s);
}
#[test]
fn err003_not_found_display_contains_epoch() {
let e = CheckpointError::NotFound(42);
let s = e.to_string();
assert!(s.contains("checkpoint not found"), "{}", s);
assert!(s.contains("42"), "{}", s);
}
#[test]
fn err003_invalid_display_contains_reason() {
let e = CheckpointError::Invalid("hash mismatch".into());
let s = e.to_string();
assert!(s.contains("invalid checkpoint"), "{}", s);
assert!(s.contains("hash mismatch"), "{}", s);
}
#[test]
fn err003_score_not_higher_shows_current_and_submitted() {
let e = CheckpointError::ScoreNotHigher {
current: 100,
submitted: 50,
};
let s = e.to_string();
assert!(s.contains("100"), "{}", s);
assert!(s.contains("50"), "{}", s);
assert!(s.to_lowercase().contains("score"), "{}", s);
}
#[test]
fn err003_epoch_mismatch_shows_expected_and_got() {
let e = CheckpointError::EpochMismatch {
expected: 5,
got: 3,
};
let s = e.to_string();
assert!(s.contains('5'), "{}", s);
assert!(s.contains('3'), "{}", s);
}
#[test]
fn err003_already_finalized_non_empty_display() {
let e = CheckpointError::AlreadyFinalized;
let s = e.to_string();
assert!(!s.trim().is_empty());
assert!(s.to_lowercase().contains("finalized"), "{}", s);
}
#[test]
fn err003_not_started_non_empty_display() {
let e = CheckpointError::NotStarted;
let s = e.to_string();
assert!(!s.trim().is_empty());
assert!(
s.to_lowercase().contains("not started") || s.to_lowercase().contains("process"),
"{}",
s
);
}
#[test]
fn err003_implements_std_error() {
let e: CheckpointError = CheckpointError::InvalidData("x".into());
let _: &dyn StdError = &e;
let _ = e.source();
}
#[test]
fn err003_checkpoint_error_is_clone() {
let e = CheckpointError::NotFound(7);
assert_eq!(e.to_string(), e.clone().to_string());
}