allure_rust_commons/
error_classifier.rs1use 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}