use dig_block::{BlockError, Bytes32};
use std::error::Error as StdError;
fn byte_tag(b: u8) -> Bytes32 {
Bytes32::new([b; 32])
}
#[test]
fn err002_puzzle_hash_mismatch_shows_coin_and_hashes() {
let coin_id = byte_tag(0x11);
let expected = byte_tag(0x22);
let computed = byte_tag(0x33);
let e = BlockError::PuzzleHashMismatch {
coin_id,
expected,
computed,
};
let s = e.to_string();
assert!(s.to_lowercase().contains("puzzle"), "{}", s);
assert!(s.contains("mismatch") || s.contains("expected"), "{}", s);
}
#[test]
fn err002_clvm_execution_failed_shows_coin_and_reason() {
let e = BlockError::ClvmExecutionFailed {
coin_id: byte_tag(0x44),
reason: "opcode fault".into(),
};
let s = e.to_string();
assert!(s.to_lowercase().contains("clvm"), "{}", s);
assert!(s.contains("opcode fault"), "{}", s);
}
#[test]
fn err002_clvm_cost_exceeded_shows_cost_and_remaining() {
let e = BlockError::ClvmCostExceeded {
coin_id: byte_tag(0x55),
cost: 9_000,
remaining: 1_000,
};
let s = e.to_string();
assert!(s.contains("9000"), "{}", s);
assert!(s.contains("1000"), "{}", s);
}
#[test]
fn err002_assertion_failed_shows_condition_and_reason() {
let e = BlockError::AssertionFailed {
condition: "ASSERT_COIN_ANNOUNCEMENT".into(),
reason: "missing announcement".into(),
};
let s = e.to_string();
assert!(s.to_lowercase().contains("assertion"), "{}", s);
assert!(s.contains("ASSERT_COIN_ANNOUNCEMENT"), "{}", s);
assert!(s.contains("missing announcement"), "{}", s);
}
#[test]
fn err002_announcement_not_found_shows_hash() {
let h = byte_tag(0x66);
let e = BlockError::AnnouncementNotFound {
announcement_hash: h,
};
assert!(!e.to_string().is_empty());
}
#[test]
fn err002_signature_failed_shows_bundle_index() {
let e = BlockError::SignatureFailed { bundle_index: 7 };
let s = e.to_string();
assert!(s.contains('7'), "{}", s);
assert!(s.to_lowercase().contains("sign"), "{}", s);
}
#[test]
fn err002_coin_minting_shows_removed_and_added() {
let e = BlockError::CoinMinting {
removed: 100,
added: 500,
};
let s = e.to_string();
assert!(s.contains("100"), "{}", s);
assert!(s.contains("500"), "{}", s);
}
#[test]
fn err002_fees_mismatch_shows_header_and_computed() {
let e = BlockError::FeesMismatch {
header: 42,
computed: 43,
};
let s = e.to_string();
assert!(s.contains("42"), "{}", s);
assert!(s.contains("43"), "{}", s);
}
#[test]
fn err002_reserve_fee_failed_shows_required_and_actual() {
let e = BlockError::ReserveFeeFailed {
required: 1_000_000,
actual: 999_999,
};
let s = e.to_string();
assert!(s.contains("1000000"), "{}", s);
assert!(s.contains("999999"), "{}", s);
}
#[test]
fn err002_cost_mismatch_shows_header_and_computed() {
let e = BlockError::CostMismatch {
header: 10,
computed: 11,
};
let s = e.to_string();
assert!(s.contains("10"), "{}", s);
assert!(s.contains("11"), "{}", s);
}
#[test]
fn err002_invalid_proposer_signature_non_empty_display() {
let e = BlockError::InvalidProposerSignature;
assert!(!e.to_string().trim().is_empty());
assert!(
e.to_string().to_lowercase().contains("proposer")
|| e.to_string().to_lowercase().contains("signature")
);
}
#[test]
fn err002_not_found_shows_block_hash() {
let h = byte_tag(0x77);
let e = BlockError::NotFound(h);
let s = e.to_string();
assert!(
s.to_lowercase().contains("not found") || s.contains("block"),
"{}",
s
);
}
#[test]
fn err002_invalid_state_root_shows_expected_and_computed() {
let e = BlockError::InvalidStateRoot {
expected: byte_tag(0xaa),
computed: byte_tag(0xbb),
};
assert!(!e.to_string().is_empty());
assert!(e.to_string().to_lowercase().contains("state"));
}
#[test]
fn err002_coin_not_found_shows_coin_id() {
let coin_id = byte_tag(0xcc);
let e = BlockError::CoinNotFound { coin_id };
let s = e.to_string();
assert!(s.to_lowercase().contains("coin"), "{}", s);
assert!(s.to_lowercase().contains("not found"), "{}", s);
}
#[test]
fn err002_coin_already_spent_shows_coin_and_height() {
let e = BlockError::CoinAlreadySpent {
coin_id: byte_tag(0xdd),
spent_height: 12345,
};
let s = e.to_string();
assert!(s.contains("12345"), "{}", s);
}
#[test]
fn err002_coin_already_exists_shows_coin_id() {
let e = BlockError::CoinAlreadyExists {
coin_id: byte_tag(0xee),
};
let s = e.to_string();
assert!(
s.to_lowercase().contains("already exists") || s.contains("coin"),
"{}",
s
);
}
#[test]
fn err002_tier2_tier3_clone_and_error_trait() {
let e = BlockError::SignatureFailed { bundle_index: 0 };
let _: &dyn StdError = &e;
let _ = e.source();
assert_eq!(e.to_string(), e.clone().to_string());
}