1mod macros;
2mod recorder;
3
4pub fn format_duration(duration: std::time::Duration) -> String {
6 let time_unit;
7 let time_value;
8
9 let elapsed_s = duration.as_secs() as u128;
10 if elapsed_s >= 1 {
11 time_unit = "s";
12 time_value = elapsed_s;
13 } else {
14 let elapsed_ms = duration.as_millis();
15 if elapsed_ms >= 1 {
16 time_unit = "ms";
17 time_value = elapsed_ms;
18 } else {
19 let elapsed_us = duration.as_micros();
20 if elapsed_us >= 1 {
21 time_unit = "μs";
22 time_value = elapsed_us;
23 } else {
24 let elapsed_ns = duration.as_nanos();
25 time_unit = "ns";
26 time_value = elapsed_ns;
27 }
28 }
29 }
30
31 format!("{}{}", time_value, time_unit)
32}
33
34pub use recorder::{TimeRecorder, GLOBAL_TIME_RECORDER};
35
36#[cfg(test)]
37mod tests {
38 use std::time::Duration;
39
40 use rstest::*;
41
42 use super::*;
43 use crate::timeit;
44
45 #[rstest]
46 #[case(Duration::from_millis(1), "1ms")]
47 #[case(Duration::from_micros(1), "1μs")]
48 #[case(Duration::from_nanos(1), "1ns")]
49 #[case(Duration::from_millis(999), "999ms")]
50 #[case(Duration::from_millis(1000), "1s")]
51 fn test_format_duration(#[case] input: Duration, #[case] expected: String) {
52 assert_eq!(expected, format_duration(input));
53 }
54
55 #[rstest]
56 fn test_recorder() {
57 let recorder = TimeRecorder::new();
58
59 recorder.timeit("test", || {
60 std::thread::sleep(Duration::from_millis(1));
61 });
62
63 let elapsed = recorder.total_elapsed().unwrap();
64 assert!(
65 elapsed.as_millis() > 0 && elapsed.as_millis() < 5,
67 "elapsed: {:?}",
68 elapsed.as_millis()
69 );
70
71 let formatted = recorder.format_verbose().unwrap();
72 assert!(formatted.contains("test"));
73 }
74
75 #[rstest]
76 fn test_global() {
77 timeit!("test", {
78 std::thread::sleep(Duration::from_millis(1));
79 });
80 let elapsed = GLOBAL_TIME_RECORDER.total_elapsed().unwrap();
81 assert!(
82 elapsed.as_millis() > 0 && elapsed.as_millis() < 5,
84 "elapsed: {:?}",
85 elapsed.as_millis()
86 );
87 }
88}