acorn-schema 0.4.0

Portable ACORN schema, validation, and codecs
use super::Constant;
use acorn_core::prelude::alloc::{String, Vec};
use acorn_core::util::assets::EmbeddedAssets;

#[test]
fn test_schema_asset_inventory_is_embedded_and_nonempty() {
    for name in [
        "geonames.tsv",
        "keywords.csv",
        "organization.json",
        "partners.csv",
        "sponsors.csv",
        "technology.csv",
    ] {
        assert!(
            Constant::from_asset(name).is_some_and(|content| !content.trim().is_empty()),
            "missing schema asset {name}"
        );
    }
    assert!(Constant::from_asset("unknown.csv").is_none());
}

#[test]
fn test_schema_assets_have_singular_filesystem_ownership() {
    let schema_assets = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("assets/constants");
    let lib_assets = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("../acorn-lib/assets/constants");
    let lib_prompts = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("../acorn-lib/assets/prompts");
    assert!(schema_assets.is_dir());
    for name in [
        "geonames.tsv",
        "keywords.csv",
        "organization.json",
        "partners.csv",
        "sponsors.csv",
        "technology.csv",
    ] {
        assert!(!lib_assets.join(name).exists(), "schema asset is duplicated by acorn-lib: {name}");
    }
    for name in [
        "eli5.prompt",
        "extract-claim.prompt",
        "find-gaps.prompt",
        "summarize.prompt",
        "teach.prompt",
        "translate.prompt",
    ] {
        assert!(!lib_prompts.join(name).exists(), "schema prompt is duplicated by acorn-lib: {name}");
    }
}

#[test]
fn test_schema_vocabulary_assets_supply_csv_columns() {
    let technologies = Constant::nth_values("technology", 0).collect::<Vec<String>>();
    assert!(technologies.contains(&"airflow".to_string()));
    let technology_names = Constant::nth_values("technology", 2).collect::<Vec<String>>();
    assert!(technology_names.contains(&"Apache Airflow".to_string()));
    let partner_names = Constant::nth_values("partners", 0).collect::<Vec<String>>();
    assert!(partner_names.contains(&"Ames Laboratory".to_string()));
    let partner_identifiers = Constant::last_values("partners").collect::<Vec<String>>();
    assert!(partner_identifiers.contains(&"041m9xr71".to_string()));
}