1use 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 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}