pub fn format_duration_breakdown(total_seconds: f64) -> String {
let total = total_seconds.max(0.0) as u64;
let days = total / 86_400;
let hours = (total % 86_400) / 3600;
let minutes = (total % 3600) / 60;
let seconds = total % 60;
if days > 0 {
format!("{days}d {hours}h {minutes}m {seconds}s")
} else if hours > 0 {
format!("{hours}h {minutes}m {seconds}s")
} else if minutes > 0 {
format!("{minutes}m {seconds}s")
} else {
format!("{seconds}s")
}
}
pub fn format_fuel_auto(kg: f64) -> String {
if kg >= 1000.0 {
format!("{:.3} t", kg / 1000.0)
} else {
format!("{kg:.2} kg")
}
}
pub fn format_land_km(metres: f64) -> String {
format!("{:.2} km", metres / 1000.0)
}
pub fn format_fitness_magnitude(value: f64) -> String {
let abs = value.abs();
if abs >= 1_000_000.0 {
format!("{:.3}M", abs / 1_000_000.0)
} else {
format!("{:.3}K", abs / 1_000.0)
}
}
pub fn format_delta(
subject: f64,
other: f64,
larger_is_better: bool,
subject_label: &str,
) -> String {
if other.abs() < 1e-12 {
return format!("{subject_label} N/A");
}
let diff = subject - other;
if diff.abs() < 1e-9 {
return format!("{subject_label} equal");
}
let pct = (diff.abs() / other.abs()) * 100.0;
let subject_better = if larger_is_better {
diff > 0.0
} else {
diff < 0.0
};
if subject_better {
format!("{subject_label} {pct:.1}% better")
} else {
format!("{subject_label} {pct:.1}% worse")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn format_duration_breakdown_drops_leading_zero_units() {
assert_eq!(format_duration_breakdown(45.0), "45s");
assert_eq!(format_duration_breakdown(125.0), "2m 5s");
assert_eq!(format_duration_breakdown(3.0 * 3600.0 + 4.0), "3h 0m 4s");
assert_eq!(
format_duration_breakdown(2.0 * 86_400.0 + 3.0 * 3600.0),
"2d 3h 0m 0s",
);
}
#[test]
fn format_fuel_auto_picks_unit_by_threshold() {
assert_eq!(format_fuel_auto(0.0), "0.00 kg");
assert_eq!(format_fuel_auto(999.99), "999.99 kg");
assert_eq!(format_fuel_auto(1000.0), "1.000 t");
assert_eq!(format_fuel_auto(12_345.0), "12.345 t");
}
#[test]
fn format_land_km_renders_metres_as_two_decimal_km() {
assert_eq!(format_land_km(0.0), "0.00 km");
assert_eq!(format_land_km(1500.0), "1.50 km");
assert_eq!(format_land_km(12_345.0), "12.35 km");
}
#[test]
fn format_fitness_magnitude_uses_m_above_one_million() {
assert_eq!(format_fitness_magnitude(-1_825_302.276_8), "1.825M");
assert_eq!(format_fitness_magnitude(-1_000_000.0), "1.000M");
assert_eq!(format_fitness_magnitude(-999_999.999), "1000.000K");
assert_eq!(format_fitness_magnitude(-173_235.238_9), "173.235K");
assert_eq!(format_fitness_magnitude(0.0), "0.000K");
}
#[test]
fn format_delta_handles_signs_and_edges() {
assert_eq!(format_delta(80.0, 100.0, false, "PSO"), "PSO 20.0% better");
assert_eq!(format_delta(120.0, 100.0, false, "PSO"), "PSO 20.0% worse");
assert_eq!(format_delta(1.2, 1.0, true, "PSO"), "PSO 20.0% better");
assert_eq!(format_delta(100.0, 100.0, false, "PSO"), "PSO equal");
assert_eq!(format_delta(50.0, 0.0, false, "PSO"), "PSO N/A");
}
#[test]
fn format_delta_perspective_flips_with_swapped_args() {
assert_eq!(
format_delta(110.0, 100.0, false, "Main"),
"Main 10.0% worse"
);
assert_eq!(
format_delta(100.0, 110.0, false, "Realization"),
"Realization 9.1% better"
);
}
}