oxihuman_morph/
sun_damage_morph.rs1#![allow(dead_code)]
4
5#[derive(Debug, Clone, Copy, PartialEq)]
9pub enum SunDamageSeverity {
10 None,
11 Mild,
12 Moderate,
13 Severe,
14}
15
16#[derive(Debug, Clone)]
18pub struct SunDamageMorph {
19 pub severity: SunDamageSeverity,
20 pub exposure_years: f32,
21 pub intensity: f32,
22 pub morph_count: usize,
23 pub enabled: bool,
24}
25
26impl SunDamageMorph {
27 pub fn new(morph_count: usize) -> Self {
28 SunDamageMorph {
29 severity: SunDamageSeverity::None,
30 exposure_years: 0.0,
31 intensity: 0.0,
32 morph_count,
33 enabled: true,
34 }
35 }
36}
37
38pub fn new_sun_damage_morph(morph_count: usize) -> SunDamageMorph {
40 SunDamageMorph::new(morph_count)
41}
42
43pub fn sdm_set_severity(morph: &mut SunDamageMorph, severity: SunDamageSeverity) {
45 morph.severity = severity;
46}
47
48pub fn sdm_set_exposure_years(morph: &mut SunDamageMorph, years: f32) {
50 morph.exposure_years = years.max(0.0);
51}
52
53pub fn sdm_set_intensity(morph: &mut SunDamageMorph, intensity: f32) {
55 morph.intensity = intensity.clamp(0.0, 1.0);
56}
57
58pub fn sdm_evaluate(morph: &SunDamageMorph) -> Vec<f32> {
60 if !morph.enabled || morph.morph_count == 0 {
62 return vec![];
63 }
64 vec![morph.intensity; morph.morph_count]
65}
66
67pub fn sdm_set_enabled(morph: &mut SunDamageMorph, enabled: bool) {
69 morph.enabled = enabled;
70}
71
72pub fn sdm_to_json(morph: &SunDamageMorph) -> String {
74 let sev = match morph.severity {
75 SunDamageSeverity::None => "none",
76 SunDamageSeverity::Mild => "mild",
77 SunDamageSeverity::Moderate => "moderate",
78 SunDamageSeverity::Severe => "severe",
79 };
80 format!(
81 r#"{{"severity":"{}","exposure_years":{},"intensity":{},"morph_count":{},"enabled":{}}}"#,
82 sev, morph.exposure_years, morph.intensity, morph.morph_count, morph.enabled
83 )
84}
85
86#[cfg(test)]
87mod tests {
88 use super::*;
89
90 #[test]
91 fn test_default_severity() {
92 let m = new_sun_damage_morph(4);
93 assert_eq!(
94 m.severity,
95 SunDamageSeverity::None );
97 }
98
99 #[test]
100 fn test_set_severity() {
101 let mut m = new_sun_damage_morph(4);
102 sdm_set_severity(&mut m, SunDamageSeverity::Severe);
103 assert_eq!(
104 m.severity,
105 SunDamageSeverity::Severe );
107 }
108
109 #[test]
110 fn test_exposure_years_clamp() {
111 let mut m = new_sun_damage_morph(4);
112 sdm_set_exposure_years(&mut m, -5.0);
113 assert!(m.exposure_years.abs() < 1e-6 );
114 }
115
116 #[test]
117 fn test_intensity_clamp() {
118 let mut m = new_sun_damage_morph(4);
119 sdm_set_intensity(&mut m, 1.5);
120 assert!((m.intensity - 1.0).abs() < 1e-6 );
121 }
122
123 #[test]
124 fn test_evaluate_length() {
125 let mut m = new_sun_damage_morph(6);
126 sdm_set_intensity(&mut m, 0.5);
127 assert_eq!(
128 sdm_evaluate(&m).len(),
129 6 );
131 }
132
133 #[test]
134 fn test_evaluate_disabled() {
135 let mut m = new_sun_damage_morph(4);
136 sdm_set_enabled(&mut m, false);
137 assert!(sdm_evaluate(&m).is_empty() );
138 }
139
140 #[test]
141 fn test_evaluate_zero_count() {
142 let m = new_sun_damage_morph(0);
143 assert!(sdm_evaluate(&m).is_empty() );
144 }
145
146 #[test]
147 fn test_to_json_has_severity() {
148 let m = new_sun_damage_morph(4);
149 let j = sdm_to_json(&m);
150 assert!(j.contains("\"severity\"") );
151 }
152
153 #[test]
154 fn test_enabled_default() {
155 let m = new_sun_damage_morph(4);
156 assert!(m.enabled );
157 }
158
159 #[test]
160 fn test_evaluate_matches_intensity() {
161 let mut m = new_sun_damage_morph(3);
162 sdm_set_intensity(&mut m, 0.4);
163 let out = sdm_evaluate(&m);
164 assert!((out[0] - 0.4).abs() < 1e-5 );
165 }
166}