rdfx 0.24.0

RDF 1.2 data-structures, traits and utilities: terms (incl. triple terms), triples, quads, interpretations, graphs, datasets, unstar/restar reification helpers.
Documentation
#![allow(clippy::unwrap_used, clippy::panic, clippy::expect_used)]

use iri_rs::IriBuf;
use rdfx::{Datatype, Direction, Literal, LiteralType, RDF_DIR_LANG_STRING, RDF_LANG_STRING, ReservedDatatypeError, XSD_STRING, langtag::LangTagBuf};

#[test]
fn datatype_new_rejects_rdf_lang_string() {
    let iri = IriBuf::from(RDF_LANG_STRING);
    let err = Datatype::new(iri).expect_err("rdf:langString must be rejected");
    assert!(matches!(err, ReservedDatatypeError::LangString(_)));
    assert_eq!(err.iri().as_str(), RDF_LANG_STRING.as_str());
}

#[test]
fn datatype_new_rejects_rdf_dir_lang_string() {
    let iri = IriBuf::from(RDF_DIR_LANG_STRING);
    let err = Datatype::new(iri).expect_err("rdf:dirLangString must be rejected");
    assert!(matches!(err, ReservedDatatypeError::DirLangString(_)));
    assert_eq!(err.iri().as_str(), RDF_DIR_LANG_STRING.as_str());
}

#[test]
fn datatype_new_accepts_xsd_string() {
    let iri = IriBuf::from(XSD_STRING);
    let dt = Datatype::new(iri).unwrap();
    assert_eq!(dt.as_iri().as_str(), XSD_STRING.as_str());
}

#[test]
fn datatype_xsd_string_round_trip() {
    let dt = Datatype::xsd_string();
    assert_eq!(dt.as_iri().as_str(), XSD_STRING.as_str());
    let iri = dt.into_iri();
    assert_eq!(iri.as_str(), XSD_STRING.as_str());
}

#[test]
fn literal_type_typed_rejects_rdf_lang_string() {
    let iri = IriBuf::from(RDF_LANG_STRING);
    assert!(LiteralType::typed(iri).is_err());
}

#[test]
fn literal_type_typed_rejects_rdf_dir_lang_string() {
    let iri = IriBuf::from(RDF_DIR_LANG_STRING);
    assert!(LiteralType::typed(iri).is_err());
}

#[test]
fn literal_type_xsd_string_constructs_any_variant() {
    let lt = LiteralType::xsd_string();
    assert!(matches!(lt, LiteralType::Any(_)));
    assert!(lt.is_xsd_string());
}

#[test]
fn literal_plain_equals_literal_typed_xsd_string() {
    let plain = Literal::plain("hello");
    let typed = Literal::typed("hello", Datatype::xsd_string());
    assert_eq!(plain, typed);
}

#[test]
fn literal_plain_uses_xsd_string_datatype() {
    let lit = Literal::plain("x");
    assert!(lit.as_type().is_xsd_string());
    assert_eq!(lit.as_str(), "x");
}

#[test]
fn literal_typed_with_custom_datatype_round_trips() {
    let dt_iri = IriBuf::new("http://example.org/dt".to_owned()).unwrap();
    let dt = Datatype::new(dt_iri.clone()).unwrap();
    let lit = Literal::typed("42", dt);
    match lit.as_type() {
        LiteralType::Any(d) => assert_eq!(d.as_iri().as_str(), dt_iri.as_str()),
        _ => panic!("expected typed datatype"),
    }
}

#[test]
fn literal_type_try_from_iribuf() {
    let xsd: LiteralType = IriBuf::from(XSD_STRING).try_into().unwrap();
    assert!(xsd.is_xsd_string());
    let bad = LiteralType::try_from(IriBuf::from(RDF_LANG_STRING));
    assert!(bad.is_err());
    let bad_dir = LiteralType::try_from(IriBuf::from(RDF_DIR_LANG_STRING));
    assert!(bad_dir.is_err());
}

#[test]
fn dir_lang_string_distinct_from_lang_string() {
    let tag: LangTagBuf = "en".parse().unwrap();
    let lang = Literal::lang_string("hi", tag.clone());
    let dir = Literal::dir_lang_string("hi", tag, Direction::Ltr);
    assert_ne!(lang, dir, "DirLangString must not equal LangString even at same value/tag");
    assert!(lang.is_lang_string());
    assert!(dir.is_lang_string());
    assert!(lang.is_undirected_lang_string());
    assert!(!dir.is_undirected_lang_string());
    assert!(!lang.is_dir_lang_string());
    assert!(dir.is_dir_lang_string());
    assert_eq!(lang.direction(), None);
    assert_eq!(dir.direction(), Some(Direction::Ltr));
}

#[cfg(feature = "serde")]
#[test]
fn datatype_serde_rejects_rdf_lang_string() {
    let json = r#""http://www.w3.org/1999/02/22-rdf-syntax-ns#langString""#;
    let result: Result<Datatype, _> = serde_json::from_str(json);
    assert!(result.is_err(), "deserializing rdf:langString into Datatype must fail");
}

#[cfg(feature = "serde")]
#[test]
fn datatype_serde_rejects_rdf_dir_lang_string() {
    let json = r#""http://www.w3.org/1999/02/22-rdf-syntax-ns#dirLangString""#;
    let result: Result<Datatype, _> = serde_json::from_str(json);
    assert!(result.is_err(), "deserializing rdf:dirLangString into Datatype must fail");
}

#[cfg(feature = "serde")]
#[test]
fn datatype_serde_round_trip_xsd_string() {
    let dt = Datatype::xsd_string();
    let json = serde_json::to_string(&dt).unwrap();
    let parsed: Datatype = serde_json::from_str(&json).unwrap();
    assert_eq!(parsed, dt);
}

#[cfg(feature = "serde")]
#[test]
fn literal_type_serde_rejects_rdf_lang_string_in_any() {
    let json = r#"{"Any":"http://www.w3.org/1999/02/22-rdf-syntax-ns#langString"}"#;
    let result: Result<LiteralType, _> = serde_json::from_str(json);
    assert!(result.is_err(), "deserializing Any(rdf:langString) must fail");
}

#[cfg(feature = "serde")]
#[test]
fn literal_type_serde_rejects_rdf_dir_lang_string_in_any() {
    let json = r#"{"Any":"http://www.w3.org/1999/02/22-rdf-syntax-ns#dirLangString"}"#;
    let result: Result<LiteralType, _> = serde_json::from_str(json);
    assert!(result.is_err(), "deserializing Any(rdf:dirLangString) must fail");
}