use hjkl_engine::Editor;
fn editor_with(content: &str) -> Editor {
let opts = hjkl_engine::Options::default();
let mut e = hjkl_vim::vim_editor(
hjkl_buffer::View::new(),
hjkl_engine::DefaultHost::new(),
opts,
);
e.set_content(content);
e
}
fn press(e: &mut Editor, keys: &str) {
for input in hjkl_engine::decode_macro(keys) {
hjkl_vim::dispatch_input(e, input);
}
}
#[test]
fn undo_line_restores_all_changes_on_the_line() {
let mut e = editor_with("hello world\n");
press(&mut e, "xxxU");
assert_eq!(e.content(), "hello world\n\n");
assert_eq!(e.cursor(), (0, 0));
}
#[test]
fn undo_line_toggles_on_second_press() {
let mut e = editor_with("hello world\n");
press(&mut e, "xxxUU");
assert_eq!(e.content(), "lo world\n\n");
}
#[test]
fn undo_line_is_noop_when_nothing_changed() {
let mut e = editor_with("hello\n");
press(&mut e, "U");
assert_eq!(e.content(), "hello\n\n");
assert_eq!(e.cursor(), (0, 0));
}
#[test]
fn undo_line_targets_changed_line_not_cursor_line() {
let mut e = editor_with("hello world\nfoo bar\n");
press(&mut e, "xxxjU");
assert_eq!(e.content(), "hello world\nfoo bar\n\n");
assert_eq!(e.cursor(), (0, 0));
}
#[test]
fn undo_line_resets_tracked_row_on_edit_elsewhere() {
let mut e = editor_with("hello\nworld\n");
press(&mut e, "x"); press(&mut e, "jx"); press(&mut e, "U");
assert_eq!(e.content(), "ello\nworld\n\n");
assert_eq!(e.cursor(), (1, 0));
}