1use alloc::string::String;
3use thiserror::Error;
4
5#[derive(Error, Debug)]
7#[error("Invalid SafetyLevel, error: {0}")]
8pub struct SafetyLevelParseError(pub String);
9
10#[cfg(test)]
11mod tests {
12 use core::str::FromStr;
13 use op_alloy_consensus::interop::SafetyLevel;
14
15 #[test]
16 #[cfg(feature = "serde")]
17 fn test_safety_level_serde() {
18 let level = SafetyLevel::Finalized;
19 let json = serde_json::to_string(&level).unwrap();
20 assert_eq!(json, r#""finalized""#);
21
22 let level: SafetyLevel = serde_json::from_str(&json).unwrap();
23 assert_eq!(level, SafetyLevel::Finalized);
24 }
25
26 #[test]
27 #[cfg(feature = "serde")]
28 fn test_serde_safety_level_fails() {
29 let json = r#""failed""#;
30 let level: Result<SafetyLevel, _> = serde_json::from_str(json);
31 assert!(level.is_err());
32 }
33
34 #[test]
35 fn test_safety_level_from_str_valid() {
36 assert_eq!(SafetyLevel::from_str("finalized").unwrap(), SafetyLevel::Finalized);
37 assert_eq!(SafetyLevel::from_str("safe").unwrap(), SafetyLevel::CrossSafe);
38 assert_eq!(SafetyLevel::from_str("local-safe").unwrap(), SafetyLevel::LocalSafe);
39 assert_eq!(SafetyLevel::from_str("localsafe").unwrap(), SafetyLevel::LocalSafe);
40 assert_eq!(SafetyLevel::from_str("cross-unsafe").unwrap(), SafetyLevel::CrossUnsafe);
41 assert_eq!(SafetyLevel::from_str("crossunsafe").unwrap(), SafetyLevel::CrossUnsafe);
42 assert_eq!(SafetyLevel::from_str("unsafe").unwrap(), SafetyLevel::LocalUnsafe);
43 assert_eq!(SafetyLevel::from_str("invalid").unwrap(), SafetyLevel::Invalid);
44 }
45
46 #[test]
47 fn test_safety_level_from_str_invalid() {
48 assert!(SafetyLevel::from_str("unknown").is_err());
49 assert!(SafetyLevel::from_str("123").is_err());
50 assert!(SafetyLevel::from_str("").is_err());
51 assert!(SafetyLevel::from_str("safe ").is_err());
52 }
53}