#[test]
fn test_unaligned_pygmy_odd_offset() {
let data = build_unaligned_pygmy_odd_offset();
let result = GGUFModel::from_bytes(&data);
match result {
Ok(model) => {
assert_eq!(model.tensors.len(), 1);
assert_eq!(model.tensors[0].offset, 17);
},
Err(_) => {
},
}
}
#[test]
fn test_unaligned_pygmy_overflow_offset() {
let data = build_unaligned_pygmy_overflow_offset();
let result = GGUFModel::from_bytes(&data);
match result {
Ok(model) => {
assert_eq!(model.tensors.len(), 1);
assert!(model.tensors[0].offset > data.len() as u64);
},
Err(_) => {
},
}
}
#[test]
fn test_malformed_pygmy_empty_name() {
let data = build_malformed_pygmy_empty_name();
let result = GGUFModel::from_bytes(&data);
match result {
Ok(model) => {
assert_eq!(model.tensors.len(), 1);
assert!(model.tensors[0].name.is_empty());
},
Err(_) => {
},
}
}
#[test]
fn test_malformed_pygmy_long_name() {
let data = build_malformed_pygmy_long_name();
let result = GGUFModel::from_bytes(&data);
assert!(result.is_err(), "Long name without data should fail");
}
#[test]
fn test_malformed_pygmy_invalid_type() {
let data = build_malformed_pygmy_invalid_type();
let result = GGUFModel::from_bytes(&data);
match result {
Ok(model) => {
assert_eq!(model.tensors.len(), 1);
},
Err(_) => {
},
}
}
#[test]
fn test_malformed_pygmy_zero_dims() {
let data = build_malformed_pygmy_zero_dims();
let result = GGUFModel::from_bytes(&data);
match result {
Ok(model) => {
assert_eq!(model.tensors.len(), 1);
assert_eq!(model.tensors[0].dims.len(), 0);
},
Err(_) => {
},
}
}
#[test]
fn test_malformed_pygmy_too_many_dims() {
let data = build_malformed_pygmy_too_many_dims();
let result = GGUFModel::from_bytes(&data);
match result {
Ok(model) => {
assert_eq!(model.tensors.len(), 1);
assert_eq!(model.tensors[0].dims.len(), 100);
},
Err(_) => {
},
}
}
#[test]
fn test_malformed_pygmy_overlapping_tensors() {
let data = build_malformed_pygmy_overlapping_tensors();
let result = GGUFModel::from_bytes(&data);
match result {
Ok(model) => {
assert_eq!(model.tensors.len(), 2);
let t0_end = model.tensors[0].offset + 128; let t1_start = model.tensors[1].offset;
assert!(t1_start < t0_end, "Tensors should overlap");
},
Err(_) => {
},
}
}
#[test]
fn test_shard_pygmy_split_metadata() {
let data = build_shard_pygmy_split_metadata();
let result = GGUFModel::from_bytes(&data);
match result {
Ok(model) => {
assert_eq!(model.metadata.len(), 3);
let keys: Vec<&str> = model
.metadata
.keys()
.map(std::string::String::as_str)
.collect();
assert!(keys.contains(&"split.no"));
assert!(keys.contains(&"split.count"));
assert!(keys.contains(&"split.tensors.count"));
},
Err(e) => {
let _ = e;
},
}
}
#[test]
fn test_padding_pattern_all_zeros() {
let mut data = Vec::new();
data.extend_from_slice(&GGUF_MAGIC.to_le_bytes());
data.extend_from_slice(&GGUF_VERSION_V3.to_le_bytes());
data.extend_from_slice(&1u64.to_le_bytes());
data.extend_from_slice(&0u64.to_le_bytes());
let name = "padded_tensor";
data.extend_from_slice(&(name.len() as u64).to_le_bytes());
data.extend_from_slice(name.as_bytes());
data.extend_from_slice(&1u32.to_le_bytes());
data.extend_from_slice(&4u64.to_le_bytes());
data.extend_from_slice(&0u32.to_le_bytes()); data.extend_from_slice(&0u64.to_le_bytes());
while data.len() % 32 != 0 {
data.push(0x00);
}
for i in 0..4 {
data.extend_from_slice(&(i as f32).to_le_bytes());
}
let result = GGUFModel::from_bytes(&data);
assert!(result.is_ok(), "Zero padding should work");
}
#[test]
fn test_padding_pattern_all_ff() {
let mut data = Vec::new();
data.extend_from_slice(&GGUF_MAGIC.to_le_bytes());
data.extend_from_slice(&GGUF_VERSION_V3.to_le_bytes());
data.extend_from_slice(&1u64.to_le_bytes());
data.extend_from_slice(&0u64.to_le_bytes());
let name = "ff_padded";
data.extend_from_slice(&(name.len() as u64).to_le_bytes());
data.extend_from_slice(name.as_bytes());
data.extend_from_slice(&1u32.to_le_bytes());
data.extend_from_slice(&4u64.to_le_bytes());
data.extend_from_slice(&0u32.to_le_bytes());
data.extend_from_slice(&0u64.to_le_bytes());
while data.len() % 32 != 0 {
data.push(0xFF);
}
for i in 0..4 {
data.extend_from_slice(&(i as f32).to_le_bytes());
}
let result = GGUFModel::from_bytes(&data);
assert!(result.is_ok(), "0xFF padding should work");
}
#[test]
fn test_padding_pattern_alternating() {
let mut data = Vec::new();
data.extend_from_slice(&GGUF_MAGIC.to_le_bytes());
data.extend_from_slice(&GGUF_VERSION_V3.to_le_bytes());
data.extend_from_slice(&1u64.to_le_bytes());
data.extend_from_slice(&0u64.to_le_bytes());
let name = "alt_padded";
data.extend_from_slice(&(name.len() as u64).to_le_bytes());
data.extend_from_slice(name.as_bytes());
data.extend_from_slice(&1u32.to_le_bytes());
data.extend_from_slice(&4u64.to_le_bytes());
data.extend_from_slice(&0u32.to_le_bytes());
data.extend_from_slice(&0u64.to_le_bytes());
let mut alt = false;
while data.len() % 32 != 0 {
data.push(if alt { 0xAA } else { 0x55 });
alt = !alt;
}
for i in 0..4 {
data.extend_from_slice(&(i as f32).to_le_bytes());
}
let result = GGUFModel::from_bytes(&data);
assert!(result.is_ok(), "Alternating padding should work");
}
#[test]
fn test_tensor_count_mismatch_more_claimed() {
let mut data = Vec::new();
data.extend_from_slice(&GGUF_MAGIC.to_le_bytes());
data.extend_from_slice(&GGUF_VERSION_V3.to_le_bytes());
data.extend_from_slice(&10u64.to_le_bytes()); data.extend_from_slice(&0u64.to_le_bytes());
let name = "only_one";
data.extend_from_slice(&(name.len() as u64).to_le_bytes());
data.extend_from_slice(name.as_bytes());
data.extend_from_slice(&1u32.to_le_bytes());
data.extend_from_slice(&4u64.to_le_bytes());
data.extend_from_slice(&0u32.to_le_bytes());
data.extend_from_slice(&0u64.to_le_bytes());
let result = GGUFModel::from_bytes(&data);
assert!(result.is_err(), "Missing tensors should fail");
}
#[test]
fn test_tensor_count_zero_with_data() {
let mut data = Vec::new();
data.extend_from_slice(&GGUF_MAGIC.to_le_bytes());
data.extend_from_slice(&GGUF_VERSION_V3.to_le_bytes());
data.extend_from_slice(&0u64.to_le_bytes()); data.extend_from_slice(&0u64.to_le_bytes());
data.extend_from_slice(&[0xDE, 0xAD, 0xBE, 0xEF]);
let result = GGUFModel::from_bytes(&data);
match result {
Ok(model) => {
assert_eq!(model.tensors.len(), 0);
},
Err(_) => {
},
}
}
#[test]
fn test_metadata_type_string_empty() {
let mut data = Vec::new();
data.extend_from_slice(&GGUF_MAGIC.to_le_bytes());
data.extend_from_slice(&GGUF_VERSION_V3.to_le_bytes());
data.extend_from_slice(&0u64.to_le_bytes());
data.extend_from_slice(&1u64.to_le_bytes());
let key = "empty_string_key";
data.extend_from_slice(&(key.len() as u64).to_le_bytes());
data.extend_from_slice(key.as_bytes());
data.extend_from_slice(&8u32.to_le_bytes()); data.extend_from_slice(&0u64.to_le_bytes());
let result = GGUFModel::from_bytes(&data);
if let Ok(model) = result {
assert_eq!(model.metadata.len(), 1);
}
}
#[test]
fn test_metadata_type_array_empty() {
let mut data = Vec::new();
data.extend_from_slice(&GGUF_MAGIC.to_le_bytes());
data.extend_from_slice(&GGUF_VERSION_V3.to_le_bytes());
data.extend_from_slice(&0u64.to_le_bytes());
data.extend_from_slice(&1u64.to_le_bytes());
let key = "empty_array";
data.extend_from_slice(&(key.len() as u64).to_le_bytes());
data.extend_from_slice(key.as_bytes());
data.extend_from_slice(&9u32.to_le_bytes()); data.extend_from_slice(&4u32.to_le_bytes()); data.extend_from_slice(&0u64.to_le_bytes());
let result = GGUFModel::from_bytes(&data);
if let Ok(model) = result {
assert_eq!(model.metadata.len(), 1);
}
}
#[test]
fn test_many_tensors_varied_types() {
let mut data = Vec::new();
let tensor_count = 50u64;
data.extend_from_slice(&GGUF_MAGIC.to_le_bytes());
data.extend_from_slice(&GGUF_VERSION_V3.to_le_bytes());
data.extend_from_slice(&tensor_count.to_le_bytes());
data.extend_from_slice(&0u64.to_le_bytes());
let types = [0u32, 1, 2, 6, 7, 8];
let mut offset = 0u64;
for i in 0..tensor_count {
let name = format!("tensor_{:03}", i);
data.extend_from_slice(&(name.len() as u64).to_le_bytes());
data.extend_from_slice(name.as_bytes());
data.extend_from_slice(&1u32.to_le_bytes()); data.extend_from_slice(&32u64.to_le_bytes()); data.extend_from_slice(&types[(i as usize) % types.len()].to_le_bytes());
data.extend_from_slice(&offset.to_le_bytes());
offset += 128; }
while data.len() % 32 != 0 {
data.push(0);
}
for _ in 0..(offset as usize) {
data.push(0);
}
let result = GGUFModel::from_bytes(&data);
match result {
Ok(model) => {
assert_eq!(model.tensors.len(), 50);
},
Err(_) => {
},
}
}