1use serde::{Deserialize, Serialize};
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
17#[serde(rename_all = "snake_case")]
18pub enum ConfidenceLevel {
19 Verified,
21 #[default]
23 Partial,
24 AstOnly,
26}
27
28#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
30pub struct ConfidenceMetadata {
31 pub level: ConfidenceLevel,
33 #[serde(default, skip_serializing_if = "Vec::is_empty")]
35 pub limitations: Vec<String>,
36 #[serde(default, skip_serializing_if = "Vec::is_empty")]
38 pub unavailable_features: Vec<String>,
39}
40
41#[cfg(test)]
42mod tests {
43 use super::*;
44
45 #[test]
46 fn test_confidence_level_default() {
47 let level = ConfidenceLevel::default();
48 assert_eq!(level, ConfidenceLevel::Partial);
49 }
50
51 #[test]
52 fn test_confidence_level_serialization() {
53 let verified = ConfidenceLevel::Verified;
54 let json = serde_json::to_string(&verified).unwrap();
55 assert_eq!(json, "\"verified\"");
56
57 let partial = ConfidenceLevel::Partial;
58 let json = serde_json::to_string(&partial).unwrap();
59 assert_eq!(json, "\"partial\"");
60
61 let ast_only = ConfidenceLevel::AstOnly;
62 let json = serde_json::to_string(&ast_only).unwrap();
63 assert_eq!(json, "\"ast_only\"");
64 }
65
66 #[test]
67 fn test_confidence_level_deserialization() {
68 let verified: ConfidenceLevel = serde_json::from_str("\"verified\"").unwrap();
69 assert_eq!(verified, ConfidenceLevel::Verified);
70
71 let partial: ConfidenceLevel = serde_json::from_str("\"partial\"").unwrap();
72 assert_eq!(partial, ConfidenceLevel::Partial);
73
74 let ast_only: ConfidenceLevel = serde_json::from_str("\"ast_only\"").unwrap();
75 assert_eq!(ast_only, ConfidenceLevel::AstOnly);
76 }
77
78 #[test]
79 fn test_confidence_metadata_default() {
80 let meta = ConfidenceMetadata::default();
81 assert_eq!(meta.level, ConfidenceLevel::Partial);
82 assert!(meta.limitations.is_empty());
83 assert!(meta.unavailable_features.is_empty());
84 }
85
86 #[test]
87 fn test_confidence_metadata_serialization() {
88 let meta = ConfidenceMetadata {
89 level: ConfidenceLevel::AstOnly,
90 limitations: vec!["No type inference".to_string()],
91 unavailable_features: vec!["rust-analyzer".to_string()],
92 };
93
94 let json = serde_json::to_string(&meta).unwrap();
95 assert!(json.contains("\"level\":\"ast_only\""));
96 assert!(json.contains("\"limitations\""));
97 assert!(json.contains("\"No type inference\""));
98 assert!(json.contains("\"unavailable_features\""));
99 assert!(json.contains("\"rust-analyzer\""));
100 }
101
102 #[test]
103 fn test_confidence_metadata_empty_vectors_omitted() {
104 let meta = ConfidenceMetadata {
105 level: ConfidenceLevel::Verified,
106 limitations: vec![],
107 unavailable_features: vec![],
108 };
109
110 let json = serde_json::to_string(&meta).unwrap();
111 assert!(!json.contains("\"limitations\""));
113 assert!(!json.contains("\"unavailable_features\""));
114 assert!(json.contains("\"level\":\"verified\""));
115 }
116
117 #[test]
118 fn test_confidence_metadata_roundtrip() {
119 let original = ConfidenceMetadata {
120 level: ConfidenceLevel::Partial,
121 limitations: vec!["Limited accuracy".to_string()],
122 unavailable_features: vec!["Type checking".to_string()],
123 };
124
125 let json = serde_json::to_string(&original).unwrap();
126 let deserialized: ConfidenceMetadata = serde_json::from_str(&json).unwrap();
127
128 assert_eq!(original, deserialized);
129 }
130}