use ass_editor::{EditorDocument, Position, Range};
#[test]
fn test_parser_recovery_from_corruption() {
let nested_tags = format!("[Events]\nDialogue: {}", "{".repeat(1000));
let corrupted_cases = vec![
"[\0Script Info]\nTitle: Test",
"[Script Info]\nTitle: Test\n[Eve",
nested_tags.as_str(),
"[Script Info\nTitle: Test\n[Events",
];
for content in corrupted_cases {
let result = EditorDocument::from_content(content);
match result {
Ok(doc) => {
let _ = doc.text();
let mut doc_mut = doc;
let _ = doc_mut.insert(Position::new(0), "X");
}
Err(_) => {
}
}
}
}
#[test]
fn test_document_state_consistency_after_errors() {
let mut doc = EditorDocument::from_content("Initial").unwrap();
let initial_len = doc.len_bytes();
let initial_lines = doc.len_lines();
doc.insert(Position::new(7), " state").unwrap();
assert!(doc.insert(Position::new(1000), "fail").is_err());
doc.delete(Range::new(Position::new(0), Position::new(7)))
.unwrap();
assert!(doc
.delete(Range::new(Position::new(0), Position::new(1000)))
.is_err());
assert_eq!(doc.text(), " state");
assert_eq!(doc.len_bytes(), 6);
assert_eq!(doc.len_lines(), 1);
doc.undo().unwrap();
doc.undo().unwrap();
assert_eq!(doc.text(), "Initial");
assert_eq!(doc.len_bytes(), initial_len);
assert_eq!(doc.len_lines(), initial_lines);
}