use yash_env::system::Times;
fn format_one_time<W>(seconds: f64, result: &mut W) -> std::fmt::Result
where
W: std::fmt::Write,
{
let seconds = (seconds * 1000000.0).round() / 1000000.0;
let minutes = seconds.div_euclid(60.0);
let sub_minute_seconds = seconds.rem_euclid(60.0);
write!(result, "{minutes:.0}m{sub_minute_seconds:.6}s")
}
pub fn format(times: &Times) -> String {
let mut result = String::with_capacity(64);
format_one_time(times.self_user, &mut result).unwrap();
result.push(' ');
format_one_time(times.self_system, &mut result).unwrap();
result.push('\n');
format_one_time(times.children_user, &mut result).unwrap();
result.push(' ');
format_one_time(times.children_system, &mut result).unwrap();
result.push('\n');
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn format_one_time_zero() {
let mut result = String::new();
format_one_time(0.0, &mut result).unwrap();
assert_eq!(result, "0m0.000000s");
}
#[test]
fn format_one_time_less_than_one_second() {
let mut result = String::new();
format_one_time(0.5, &mut result).unwrap();
assert_eq!(result, "0m0.500000s");
}
#[test]
fn format_one_time_one_second() {
let mut result = String::new();
format_one_time(1.0, &mut result).unwrap();
assert_eq!(result, "0m1.000000s");
}
#[test]
fn format_one_time_more_than_one_second() {
let mut result = String::new();
format_one_time(12.25, &mut result).unwrap();
assert_eq!(result, "0m12.250000s");
}
#[test]
fn format_one_time_more_than_one_minute() {
let mut result = String::new();
format_one_time(1234.50, &mut result).unwrap();
assert_eq!(result, "20m34.500000s");
}
#[test]
fn format_one_time_almost_one_minute() {
let mut result = String::new();
format_one_time(59.9999990, &mut result).unwrap();
assert_eq!(result, "0m59.999999s");
let mut result = String::new();
format_one_time(59.9999999, &mut result).unwrap();
assert_eq!(result, "1m0.000000s");
}
#[test]
fn format_times() {
let times = Times {
self_user: 12.5,
self_system: 65.25,
children_user: 24.75,
children_system: 600.0,
};
let result = format(×);
assert_eq!(
result,
"0m12.500000s 1m5.250000s\n0m24.750000s 10m0.000000s\n"
);
}
}