Documentation
#[cfg(feature = "jiff")]
#[test]
fn signed_duration_boundaries_round_trip() {
    use xsd::primitive::Duration;

    for duration in [
        Duration::new(i64::MIN, -999_999_999),
        Duration::new(i64::MAX, 999_999_999),
        Duration::new(0, -1),
        Duration::ZERO,
    ] {
        let value = xsd::Value::from(duration);
        assert_eq!(xsd::parse(value.to_string(), xsd::DURATION).unwrap(), value);
    }
    for input in ["PT9223372036854775808S", "-PT9223372036854775809S"] {
        assert!(xsd::parse(input, xsd::DURATION).is_err(), "{input}");
    }
}

#[cfg(feature = "jiff")]
#[test]
fn calendar_duration_components_are_unsupported() {
    for input in ["P1Y", "P1M", "P1D", "P1DT1S", "-P1M", "P1Y2M3DT4H5M6S"] {
        assert!(
            matches!(
                xsd::parse(input, xsd::DURATION),
                Err(xsd::ParseError::InvalidTemporal {
                    datatype: xsd::PrimitiveType::Duration,
                    ..
                })
            ),
            "{input}"
        );
    }
    assert_eq!(xsd::parse_duration("-PT0S").unwrap().to_string(), "PT0S");
}

#[cfg(not(feature = "jiff"))]
#[test]
fn unsigned_alias_does_not_enable_duration_parsing() {
    let duration: xsd::primitive::Duration = core::time::Duration::new(1, 1);
    assert_eq!(duration.as_nanos(), 1_000_000_001);
    for input in ["PT1S", "-PT1S", "PT0S"] {
        assert!(matches!(
            xsd::parse(input, xsd::DURATION),
            Err(xsd::ParseError::UnsupportedDatatype(datatype)) if datatype == xsd::DURATION
        ));
    }
}