use super::*;
fn write_blob(out: &mut Vec<u8>, blob: &[u8]) {
out.extend_from_slice(&(blob.len() as u32).to_le_bytes());
out.extend_from_slice(blob);
}
fn v2_header(n_nodes: u32) -> Vec<u8> {
let mut out = 2u32.to_le_bytes().to_vec(); for v in [16u32, 32, 400, 0, 0, n_nodes] {
out.extend_from_slice(&v.to_le_bytes());
}
out
}
#[test]
fn v2_rejects_hostile_level_value() {
let mut p = v2_header(1);
write_blob(&mut p, &pack_u64s(&[u64::MAX])); write_blob(&mut p, &pack_u64s(&[]));
write_blob(&mut p, &pack_u64s(&[]));
assert!(HnswIndex::from_bytes(&p, 1, 8).is_err());
}
#[test]
fn v2_rejects_hostile_degree_value() {
let mut p = v2_header(1);
write_blob(&mut p, &pack_u64s(&[0])); write_blob(&mut p, &pack_u64s(&[u64::MAX])); write_blob(&mut p, &pack_u64s(&[]));
assert!(HnswIndex::from_bytes(&p, 1, 8).is_err());
}
#[test]
fn v2_truncated_columns_error_not_panic() {
let mut p = v2_header(1);
write_blob(&mut p, &pack_u64s(&[0]));
assert!(HnswIndex::from_bytes(&p, 1, 8).is_err());
}
#[test]
fn v2_rejects_out_of_range_neighbour_id() {
let mut p = v2_header(2); write_blob(&mut p, &pack_u64s(&[0, 0])); write_blob(&mut p, &pack_u64s(&[1, 1])); write_blob(&mut p, &pack_u64s(&[5, 0])); assert!(HnswIndex::from_bytes(&p, 2, 8).is_err());
}
#[test]
fn v1_rejects_out_of_range_neighbour_id() {
let mut out = 1u32.to_le_bytes().to_vec(); for v in [16u32, 32, 400, 0, 0, 1] {
out.extend_from_slice(&v.to_le_bytes()); }
out.extend_from_slice(&0u32.to_le_bytes()); out.extend_from_slice(&1u32.to_le_bytes()); out.extend_from_slice(&7u32.to_le_bytes()); assert!(HnswIndex::from_bytes(&out, 1, 8).is_err());
}
#[test]
fn rejects_out_of_range_entry_point() {
let mut out = 2u32.to_le_bytes().to_vec(); for v in [16u32, 32, 400, 9, 0, 1] {
out.extend_from_slice(&v.to_le_bytes()); }
write_blob(&mut out, &pack_u64s(&[0])); write_blob(&mut out, &pack_u64s(&[0])); write_blob(&mut out, &pack_u64s(&[])); assert!(HnswIndex::from_bytes(&out, 1, 8).is_err());
}