use super::*;
use crate::parser::ast::SectionType;
#[cfg(not(feature = "std"))]
use alloc::{format, vec};
#[test]
fn script_equality_comprehensive() {
let content1 = "[Script Info]\nTitle: Test1";
let content2 = "[Script Info]\nTitle: Test2";
let content3 = "[Script Info]\nTitle: Test1";
let script1 = Script::parse(content1).unwrap();
let script2 = Script::parse(content2).unwrap();
let script3 = Script::parse(content3).unwrap();
assert_eq!(script1, script3);
assert_ne!(script1, script2);
let cloned1 = script1.clone();
assert_eq!(script1, cloned1);
let debug1 = format!("{script1:?}");
let debug2 = format!("{script2:?}");
assert!(debug1.contains("Script"));
assert!(debug2.contains("Script"));
assert_ne!(debug1, debug2);
}
#[test]
fn parse_special_characters() {
let content = "[Script Info]\nTitle: Test with émojis 🎬 and spëcial chars\nAuthor: テスト";
let script = Script::parse(content).unwrap();
assert_eq!(script.source(), content);
assert_eq!(script.sections().len(), 1);
assert!(script.find_section(SectionType::ScriptInfo).is_some());
}
#[test]
fn parse_different_section_orders() {
let content1 =
"[Events]\nFormat: Text\n\n[V4+ Styles]\nFormat: Name\n\n[Script Info]\nTitle: Test";
let script1 = Script::parse(content1).unwrap();
assert_eq!(script1.sections().len(), 3);
let content2 =
"[Script Info]\nTitle: Test\n\n[V4+ Styles]\nFormat: Name\n\n[Events]\nFormat: Text";
let script2 = Script::parse(content2).unwrap();
assert_eq!(script2.sections().len(), 3);
assert!(script1.find_section(SectionType::ScriptInfo).is_some());
assert!(script1.find_section(SectionType::Styles).is_some());
assert!(script1.find_section(SectionType::Events).is_some());
assert!(script2.find_section(SectionType::ScriptInfo).is_some());
assert!(script2.find_section(SectionType::Styles).is_some());
assert!(script2.find_section(SectionType::Events).is_some());
}
#[test]
fn parse_partial_comprehensive_scenarios() {
let content = "[Script Info]\nTitle: Original\nAuthor: Test\n[V4+ Styles]\nFormat: Name, Fontname\nStyle: Default,Arial\n[Events]\nFormat: Start, End, Text\nDialogue: 0:00:00.00,0:00:05.00,Original text";
let _script = Script::parse(content).unwrap();
let modified_content = content.replace("Title: Original", "Title: Modified");
let modified_script = Script::parse(&modified_content);
assert!(modified_script.is_ok());
}
#[test]
fn parse_error_scenarios() {
let malformed_cases = vec![
"[Unclosed Section",
"[Script Info\nMalformed",
"Invalid: : Content",
];
for malformed in malformed_cases {
let result = Script::parse(malformed);
assert!(result.is_ok() || result.is_err());
}
}
#[test]
fn script_modification_scenarios() {
let content = "[Script Info]\nTitle: Test\n[V4+ Styles]\nFormat: Name\nStyle: Default,Arial";
let script = Script::parse(content).unwrap();
assert_eq!(script.sections().len(), 2);
assert!(script.find_section(SectionType::ScriptInfo).is_some());
assert!(script.find_section(SectionType::Styles).is_some());
let extended_content = format!(
"{content}\n[Events]\nFormat: Start, End, Text\nDialogue: 0:00:00.00,0:00:05.00,Test"
);
let extended_script = Script::parse(&extended_content).unwrap();
assert_eq!(extended_script.sections().len(), 3);
}
#[test]
fn incremental_parsing_simulation() {
let content = "[Script Info]\nTitle: Test";
let _script = Script::parse(content).unwrap();
let variations = vec![
"[Script Info]\n Title: Test", "!Script Info]\nTitle: Test", "[Script Info]\nTitle: Test\nAuthor: Someone", ];
for variation in variations {
let result = Script::parse(variation);
assert!(result.is_ok() || result.is_err());
}
}
#[test]
fn malformed_content_parsing() {
let malformed_cases = vec![
"[Unclosed Section",
"[Script Info\nMalformed",
"Invalid: : Content",
];
for malformed in malformed_cases {
let result = Script::parse(malformed);
if let Ok(script) = result {
let _ = script.issues().len();
}
}
}
#[test]
fn script_delta_debug_comprehensive() {
let script = Script::parse("[Script Info]\nTitle: Test").unwrap();
assert!(!script.issues().is_empty() || script.issues().is_empty()); }