conspire 0.7.7

The Rust interface to conspire.
Documentation
use super::{
    AttValue, Attribute, DimSpec, NC_DOUBLE, NC_FLOAT, NC_INT, Storage, VarSpec, finalize, parse,
    type_size,
};

fn double_var(name: &str, dimids: Vec<usize>) -> VarSpec {
    VarSpec {
        name: name.to_string(),
        xtype: NC_DOUBLE,
        dimids,
        atts: Vec::new(),
        begin: 0,
        vsize: 0,
        storage: Storage::Classic,
    }
}

#[test]
fn round_trips_through_parse() {
    let dims = vec![
        DimSpec {
            name: "nodes".to_string(),
            len: 3,
        },
        DimSpec {
            name: "time_step".to_string(),
            len: 0,
        },
    ];
    let gatts = vec![
        Attribute {
            name: "file_size".to_string(),
            value: AttValue::Int(vec![1]),
        },
        Attribute {
            name: "version".to_string(),
            value: AttValue::Float(vec![8.25]),
        },
    ];
    let mut vars = vec![double_var("coordx", vec![0])];
    let header = finalize(&dims, &gatts, &mut vars);

    let parsed = parse(&header);
    assert_eq!(parsed.dims.len(), 2);
    assert_eq!(parsed.dims[0].name, "nodes");
    assert_eq!(parsed.dims[0].len, 3);
    assert_eq!(parsed.dims[1].len, 0);
    assert_eq!(parsed.vars.len(), 1);
    assert_eq!(parsed.vars[0].name, "coordx");
    assert_eq!(parsed.vars[0].xtype, NC_DOUBLE);
    assert_eq!(parsed.vars[0].begin, vars[0].begin);
    assert_eq!(parsed.vars[0].elements(&parsed.dims), 3);
}

#[test]
fn type_sizes() {
    assert_eq!(type_size(NC_INT), 4);
    assert_eq!(type_size(NC_FLOAT), 4);
    assert_eq!(type_size(NC_DOUBLE), 8);
}

#[test]
fn empty_dims_and_vars_round_trip() {
    let header = finalize(&[], &[], &mut []);
    let parsed = parse(&header);
    assert!(parsed.dims.is_empty());
    assert!(parsed.gatts.is_empty());
    assert!(parsed.vars.is_empty());
}