use bitcoin_asmap::*;
use bitcoin_imports::*;
fn minimal_return_42() -> Vec<bool> {
let mut bits = vec![false];
bits.push(false); let mantissa: u16 = 41;
for i in (0..15).rev() {
bits.push(((mantissa >> i) & 1) != 0);
}
while bits.len() % 8 != 0 {
bits.push(false); }
bits
}
#[traced_test]
fn decode_bits_minimal_path() {
let bits = vec![false, false, false]; let mut pos = 0;
let val = decode_bits(&bits, &mut pos, 0, &[0_u8]);
assert_eq!(val, 0);
}
#[traced_test]
fn count_bits_roundtrip() {
let value: u32 = 0b1011_0001;
assert_eq!(count_bits(value), 4);
}
#[traced_test]
fn sanity_accepts_minimal_return() {
let asmap = minimal_return_42();
assert!(sanity_check_as_map(&asmap, 128));
}
#[traced_test]
fn interpret_returns_expected_asn() {
let asmap = minimal_return_42();
let ip = vec![false; 128]; let asn = interpret(&asmap, &ip);
assert_eq!(asn, 42);
}
#[traced_test]
fn decode_asmap_roundtrip_file_io() {
let tmp_dir = std::env::temp_dir();
let mut path = PathBuf::from(&tmp_dir);
path.push("asmap_test.bin");
let bits = minimal_return_42();
let mut byte = 0u8;
let mut count = 0u8;
let mut bytes_out = Vec::<u8>::new();
for b in bits {
if b {
byte |= 1 << count;
}
count += 1;
if count == 8 {
bytes_out.push(byte);
byte = 0;
count = 0;
}
}
if count != 0 {
bytes_out.push(byte); }
let mut f = File::create(&path).unwrap();
f.write_all(&bytes_out).unwrap();
drop(f);
let decoded = decode_asmap(&path);
std::fs::remove_file(&path).unwrap();
assert!(!decoded.is_empty());
assert_eq!(decoded.len(), minimal_return_42().len());
assert!(sanity_check_as_map(&decoded, 128));
}