#[test]
fn test_phase33_loader_get_tensor_f32_basic() {
let mut data = build_gguf_header(1, 0);
data.extend(build_tensor_info("test", &[4], 0, 0));
let current_len = data.len();
let aligned = current_len.div_ceil(32) * 32;
data.resize(aligned, 0);
let values = [1.0f32, 2.0, 3.0, 4.0];
for v in &values {
data.extend_from_slice(&v.to_le_bytes());
}
let model = GGUFModel::from_bytes(&data).expect("Should parse");
let tensor = model.get_tensor_f32("test", &data).expect("Should extract");
assert_eq!(tensor.len(), 4);
assert!((tensor[0] - 1.0).abs() < 0.001);
assert!((tensor[1] - 2.0).abs() < 0.001);
assert!((tensor[2] - 3.0).abs() < 0.001);
assert!((tensor[3] - 4.0).abs() < 0.001);
}
#[test]
fn test_phase33_loader_get_tensor_f32_out_of_bounds() {
let mut data = build_gguf_header(1, 0);
data.extend(build_tensor_info("test", &[1000000], 0, 0));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
let result = model.get_tensor_f32("test", &data);
assert!(result.is_err());
}
#[test]
fn test_phase33_loader_empty_string_key() {
let mut data = build_gguf_header(0, 1);
data.extend(build_gguf_metadata("", 4, &42u32.to_le_bytes()));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert!(model.metadata.contains_key(""));
}
#[test]
fn test_phase33_loader_empty_tensor_name() {
let mut data = build_gguf_header(1, 0);
data.extend(build_tensor_info("", &[64], 0, 0));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert_eq!(model.tensors[0].name, "");
}
#[test]
fn test_phase33_loader_unicode_metadata_key() {
let mut data = build_gguf_header(0, 1);
data.extend(build_gguf_metadata(
"test_\u{1F600}",
4,
&42u32.to_le_bytes(),
));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert!(model.metadata.contains_key("test_\u{1F600}"));
}
#[test]
fn test_phase33_loader_large_tensor_count() {
let mut data = build_gguf_header(100, 0);
for i in 0..100 {
data.extend(build_tensor_info(
&format!("t{i}"),
&[32],
0,
i as u64 * 128,
));
}
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert_eq!(model.tensors.len(), 100);
}
#[test]
fn test_phase33_loader_large_metadata_count() {
let mut data = build_gguf_header(0, 50);
for i in 0..50 {
data.extend(build_gguf_metadata(
&format!("key_{i}"),
4,
&(i as u32).to_le_bytes(),
));
}
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert_eq!(model.metadata.len(), 50);
}
#[test]
fn test_phase33_loader_mixed_content() {
let mut data = build_gguf_header(2, 3);
data.extend(build_gguf_metadata("arch", 8, &build_gguf_string("llama")));
data.extend(build_gguf_metadata("hidden", 4, &128u32.to_le_bytes()));
data.extend(build_gguf_metadata("layers", 4, &2u32.to_le_bytes()));
data.extend(build_tensor_info("embed", &[100, 128], 0, 0));
data.extend(build_tensor_info("norm", &[128], 0, 51200));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert_eq!(model.metadata.len(), 3);
assert_eq!(model.tensors.len(), 2);
if let Some(GGUFValue::String(arch)) = model.metadata.get("arch") {
assert_eq!(arch, "llama");
}
}
#[test]
fn test_phase33_loader_architecture() {
let mut data = build_gguf_header(0, 1);
let arch_value = build_gguf_string("llama");
data.extend(build_gguf_metadata("general.architecture", 8, &arch_value));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert_eq!(model.architecture(), Some("llama"));
}
#[test]
fn test_phase33_loader_architecture_missing() {
let data = build_gguf_header(0, 0);
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert_eq!(model.architecture(), None);
}
#[test]
fn test_phase33_loader_embedding_dim() {
let mut data = build_gguf_header(0, 2);
let arch_value = build_gguf_string("llama");
data.extend(build_gguf_metadata("general.architecture", 8, &arch_value));
data.extend(build_gguf_metadata(
"llama.embedding_length",
4,
&256u32.to_le_bytes(),
));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert_eq!(model.embedding_dim(), Some(256));
}
#[test]
fn test_phase33_loader_num_layers() {
let mut data = build_gguf_header(0, 2);
let arch_value = build_gguf_string("qwen2");
data.extend(build_gguf_metadata("general.architecture", 8, &arch_value));
data.extend(build_gguf_metadata(
"qwen2.block_count",
4,
&24u32.to_le_bytes(),
));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert_eq!(model.num_layers(), Some(24));
}
#[test]
fn test_phase33_loader_num_heads() {
let mut data = build_gguf_header(0, 2);
let arch_value = build_gguf_string("llama");
data.extend(build_gguf_metadata("general.architecture", 8, &arch_value));
data.extend(build_gguf_metadata(
"llama.attention.head_count",
4,
&32u32.to_le_bytes(),
));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert_eq!(model.num_heads(), Some(32));
}
#[test]
fn test_phase33_loader_context_length() {
let mut data = build_gguf_header(0, 2);
let arch_value = build_gguf_string("llama");
data.extend(build_gguf_metadata("general.architecture", 8, &arch_value));
data.extend(build_gguf_metadata(
"llama.context_length",
4,
&4096u32.to_le_bytes(),
));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert_eq!(model.context_length(), Some(4096));
}
#[test]
fn test_phase33_loader_num_kv_heads() {
let mut data = build_gguf_header(0, 2);
let arch_value = build_gguf_string("llama");
data.extend(build_gguf_metadata("general.architecture", 8, &arch_value));
data.extend(build_gguf_metadata(
"llama.attention.head_count_kv",
4,
&8u32.to_le_bytes(),
));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
assert_eq!(model.num_kv_heads(), Some(8));
}
#[test]
fn test_phase33_loader_rope_freq_base() {
let mut data = build_gguf_header(0, 2);
let arch_value = build_gguf_string("llama");
data.extend(build_gguf_metadata("general.architecture", 8, &arch_value));
data.extend(build_gguf_metadata(
"llama.rope.freq_base",
6,
&10000.0f32.to_le_bytes(),
));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
let rope = model.rope_freq_base().expect("Should have rope");
assert!((rope - 10000.0).abs() < 0.1);
}
#[test]
fn test_phase33_loader_rms_epsilon() {
let mut data = build_gguf_header(0, 2);
let arch_value = build_gguf_string("llama");
data.extend(build_gguf_metadata("general.architecture", 8, &arch_value));
data.extend(build_gguf_metadata(
"llama.attention.layer_norm_rms_epsilon",
6,
&1e-5f32.to_le_bytes(),
));
let model = GGUFModel::from_bytes(&data).expect("Should parse");
let eps = model.rms_epsilon().expect("Should have epsilon");
assert!((eps - 1e-5).abs() < 1e-7);
}
#[test]
fn test_phase33_loader_get_tensor_q4_0() {
use crate::gguf::GGUF_TYPE_Q4_0;
let mut data = build_gguf_header(1, 0);
data.extend(build_tensor_info("test", &[32], GGUF_TYPE_Q4_0, 0));
let current_len = data.len();
let aligned = current_len.div_ceil(32) * 32;
data.resize(aligned, 0);
let scale = half::f16::from_f32(1.0);
data.extend_from_slice(&scale.to_le_bytes());
data.extend([0x11u8; 16]);
let model = GGUFModel::from_bytes(&data).expect("Should parse");
let result = model.get_tensor_f32("test", &data);
assert!(
result.is_ok(),
"Q4_0 extraction should work: {:?}",
result.err()
);
let tensor = result.expect("test value should be present");
assert_eq!(tensor.len(), 32);
}
#[test]
fn test_phase33_loader_get_tensor_q8_0() {
use crate::gguf::GGUF_TYPE_Q8_0;
let mut data = build_gguf_header(1, 0);
data.extend(build_tensor_info("test", &[32], GGUF_TYPE_Q8_0, 0));
let current_len = data.len();
let aligned = current_len.div_ceil(32) * 32;
data.resize(aligned, 0);
let scale = half::f16::from_f32(1.0);
data.extend_from_slice(&scale.to_le_bytes());
data.extend([0i8 as u8; 32]);
let model = GGUFModel::from_bytes(&data).expect("Should parse");
let result = model.get_tensor_f32("test", &data);
assert!(
result.is_ok(),
"Q8_0 extraction should work: {:?}",
result.err()
);
let tensor = result.expect("test value should be present");
assert_eq!(tensor.len(), 32);
}
#[test]
fn test_phase33_loader_get_tensor_f16() {
use crate::gguf::GGUF_TYPE_F16;
let mut data = build_gguf_header(1, 0);
data.extend(build_tensor_info("test", &[4], GGUF_TYPE_F16, 0));
let current_len = data.len();
let aligned = current_len.div_ceil(32) * 32;
data.resize(aligned, 0);
let values = [1.0f32, 2.0, 3.0, 4.0];
for v in &values {
let f16_val = half::f16::from_f32(*v);
data.extend_from_slice(&f16_val.to_le_bytes());
}
let model = GGUFModel::from_bytes(&data).expect("Should parse");
let result = model.get_tensor_f32("test", &data);
assert!(
result.is_ok(),
"F16 extraction should work: {:?}",
result.err()
);
let tensor = result.expect("test value should be present");
assert_eq!(tensor.len(), 4);
assert!((tensor[0] - 1.0).abs() < 0.01);
}
#[test]
fn test_phase33_loader_get_tensor_q4_1() {
use crate::gguf::GGUF_TYPE_Q4_1;
let mut data = build_gguf_header(1, 0);
data.extend(build_tensor_info("test", &[32], GGUF_TYPE_Q4_1, 0));
let current_len = data.len();
let aligned = current_len.div_ceil(32) * 32;
data.resize(aligned, 0);
let scale = half::f16::from_f32(1.0);
let min = half::f16::from_f32(0.0);
data.extend_from_slice(&scale.to_le_bytes());
data.extend_from_slice(&min.to_le_bytes());
data.extend([0x00u8; 16]);
let model = GGUFModel::from_bytes(&data).expect("Should parse");
let result = model.get_tensor_f32("test", &data);
assert!(
result.is_ok(),
"Q4_1 extraction should work: {:?}",
result.err()
);
let tensor = result.expect("test value should be present");
assert_eq!(tensor.len(), 32);
}
#[test]
fn test_phase33_loader_get_tensor_q5_0() {
use crate::gguf::GGUF_TYPE_Q5_0;
let mut data = build_gguf_header(1, 0);
data.extend(build_tensor_info("test", &[32], GGUF_TYPE_Q5_0, 0));
let current_len = data.len();
let aligned = current_len.div_ceil(32) * 32;
data.resize(aligned, 0);
let scale = half::f16::from_f32(1.0);
data.extend_from_slice(&scale.to_le_bytes());
data.extend([0u8; 4]); data.extend([0x00u8; 16]);
let model = GGUFModel::from_bytes(&data).expect("Should parse");
let result = model.get_tensor_f32("test", &data);
assert!(
result.is_ok(),
"Q5_0 extraction should work: {:?}",
result.err()
);
let tensor = result.expect("test value should be present");
assert_eq!(tensor.len(), 32);
}
#[test]
fn test_phase33_loader_get_tensor_q5_1() {
use crate::gguf::GGUF_TYPE_Q5_1;
let mut data = build_gguf_header(1, 0);
data.extend(build_tensor_info("test", &[32], GGUF_TYPE_Q5_1, 0));
let current_len = data.len();
let aligned = current_len.div_ceil(32) * 32;
data.resize(aligned, 0);
let scale = half::f16::from_f32(1.0);
let min = half::f16::from_f32(0.0);
data.extend_from_slice(&scale.to_le_bytes());
data.extend_from_slice(&min.to_le_bytes());
data.extend([0u8; 4]); data.extend([0x00u8; 16]);
let model = GGUFModel::from_bytes(&data).expect("Should parse");
let result = model.get_tensor_f32("test", &data);
assert!(
result.is_ok(),
"Q5_1 extraction should work: {:?}",
result.err()
);
let tensor = result.expect("test value should be present");
assert_eq!(tensor.len(), 32);
}