Skip to main content

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