ballistics_engine/
drag_model.rs1#[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)] 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 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 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 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 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 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 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 let original = DragModel::G7;
107 let cloned = original;
108 assert_eq!(original, cloned);
109
110 assert_eq!(format!("{}", original), "G7");
112 assert_eq!(format!("{}", cloned), "G7");
113 }
114
115 #[test]
116 fn test_drag_model_copy() {
117 let original = DragModel::G1;
119 let copied = original; let also_copied = original; 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 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}