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