Skip to main content

oxihuman_morph/
jaundice_morph.rs

1// Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)
2// SPDX-License-Identifier: Apache-2.0
3#![allow(dead_code)]
4
5//! Jaundice (yellow tint) morph stub.
6
7/// Jaundice severity grade.
8#[derive(Debug, Clone, Copy, PartialEq)]
9pub enum JaundiceSeverity {
10    Mild,
11    Moderate,
12    Severe,
13}
14
15/// Jaundice morph controller.
16#[derive(Debug, Clone)]
17pub struct JaundiceMorph {
18    pub severity: JaundiceSeverity,
19    pub bilirubin_level: f32,
20    pub intensity: f32,
21    pub morph_count: usize,
22    pub enabled: bool,
23}
24
25impl JaundiceMorph {
26    pub fn new(morph_count: usize) -> Self {
27        JaundiceMorph {
28            severity: JaundiceSeverity::Mild,
29            bilirubin_level: 0.0,
30            intensity: 0.0,
31            morph_count,
32            enabled: true,
33        }
34    }
35}
36
37/// Create a new jaundice morph.
38pub fn new_jaundice_morph(morph_count: usize) -> JaundiceMorph {
39    JaundiceMorph::new(morph_count)
40}
41
42/// Set severity.
43pub fn jdm_set_severity(morph: &mut JaundiceMorph, severity: JaundiceSeverity) {
44    morph.severity = severity;
45}
46
47/// Set bilirubin level (mg/dL, unclamped).
48pub fn jdm_set_bilirubin(morph: &mut JaundiceMorph, bilirubin: f32) {
49    morph.bilirubin_level = bilirubin.max(0.0);
50}
51
52/// Set yellow tint intensity.
53pub fn jdm_set_intensity(morph: &mut JaundiceMorph, intensity: f32) {
54    morph.intensity = intensity.clamp(0.0, 1.0);
55}
56
57/// Evaluate morph weights (stub: uniform from intensity).
58pub fn jdm_evaluate(morph: &JaundiceMorph) -> Vec<f32> {
59    /* Stub: uniform weight from intensity */
60    if !morph.enabled || morph.morph_count == 0 {
61        return vec![];
62    }
63    vec![morph.intensity; morph.morph_count]
64}
65
66/// Enable or disable.
67pub fn jdm_set_enabled(morph: &mut JaundiceMorph, enabled: bool) {
68    morph.enabled = enabled;
69}
70
71/// Serialize to JSON-like string.
72pub fn jdm_to_json(morph: &JaundiceMorph) -> String {
73    let sev = match morph.severity {
74        JaundiceSeverity::Mild => "mild",
75        JaundiceSeverity::Moderate => "moderate",
76        JaundiceSeverity::Severe => "severe",
77    };
78    format!(
79        r#"{{"severity":"{}","bilirubin_level":{},"intensity":{},"morph_count":{},"enabled":{}}}"#,
80        sev, morph.bilirubin_level, morph.intensity, morph.morph_count, morph.enabled
81    )
82}
83
84#[cfg(test)]
85mod tests {
86    use super::*;
87
88    #[test]
89    fn test_default_severity() {
90        let m = new_jaundice_morph(4);
91        assert_eq!(
92            m.severity,
93            JaundiceSeverity::Mild /* default severity must be Mild */
94        );
95    }
96
97    #[test]
98    fn test_set_severity() {
99        let mut m = new_jaundice_morph(4);
100        jdm_set_severity(&mut m, JaundiceSeverity::Severe);
101        assert_eq!(
102            m.severity,
103            JaundiceSeverity::Severe /* severity must be set */
104        );
105    }
106
107    #[test]
108    fn test_bilirubin_clamp() {
109        let mut m = new_jaundice_morph(4);
110        jdm_set_bilirubin(&mut m, -5.0);
111        assert!(m.bilirubin_level.abs() < 1e-6 /* bilirubin must not be negative */);
112    }
113
114    #[test]
115    fn test_intensity_clamp() {
116        let mut m = new_jaundice_morph(4);
117        jdm_set_intensity(&mut m, 2.0);
118        assert!((m.intensity - 1.0).abs() < 1e-6 /* clamped to 1.0 */);
119    }
120
121    #[test]
122    fn test_evaluate_length() {
123        let mut m = new_jaundice_morph(6);
124        jdm_set_intensity(&mut m, 0.5);
125        assert_eq!(
126            jdm_evaluate(&m).len(),
127            6 /* output must match morph_count */
128        );
129    }
130
131    #[test]
132    fn test_evaluate_disabled() {
133        let mut m = new_jaundice_morph(4);
134        jdm_set_enabled(&mut m, false);
135        assert!(jdm_evaluate(&m).is_empty() /* disabled must return empty */);
136    }
137
138    #[test]
139    fn test_to_json_has_severity() {
140        let m = new_jaundice_morph(4);
141        let j = jdm_to_json(&m);
142        assert!(j.contains("\"severity\"") /* JSON must have severity */);
143    }
144
145    #[test]
146    fn test_enabled_default() {
147        let m = new_jaundice_morph(4);
148        assert!(m.enabled /* must be enabled by default */);
149    }
150
151    #[test]
152    fn test_evaluate_matches_intensity() {
153        let mut m = new_jaundice_morph(3);
154        jdm_set_intensity(&mut m, 0.3);
155        let out = jdm_evaluate(&m);
156        assert!((out[0] - 0.3).abs() < 1e-5 /* evaluate must match intensity */);
157    }
158}