precis-core 0.1.11

PRECIS Framework: Preparation, Enforcement, and Comparison of Internationalized Strings in Application Protocols as defined in rfc8264
Documentation
use precis_core::*;
use precis_tools::*;
use std::env;
use std::fs::File;
use std::path::Path;
use std::path::PathBuf;

fn validate_result(
    cp: u32,
    expected: precis_tools::DerivedProperty,
    id: &IdentifierClass,
    ff: &FreeformClass,
) {
    match expected {
        precis_tools::DerivedProperty::PValid => {
            let id_prop = id.get_value_from_codepoint(cp);
            let ff_prop = ff.get_value_from_codepoint(cp);

            assert_eq!(id_prop, DerivedPropertyValue::PValid);
            assert_eq!(ff_prop, DerivedPropertyValue::PValid);
        }
        precis_tools::DerivedProperty::FreePVal => {
            let ff_prop = ff.get_value_from_codepoint(cp);

            assert_eq!(ff_prop, DerivedPropertyValue::SpecClassPval)
        }
        precis_tools::DerivedProperty::ContextJ => {
            let id_prop = id.get_value_from_codepoint(cp);
            let ff_prop = ff.get_value_from_codepoint(cp);

            assert_eq!(id_prop, DerivedPropertyValue::ContextJ);
            assert_eq!(ff_prop, DerivedPropertyValue::ContextJ);
        }
        precis_tools::DerivedProperty::ContextO => {
            let id_prop = id.get_value_from_codepoint(cp);
            let ff_prop = ff.get_value_from_codepoint(cp);

            assert_eq!(id_prop, DerivedPropertyValue::ContextO);
            assert_eq!(ff_prop, DerivedPropertyValue::ContextO);
        }
        precis_tools::DerivedProperty::Disallowed => {
            let id_prop = id.get_value_from_codepoint(cp);
            let ff_prop = ff.get_value_from_codepoint(cp);

            assert_eq!(id_prop, DerivedPropertyValue::Disallowed);
            assert_eq!(ff_prop, DerivedPropertyValue::Disallowed);
        }
        precis_tools::DerivedProperty::IdDis => {
            let id_prop = id.get_value_from_codepoint(cp);
            assert_eq!(id_prop, DerivedPropertyValue::SpecClassDis);
        }
        precis_tools::DerivedProperty::Unassigned => {
            let id_prop = id.get_value_from_codepoint(cp);
            let ff_prop = ff.get_value_from_codepoint(cp);

            assert!(
                id_prop == DerivedPropertyValue::Unassigned,
                "failed check for unicode point: {:#06x}. Expected: {:?}, Got: {:?}",
                cp,
                expected,
                id_prop
            );
            assert!(
                ff_prop == DerivedPropertyValue::Unassigned,
                "failed check for unicode point: {:#06x}. Expected: {:?}, Got: {:?}",
                cp,
                expected,
                ff_prop
            );
        }
    }
}

fn check_derived_property(
    cp: u32,
    props: &DerivedProperties,
    id: &IdentifierClass,
    ff: &FreeformClass,
) {
    match props {
        precis_tools::DerivedProperties::Single(p) => validate_result(cp, *p, id, ff),
        precis_tools::DerivedProperties::Tuple((p1, p2)) => {
            validate_result(cp, *p1, id, ff);
            validate_result(cp, *p2, id, ff);
        }
    }
}

#[cfg(feature = "networking")]
fn get_csv_path() -> PathBuf {
    let out_dir = env::var_os("OUT_DIR").unwrap();
    Path::new(&out_dir).join("csv/precis-tables-6.3.0.csv")
}

#[cfg(not(feature = "networking"))]
fn get_csv_path() -> PathBuf {
    let base_dir = env::var_os("CARGO_MANIFEST_DIR").unwrap();
    Path::new(&base_dir).join("resources/csv/precis-tables-6.3.0.csv")
}

#[test]
fn check_derived_properties() {
    let id = IdentifierClass {};
    let ff = FreeformClass {};

    let csv_path = get_csv_path();

    let parser: precis_tools::CsvLineParser<File, precis_tools::PrecisDerivedProperty> =
        precis_tools::CsvLineParser::from_path(csv_path).unwrap();

    for result in parser {
        let prop = result.unwrap();
        match prop.codepoints {
            ucd_parse::Codepoints::Single(cp) => {
                check_derived_property(cp.value(), &prop.properties, &id, &ff)
            }
            ucd_parse::Codepoints::Range(r) => {
                for cp in r {
                    check_derived_property(cp.value(), &prop.properties, &id, &ff)
                }
            }
        }
    }
}