use ass_editor::{EditorDocument, Position, Range};
#[test]
fn test_empty_document_operations() {
let mut doc = EditorDocument::new();
assert_eq!(doc.len_bytes(), 0);
assert_eq!(doc.len_lines(), 1); assert!(doc.is_empty());
assert_eq!(doc.text(), "");
assert!(doc.undo().is_err());
assert!(doc.redo().is_err());
assert!(doc
.delete(Range::new(Position::new(0), Position::new(1)))
.is_err());
let result = doc.replace(Range::new(Position::new(0), Position::new(0)), "Hello");
assert!(result.is_ok());
assert_eq!(doc.text(), "Hello");
}
#[test]
fn test_boundary_position_operations() {
let mut doc = EditorDocument::from_content("Hello\nWorld").unwrap();
let len = doc.len_bytes();
doc.insert(Position::new(len), "!").unwrap();
assert_eq!(doc.text(), "Hello\nWorld!");
assert!(doc.insert(Position::new(len + 100), "X").is_err());
assert!(doc
.delete(Range::new(Position::new(len), Position::new(len + 10)))
.is_err());
let text_before = doc.text();
doc.delete(Range::new(Position::new(5), Position::new(5)))
.unwrap();
assert_eq!(doc.text(), text_before);
}
#[test]
fn test_unicode_and_special_characters() {
let test_cases = vec![
"Hello 世界", "Привет мир", "🎭🎬🎪", "नमस्ते", "مرحبا", "🇺🇸🇯🇵🇫🇷", "a\u{0301}", "👨👩👧👦", "\r\n\r\n", "\t\t\t", ];
for text in test_cases {
let mut doc = EditorDocument::from_content(text).unwrap();
assert_eq!(doc.text(), text);
doc.insert(Position::new(0), "X").unwrap();
assert!(doc.text().starts_with("X"));
assert_eq!(doc.text(), format!("X{text}"));
doc.undo().unwrap();
assert_eq!(doc.text(), text);
doc.insert(Position::new(0), "→").unwrap();
assert!(doc.text().starts_with("→"));
let expected = format!("→{text}");
assert_eq!(doc.text(), expected);
doc.undo().unwrap();
let after_undo = doc.text();
assert!(!after_undo.starts_with("→"));
}
}
#[test]
fn test_line_ending_handling() {
let endings = vec![
("Unix\nStyle\n", 3),
("Windows\r\nStyle\r\n", 3),
("Mixed\nLine\r\nEndings\r\n", 4),
("No newline at end", 1),
("\n\n\n", 4), ];
for (text, expected_lines) in endings {
let doc = EditorDocument::from_content(text).unwrap();
assert_eq!(doc.len_lines(), expected_lines);
assert_eq!(doc.text(), text);
}
}
#[test]
fn test_large_document_operations() {
let mut content = String::new();
for i in 0..1000 {
content.push_str(&format!(
"Line {i}: This is a test line with some content\n"
));
}
let mut doc = EditorDocument::from_content(&content).unwrap();
let original_len = doc.len_bytes();
doc.insert(Position::new(0), "START\n").unwrap();
doc.insert(Position::new(doc.len_bytes()), "\nEND").unwrap();
doc.insert(Position::new(original_len / 2), "\nMIDDLE\n")
.unwrap();
assert!(doc.text().starts_with("START\n"));
assert!(doc.text().ends_with("\nEND"));
assert!(doc.text().contains("\nMIDDLE\n"));
doc.undo().unwrap();
doc.undo().unwrap();
doc.undo().unwrap();
assert_eq!(doc.len_bytes(), original_len);
}