fish-shell/src/tests/editable_line.rs
2024-01-13 03:58:33 +01:00

74 lines
2.6 KiB
Rust

use crate::{
editable_line::{Edit, EditableLine},
wchar::prelude::*,
};
#[test]
fn test_undo() {
let mut line = EditableLine::default();
let insert = |line: &EditableLine| line.position()..line.position();
assert!(!line.undo()); // nothing to undo
assert!(line.text().is_empty());
assert_eq!(line.position(), 0);
line.push_edit(Edit::new(0..0, L!("a b c").to_owned()), true);
assert_eq!(line.text(), L!("a b c").to_owned());
assert_eq!(line.position(), 5);
line.set_position(2);
line.push_edit(Edit::new(2..3, L!("B").to_owned()), true); // replacement right of cursor
assert_eq!(line.text(), L!("a B c").to_owned());
line.undo();
assert_eq!(line.text(), L!("a b c").to_owned());
assert_eq!(line.position(), 2);
line.redo();
assert_eq!(line.text(), L!("a B c").to_owned());
assert_eq!(line.position(), 3);
assert!(!line.redo()); // nothing to redo
line.push_edit(Edit::new(0..2, L!("").to_owned()), true); // deletion left of cursor
assert_eq!(line.text(), L!("B c").to_owned());
assert_eq!(line.position(), 1);
line.undo();
assert_eq!(line.text(), L!("a B c").to_owned());
assert_eq!(line.position(), 3);
line.redo();
assert_eq!(line.text(), L!("B c").to_owned());
assert_eq!(line.position(), 1);
line.push_edit(Edit::new(0..line.len(), L!("a b c").to_owned()), true); // replacement left and right of cursor
assert_eq!(line.text(), L!("a b c").to_owned());
assert_eq!(line.position(), 5);
// Undo coalesced edits
line.clear();
line.push_edit(Edit::new(insert(&line), L!("a").to_owned()), true);
line.push_edit(Edit::new(insert(&line), L!("b").to_owned()), true);
line.push_edit(Edit::new(insert(&line), L!("c").to_owned()), true);
line.push_edit(Edit::new(insert(&line), L!(" ").to_owned()), true);
line.undo();
line.undo();
line.redo();
assert_eq!(line.text(), L!("abc").to_owned());
// This removes the space insertion from the history, but does not coalesce with the first edit.
line.push_edit(Edit::new(insert(&line), L!("d").to_owned()), true);
line.push_edit(Edit::new(insert(&line), L!("e").to_owned()), true);
assert_eq!(line.text(), L!("abcde").to_owned());
line.undo();
assert_eq!(line.text(), L!("abc").to_owned());
}
#[test]
fn test_undo_group() {
let mut line = EditableLine::default();
line.begin_edit_group();
line.push_edit(Edit::new(0..0, L!("a").to_owned()), true);
line.end_edit_group();
line.begin_edit_group();
line.push_edit(Edit::new(1..1, L!("b").to_owned()), true);
line.end_edit_group();
line.undo();
assert_eq!(line.text(), "a");
}