#[test]
fn test_menagerie_tensor_names_trigger_converter() {
let data = build_complex_pygmy(4, 64, 256, 128);
let model = GGUFModel::from_bytes(&data).expect("should parse");
let names: Vec<&str> = model.tensors.iter().map(|t| t.name.as_str()).collect();
assert!(
names.iter().any(|n| n.contains("attn_q")),
"Should have attn_q tensors"
);
assert!(
names.iter().any(|n| n.contains("attn_k")),
"Should have attn_k tensors"
);
assert!(
names.iter().any(|n| n.contains("attn_v")),
"Should have attn_v tensors"
);
assert!(
names.iter().any(|n| n.contains("ffn_gate")),
"Should have ffn_gate tensors"
);
assert!(
names.iter().any(|n| n.contains("ffn_up")),
"Should have ffn_up tensors"
);
assert!(
names.iter().any(|n| n.contains("ffn_down")),
"Should have ffn_down tensors"
);
assert!(
names.iter().any(|n| n.contains("attn_norm")),
"Should have attn_norm tensors"
);
assert!(
names.iter().any(|n| n.contains("ffn_norm")),
"Should have ffn_norm tensors"
);
assert!(
names.iter().any(|n| n.contains("token_embd")),
"Should have token_embd tensor"
);
assert!(
names.iter().any(|n| n.contains("output")),
"Should have output tensor"
);
}
#[test]
fn test_menagerie_bias_tensors_present() {
let data = build_complex_pygmy(4, 64, 256, 128);
let model = GGUFModel::from_bytes(&data).expect("should parse");
let bias_count = model
.tensors
.iter()
.filter(|t| t.name.contains(".bias"))
.count();
assert!(
bias_count >= 4,
"Should have at least 4 bias tensors, got {}",
bias_count
);
}
#[test]
fn test_menagerie_get_tensor_f32_mixed_types() {
let data = build_complex_pygmy(4, 64, 256, 128);
let model = GGUFModel::from_bytes(&data).expect("should parse");
let f32_result = model.get_tensor_f32("blk.0.attn_norm.weight", &data);
if let Ok(values) = f32_result {
assert_eq!(values.len(), 64, "F32 norm should have 64 elements");
}
let q4_0_result = model.get_tensor_f32("blk.0.attn_q.weight", &data);
let _ = q4_0_result;
let q8_0_result = model.get_tensor_f32("blk.1.attn_q.weight", &data);
let _ = q8_0_result;
let q4_k_result = model.get_tensor_f32("blk.2.attn_q.weight", &data);
let _ = q4_k_result;
}
#[test]
fn test_menagerie_layer_iteration() {
let data = build_complex_pygmy(8, 64, 256, 128);
let model = GGUFModel::from_bytes(&data).expect("should parse");
for layer in 0..8 {
let prefix = format!("blk.{layer}");
let layer_tensors: Vec<_> = model
.tensors
.iter()
.filter(|t| t.name.starts_with(&prefix))
.collect();
assert!(
layer_tensors.len() >= 8,
"Layer {} should have at least 8 tensors, got {}",
layer,
layer_tensors.len()
);
}
}
#[test]
fn test_menagerie_converter_4_layer() {
use crate::convert::GgufToAprConverter;
let data = build_complex_pygmy(4, 64, 256, 128);
let result = GgufToAprConverter::convert(&data);
match result {
Ok(apr) => {
assert!(apr.config.num_layers > 0, "APR should have layers");
},
Err(e) => {
let _ = e;
},
}
}
#[test]
fn test_menagerie_converter_8_layer() {
use crate::convert::GgufToAprConverter;
let data = build_complex_pygmy(8, 64, 256, 128);
let result = GgufToAprConverter::convert(&data);
let _ = result; }
#[test]
fn test_menagerie_large_dimension_pygmy() {
let data = build_complex_pygmy(2, 256, 512, 512);
let model = GGUFModel::from_bytes(&data);
assert!(model.is_ok(), "Large dimension Pygmy should parse");
let model = model.expect("test value should be present");
let embed_tensor = model
.tensors
.iter()
.find(|t| t.name.contains("token_embd"))
.expect("test value should be present");
assert!(embed_tensor.dims[0] > 0 && embed_tensor.dims[1] > 0);
}
#[test]
fn test_menagerie_100_tensor_pygmy() {
let data = build_complex_pygmy(10, 64, 256, 128);
let model = GGUFModel::from_bytes(&data).expect("should parse");
assert!(
model.tensors.len() >= 100,
"Should have 100+ tensors, got {}",
model.tensors.len()
);
}