#![cfg(feature = "jiff")]
#[test]
fn datetime_fractions_preserve_nanoseconds_and_signed_years() {
for input in [
"2024-02-29T12:34:56.1",
"2024-02-29T12:34:56.123456789",
"-2024-02-29T00:00:00.000000001",
] {
let value = xsd::parse_datetime(input).unwrap();
assert_eq!(value.to_string(), input);
assert_eq!(xsd::parse(input, xsd::DATE_TIME).unwrap(), value);
assert_eq!(xsd::parse_datetime(value.to_string()).unwrap(), value);
}
}
#[test]
fn datetime_precision_limits_are_explicit() {
for input in [
"2024-02-29T12:34:56.1234567891",
"2024-02-29T12:34:56.1234567890",
"2024-02-29T12:34:56.0000000000",
"-2024-02-29T12:34:56.1234567891+02:00",
] {
let error = xsd::parse_datetime(input).unwrap_err();
assert!(
error.to_string().contains("nanosecond precision"),
"{input}: {error}"
);
assert!(matches!(
xsd::parse(input, xsd::DATE_TIME),
Err(xsd::ParseError::InvalidTemporal {
datatype: xsd::PrimitiveType::DateTime,
..
})
));
}
assert_eq!(
xsd::parse_datetime("2024-02-29T24:00:00.0000000000")
.unwrap()
.to_string(),
"2024-03-01T00:00:00"
);
}
#[test]
fn datetime_rejects_malformed_fractions() {
for input in [
"2024-02-29T12:34:56.",
"2024-02-29T12:34:56.+02:00",
"2024-02-29T12:34:56..1",
"2024-02-29T12:34:56.12",
"2024-02-29T12:34:56.1e2",
] {
assert!(xsd::parse_datetime(input).is_err(), "{input}");
assert!(xsd::parse(input, xsd::DATE_TIME).is_err(), "{input}");
}
}