use ass_editor::{EditorDocument, Position, Range};
#[test]
fn test_large_undo_history() {
let mut doc = EditorDocument::new();
for i in 0..1000 {
doc.insert(Position::new(0), &format!("{i}")).unwrap();
}
let mut actual_undos = 0;
for _ in 0..500 {
if doc.undo().is_ok() {
actual_undos += 1;
} else {
break;
}
}
assert!(actual_undos <= 50);
doc.insert(Position::new(0), "NEW").unwrap();
assert!(doc.redo().is_err());
}
#[test]
fn test_pathological_replace_patterns() {
let mut doc = EditorDocument::from_content("aaaaaaaaaaaaaaaaaaaa").unwrap();
doc.replace(
Range::new(Position::new(0), Position::new(20)),
"bbbbbbbbbbbbbbbbbbbb",
)
.unwrap();
assert_eq!(doc.text(), "bbbbbbbbbbbbbbbbbbbb");
doc.replace(
Range::new(Position::new(0), Position::new(20)),
&"c".repeat(1000),
)
.unwrap();
assert_eq!(doc.text().len(), 1000);
doc.replace(Range::new(Position::new(0), Position::new(1000)), "")
.unwrap();
assert_eq!(doc.text(), "");
}
#[test]
fn test_position_advance_edge_cases() {
let test_cases = vec![
("a", 1),
("é", 2), ("中", 3), ("𝄞", 4), ("\r\n", 2), ("\n", 1), ("\t", 1), ];
for (ch, expected_advance) in test_cases {
let pos = Position::new(0);
let new_pos = pos.advance(ch.len());
assert_eq!(new_pos.offset - pos.offset, expected_advance);
}
}