use std::fmt::Debug; use std::marker::PhantomData; use rstest::rstest; use serde::{Deserialize, Serialize}; use serde_test2::Configure; use time::Month::*; use time::Weekday::*; use time::macros::{date, datetime, time}; use time::{Date, Month, OffsetDateTime, PlainDateTime, SignedDuration, Time, Weekday}; enum Format { Compact, Readable, } use Format::*; #[rstest] #[case(Monday.compact(), "1")] #[case(Monday.readable(), r#""Monday""#)] #[case(March.compact(), "3")] #[case(March.readable(), r#""March""#)] #[case(time!(12:40:20).compact(), "[12,40,20,0]")] #[case(time!(12:40:20).readable(), r#""12:40:20.0""#)] #[case(datetime!(2022-05-20 12:40:20).compact(), "[2022,140,12,40,20,0]")] #[case(datetime!(2022-05-20 12:40:20).readable(), r#""2022-05-20 12:40:20.0""#)] #[case(datetime!(2022-05-20 12:40:20 UTC).compact(), "[2022,140,12,40,20,0,0,0,0]")] #[case(datetime!(2022-05-20 12:40:20 UTC).readable(), r#""2022-05-20 12:40:20.0 +00:00:00""#)] #[case(SignedDuration::new(50, 0).compact(), "[50,0]")] #[case(SignedDuration::new(50, 0).readable(), r#""50.000000000""#)] #[case(date!(2022-04-05).compact(), "[2022,95]")] #[case(date!(2022-04-05).readable(), r#""2022-04-05""#)] fn serialize(#[case] value: T, #[case] expected: &str) where T: Serialize, { let mut buf: Vec = Vec::new(); let mut ser = serde_json::Serializer::new(&mut buf); value.serialize(&mut ser).expect("serialization failed"); assert_eq!(String::from_utf8(buf).as_deref(), Ok(expected)); } #[rstest] #[case(PhantomData::, Compact, "1", Monday)] #[case(PhantomData::, Readable, "1", Monday)] #[case(PhantomData::, Readable, r#""Monday""#, Monday)] #[case(PhantomData::, Compact, "3", March)] #[case(PhantomData::, Readable, "3", March)] #[case(PhantomData::, Readable, r#""March""#, March)] #[case(PhantomData::