use bakery::{load_from_string, write_from_string_with_recipe, Recipe};
use core::fmt::Debug;
use serde::{Deserialize, Serialize};
use std::cmp::PartialEq;
pub fn vec_and(a: &Vec<u8>, b: &Vec<u8>) -> Vec<u8> {
assert_eq!(a.len(), b.len());
let mut result = a.to_vec();
for (x, y) in result.iter_mut().zip(b) {
*x &= y;
}
result
}
pub fn test_compile_mask(rec: &str, dat: &str, expect: &[u8], mask: &[u8]) -> Vec<u8> {
let mut out = Vec::<u8>::new();
write_from_string_with_recipe(&mut out, rec, dat).unwrap();
let mut out_masked = out.clone();
assert_eq!(expect.len(), mask.len()); for (a, b) in out_masked.iter_mut().zip(mask) {
*a = *a & b;
}
assert_eq!(out_masked, expect);
out
}
pub fn test_compile_ser<T>(rec: &str, dat: &str, bin: Option<&[u8]>, val: T)
where
T: Recipe + Debug + Serialize + PartialEq + for<'a> Deserialize<'a>,
{
let mut out = Vec::<u8>::new();
write_from_string_with_recipe(&mut out, rec, dat).unwrap();
if let Some(bin) = bin {
assert_eq!(out, bin);
assert_eq!(bincode::serialize(&val).unwrap(), bin);
}
assert_eq!(bincode::deserialize::<T>(&out).unwrap(), val);
assert_eq!(load_from_string::<T>(dat).unwrap(), val);
}
pub fn test_load_from_string<T>(dat: &str, expected: T)
where
T: Recipe + Debug + PartialEq + for<'a> Deserialize<'a>,
{
assert_eq!(load_from_string::<T>(dat).unwrap(), expected)
}