use tensogram::{MetaType, decode_metadata};
const FIXTURE: &[u8] = include_bytes!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/../../tests/fixtures/metadata_parity.tgm"
));
#[test]
fn metadata_parity_matrix() {
let meta = decode_metadata(FIXTURE).expect("decode fixture metadata");
assert_eq!(meta.num_objects(), 2);
assert!(meta.contains("shortName"));
assert!(meta.contains("level")); assert!(meta.contains("note")); assert!(!meta.contains("missing"));
assert_eq!(meta.get("shortName").unwrap().as_str(), Some("2t")); assert_eq!(meta.get("level").unwrap().as_i64(), Some(0));
assert_eq!(meta.get("note").unwrap().as_str(), Some(""));
assert_eq!(meta.get("count").unwrap().as_i64(), Some(-5));
assert_eq!(meta.get("count").unwrap().as_u64(), None); assert_eq!(meta.get("big").unwrap().as_i64(), Some(2_147_483_648));
assert_eq!(meta.get("ratio").unwrap().as_f64(), Some(0.5));
assert_eq!(meta.get("ratio").unwrap().as_i64(), None); assert_eq!(meta.get("flag").unwrap().as_bool(), Some(true));
assert_eq!(meta.get("shortName").unwrap().as_i64(), None); assert_eq!(meta.get("level").unwrap().value_type(), MetaType::Int);
assert_eq!(meta.get("note").unwrap().value_type(), MetaType::String);
assert_eq!(meta.get("mars.class").unwrap().as_str(), Some("od"));
let mars = meta.get("mars").unwrap();
assert_eq!(mars.value_type(), MetaType::Map);
assert_eq!(mars.get_key("stream").unwrap().as_str(), Some("oper"));
assert!(mars.contains_key("class"));
let levels = meta.get("levels").unwrap();
assert_eq!(levels.value_type(), MetaType::Array);
assert_eq!(levels.len(), 3);
assert_eq!(levels.get_index(1).unwrap().as_i64(), Some(850));
assert!(levels.get_index(3).is_none());
assert_eq!(meta.get("source").unwrap().as_str(), Some("parity-fixture"));
assert_eq!(
meta.get("extra.source").unwrap().as_str(),
Some("parity-fixture")
);
assert!(!meta.contains("_reserved_.tensor"));
assert!(!meta.contains_at(0, "_reserved_.tensor"));
let obj0 = meta.object(0).unwrap();
assert!(obj0.contains_key("_reserved_"));
assert!(obj0.contains_key("shortName"));
let tensor = obj0
.get_key("_reserved_")
.and_then(|r| r.get_key("tensor"))
.expect("reserved.tensor via enumeration");
assert_eq!(tensor.get_key("dtype").unwrap().as_str(), Some("float32"));
let shape = tensor.get_key("shape").unwrap();
assert_eq!(shape.value_type(), MetaType::Array);
assert_eq!(shape.get_index(0).unwrap().as_i64(), Some(2));
assert_eq!(shape.get_index(1).unwrap().as_i64(), Some(3));
assert_eq!(meta.get_at(0, "shortName").unwrap().as_str(), Some("2t"));
assert_eq!(meta.get_at(1, "shortName").unwrap().as_str(), Some("msl"));
assert_eq!(meta.get_at(0, "mars.class").unwrap().as_str(), Some("od"));
assert_eq!(meta.get_at(1, "mars.class").unwrap().as_str(), Some("ea"));
assert!(meta.contains_at(0, "only0"));
assert!(!meta.contains_at(1, "only0"));
assert!(meta.get_at(2, "shortName").is_none());
assert!(meta.extra_view().contains_key("source"));
assert_eq!(
meta.extra_view().get_key("source").unwrap().as_str(),
Some("parity-fixture")
);
}