use editor_core::{Command, CommandExecutor, EditCommand};
#[test]
fn undo_tree_preserves_alternate_branches_and_allows_branch_selection() {
let mut executor = CommandExecutor::empty(80);
executor
.execute(Command::Edit(EditCommand::InsertText { text: "a".into() }))
.unwrap();
executor
.execute(Command::Edit(EditCommand::EndUndoGroup))
.unwrap();
executor
.execute(Command::Edit(EditCommand::InsertText { text: "b".into() }))
.unwrap();
executor
.execute(Command::Edit(EditCommand::EndUndoGroup))
.unwrap();
assert_eq!(executor.editor().get_text(), "ab");
executor.execute(Command::Edit(EditCommand::Undo)).unwrap();
assert_eq!(executor.editor().get_text(), "a");
assert_eq!(executor.redo_branch_count(), 1);
executor
.execute(Command::Edit(EditCommand::InsertText { text: "c".into() }))
.unwrap();
executor
.execute(Command::Edit(EditCommand::EndUndoGroup))
.unwrap();
assert_eq!(executor.editor().get_text(), "ac");
assert!(!executor.can_redo());
executor.execute(Command::Edit(EditCommand::Undo)).unwrap();
assert_eq!(executor.editor().get_text(), "a");
assert_eq!(executor.redo_branch_count(), 2);
assert!(executor.can_redo());
executor.execute(Command::Edit(EditCommand::Redo)).unwrap();
assert_eq!(executor.editor().get_text(), "ac");
executor.execute(Command::Edit(EditCommand::Undo)).unwrap();
assert_eq!(executor.editor().get_text(), "a");
assert_eq!(executor.redo_branch_count(), 2);
executor.select_redo_branch(0).unwrap();
executor.execute(Command::Edit(EditCommand::Redo)).unwrap();
assert_eq!(executor.editor().get_text(), "ab");
}
#[test]
fn redo_depth_follows_selected_branch_in_undo_tree() {
let mut executor = CommandExecutor::empty(80);
executor
.execute(Command::Edit(EditCommand::InsertText { text: "a".into() }))
.unwrap();
executor
.execute(Command::Edit(EditCommand::EndUndoGroup))
.unwrap();
executor
.execute(Command::Edit(EditCommand::InsertText { text: "b".into() }))
.unwrap();
executor
.execute(Command::Edit(EditCommand::EndUndoGroup))
.unwrap();
executor
.execute(Command::Edit(EditCommand::InsertText { text: "d".into() }))
.unwrap();
executor
.execute(Command::Edit(EditCommand::EndUndoGroup))
.unwrap();
assert_eq!(executor.editor().get_text(), "abd");
executor.execute(Command::Edit(EditCommand::Undo)).unwrap();
executor.execute(Command::Edit(EditCommand::Undo)).unwrap();
assert_eq!(executor.editor().get_text(), "a");
executor
.execute(Command::Edit(EditCommand::InsertText { text: "c".into() }))
.unwrap();
executor
.execute(Command::Edit(EditCommand::EndUndoGroup))
.unwrap();
assert_eq!(executor.editor().get_text(), "ac");
executor.execute(Command::Edit(EditCommand::Undo)).unwrap();
assert_eq!(executor.editor().get_text(), "a");
assert_eq!(executor.redo_branch_count(), 2);
executor.select_redo_branch(0).unwrap();
assert_eq!(executor.redo_depth(), 2);
executor.select_redo_branch(1).unwrap();
assert_eq!(executor.redo_depth(), 1);
}