caseformat 0.2.0

Power flow case data format
Documentation
use std::fs::File;
use std::path::Path;
use validator::Validate;

use crate::read::{read_dir, read_tar};

#[test]
fn test_read_dir() {
    let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
    let manifest_path = Path::new(&manifest_dir);
    let case9_dir = manifest_path.join("casedata").join("case9");

    let (case, buses, gen, branch, gencost, dcline, _readme, _license) =
        read_dir(&case9_dir).unwrap();

    assert!(case.validate().is_ok());
    assert_eq!(case.name, "case9");
    assert_eq!(case.version, "2");
    assert_eq!(case.base_mva, 100.0);
    assert!(case.f.is_none());

    assert_eq!(buses.len(), 9);
    assert!(buses.iter().all(|bus| bus.validate().is_ok()));
    assert!(!buses.iter().any(|bus| bus.is_opf()));
    assert_eq!(buses.iter().filter(|bus| bus.is_ref()).count(), 1);

    assert_eq!(gen.len(), 3);
    assert!(gen.iter().all(|g| g.validate().is_ok()));

    assert_eq!(branch.len(), 9);
    assert!(branch.iter().all(|br| br.validate().is_ok()));

    assert_eq!(gencost.len(), 3);
    assert!(gencost.iter().all(|c| c.validate().is_ok()));

    assert!(dcline.is_empty());
}

#[test]
fn test_read_zip() {
    let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
    let manifest_path = Path::new(&manifest_dir);
    let ieee14_zip = manifest_path.join("casedata").join("ieee14.case");

    let (case, buses, gen, branch, gencost, dcline, _readme, _license) =
        read_tar(File::open(&ieee14_zip).unwrap()).unwrap();

    assert!(case.validate().is_ok());
    assert_eq!(case.name, "ieee14");
    assert_eq!(case.version, "2");
    assert_eq!(case.base_mva, 100.0);
    assert!(case.f.is_none());

    assert_eq!(buses.len(), 14);
    assert!(buses.iter().all(|bus| bus.validate().is_ok()));
    assert!(!buses.iter().any(|bus| bus.is_opf()));
    assert_eq!(buses.iter().filter(|bus| bus.is_ref()).count(), 1);

    assert_eq!(gen.len(), 5);
    assert!(gen.iter().all(|g| g.validate().is_ok()));

    assert_eq!(branch.len(), 20);
    assert!(branch.iter().all(|br| br.validate().is_ok()));

    assert_eq!(gencost.len(), 5);
    assert!(gencost.iter().all(|c| c.validate().is_ok()));

    assert!(dcline.is_empty());
}