#[cfg(test)]
mod tests {
use crate::clap::factory::preset_discovery::*;
#[test]
fn test_extract_balanced_json_object() {
let s = r#"{"name": "test", "nested": {"a": 1}}"#;
let result = extract_balanced_json(s).unwrap();
assert_eq!(result, s);
}
#[test]
fn test_extract_balanced_json_nested_braces_in_strings() {
let s = r#"{"data": "{\"key\": \"val\"}", "x": 1}extra"#;
let result = extract_balanced_json(s).unwrap();
assert_eq!(result, r#"{"data": "{\"key\": \"val\"}", "x": 1}"#);
}
#[test]
fn test_extract_balanced_json_array() {
let s = r#"[1, 2, {"a": 3}, [4, 5]]trailing"#;
let result = extract_balanced_json(s).unwrap();
assert_eq!(result, r#"[1, 2, {"a": 3}, [4, 5]]"#);
}
#[test]
fn test_extract_balanced_json_with_unicode_in_strings() {
let s = r#"{"name": "café", "modeled_by": "田中太郎"}"#;
let result = extract_balanced_json(s).unwrap();
assert_eq!(result, s);
}
#[test]
fn test_extract_balanced_json_with_japanese_metadata() {
let s = r#"{"name": "チューブスクリーマー", "make": "BOSS", "model": "SD-1"}"#;
let result = extract_balanced_json(s).unwrap();
assert_eq!(result, s);
}
#[test]
fn test_extract_balanced_json_with_emoji_in_strings() {
let s = r#"{"tone": "🔥🔥🔥", "genre": "rock 🎸"}"#;
let result = extract_balanced_json(s).unwrap();
assert_eq!(result, s);
}
#[test]
fn test_extract_balanced_json_with_escaped_unicode() {
let s = r#"{"name": "caf\u00e9", "x": 1}"#;
let result = extract_balanced_json(s).unwrap();
assert_eq!(result, r#"{"name": "caf\u00e9", "x": 1}"#);
}
#[test]
fn test_extract_balanced_json_unicode_byte_index_correct() {
let s = r#"{"名前": "value"}"#; let result = extract_balanced_json(s).unwrap();
assert_eq!(result, s);
}
#[test]
fn test_extract_balanced_json_empty_string() {
assert!(extract_balanced_json("").is_none());
}
#[test]
fn test_extract_balanced_json_plain_value() {
assert!(extract_balanced_json("\"hello\"").is_none());
}
#[test]
fn test_extract_balanced_json_unclosed_object() {
assert!(extract_balanced_json("{\"a\": 1").is_none());
}
#[test]
fn test_extract_balanced_json_unclosed_string() {
assert!(extract_balanced_json("{\"a\": \"unclosed}").is_none());
}
#[test]
fn test_parse_metadata_with_unicode_name() {
let json = r#"{"name": "café modèl", "modeled_by": "José García"}"#;
let meta = parse_metadata(json).expect("should parse unicode metadata");
assert_eq!(meta.name.as_deref(), Some("café modèl"));
assert_eq!(meta.modeled_by.as_deref(), Some("José García"));
}
#[test]
fn test_parse_metadata_empty_object() {
let meta = parse_metadata("{}");
assert!(meta.is_none());
}
#[test]
fn test_parse_metadata_malformed_json() {
assert!(parse_metadata("{broken").is_none());
}
#[test]
fn test_parse_metadata_truncated_utf8() {
let truncated = unsafe { std::str::from_utf8_unchecked(b"{\"name\": \"t\xC3\xA9") };
assert!(extract_balanced_json(truncated).is_none());
}
#[test]
fn test_metadata_extraction_from_nam_file() {
let test_dir =
std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/models");
let model_path = test_dir.join("BossWN-standard.nam");
if model_path.exists() {
let meta = extract_model_metadata(&model_path);
assert!(
meta.is_some(),
"Should extract metadata from BossWN-standard.nam"
);
let m = meta.unwrap();
assert!(
m.name.is_some() || m.modeled_by.is_some(),
"Metadata should contain at least name or author"
);
}
}
#[test]
fn test_extract_model_metadata_unsupported_extension() {
let meta = extract_model_metadata(std::path::Path::new("/tmp/test.txt"));
assert!(meta.is_none());
}
#[test]
fn test_extract_model_metadata_missing_file() {
let meta = extract_model_metadata(std::path::Path::new("/nonexistent/model.nam"));
assert!(meta.is_none());
}
#[test]
fn test_factory_returns_one_provider() {
let factory = NamPresetDiscoveryFactory;
assert_eq!(factory.provider_count(), 1);
}
#[test]
fn test_factory_descriptor_is_valid() {
let factory = NamPresetDiscoveryFactory;
let desc = factory.provider_descriptor(0).unwrap();
assert!(desc.id().is_some());
assert!(desc.name().is_some());
assert_eq!(desc.id().unwrap().to_bytes(), NAM_PROVIDER_ID.as_bytes());
}
}