diff --git a/eyre/Cargo.toml b/eyre/Cargo.toml index 982d9b2..5d9ac2d 100644 --- a/eyre/Cargo.toml +++ b/eyre/Cargo.toml @@ -26,7 +26,7 @@ pyo3 = { version = "0.20", optional = true, default-features = false } futures = { version = "0.3", default-features = false } rustversion = "1.0" thiserror = "1.0" -trybuild = { version = "1.0.19", features = ["diff"] } +ui_test = "0.21.0" backtrace = "0.3.46" anyhow = "1.0.28" syn = { version = "2.0", features = ["full"] } diff --git a/eyre/tests/compiletest.rs b/eyre/tests/compiletest.rs index 7974a62..973f0f8 100644 --- a/eyre/tests/compiletest.rs +++ b/eyre/tests/compiletest.rs @@ -1,7 +1,15 @@ -#[rustversion::attr(not(nightly), ignore)] +#[cfg_attr(not(backtrace), ignore)] #[cfg_attr(miri, ignore)] #[test] fn ui() { - let t = trybuild::TestCases::new(); - t.compile_fail("tests/ui/*.rs"); + let eyre_root_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); + let mut config = ui_test::Config::cargo(eyre_root_dir); + let rust_backtrace_val = "1"; + config + .program + .envs + .push(("RUST_BACKTRACE".into(), Some(rust_backtrace_val.into()))); + config.mode = ui_test::Mode::Run { exit_code: 0 }; + config.filter_files = vec!["ui_test".to_owned()]; + ui_test::run_tests(config); } diff --git a/eyre/tests/test_backtrace.rs b/eyre/tests/test_backtrace.rs index b9c6a9d..9094f68 100644 --- a/eyre/tests/test_backtrace.rs +++ b/eyre/tests/test_backtrace.rs @@ -48,20 +48,29 @@ mod test_backtrace { 13: test_backtrace::test_backtrace::test_backtrace "; + use std::backtrace::Backtrace; use std::sync::{Arc, Mutex}; /* This test does produce a backtrace for panic or error with the standard panic hook, * but I'm at a loss for how to capture the backtrace and compare it to a snippet. */ #[cfg_attr(not(backtrace), ignore)] - //#[test] - //#[should_panic] + // #[test] + // #[should_panic] fn test_backtrace_simple() { - high(FailFrame::Low).unwrap(); + let report = high(FailFrame::Low).expect_err("Must be error"); + let handler: &eyre::DefaultHandler = report.handler().downcast_ref().unwrap(); + eprintln!("{:?}", handler); + // let backtrace: Backtrace = handler.backtrace.unwrap(); + // let + /* + let backtrace: Option = handler.backtrace; + assert!(backtrace.is_some()); + */ } #[cfg_attr(not(backtrace), ignore)] - #[test] + // #[test] fn test_backtrace() { /* FIXME: check that the backtrace actually happens here * It's not trivial to compare the *whole* output, diff --git a/eyre/tests/ui/ui_test_backtrace.rs b/eyre/tests/ui/ui_test_backtrace.rs new file mode 100644 index 0000000..72d85ff --- /dev/null +++ b/eyre/tests/ui/ui_test_backtrace.rs @@ -0,0 +1,14 @@ +use eyre::Report; + +fn fail(fail: bool) -> Result<(), Report> { + let e: Report = eyre!("Internal error message"); + if fail { + Err(e).wrap_err("External error message") + } else { + Ok(()) + } +} + +fn main() { + fail(true); +} diff --git a/eyre/tests/ui/ui_test_backtrace.stderr b/eyre/tests/ui/ui_test_backtrace.stderr new file mode 100644 index 0000000..f8d406b --- /dev/null +++ b/eyre/tests/ui/ui_test_backtrace.stderr @@ -0,0 +1 @@ +error: embedded manifest `$DIR/ui_test_backtrace.rs` requires `-Zscript`