1#![allow(dead_code, unused)]
2use core::str;
3use std::cmp::{Ord, Ordering, PartialEq, PartialOrd};
4use std::convert::From;
5
6use crate::check;
7
8#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Default)]
9pub struct Microseconds {
10 count: i64,
11}
12
13impl Microseconds {
14 pub fn new() -> Microseconds {
15 Microseconds { count: 0 }
16 }
17
18 pub fn maximum() -> Microseconds {
19 Microseconds::from(0x7fffffffffffffff)
20 }
21
22 pub fn count(&self) -> i64 {
23 self.count
24 }
25
26 pub fn to_seconds(&self) -> i64 {
27 self.count / 1000000
28 }
29}
30
31impl From<i64> for Microseconds {
32 fn from(count: i64) -> Self {
33 Microseconds { count }
34 }
35}
36
37impl From<Microseconds> for i64 {
38 fn from(microseconds: Microseconds) -> i64 {
39 microseconds.count
40 }
41}
42
43impl std::ops::Add for Microseconds {
44 type Output = Microseconds;
45 fn add(self, other: Microseconds) -> Microseconds {
46 Microseconds::from(self.count + other.count)
47 }
48}
49
50impl std::ops::Sub for Microseconds {
51 type Output = Microseconds;
52 fn sub(self, other: Microseconds) -> Microseconds {
53 Microseconds::from(self.count - other.count)
54 }
55}
56
57impl std::ops::AddAssign for Microseconds {
58 fn add_assign(&mut self, other: Microseconds) {
59 self.count += other.count;
60 }
61}
62
63impl std::ops::SubAssign for Microseconds {
64 fn sub_assign(&mut self, other: Microseconds) {
65 self.count -= other.count;
66 }
67}
68
69pub fn milliseconds(ms: i64) -> Microseconds {
70 Microseconds::from(ms * 1000)
71}
72
73pub fn seconds(s: i64) -> Microseconds {
74 milliseconds(s * 1000)
75}
76
77pub fn minutes(m: i64) -> Microseconds {
78 seconds(60 * m)
79}
80
81pub fn hours(h: i64) -> Microseconds {
82 minutes(60 * h)
83}
84
85pub fn days(d: i64) -> Microseconds {
86 hours(24 * d)
87}
88
89#[cfg(test)]
90mod tests {
91 use super::*;
92
93 #[test]
94 fn test_microseconds_creation() {
95 let micro = Microseconds::from(100);
96 assert_eq!(micro.count(), 100);
97
98 let micro = Microseconds::from(-100);
99 assert_eq!(micro.count(), -100);
100 }
101
102 #[test]
103 fn test_microseconds_equality() {
104 let micro1 = Microseconds::from(100);
105 let micro2 = Microseconds::from(100);
106 assert_eq!(micro1, micro2);
107 }
108
109 #[test]
110 fn test_microseconds_inequality() {
111 let micro1 = Microseconds::from(100);
112 let micro2 = Microseconds::from(200);
113 assert_ne!(micro1, micro2);
114
115 let micro1 = Microseconds::from(-100);
116 let micro2 = Microseconds::from(100);
117 assert_ne!(micro1, micro2);
118 }
119
120 #[test]
121 fn test_microseconds_addition() {
122 let micro1 = Microseconds::from(100);
123 let micro2 = Microseconds::from(200);
124 let result = micro1 + micro2;
125 assert_eq!(result.count(), 300);
126 }
127
128 #[test]
129 fn test_microseconds_subtraction() {
130 let micro1 = Microseconds::from(100);
131 let micro2 = Microseconds::from(200);
132 let result = micro2 - micro1;
133 assert_eq!(result.count(), 100);
134 }
135
136 #[test]
137 fn test_microseconds_comparison() {
138 let micro1 = Microseconds::from(100);
139 let micro2 = Microseconds::from(200);
140 assert!(micro1 < micro2);
141 assert!(micro2 > micro1);
142 assert!(micro1 <= micro2);
143 assert!(micro2 >= micro1);
144 }
145
146 #[test]
147 fn test_microseconds_addition_assignment() {
148 let mut micro1 = Microseconds::from(100);
149 let micro2 = Microseconds::from(200);
150 micro1 += micro2;
151 assert_eq!(micro1.count(), 300);
152 }
153
154 #[test]
155 fn test_microseconds_subtraction_assignment() {
156 let micro1 = Microseconds::from(100);
157 let mut micro2 = Microseconds::from(200);
158 micro2 -= micro1;
159 assert_eq!(micro2.count(), 100);
160 }
161
162 #[test]
163 fn test_microseconds_to_seconds() {
164 let micro = Microseconds::from(1000000);
165 assert_eq!(micro.to_seconds(), 1);
166 }
167
168 #[test]
169 fn test_microseconds_time_functions() {
170 let days_micro = days(1);
171 let hours_micro = hours(1);
172 let minutes_micro = minutes(1);
173 let seconds_micro = seconds(1);
174
175 assert_eq!(days_micro.count(), 86400000000);
176 assert_eq!(hours_micro.count(), 3600000000);
177 assert_eq!(minutes_micro.count(), 60000000);
178 assert_eq!(seconds_micro.count(), 1000000);
179 }
180}