Duration to String enhanced with tests

Adds checks for if a bit in a u8 is set or clear
This commit is contained in:
2025-07-23 11:19:22 -04:00
parent 3280123d22
commit 6d51a4d3a6
7 changed files with 133 additions and 42 deletions
@@ -0,0 +1,38 @@
use std::time::Duration;
pub const SECONDS_IN_MINUTE: u32 = 60;
pub const SECONDS_IN_HOUR: u32 = SECONDS_IN_MINUTE * 60;
pub const SECONDS_IN_DAY: u32 = SECONDS_IN_HOUR * 24;
pub fn duration_to_string(to_convert: Duration, show_zeros: Option<bool>) -> String {
const SECONDS_IN_DAY: u32 = 86400;
const SECONDS_IN_HOUR: u32 = 3600;
const SECONDS_IN_MINUTE: u32 = 60;
let should_show_zero = show_zeros.unwrap_or(false);
let mut total_seconds = to_convert.as_secs() as u32;
let mut parts = Vec::new();
let units = [
(SECONDS_IN_DAY, "day"),
(SECONDS_IN_HOUR, "hour"),
(SECONDS_IN_MINUTE, "minute"),
(1, "second"),
];
for &(unit_seconds, unit_name) in &units {
let count = total_seconds / unit_seconds;
total_seconds %= unit_seconds;
if count > 0 || should_show_zero {
let label = if count == 1 {
unit_name.to_string()
} else {
format!("{}s", unit_name)
};
parts.push(format!("{} {}", count, label));
}
}
parts.join(" ")
}
+2
View File
@@ -0,0 +1,2 @@
pub mod duration_to_string;
mod tests;
+43
View File
@@ -0,0 +1,43 @@
use std::time::Duration;
use crate::duration_to_string::duration_to_string::duration_to_string;
#[cfg(test)]
mod test {
use super::*;
use crate::duration_to_string::duration_to_string::*;
#[test]
fn multi_duration_to_string() {
let params: Vec<(&str, Duration, Option<bool>)> = vec![
("1 second", Duration::from_secs(1), Some(false)),
("4 seconds", Duration::from_secs(4), Some(false)),
("1 minute", Duration::from_secs(SECONDS_IN_MINUTE as u64), Some(false)),
("4 minutes", Duration::from_secs((SECONDS_IN_MINUTE * 4) as u64), Some(false)),
("1 hour", Duration::from_secs(SECONDS_IN_HOUR as u64), Some(false)),
("4 hours", Duration::from_secs((SECONDS_IN_HOUR * 4) as u64), Some(false)),
("4 hours 5 minutes", Duration::from_secs((SECONDS_IN_HOUR * 4 + SECONDS_IN_MINUTE * 5) as u64), Some(false)),
("1 day", Duration::from_secs(SECONDS_IN_DAY as u64), Some(false)),
("0 days 0 hours 0 minutes 1 second", Duration::from_secs(1), Some(true)),
("0 days 0 hours 0 minutes 4 seconds", Duration::from_secs(4), Some(true)),
("0 days 0 hours 1 minute 0 seconds", Duration::from_secs(SECONDS_IN_MINUTE as u64), Some(true)),
("0 days 0 hours 4 minutes 0 seconds", Duration::from_secs((SECONDS_IN_MINUTE * 4) as u64), Some(true)),
("0 days 1 hour 0 minutes 0 seconds", Duration::from_secs(SECONDS_IN_HOUR as u64), Some(true)),
("0 days 4 hours 0 minutes 0 seconds", Duration::from_secs((SECONDS_IN_HOUR * 4) as u64), Some(true)),
("0 days 4 hours 5 minutes 0 seconds", Duration::from_secs((SECONDS_IN_HOUR * 4 + SECONDS_IN_MINUTE * 5) as u64), Some(true)),
("1 day 0 hours 0 minutes 0 seconds", Duration::from_secs(SECONDS_IN_DAY as u64), Some(true)),
("1 day 0 hours 0 minutes 1 second", Duration::from_secs((SECONDS_IN_DAY + 1) as u64), Some(true)),
("1 second", Duration::from_secs(1), None),
("4 seconds", Duration::from_secs(4), None),
("1 minute", Duration::from_secs(SECONDS_IN_MINUTE as u64), None),
("4 minutes", Duration::from_secs((SECONDS_IN_MINUTE * 4) as u64), None),
("1 hour", Duration::from_secs(SECONDS_IN_HOUR as u64), None),
("4 hours", Duration::from_secs((SECONDS_IN_HOUR * 4) as u64), None),
("4 hours 5 minutes", Duration::from_secs((SECONDS_IN_HOUR * 4 + SECONDS_IN_MINUTE * 5) as u64), None),
("1 day", Duration::from_secs(SECONDS_IN_DAY as u64), None),
];
for (expected, actual, show) in params {
assert_eq!(expected, duration_to_string(actual, show));
}
}
}