Skip to main content

allure_rust_commons/
error_classifier.rs

1use std::any::Any;
2
3use crate::model::{Status, StatusDetails};
4
5pub fn get_status_from_error(message: &str) -> Status {
6    let lowercase = message.to_ascii_lowercase();
7    if lowercase.contains("assertion")
8        || lowercase.contains("assert")
9        || lowercase.contains("comparison failed")
10    {
11        Status::Failed
12    } else {
13        Status::Broken
14    }
15}
16
17pub fn classify_message(message: impl Into<String>) -> (Status, StatusDetails) {
18    let message = message.into();
19    (
20        get_status_from_error(&message),
21        StatusDetails {
22            message: Some(message),
23            trace: None,
24            actual: None,
25            expected: None,
26        },
27    )
28}
29
30pub fn classify_panic(payload: &Box<dyn Any + Send>) -> (Status, StatusDetails) {
31    let message = if let Some(message) = payload.downcast_ref::<&str>() {
32        (*message).to_string()
33    } else if let Some(message) = payload.downcast_ref::<String>() {
34        message.clone()
35    } else {
36        "panic without string payload".to_string()
37    };
38
39    classify_message(message)
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn detects_assertion_messages_as_failed() {
48        assert!(matches!(
49            get_status_from_error("assert_eq! left != right"),
50            Status::Failed
51        ));
52        assert!(matches!(
53            get_status_from_error("assertion failed: expected true"),
54            Status::Failed
55        ));
56    }
57
58    #[test]
59    fn classifies_non_assertion_messages_as_broken() {
60        assert!(matches!(
61            get_status_from_error("panic without string payload"),
62            Status::Broken
63        ));
64    }
65}