use super::*;
use crate::parser::SectionType;
#[cfg(not(feature = "std"))]
use alloc::string::String;
#[cfg(not(feature = "std"))]
use alloc::string::ToString;
#[test]
fn test_adjust_range_before_change() {
let original = 100..200;
let change = TextChange {
range: 50..60,
new_text: "hello".to_string(), line_range: 5..6,
};
let adjusted = adjust_range_for_change(original, &change);
assert_eq!(adjusted, 95..195); }
#[test]
fn test_adjust_range_after_change() {
let original = 100..200;
let change = TextChange {
range: 250..260,
new_text: "hello".to_string(),
line_range: 25..26,
};
let adjusted = adjust_range_for_change(original, &change);
assert_eq!(adjusted, 100..200); }
#[test]
fn test_adjust_range_overlapping_change() {
let original = 100..200;
let change = TextChange {
range: 150..160,
new_text: "hello world".to_string(), line_range: 15..16,
};
let adjusted = adjust_range_for_change(original, &change);
assert_eq!(adjusted, 100..201); }
#[test]
fn test_calculate_line_range() {
let source = "line 1\nline 2\nline 3\nline 4\n";
let range = calculate_line_range(source, 7..20);
assert_eq!(range, 2..3);
}
#[test]
fn test_calculate_line_number() {
let source = "line 1\nline 2\nline 3\n";
assert_eq!(calculate_line_number(source, 0), 1);
assert_eq!(calculate_line_number(source, 7), 2);
assert_eq!(calculate_line_number(source, 14), 3);
}
#[test]
fn test_find_section_header_start() {
let source =
"[Script Info]\nTitle: Test\n\n[V4+ Styles]\nFormat: Name\n\n[Events]\nFormat: Start";
let result = find_section_header_start(source, 20, SectionType::ScriptInfo);
assert!(result.is_ok());
assert_eq!(result.unwrap(), 0);
let result = find_section_header_start(source, 40, SectionType::Styles);
assert!(result.is_ok());
assert_eq!(result.unwrap(), 27);
let result = find_section_header_start(source, 70, SectionType::Events);
assert!(result.is_ok());
assert_eq!(result.unwrap(), 54);
let result = find_section_header_start(source, 10, SectionType::Events);
assert!(result.is_err());
}
#[test]
fn test_find_section_end() {
let source =
"[Script Info]\nTitle: Test\n\n[V4+ Styles]\nFormat: Name\n\n[Events]\nFormat: Start";
let result = find_section_end(source, 14, SectionType::ScriptInfo);
assert!(result.is_ok());
assert_eq!(result.unwrap(), 27);
let result = find_section_end(source, 42, SectionType::Styles);
assert!(result.is_ok());
assert_eq!(result.unwrap(), 54);
let result = find_section_end(source, 65, SectionType::Events);
assert!(result.is_ok());
assert_eq!(result.unwrap(), source.len());
}
#[test]
fn test_adjust_range_complex_scenarios() {
let change = TextChange {
range: 10..10,
new_text: "inserted".to_string(),
line_range: 1..1,
};
assert_eq!(adjust_range_for_change(20..30, &change), 28..38);
let change = TextChange {
range: 10..20,
new_text: String::new(),
line_range: 1..2,
};
assert_eq!(adjust_range_for_change(25..35, &change), 15..25);
let change = TextChange {
range: 10..30,
new_text: "replacement".to_string(),
line_range: 1..3,
};
assert_eq!(adjust_range_for_change(15..25, &change), 10..21);
}
#[test]
fn test_calculate_line_range_edge_cases() {
assert_eq!(calculate_line_range("", 0..0), 0..1);
let source = "line1\nline2"; assert_eq!(calculate_line_range(source, 11..11), 0..2);
let source = "line1\nline2\nline3";
assert_eq!(calculate_line_range(source, 0..17), 1..3);
let source = "line1\n测试\nline3";
assert_eq!(calculate_line_range(source, 6..12), 2..2);
}