ass-core 0.1.2

High-performance ASS subtitle format parser and analyzer
Documentation
//! Tests for equality, special characters, section ordering, and modifications.

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"; // Same as content1

    let script1 = Script::parse(content1).unwrap();
    let script2 = Script::parse(content2).unwrap();
    let script3 = Script::parse(content3).unwrap();

    // Test equality
    assert_eq!(script1, script3);
    assert_ne!(script1, script2);

    // Test cloning preserves equality
    let cloned1 = script1.clone();
    assert_eq!(script1, cloned1);

    // Test debug output
    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() {
    // Events before styles
    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);

    // Standard order
    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);

    // Both should find all sections regardless of order
    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();

    // Test basic parsing functionality instead of parse_partial which may not be implemented
    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() {
    // Test malformed content parsing
    let malformed_cases = vec![
        "[Unclosed Section",
        "[Script Info\nMalformed",
        "Invalid: : Content",
    ];

    for malformed in malformed_cases {
        let result = Script::parse(malformed);
        // Should either succeed or fail gracefully
        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();

    // Test basic script properties
    assert_eq!(script.sections().len(), 2);
    assert!(script.find_section(SectionType::ScriptInfo).is_some());
    assert!(script.find_section(SectionType::Styles).is_some());

    // Test adding new content
    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();

    // Simulate different content variations
    let variations = vec![
        "[Script Info]\n Title: Test",                 // Add space
        "!Script Info]\nTitle: Test",                  // Replace first character
        "[Script Info]\nTitle: Test\nAuthor: Someone", // Append
    ];

    for variation in variations {
        let result = Script::parse(variation);
        // All should either succeed or fail gracefully
        assert!(result.is_ok() || result.is_err());
    }
}

#[test]
fn malformed_content_parsing() {
    // Test parsing various malformed content
    let malformed_cases = vec![
        "[Unclosed Section",
        "[Script Info\nMalformed",
        "Invalid: : Content",
    ];

    for malformed in malformed_cases {
        let result = Script::parse(malformed);
        // Should handle malformed content gracefully
        if let Ok(script) = result {
            // Should potentially have parse issues
            let _ = script.issues().len();
        }
    }
}

#[test]
fn script_delta_debug_comprehensive() {
    // Test that ScriptDelta types can be created and debugged
    let script = Script::parse("[Script Info]\nTitle: Test").unwrap();
    assert!(!script.issues().is_empty() || script.issues().is_empty()); // Just test it compiles
}