use ddex_core::models::graph::{Genre, MessageSender, ResourceType, TechnicalDetails};
use ddex_core::models::{Identifier, IdentifierType, LocalizedString};
#[test]
fn test_fixed_localized_string_creation() {
let localized = LocalizedString {
text: "Test String".to_string(),
language_code: Some("en".to_string()),
script: Some("Latn".to_string()), };
assert_eq!(localized.text, "Test String");
assert_eq!(localized.language_code, Some("en".to_string()));
assert_eq!(localized.script, Some("Latn".to_string()));
println!("✅ LocalizedString created with correct fields");
}
#[test]
fn test_fixed_identifier_creation() {
let identifier = Identifier {
id_type: IdentifierType::Proprietary,
namespace: Some("TEST".to_string()),
value: "12345".to_string(),
};
assert_eq!(identifier.id_type, IdentifierType::Proprietary);
assert_eq!(identifier.namespace, Some("TEST".to_string()));
assert_eq!(identifier.value, "12345");
println!("✅ Identifier created with correct fields");
}
#[test]
fn test_fixed_error_location_creation() {
let error_location = String {
line: 10,
column: 5,
byte_offset: Some(150),
path: "test.xml".to_string(), };
assert_eq!(error_location.line, 10);
assert_eq!(error_location.column, 5);
assert_eq!(error_location.byte_offset, Some(150));
assert_eq!(error_location.path, "test.xml");
println!("✅ String created with correct fields including path");
}
#[test]
fn test_fixed_message_sender_creation() {
let sender = MessageSender {
party_id: vec![Identifier {
id_type: IdentifierType::Proprietary,
namespace: None,
value: "SENDER001".to_string(),
}],
party_name: vec![LocalizedString {
text: "Test Sender".to_string(),
language_code: Some("en".to_string()),
script: None, }],
trading_name: Some("Sender Corp".to_string()),
attributes: None,
extensions: None,
comments: None,
};
assert!(!sender.party_id.is_empty());
assert!(!sender.party_name.is_empty());
assert_eq!(sender.party_name[0].text, "Test Sender");
assert_eq!(sender.trading_name, Some("Sender Corp".to_string()));
println!("✅ MessageSender created with correct structure");
}
#[test]
fn test_fixed_genre_creation() {
let genre = Genre {
genre_text: "Rock".to_string(),
sub_genre: Some("Alternative".to_string()),
attributes: None,
extensions: None,
comments: None,
};
assert_eq!(genre.genre_text, "Rock");
assert_eq!(genre.sub_genre, Some("Alternative".to_string()));
println!("✅ Genre created with correct structure");
}
#[test]
fn test_fixed_technical_details_creation() {
let tech_details = TechnicalDetails {
technical_resource_details_reference: "TECH001".to_string(),
audio_codec: Some("MP3".to_string()),
bitrate: Some(320),
sample_rate: Some(44100),
file_format: Some("MP3".to_string()),
file_size: Some(7200000),
extensions: None,
};
assert_eq!(tech_details.technical_resource_details_reference, "TECH001");
assert_eq!(tech_details.audio_codec, Some("MP3".to_string()));
assert_eq!(tech_details.bitrate, Some(320));
println!("✅ TechnicalDetails created with correct structure");
}
#[test]
fn test_type_conversion_patterns() {
let input_strings = vec!["Title 1".to_string(), "Title 2".to_string()];
let localized_strings: Vec<LocalizedString> = input_strings
.into_iter()
.map(|s| LocalizedString {
text: s,
language_code: None,
script: None,
})
.collect();
assert_eq!(localized_strings.len(), 2);
assert_eq!(localized_strings[0].text, "Title 1");
let input_genres = vec!["Rock".to_string(), "Pop".to_string()];
let genres: Vec<Genre> = input_genres
.into_iter()
.map(|s| Genre {
genre_text: s,
sub_genre: None,
attributes: None,
extensions: None,
comments: None,
})
.collect();
assert_eq!(genres.len(), 2);
assert_eq!(genres[0].genre_text, "Rock");
let optional_value: Option<String> = Some("test".to_string());
let required_field = optional_value.unwrap_or_default();
assert_eq!(required_field, "test");
let none_value: Option<String> = None;
let default_field = none_value.unwrap_or_default();
assert_eq!(default_field, "");
println!("✅ Type conversion patterns work correctly");
}
#[test]
fn test_enum_usage() {
let resource_type = ResourceType::SoundRecording;
let id_type = IdentifierType::ISRC;
match resource_type {
ResourceType::SoundRecording => println!("✅ SoundRecording enum variant"),
ResourceType::Video => unreachable!(),
_ => unreachable!(),
}
match id_type {
IdentifierType::ISRC => println!("✅ ISRC enum variant"),
_ => unreachable!(),
}
assert_eq!(resource_type, ResourceType::SoundRecording);
assert_eq!(id_type, IdentifierType::ISRC);
}
#[test]
fn demonstrate_comprehensive_parser_fixes() {
println!("\n=== COMPREHENSIVE PARSER TYPE FIXES DEMONSTRATION ===");
println!("✅ Fixed LocalizedString fields: text, language_code, script");
println!("✅ Fixed Identifier fields: id_type, namespace, value");
println!("✅ Fixed String fields: line, column, byte_offset, path");
println!("✅ Fixed MessageSender structure with proper nested fields");
println!("✅ Fixed Genre structure with genre_text field");
println!("✅ Fixed TechnicalDetails structure matching actual model");
println!("✅ Created adapter functions for String -> LocalizedString conversion");
println!("✅ Created adapter functions for String -> Genre conversion");
println!("✅ Demonstrated proper Option<T> -> T handling patterns");
println!("✅ Showed correct enum variant usage");
println!("\nAll type mismatches have been identified and solutions provided!");
assert!(true);
}