in src/common/src/time_ext.rs [244:287]
fn test_parse_readable_duration() {
#[derive(Serialize, Deserialize)]
struct DurHolder {
d: ReadableDuration,
}
let legal_cases = vec![
(0, 0, "0s"),
(0, 1, "1ms"),
(2, 0, "2s"),
(24 * 3600, 0, "1d"),
(2 * 24 * 3600, 10, "2d10ms"),
(4 * 60, 0, "4m"),
(5 * 3600, 0, "5h"),
(3600 + 2 * 60, 0, "1h2m"),
(5 * 24 * 3600 + 3600 + 2 * 60, 0, "5d1h2m"),
(3600 + 2, 5, "1h2s5ms"),
(3 * 24 * 3600 + 7 * 3600 + 2, 5, "3d7h2s5ms"),
];
for (secs, ms, exp) in legal_cases {
let d = DurHolder {
d: ReadableDuration(Duration::new(secs, ms * 1_000_000)),
};
let res_str = toml::to_string(&d).unwrap();
let exp_str = format!("d = {exp:?}\n");
assert_eq!(res_str, exp_str);
let res_dur: DurHolder = toml::from_str(&exp_str).unwrap();
assert_eq!(res_dur.d.0, d.d.0);
}
let decode_cases = vec![(" 0.5 h2m ", 3600 / 2 + 2 * 60, 0)];
for (src, secs, ms) in decode_cases {
let src = format!("d = {src:?}");
let res: DurHolder = toml::from_str(&src).unwrap();
assert_eq!(res.d.0, Duration::new(secs, ms * 1_000_000));
}
let illegal_cases = vec!["1H", "1M", "1S", "1MS", "1h1h", "h"];
for src in illegal_cases {
let src_str = format!("d = {src:?}");
assert!(toml::from_str::<DurHolder>(&src_str).is_err(), "{}", src);
}
assert!(toml::from_str::<DurHolder>("d = 23").is_err());
}