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 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 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 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 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 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 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 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 let original = DragModel::G7;
106 let cloned = original.clone();
107 assert_eq!(original, cloned);
108
109 assert_eq!(format!("{}", original), "G7");
111 assert_eq!(format!("{}", cloned), "G7");
112 }
113
114 #[test]
115 fn test_drag_model_copy() {
116 let original = DragModel::G1;
118 let copied = original; let also_copied = original; 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 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}