#![warn(missing_docs)]
#[cfg(test)]
#[allow(clippy::result_large_err)]
mod tests {
use decrust_core::{ErrorReportConfig, ErrorReportFormat, ErrorReporter};
use std::error::Error;
use std::fmt;
#[derive(Debug)]
struct TestError {
message: String,
source: Option<Box<dyn Error + Send + Sync>>,
}
impl fmt::Display for TestError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.message)
}
}
impl Error for TestError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
self.source
.as_ref()
.map(|s| s.as_ref() as &(dyn Error + 'static))
}
}
#[test]
fn test_error_reporter_plain_format() {
let error = TestError {
message: "Test error message".to_string(),
source: None,
};
let reporter = ErrorReporter::new();
let config = ErrorReportConfig {
include_message: true,
include_source_chain: true,
include_backtrace: false,
include_rich_context: false,
include_source_location: false,
include_severity: false,
format: ErrorReportFormat::Plain,
max_chain_depth: None,
pretty_print_json: false,
include_diagnostics: false,
};
let report = reporter.report_to_string(&error, &config);
assert!(report.contains("Test error message"));
assert!(report.contains("Error:"));
}
#[test]
fn test_error_reporter_with_source() {
let source_error = TestError {
message: "Source error".to_string(),
source: None,
};
let error = TestError {
message: "Main error".to_string(),
source: Some(Box::new(source_error)),
};
let reporter = ErrorReporter::new();
let config = ErrorReportConfig {
include_message: true,
include_source_chain: true,
include_backtrace: false,
include_rich_context: false,
include_source_location: false,
include_severity: false,
format: ErrorReportFormat::Plain,
max_chain_depth: None,
pretty_print_json: false,
include_diagnostics: false,
};
let report = reporter.report_to_string(&error, &config);
assert!(report.contains("Main error"));
assert!(report.contains("Source error"));
assert!(report.contains("Caused by:"));
}
#[test]
fn test_error_reporter_json_format() {
let error = TestError {
message: "JSON test error".to_string(),
source: None,
};
let reporter = ErrorReporter::new();
let config = ErrorReportConfig {
format: ErrorReportFormat::Json,
pretty_print_json: false,
..Default::default()
};
let report = reporter.report_to_string(&error, &config);
assert!(report.contains("{"));
assert!(report.contains("}"));
assert!(report.contains("\"error\""));
assert!(report.contains("JSON test error"));
}
#[test]
fn test_error_reporter_with_syntax() {
let error = TestError {
message: "Syntax error in code".to_string(),
source: None,
};
let source_code = r#"fn main() {
let x: i32 = "not an integer"; // Type mismatch error
println!("Value: {}", x);
}"#;
let reporter = ErrorReporter::new();
let config = ErrorReportConfig {
format: ErrorReportFormat::Markdown,
include_source_chain: false, include_backtrace: false,
include_rich_context: false,
include_source_location: false,
include_severity: false,
include_diagnostics: false,
..Default::default()
};
let report = reporter.report_to_string_with_syntax(&error, &config, Some(source_code));
assert!(report.contains("Syntax error in code"));
assert!(report.contains("Source Code Context"));
assert!(report.contains("```rust"));
assert!(report.contains("let x: i32 = \"not an integer\";"));
}
}