Skip to main content

ralph_core/
utils.rs

1//! Utility functions for common operations.
2//!
3//! This module provides shared utilities used across the Ralph orchestrator.
4
5use std::time::Duration;
6
7/// Formats a duration as MM:SS (minutes:seconds).
8///
9/// Useful for displaying elapsed time in TUI headers, status bars, and logs.
10///
11/// # Examples
12///
13/// ```
14/// use std::time::Duration;
15/// use ralph_core::utils::format_elapsed;
16///
17/// assert_eq!(format_elapsed(Duration::from_secs(0)), "00:00");
18/// assert_eq!(format_elapsed(Duration::from_secs(65)), "01:05");
19/// assert_eq!(format_elapsed(Duration::from_secs(3661)), "61:01"); // Handles >60 mins
20/// ```
21pub fn format_elapsed(duration: Duration) -> String {
22    let total_secs = duration.as_secs();
23    let mins = total_secs / 60;
24    let secs = total_secs % 60;
25    format!("{mins:02}:{secs:02}")
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn format_elapsed_zero() {
34        assert_eq!(format_elapsed(Duration::from_secs(0)), "00:00");
35    }
36
37    #[test]
38    fn format_elapsed_seconds_only() {
39        assert_eq!(format_elapsed(Duration::from_secs(45)), "00:45");
40    }
41
42    #[test]
43    fn format_elapsed_one_minute() {
44        assert_eq!(format_elapsed(Duration::from_secs(60)), "01:00");
45    }
46
47    #[test]
48    fn format_elapsed_mixed() {
49        assert_eq!(format_elapsed(Duration::from_secs(272)), "04:32");
50    }
51
52    #[test]
53    fn format_elapsed_large_value() {
54        // 61 minutes and 1 second
55        assert_eq!(format_elapsed(Duration::from_secs(3661)), "61:01");
56    }
57
58    #[test]
59    fn format_elapsed_pads_single_digits() {
60        // Ensure single-digit values are zero-padded
61        assert_eq!(format_elapsed(Duration::from_secs(5)), "00:05");
62        assert_eq!(format_elapsed(Duration::from_secs(65)), "01:05");
63    }
64
65    #[test]
66    fn format_elapsed_ignores_subsecond() {
67        // Milliseconds should be truncated, not rounded
68        assert_eq!(format_elapsed(Duration::from_millis(999)), "00:00");
69        assert_eq!(format_elapsed(Duration::from_millis(1500)), "00:01");
70    }
71}