use super::*;
#[test]
fn falsify_f_conv_rt_001_no_double_quantization_gguf_export() {
use crate::format::converter::{apr_export, ExportFormat, ExportOptions};
use crate::format::test_factory::build_pygmy_apr;
let apr_bytes = build_pygmy_apr();
let dir = tempfile::tempdir().expect("tempdir");
let apr_path = dir.path().join("source.apr");
let gguf_path = dir.path().join("exported.gguf");
std::fs::write(&apr_path, &apr_bytes).expect("write APR");
let options = ExportOptions {
format: ExportFormat::Gguf,
quantize: Some(crate::format::converter::QuantizationType::Q4K),
include_tokenizer: false,
include_config: false,
skip_completeness_check: true,
};
let result = apr_export(&apr_path, &gguf_path, options);
assert!(
result.is_ok(),
"F32 APR → GGUF Q4K export should succeed (no double quant): {:?}",
result.unwrap_err()
);
assert!(gguf_path.exists(), "Exported GGUF file should exist");
let rosetta = RosettaStone::new();
let report = rosetta.inspect(&gguf_path).expect("Inspect exported GGUF");
assert_eq!(report.format, FormatType::Gguf);
assert!(
!report.tensors.is_empty(),
"Exported GGUF should have tensors"
);
}
#[test]
fn falsify_f_conv_rt_001_safetensors_still_quantizes() {
use crate::format::converter::{apr_export, ExportFormat, ExportOptions};
use crate::format::test_factory::build_pygmy_apr;
let apr_bytes = build_pygmy_apr();
let dir = tempfile::tempdir().expect("tempdir");
let apr_path = dir.path().join("source.apr");
let st_path = dir.path().join("exported.safetensors");
std::fs::write(&apr_path, &apr_bytes).expect("write APR");
let options = ExportOptions {
format: ExportFormat::SafeTensors,
quantize: Some(crate::format::converter::QuantizationType::Q4K),
include_tokenizer: false,
include_config: false,
skip_completeness_check: true,
};
let result = apr_export(&apr_path, &st_path, options);
assert!(
result.is_ok(),
"F32 APR → SafeTensors Q4K export should succeed: {:?}",
result.unwrap_err()
);
assert!(st_path.exists(), "Exported SafeTensors file should exist");
}
#[test]
fn falsify_f_contract_i2_001_resolve_sharded_index() {
let dir = tempfile::tempdir().expect("tempdir");
let index_path = dir.path().join("model.safetensors.index.json");
std::fs::write(&index_path, "{}").expect("write index");
let single_path = dir.path().join("model.safetensors");
assert!(!single_path.exists(), "Single file must not exist for this test");
let resolved = try_resolve_sharded_index(&single_path);
assert!(
resolved.is_some(),
"try_resolve_sharded_index should return Some for missing .safetensors with existing .index.json"
);
assert_eq!(
resolved.expect("checked above"),
index_path,
"Resolved path should be the .index.json file"
);
}
#[test]
fn falsify_f_contract_i2_001_no_resolve_when_file_exists() {
let dir = tempfile::tempdir().expect("tempdir");
let st_path = dir.path().join("model.safetensors");
std::fs::write(&st_path, "dummy").expect("write safetensors");
let resolved = try_resolve_sharded_index(&st_path);
assert!(
resolved.is_none(),
"try_resolve_sharded_index should return None when .safetensors exists"
);
}
#[test]
fn falsify_f_contract_i2_001_no_resolve_for_non_safetensors() {
let dir = tempfile::tempdir().expect("tempdir");
let gguf_path = dir.path().join("model.gguf");
let resolved = try_resolve_sharded_index(&gguf_path);
assert!(
resolved.is_none(),
"try_resolve_sharded_index should return None for non-.safetensors paths"
);
}
#[test]
fn falsify_f_contract_i2_001_no_resolve_when_index_missing() {
let dir = tempfile::tempdir().expect("tempdir");
let st_path = dir.path().join("model.safetensors");
let resolved = try_resolve_sharded_index(&st_path);
assert!(
resolved.is_none(),
"try_resolve_sharded_index should return None when .index.json also missing"
);
}
#[test]
fn falsify_f_contract_i2_001_inspect_sharded_fallback() {
use std::io::Write;
let dir = tempfile::tempdir().expect("tempdir");
let shard_path = dir.path().join("model-00001-of-00001.safetensors");
{
let mut file = std::fs::File::create(&shard_path).expect("create shard");
let header = r#"{"test.bias":{"dtype":"F32","shape":[4],"data_offsets":[0,16]},"__metadata__":{"format":"test"}}"#;
file.write_all(&(header.len() as u64).to_le_bytes())
.expect("write header len");
file.write_all(header.as_bytes()).expect("write header");
let data: [f32; 4] = [0.01, -0.02, 0.03, -0.01];
for val in &data {
file.write_all(&val.to_le_bytes()).expect("write tensor");
}
}
let index_path = dir.path().join("model.safetensors.index.json");
let index_json = serde_json::json!({
"metadata": {"total_size": 16},
"weight_map": {
"test.bias": "model-00001-of-00001.safetensors"
}
});
std::fs::write(&index_path, index_json.to_string()).expect("write index");
let missing_single = dir.path().join("model.safetensors");
assert!(!missing_single.exists());
let rosetta = RosettaStone::new();
let report = rosetta.inspect(&missing_single);
assert!(
report.is_ok(),
"inspect() should resolve sharded fallback: {:?}",
report.unwrap_err()
);
let report = report.expect("checked above");
assert_eq!(report.format, FormatType::SafeTensors);
assert!(
!report.tensors.is_empty(),
"Sharded inspect should find tensors"
);
}
#[test]
fn falsify_f_contract_i2_001_validate_sharded_fallback() {
use std::io::Write;
let dir = tempfile::tempdir().expect("tempdir");
let shard_path = dir.path().join("model-00001-of-00001.safetensors");
{
let mut file = std::fs::File::create(&shard_path).expect("create shard");
let header = r#"{"test.bias":{"dtype":"F32","shape":[4],"data_offsets":[0,16]},"__metadata__":{"format":"test"}}"#;
file.write_all(&(header.len() as u64).to_le_bytes())
.expect("write header len");
file.write_all(header.as_bytes()).expect("write header");
let data: [f32; 4] = [0.01, -0.02, 0.03, -0.01];
for val in &data {
file.write_all(&val.to_le_bytes()).expect("write tensor");
}
}
let index_path = dir.path().join("model.safetensors.index.json");
let index_json = serde_json::json!({
"metadata": {"total_size": 16},
"weight_map": {
"test.bias": "model-00001-of-00001.safetensors"
}
});
std::fs::write(&index_path, index_json.to_string()).expect("write index");
let missing_single = dir.path().join("model.safetensors");
assert!(!missing_single.exists());
let rosetta = RosettaStone::new();
let report = rosetta.validate(&missing_single);
assert!(
report.is_ok(),
"validate() should resolve sharded fallback: {:?}",
report.unwrap_err()
);
let report = report.expect("checked above");
assert_eq!(report.format, FormatType::SafeTensors);
assert!(report.is_valid, "Sharded model tensors should be valid");
assert!(
report.tensor_count > 0,
"Should have validated at least one tensor"
);
}
#[test]
fn falsify_f_contract_i2_001_validate_explicit_index_json() {
use std::io::Write;
let dir = tempfile::tempdir().expect("tempdir");
let shard_path = dir.path().join("model-00001-of-00001.safetensors");
{
let mut file = std::fs::File::create(&shard_path).expect("create shard");
let header = r#"{"test.bias":{"dtype":"F32","shape":[4],"data_offsets":[0,16]},"__metadata__":{"format":"test"}}"#;
file.write_all(&(header.len() as u64).to_le_bytes())
.expect("write header len");
file.write_all(header.as_bytes()).expect("write header");
let data: [f32; 4] = [0.01, -0.02, 0.03, -0.01];
for val in &data {
file.write_all(&val.to_le_bytes()).expect("write tensor");
}
}
let index_path = dir.path().join("model.safetensors.index.json");
let index_json = serde_json::json!({
"metadata": {"total_size": 16},
"weight_map": {
"test.bias": "model-00001-of-00001.safetensors"
}
});
std::fs::write(&index_path, index_json.to_string()).expect("write index");
let rosetta = RosettaStone::new();
let report = rosetta.validate(&index_path);
assert!(
report.is_ok(),
"validate() with explicit .index.json should work: {:?}",
report.unwrap_err()
);
let report = report.expect("checked above");
assert_eq!(report.format, FormatType::SafeTensors);
assert!(report.is_valid, "Sharded model tensors should be valid");
}