use consola::*;
#[test]
fn error_chain_depth_limiting() {
use anyhow::anyhow;
let err = anyhow!("error 1")
.context("error 2")
.context("error 3")
.context("error 4")
.context("error 5");
let err_ref: &(dyn std::error::Error + 'static) = err.as_ref();
let chain = collect_chain(err_ref);
assert_eq!(chain.len(), 5);
let limited_2 = format_chain_lines(&chain, 2);
assert_eq!(limited_2.len(), 2);
assert!(limited_2[0].contains("error 5")); assert!(limited_2[1].contains("Caused by:"));
assert!(limited_2[1].contains("error 4"));
let limited_3 = format_chain_lines(&chain, 3);
assert_eq!(limited_3.len(), 3);
let unlimited = format_chain_lines(&chain, usize::MAX);
assert_eq!(unlimited.len(), 5);
}
#[test]
fn error_chain_cycle_detection() {
use anyhow::anyhow;
let err = anyhow!("test error");
let err_ref: &(dyn std::error::Error + 'static) = err.as_ref();
let chain = collect_chain(err_ref);
assert!(!chain.is_empty());
for i in 0..chain.len() {
for _j in (i + 1)..chain.len() {
}
}
}
#[test]
fn error_chain_multi_level_nested() {
use anyhow::anyhow;
use std::io;
let io_err = io::Error::new(io::ErrorKind::NotFound, "file not found");
let err = anyhow!(io_err)
.context("Failed to read config")
.context("Application initialization failed");
let err_ref: &(dyn std::error::Error + 'static) = err.as_ref();
let chain = collect_chain(err_ref);
assert!(chain.len() >= 3);
let formatted = format_chain_lines(&chain, usize::MAX);
assert!(!formatted[0].starts_with("Caused by:"));
for line in &formatted[1..] {
assert!(line.starts_with("Caused by:"));
}
let full_chain_str = formatted.join("\n");
assert!(
full_chain_str.contains("initialization failed")
|| full_chain_str.contains("Application initialization")
);
}
#[test]
fn error_chain_empty_source() {
use anyhow::anyhow;
let err = anyhow!("single error");
let err_ref: &(dyn std::error::Error + 'static) = err.as_ref();
let chain = collect_chain(err_ref);
assert_eq!(chain.len(), 1);
assert!(chain[0].contains("single error"));
}