Skip to main content

bao_browser/
error.rs

1// @trace REQ-BRW-001
2use std::fmt;
3
4#[derive(Debug)]
5pub enum BrowserError {
6    Init(String),
7    Navigation(String),
8    Rendering(String),
9    JavaScript(String),
10    CDP(String),
11}
12
13impl fmt::Display for BrowserError {
14    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
15        match self {
16            BrowserError::Init(msg) => write!(f, "browser init error: {msg}"),
17            BrowserError::Navigation(msg) => write!(f, "navigation error: {msg}"),
18            BrowserError::Rendering(msg) => write!(f, "rendering error: {msg}"),
19            BrowserError::JavaScript(msg) => write!(f, "javascript error: {msg}"),
20            BrowserError::CDP(msg) => write!(f, "cdp error: {msg}"),
21        }
22    }
23}
24
25impl std::error::Error for BrowserError {}
26
27#[cfg(test)]
28mod tests {
29    // @trace REQ-BRW-001 [req:REQ-BRW-001] [level:unit]
30    use super::BrowserError;
31    use std::error::Error;
32
33    #[test]
34    fn init_display_format() {
35        let err = BrowserError::Init("servo crashed".into());
36        assert_eq!(err.to_string(), "browser init error: servo crashed");
37    }
38
39    #[test]
40    fn navigation_display_format() {
41        let err = BrowserError::Navigation("url not found".into());
42        assert_eq!(err.to_string(), "navigation error: url not found");
43    }
44
45    #[test]
46    fn rendering_display_format() {
47        let err = BrowserError::Rendering("gpu lost".into());
48        assert_eq!(err.to_string(), "rendering error: gpu lost");
49    }
50
51    #[test]
52    fn javascript_display_format() {
53        let err = BrowserError::JavaScript("syntax error".into());
54        assert_eq!(err.to_string(), "javascript error: syntax error");
55    }
56
57    #[test]
58    fn cdp_display_format() {
59        let err = BrowserError::CDP("connection refused".into());
60        assert_eq!(err.to_string(), "cdp error: connection refused");
61    }
62
63    #[test]
64    fn error_trait_dyn_compatible() {
65        let err: Box<dyn Error> = Box::new(BrowserError::Init("fail".into()));
66        assert_eq!(err.to_string(), "browser init error: fail");
67    }
68
69    #[test]
70    fn debug_format_roundtrip() {
71        let err = BrowserError::Navigation("page load".into());
72        let debug = format!("{err:?}");
73        assert!(
74            debug.contains("Navigation"),
75            "Debug should contain variant name: {debug}"
76        );
77        assert!(
78            debug.contains("page load"),
79            "Debug should contain message: {debug}"
80        );
81    }
82
83    #[test]
84    fn empty_string_message() {
85        let err = BrowserError::Rendering(String::new());
86        assert_eq!(err.to_string(), "rendering error: ");
87    }
88
89    #[test]
90    fn unicode_message() {
91        let err = BrowserError::CDP("连接失败 🌐".into());
92        assert_eq!(err.to_string(), "cdp error: 连接失败 🌐");
93    }
94}