oxihuman-core 0.1.2

Core data structures, algorithms, and asset management for OxiHuman
Documentation
#![allow(dead_code)]

#[allow(dead_code)]
#[derive(Debug, Clone)]
pub struct ProgressTracker {
    current: f32,
    total: f32,
}

#[allow(dead_code)]
pub fn new_progress_tracker(total: f32) -> ProgressTracker {
    ProgressTracker {
        current: 0.0,
        total: if total <= 0.0 { 1.0 } else { total },
    }
}

#[allow(dead_code)]
pub fn set_progress(pt: &mut ProgressTracker, value: f32) {
    pt.current = value.clamp(0.0, pt.total);
}

#[allow(dead_code)]
pub fn get_progress(pt: &ProgressTracker) -> f32 {
    pt.current
}

#[allow(dead_code)]
pub fn progress_percent(pt: &ProgressTracker) -> f32 {
    (pt.current / pt.total) * 100.0
}

#[allow(dead_code)]
pub fn is_complete(pt: &ProgressTracker) -> bool {
    (pt.current - pt.total).abs() < f32::EPSILON
}

#[allow(dead_code)]
pub fn progress_reset(pt: &mut ProgressTracker) {
    pt.current = 0.0;
}

#[allow(dead_code)]
pub fn progress_increment(pt: &mut ProgressTracker, amount: f32) {
    pt.current = (pt.current + amount).min(pt.total);
}

#[allow(dead_code)]
pub fn progress_to_json(pt: &ProgressTracker) -> String {
    format!(
        "{{\"current\":{},\"total\":{},\"percent\":{}}}",
        pt.current,
        pt.total,
        progress_percent(pt)
    )
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_new() {
        let pt = new_progress_tracker(100.0);
        assert_eq!(get_progress(&pt), 0.0);
    }

    #[test]
    fn test_set() {
        let mut pt = new_progress_tracker(100.0);
        set_progress(&mut pt, 50.0);
        assert_eq!(get_progress(&pt), 50.0);
    }

    #[test]
    fn test_percent() {
        let mut pt = new_progress_tracker(200.0);
        set_progress(&mut pt, 100.0);
        assert!((progress_percent(&pt) - 50.0).abs() < f32::EPSILON);
    }

    #[test]
    fn test_complete() {
        let mut pt = new_progress_tracker(10.0);
        set_progress(&mut pt, 10.0);
        assert!(is_complete(&pt));
    }

    #[test]
    fn test_not_complete() {
        let pt = new_progress_tracker(10.0);
        assert!(!is_complete(&pt));
    }

    #[test]
    fn test_reset() {
        let mut pt = new_progress_tracker(50.0);
        set_progress(&mut pt, 25.0);
        progress_reset(&mut pt);
        assert_eq!(get_progress(&pt), 0.0);
    }

    #[test]
    fn test_increment() {
        let mut pt = new_progress_tracker(100.0);
        progress_increment(&mut pt, 30.0);
        progress_increment(&mut pt, 20.0);
        assert_eq!(get_progress(&pt), 50.0);
    }

    #[test]
    fn test_increment_clamp() {
        let mut pt = new_progress_tracker(10.0);
        progress_increment(&mut pt, 15.0);
        assert_eq!(get_progress(&pt), 10.0);
    }

    #[test]
    fn test_to_json() {
        let pt = new_progress_tracker(100.0);
        let j = progress_to_json(&pt);
        assert!(j.contains("\"current\":"));
        assert!(j.contains("\"total\":"));
    }

    #[test]
    fn test_negative_total() {
        let pt = new_progress_tracker(-5.0);
        assert_eq!(pt.total, 1.0);
    }
}