conspire 0.7.7

The Rust interface to conspire.
Documentation
use super::{Sizes, attribute, data_layout, dataspace, datatype, fill_value, filter_pipeline};
use crate::io::netcdf::format::{NC_INT, Storage};

const SIZES: Sizes = Sizes {
    offset: 8,
    length: 8,
};

#[test]
fn datatype_endianness() {
    let le = datatype(&[0x10, 0x08, 0, 0, 4, 0, 0, 0]);
    assert!(le.little_endian && le.class == 0 && le.size == 4);
    let be = datatype(&[0x10, 0x01, 0, 0, 4, 0, 0, 0]);
    assert!(!be.little_endian);
}

#[test]
fn dataspace_scalar_and_simple() {
    assert_eq!(dataspace(&[2, 0, 0, 0]), Vec::<u64>::new());
    let mut d = vec![2, 1, 0, 0];
    d.extend(7u64.to_le_bytes());
    assert_eq!(dataspace(&d), [7]);
}

#[test]
#[should_panic(expected = "unsupported dataspace version")]
fn dataspace_rejects_v1() {
    dataspace(&[1, 0, 0, 0]);
}

#[test]
#[should_panic(expected = "unsupported data layout message version")]
fn data_layout_rejects_old_version() {
    data_layout(&SIZES, &[2, 1, 0]);
}

#[test]
#[should_panic(expected = "unsupported data layout class")]
fn data_layout_rejects_compact_class() {
    data_layout(&SIZES, &[3, 0, 0, 0]);
}

#[test]
fn data_layout_unallocated_chunked_is_fill() {
    let mut d = vec![3, 2, 2];
    d.extend([0xFF; 8]);
    d.extend([4, 0, 0, 0, 8, 0, 0, 0]);
    assert!(matches!(data_layout(&SIZES, &d), super::RawLayout::Fill));
}

#[test]
fn fill_value_versions() {
    assert_eq!(
        fill_value(&[3, 0x2a, 4, 0, 0, 0, 9, 9, 9, 9]),
        Some(vec![9; 4])
    );
    assert_eq!(fill_value(&[3, 0x00, 0, 0, 0, 0]), None);
    assert_eq!(
        fill_value(&[2, 2, 2, 1, 4, 0, 0, 0, 7, 7, 7, 7]),
        Some(vec![7; 4])
    );
    assert_eq!(fill_value(&[2, 2, 2, 0]), None);
}

#[test]
#[should_panic(expected = "unsupported fill value message version")]
fn fill_value_rejects_unknown_version() {
    fill_value(&[9, 0]);
}

#[test]
#[should_panic(expected = "unsupported filter pipeline version")]
fn filter_pipeline_rejects_v1() {
    filter_pipeline(&[1, 1, 0, 0, 0, 0, 0, 0]);
}

#[test]
#[should_panic(expected = "unsupported HDF5 filter")]
fn filter_pipeline_rejects_unknown_filter() {
    filter_pipeline(&[2, 1, 99, 0, 0, 0, 0, 0]);
}

#[test]
#[should_panic(expected = "unsupported attribute message version")]
fn attribute_rejects_old_version() {
    attribute(&[1, 0, 0, 0, 0, 0, 0, 0]);
}

#[test]
fn parse_ignores_unknown_object_header_messages() {
    let mut b = b"OHDR".to_vec();
    b.extend([2, 0x00, 32]);
    b.extend([0x01, 12, 0, 0]);
    b.extend([2, 1, 0, 0]);
    b.extend(3u64.to_le_bytes());
    b.extend([0x03, 8, 0, 0]);
    b.extend([0x00, 0x00, 0, 0, 4, 0, 0, 0]);
    b.extend([0xFF, 0, 0, 0]);

    let mut dims = Vec::new();
    let mut vars = Vec::new();
    super::parse(&b, &SIZES, "u", 0, &mut dims, &mut vars);

    assert_eq!(vars.len(), 1);
    assert_eq!(vars[0].xtype, NC_INT);
    assert!(matches!(&vars[0].storage, Storage::Hdf5 { shape, .. } if *shape == [3]));
}