use super::*;
use crate::core::position::{Position, Range};
#[test]
fn test_undo_redo_basic() {
let mut doc = EditorDocument::from_content("[Script Info]\nTitle: Test").unwrap();
let initial_len = doc.len_bytes();
doc.insert(Position::new(initial_len), "\nAuthor: John")
.unwrap();
assert!(doc.text().contains("Author: John"));
assert!(doc.can_undo());
assert!(!doc.can_redo());
let result = doc.undo().unwrap();
assert!(result.success);
assert!(!doc.text().contains("Author: John"));
assert!(!doc.can_undo());
assert!(doc.can_redo());
let result = doc.redo().unwrap();
assert!(result.success);
assert!(doc.text().contains("Author: John"));
assert!(doc.can_undo());
assert!(!doc.can_redo());
}
#[test]
fn test_undo_redo_multiple_operations() {
let mut doc = EditorDocument::from_content("[Script Info]\nTitle: Test").unwrap();
doc.insert(Position::new(doc.len_bytes()), "\nAuthor: John")
.unwrap();
doc.insert(Position::new(doc.len_bytes()), "\nVersion: 1.0")
.unwrap();
doc.insert(Position::new(doc.len_bytes()), "\nComment: Test script")
.unwrap();
assert!(doc.text().contains("Author: John"));
assert!(doc.text().contains("Version: 1.0"));
assert!(doc.text().contains("Comment: Test script"));
doc.undo().unwrap();
assert!(!doc.text().contains("Comment: Test script"));
doc.undo().unwrap();
assert!(!doc.text().contains("Version: 1.0"));
doc.undo().unwrap();
assert!(!doc.text().contains("Author: John"));
doc.redo().unwrap();
assert!(doc.text().contains("Author: John"));
assert!(!doc.text().contains("Version: 1.0"));
}
#[test]
fn test_undo_redo_replace() {
let mut doc = EditorDocument::from_content("[Script Info]\nTitle: Original").unwrap();
let start = doc.text().find("Original").unwrap();
let range = Range::new(Position::new(start), Position::new(start + 8));
doc.replace(range, "Modified").unwrap();
assert!(doc.text().contains("Title: Modified"));
assert!(!doc.text().contains("Original"));
doc.undo().unwrap();
assert!(doc.text().contains("Title: Original"));
assert!(!doc.text().contains("Modified"));
doc.redo().unwrap();
assert!(doc.text().contains("Title: Modified"));
assert!(!doc.text().contains("Original"));
}
#[test]
fn test_undo_redo_delete() {
let mut doc = EditorDocument::from_content("[Script Info]\nTitle: Test\nAuthor: John").unwrap();
let start = doc.text().find("\nAuthor: John").unwrap();
let range = Range::new(Position::new(start), Position::new(start + 13));
doc.delete(range).unwrap();
assert!(!doc.text().contains("Author: John"));
doc.undo().unwrap();
assert!(doc.text().contains("Author: John"));
doc.redo().unwrap();
assert!(!doc.text().contains("Author: John"));
}