ballistics_engine/
drag_model.rs

1/// Drag model enum
2#[derive(Debug, Clone, Copy, PartialEq)]
3pub enum DragModel {
4    G1,
5    G2,
6    G5,
7    G6,
8    G7,
9    G8,
10    GI,
11    GS,
12}
13
14impl DragModel {
15    pub fn from_str(s: &str) -> Option<Self> {
16        match s.to_uppercase().as_str() {
17            "G1" => Some(DragModel::G1),
18            "G2" => Some(DragModel::G2),
19            "G5" => Some(DragModel::G5),
20            "G6" => Some(DragModel::G6),
21            "G7" => Some(DragModel::G7),
22            "G8" => Some(DragModel::G8),
23            "GI" => Some(DragModel::GI),
24            "GS" => Some(DragModel::GS),
25            _ => None,
26        }
27    }
28}
29
30impl std::fmt::Display for DragModel {
31    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32        write!(f, "{:?}", self)
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39    
40    #[test]
41    fn test_drag_model_from_str() {
42        // Test valid drag models
43        assert_eq!(DragModel::from_str("G1"), Some(DragModel::G1));
44        assert_eq!(DragModel::from_str("G2"), Some(DragModel::G2));
45        assert_eq!(DragModel::from_str("G5"), Some(DragModel::G5));
46        assert_eq!(DragModel::from_str("G6"), Some(DragModel::G6));
47        assert_eq!(DragModel::from_str("G7"), Some(DragModel::G7));
48        assert_eq!(DragModel::from_str("G8"), Some(DragModel::G8));
49        assert_eq!(DragModel::from_str("GI"), Some(DragModel::GI));
50        assert_eq!(DragModel::from_str("GS"), Some(DragModel::GS));
51    }
52    
53    #[test]
54    fn test_drag_model_from_str_case_insensitive() {
55        // Test case insensitivity
56        assert_eq!(DragModel::from_str("g1"), Some(DragModel::G1));
57        assert_eq!(DragModel::from_str("G1"), Some(DragModel::G1));
58        assert_eq!(DragModel::from_str("g7"), Some(DragModel::G7));
59        assert_eq!(DragModel::from_str("G7"), Some(DragModel::G7));
60        assert_eq!(DragModel::from_str("gi"), Some(DragModel::GI));
61        assert_eq!(DragModel::from_str("GI"), Some(DragModel::GI));
62        assert_eq!(DragModel::from_str("Gs"), Some(DragModel::GS));
63    }
64    
65    #[test]
66    fn test_drag_model_from_str_invalid() {
67        // Test invalid inputs
68        assert_eq!(DragModel::from_str("G9"), None);
69        assert_eq!(DragModel::from_str("G10"), None);
70        assert_eq!(DragModel::from_str("X1"), None);
71        assert_eq!(DragModel::from_str(""), None);
72        assert_eq!(DragModel::from_str("invalid"), None);
73        assert_eq!(DragModel::from_str("123"), None);
74    }
75    
76    #[test]
77    fn test_drag_model_display() {
78        // Test Display implementation
79        assert_eq!(format!("{}", DragModel::G1), "G1");
80        assert_eq!(format!("{}", DragModel::G2), "G2");
81        assert_eq!(format!("{}", DragModel::G5), "G5");
82        assert_eq!(format!("{}", DragModel::G6), "G6");
83        assert_eq!(format!("{}", DragModel::G7), "G7");
84        assert_eq!(format!("{}", DragModel::G8), "G8");
85        assert_eq!(format!("{}", DragModel::GI), "GI");
86        assert_eq!(format!("{}", DragModel::GS), "GS");
87    }
88    
89    #[test]
90    fn test_drag_model_equality() {
91        // Test PartialEq implementation
92        assert_eq!(DragModel::G1, DragModel::G1);
93        assert_eq!(DragModel::G7, DragModel::G7);
94        assert_ne!(DragModel::G1, DragModel::G7);
95        assert_ne!(DragModel::G5, DragModel::G6);
96        
97        // Test that from_str produces equal values
98        let g1_from_str = DragModel::from_str("G1").unwrap();
99        assert_eq!(g1_from_str, DragModel::G1);
100    }
101    
102    #[test]
103    fn test_drag_model_clone() {
104        // Test Clone implementation
105        let original = DragModel::G7;
106        let cloned = original.clone();
107        assert_eq!(original, cloned);
108        
109        // Both should be independent
110        assert_eq!(format!("{}", original), "G7");
111        assert_eq!(format!("{}", cloned), "G7");
112    }
113    
114    #[test]
115    fn test_drag_model_copy() {
116        // Test Copy implementation
117        let original = DragModel::G1;
118        let copied = original; // This uses Copy
119        let also_copied = original; // Can still use original
120        
121        assert_eq!(original, copied);
122        assert_eq!(original, also_copied);
123        assert_eq!(copied, also_copied);
124    }
125    
126    #[test]
127    fn test_drag_model_debug() {
128        // Test Debug implementation
129        assert_eq!(format!("{:?}", DragModel::G1), "G1");
130        assert_eq!(format!("{:?}", DragModel::G7), "G7");
131        assert_eq!(format!("{:?}", DragModel::GI), "GI");
132        assert_eq!(format!("{:?}", DragModel::GS), "GS");
133    }
134}