use std::time::Duration;
use qubit_retry::{Delay, Jitter, RetryExecutor, RetryOptions};
use crate::support::TestError;
#[test]
fn test_build_validates_options_and_reports_builder_errors() {
let options = RetryOptions::new(2, None, Delay::none(), Jitter::none())
.expect("valid retry options should be created");
let executor = RetryExecutor::<TestError>::from_options(options.clone())
.expect("executor should be created from valid options");
assert_eq!(executor.options(), &options);
let invalid_delay = RetryExecutor::<TestError>::builder()
.delay(Delay::fixed(Duration::ZERO))
.build()
.expect_err("zero fixed delay should be rejected");
assert_eq!(invalid_delay.path(), RetryOptions::KEY_DELAY);
let invalid_jitter = RetryExecutor::<TestError>::builder()
.jitter_factor(1.5)
.build()
.expect_err("out-of-range jitter should be rejected");
assert_eq!(invalid_jitter.path(), RetryOptions::KEY_JITTER_FACTOR);
let invalid_attempts = RetryExecutor::<TestError>::builder()
.max_attempts(0)
.build()
.expect_err("zero attempts should be rejected");
assert_eq!(invalid_attempts.path(), RetryOptions::KEY_MAX_ATTEMPTS);
}
#[test]
fn test_default_and_debug_work() {
let executor = qubit_retry::RetryExecutorBuilder::<TestError>::default()
.delay(Delay::none())
.build()
.expect("default builder should create an executor");
assert!(format!("{executor:?}").contains("RetryExecutor"));
}
#[test]
fn test_build_and_from_options_allow_borrowed_error_type() {
#[derive(Debug, PartialEq, Eq)]
struct BorrowedError<'a>(&'a str);
let message = String::from("borrowed");
let options = RetryOptions::new(2, None, Delay::none(), Jitter::none())
.expect("valid retry options should be created");
let from_options_executor = RetryExecutor::<BorrowedError<'_>>::from_options(options.clone())
.expect("executor from options should support borrowed error types");
assert_eq!(from_options_executor.options(), &options);
let built_executor = RetryExecutor::<BorrowedError<'_>>::builder()
.delay(Delay::none())
.build()
.expect("builder should support borrowed error types");
assert_eq!(built_executor.options().max_attempts.get(), 3);
let run_result = from_options_executor
.run(|| -> Result<(), BorrowedError<'_>> { Err(BorrowedError(message.as_str())) });
let run_error = run_result.expect_err("operation should fail with borrowed error");
assert_eq!(run_error.attempts(), 2);
assert_eq!(run_error.last_error(), Some(&BorrowedError("borrowed")));
}