Skip to content

Commit

Permalink
Fix Duration::abs when nanos is not zero
Browse files Browse the repository at this point in the history
  • Loading branch information
abreis authored and djc committed Jul 15, 2022
1 parent 051e117 commit 07e4dce
Showing 1 changed file with 18 additions and 1 deletion.
19 changes: 18 additions & 1 deletion src/oldtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,11 @@ impl Duration {
/// Returns the duration as an absolute (non-negative) value.
#[inline]
pub fn abs(&self) -> Duration {
Duration { secs: self.secs.abs(), nanos: self.nanos }
if self.secs < 0 && self.nanos != 0 {
Duration { secs: (self.secs + 1).abs(), nanos: NANOS_PER_SEC - self.nanos }
} else {
Duration { secs: self.secs.abs(), nanos: self.nanos }
}
}

/// The minimum possible `Duration`: `i64::MIN` milliseconds.
Expand Down Expand Up @@ -610,6 +614,19 @@ mod tests {
assert!(Duration::milliseconds(i64::MIN).checked_sub(&Duration::milliseconds(1)).is_none());
}

#[test]
fn test_duration_abs() {
assert_eq!(Duration::milliseconds(1300).abs(), Duration::milliseconds(1300));
assert_eq!(Duration::milliseconds(1000).abs(), Duration::milliseconds(1000));
assert_eq!(Duration::milliseconds(300).abs(), Duration::milliseconds(300));
assert_eq!(Duration::milliseconds(0).abs(), Duration::milliseconds(0));
assert_eq!(Duration::milliseconds(-300).abs(), Duration::milliseconds(300));
assert_eq!(Duration::milliseconds(-700).abs(), Duration::milliseconds(700));
assert_eq!(Duration::milliseconds(-1000).abs(), Duration::milliseconds(1000));
assert_eq!(Duration::milliseconds(-1300).abs(), Duration::milliseconds(1300));
assert_eq!(Duration::milliseconds(-1700).abs(), Duration::milliseconds(1700));
}

#[test]
fn test_duration_mul() {
assert_eq!(Duration::zero() * i32::MAX, Duration::zero());
Expand Down

0 comments on commit 07e4dce

Please sign in to comment.