use super::{format_duration, DurationFormat};
use std::time::Duration;
#[test]
fn the_ladder_covers_the_whole_input_type() {
assert_eq!(
format_duration(Duration::MAX, &DurationFormat::Parts(3)),
"584942417355y 26d 7h"
);
assert_eq!(
format_duration(Duration::MAX, &DurationFormat::Parts(8)),
"584942417355y 26d 7h 15s 999ms 999µs 999ns"
);
}
#[test]
fn composite_renders_the_example_from_the_issue() {
let span = Duration::new(31_626_004, 5_000_000);
assert_eq!(
format_duration(span, &DurationFormat::Parts(5)),
"1y 1d 1h 4s 5ms"
);
}
#[test]
fn the_default_is_three_components() {
let span = Duration::new(7503, 200_000_000);
assert_eq!(
format_duration(span, &DurationFormat::default_parts()),
"2h 5m 3s"
);
assert_eq!(
format_duration(span, &DurationFormat::Parts(5)),
"2h 5m 3s 200ms"
);
}
#[test]
fn the_window_slides_up_the_ladder_as_the_span_grows() {
let three = DurationFormat::default_parts();
let day = 86_400;
for (secs, expected) in [
(5_u64, "5s"),
(90, "1m 30s"),
(3903, "1h 5m 3s"),
(61 * day, "2mo 1d"),
(400 * day, "1y 1mo 5d"),
(367 * day, "1y 2d"),
(365 * day + 3600, "1y 1h"),
] {
assert_eq!(
format_duration(Duration::from_secs(secs), &three),
expected,
"{secs}s"
);
}
}
#[test]
fn composite_stops_when_the_span_runs_out() {
assert_eq!(
format_duration(Duration::from_millis(340), &DurationFormat::Parts(4)),
"340ms"
);
assert_eq!(
format_duration(Duration::from_nanos(1), &DurationFormat::Parts(4)),
"1ns"
);
}
#[test]
fn every_unit_appears_at_its_own_boundary() {
let one = DurationFormat::Parts(1);
assert_eq!(format_duration(Duration::from_nanos(1), &one), "1ns");
assert_eq!(format_duration(Duration::from_micros(1), &one), "1µs");
assert_eq!(format_duration(Duration::from_millis(1), &one), "1ms");
assert_eq!(format_duration(Duration::from_secs(1), &one), "1s");
assert_eq!(format_duration(Duration::from_secs(60), &one), "1m");
assert_eq!(format_duration(Duration::from_secs(3600), &one), "1h");
assert_eq!(format_duration(Duration::from_secs(86_400), &one), "1d");
assert_eq!(format_duration(Duration::from_secs(2_592_000), &one), "1mo");
assert_eq!(format_duration(Duration::from_secs(31_536_000), &one), "1y");
}
#[test]
fn a_year_is_three_hundred_and_sixty_five_days_and_a_month_is_thirty() {
let one = DurationFormat::Parts(1);
assert_eq!(
format_duration(Duration::from_secs(30 * 86_400), &one),
"1mo"
);
assert_eq!(
format_duration(Duration::from_secs(365 * 86_400), &one),
"1y"
);
}
#[test]
fn twelve_months_are_not_a_year_and_the_output_says_so() {
let three = DurationFormat::default_parts();
assert_eq!(
format_duration(Duration::from_secs(364 * 86_400), &three),
"12mo 4d"
);
assert_eq!(
format_duration(Duration::from_secs(365 * 86_400), &three),
"1y"
);
}
#[test]
fn plain_milliseconds_keeps_sub_millisecond_spans() {
let two = DurationFormat::Millis { decimals: 2 };
assert_eq!(format_duration(Duration::from_micros(340), &two), "0.34ms");
assert_eq!(
format_duration(Duration::from_millis(340), &two),
"340.00ms"
);
assert_eq!(format_duration(Duration::from_secs(90), &two), "90000.00ms");
}
#[test]
fn the_millisecond_decimal_count_is_configurable() {
let span = Duration::from_micros(1_234_567);
assert_eq!(
format_duration(span, &DurationFormat::Millis { decimals: 0 }),
"1235ms"
);
assert_eq!(
format_duration(span, &DurationFormat::Millis { decimals: 3 }),
"1234.567ms"
);
}
#[test]
fn zero_renders_under_either_shape() {
assert_eq!(
format_duration(Duration::ZERO, &DurationFormat::Parts(3)),
"0s"
);
assert_eq!(
format_duration(Duration::ZERO, &DurationFormat::Millis { decimals: 2 }),
"0.00ms"
);
}
#[test]
fn a_zero_component_count_still_renders_one_component() {
assert_eq!(
format_duration(Duration::from_secs(3661), &DurationFormat::Parts(0)),
"1h"
);
}