From 0ad9f47fc64cc59790d33282109faae43d78555f Mon Sep 17 00:00:00 2001 From: Jacob Pratt Date: Tue, 22 Mar 2022 02:53:20 -0400 Subject: [PATCH] Add tests for size, alignment, trait impls This ensures that nothing will regress without knowing. As it turns out, there was a missing implementation that was caught during this. As such, `impl AddAssign for `StdDuration` was added in this commit as well. --- src/duration.rs | 11 +- tests/integration/duration.rs | 11 + tests/integration/main.rs | 8 +- tests/integration/meta.rs | 931 ++++++++++++++++++++++++++++++++++ 4 files changed, 959 insertions(+), 2 deletions(-) create mode 100644 tests/integration/meta.rs diff --git a/src/duration.rs b/src/duration.rs index 7cb26d362d..ee7af639b6 100644 --- a/src/duration.rs +++ b/src/duration.rs @@ -4,7 +4,7 @@ use core::cmp::Ordering; use core::convert::{TryFrom, TryInto}; use core::fmt; use core::iter::Sum; -use core::ops::{Add, Div, Mul, Neg, Sub, SubAssign}; +use core::ops::{Add, AddAssign, Div, Mul, Neg, Sub, SubAssign}; use core::time::Duration as StdDuration; use crate::error; @@ -837,6 +837,15 @@ impl Add for StdDuration { impl_add_assign!(Duration: Self, StdDuration); +impl AddAssign for StdDuration { + fn add_assign(&mut self, rhs: Duration) { + *self = (*self + rhs).try_into().expect( + "Cannot represent a resulting duration in std. Try `let x = x + rhs;`, which will \ + change the type.", + ); + } +} + impl Neg for Duration { type Output = Self; diff --git a/tests/integration/duration.rs b/tests/integration/duration.rs index 9fb4a2a4a9..d20eb9a7f0 100644 --- a/tests/integration/duration.rs +++ b/tests/integration/duration.rs @@ -471,6 +471,17 @@ fn add_assign_std() { assert_eq!(duration, 0.seconds()); } +#[test] +fn std_add_assign() { + let mut duration = 1.std_seconds(); + duration += 1.seconds(); + assert_eq!(duration, 2.seconds()); + + let mut duration = 500.std_milliseconds(); + duration += 500.milliseconds(); + assert_eq!(duration, 1.seconds()); +} + #[test] fn neg() { assert_eq!(-(1.seconds()), (-1).seconds()); diff --git a/tests/integration/main.rs b/tests/integration/main.rs index 3fe04d90ce..ce4bd724b8 100644 --- a/tests/integration/main.rs +++ b/tests/integration/main.rs @@ -28,7 +28,12 @@ unused_qualifications, variant_size_differences )] -#![allow(clippy::cognitive_complexity, clippy::clone_on_copy, clippy::cmp_owned)] +#![allow( + clippy::clone_on_copy, + clippy::cmp_owned, + clippy::cognitive_complexity, + clippy::missing_const_for_fn +)] extern crate quickcheck_dep as quickcheck; @@ -55,6 +60,7 @@ mod format_description; mod formatting; mod instant; mod macros; +mod meta; mod month; mod offset_date_time; mod parse_format_description; diff --git a/tests/integration/meta.rs b/tests/integration/meta.rs new file mode 100644 index 0000000000..515de7805d --- /dev/null +++ b/tests/integration/meta.rs @@ -0,0 +1,931 @@ +use std::borrow::Borrow; +use std::convert::TryFrom; +use std::error::Error as StdError; +use std::fmt::{Debug, Display}; +use std::hash::Hash; +use std::iter::Sum; +use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign}; +use std::panic::{RefUnwindSafe, UnwindSafe}; +use std::time::{Duration as StdDuration, Instant as StdInstant, SystemTime}; + +use quickcheck_dep::Arbitrary; +use rand::distributions::{Distribution, Standard}; +use serde::{Deserialize, Serialize}; +use time::format_description::{modifier, well_known, Component, FormatItem}; +use time::formatting::Formattable; +use time::parsing::{Parsable, Parsed}; +use time::{ + error, ext, Date, Duration, Error, Instant, Month, OffsetDateTime, PrimitiveDateTime, Time, + UtcOffset, Weekday, +}; + +#[test] +fn alignment() { + macro_rules! assert_alignment { + ($t:ty, $alignment:literal) => { + assert_eq!( + ::core::mem::align_of::<$t>(), + $alignment, + concat!("alignment of `", stringify!($t), "` was ", $alignment) + ); + }; + } + + assert_alignment!(Date, 4); + assert_alignment!(Duration, 8); + assert_alignment!(Error, 8); + assert_alignment!(Month, 1); + assert_alignment!(OffsetDateTime, 4); + assert_alignment!(PrimitiveDateTime, 4); + assert_alignment!(Time, 4); + assert_alignment!(UtcOffset, 1); + assert_alignment!(Weekday, 1); + + assert_alignment!(Option, 4); + assert_alignment!(Option, 8); + assert_alignment!(Option, 8); + assert_alignment!(Option, 1); + assert_alignment!(Option, 4); + assert_alignment!(Option, 4); + assert_alignment!(Option