//! vectors from https://tangled.org/microcosm.blue/star/tree/main/interop at 41bdec1
//! license in licenses/star-interop-MIT.txt
use std::io::BufReader;
use dasl_star::{Reader, write_end, write_header, write_pair};
use ipld_core::ipld::Ipld;
use serde_json::Value;
fn fixtures(name: &str) -> Vec<Value> {
let path = format!("{}/tests/fixtures/{name}", env!("CARGO_MANIFEST_DIR"));
serde_json::from_slice(&std::fs::read(path).unwrap()).unwrap()
}
fn hex(s: &Value) -> Vec<u8> {
let s = s.as_str().unwrap();
(0..s.len())
.step_by(2)
.map(|i| u8::from_str_radix(&s[i..i + 2], 16).unwrap())
.collect()
}
#[test]
fn every_valid_vector_reads_as_expected_and_writes_back_byte_for_byte() {
let fixtures = fixtures("valid-star-fixtures.json");
assert!(!fixtures.is_empty());
for fixture in fixtures {
let comment = &fixture["comment"];
let star = hex(&fixture["star_hex"]);
let reader = Reader::new(&star[..]).unwrap_or_else(|e| panic!("{comment}: {e}"));
let meta: Value = serde_ipld_dagcbor::from_slice(reader.meta()).unwrap();
assert_eq!(meta, fixture["decoded"]["meta"], "{comment}");
let ipld: Ipld = serde_ipld_dagcbor::from_slice(reader.meta()).unwrap();
let pairs: Vec<_> = reader
.collect::<Result<_, _>>()
.unwrap_or_else(|e| panic!("{comment}: {e}"));
let expected: Vec<_> = fixture["decoded"]["pairs"]
.as_array()
.unwrap()
.iter()
.map(|pair| (hex(&pair["key_hex"]), hex(&pair["value_hex"])))
.collect();
assert_eq!(pairs, expected, "{comment}");
let mut written = Vec::new();
write_header(&mut written, &ipld).unwrap();
for (key, value) in &pairs {
write_pair(&mut written, key, value).unwrap();
}
write_end(&mut written).unwrap();
assert_eq!(written, star, "{comment}");
let mut reader = Reader::new(BufReader::with_capacity(1, &star[..])).unwrap();
for (key, value) in &expected {
let pair = reader.next_pair().unwrap();
assert_eq!(pair, Some((&key[..], &value[..])), "{comment}");
}
assert_eq!(reader.next_pair().unwrap(), None, "{comment}");
}
}
#[test]
fn every_invalid_vector_is_refused() {
let fixtures = fixtures("invalid-star-fixtures.json");
assert!(!fixtures.is_empty());
for fixture in fixtures {
let comment = &fixture["comment"];
let star = hex(&fixture["star_hex"]);
let read = Reader::new(&star[..]).and_then(|reader| reader.collect::<Result<Vec<_>, _>>());
assert!(read.is_err(), "{comment} was accepted: {read:?}");
let read = Reader::new(BufReader::with_capacity(1, &star[..]))
.and_then(|reader| reader.collect::<Result<Vec<_>, _>>());
assert!(
read.is_err(),
"{comment} was accepted a byte at a time: {read:?}"
);
}
}