use std::error::Error;
use qubit_id::IdError;
fn assert_error_trait(error: &dyn Error) -> String {
error.to_string()
}
#[test]
fn test_id_error_display_formats_all_variants() {
let cases = [
(
IdError::HostOutOfRange {
host: 512,
max: 511,
},
"host id 512 is out of range 0..=511",
),
(
IdError::NodeOutOfRange {
node_id: 1024,
max: 1023,
},
"node id 1024 is out of range 0..=1023",
),
(
IdError::MachineIdOutOfRange {
machine_id: 65_536,
max: 65_535,
},
"machine id 65536 is out of range 0..=65535",
),
(
IdError::TimestampOverflow {
timestamp: 8,
max: 7,
},
"timestamp 8 exceeds maximum 7",
),
(
IdError::SequenceOverflow {
sequence: 4,
max: 3,
},
"sequence 4 exceeds maximum 3",
),
(
IdError::ClockMovedBackwards {
last_timestamp: 10,
current_timestamp: 9,
skew_millis: 1,
max_skew_millis: 0,
},
"clock moved backwards from 10 to 9; skew 1 ms exceeds maximum 0 ms",
),
(
IdError::TimeBeforeEpoch,
"time is before the configured epoch",
),
(
IdError::StartTimeAhead,
"start time is ahead of the generator clock",
),
(
IdError::InvalidBitLength {
name: "time",
bits: 31,
reason: "time bit length must be at least 32",
},
"invalid bit length for time: 31; time bit length must be at least 32",
),
(
IdError::InvalidTimeUnit {
nanos: 1,
min_nanos: 1_000_000,
},
"invalid time unit 1 ns; minimum is 1000000 ns",
),
(
IdError::RandomSourceUnavailable,
"operating system random source is unavailable",
),
(IdError::StatePoisoned, "generator state mutex is poisoned"),
];
for (error, expected) in cases {
assert_eq!(assert_error_trait(&error), expected);
}
}