use hjkl_engine::{Editor, Input, Key};
use hjkl_vim::VimEditorExt;
fn editor_with(content: &str) -> Editor {
let mut e = hjkl_vim::vim_editor(
hjkl_buffer::View::new(),
hjkl_engine::DefaultHost::new(),
hjkl_engine::Options::default(),
);
e.set_content(content);
e
}
fn key(e: &mut Editor, k: Key) {
hjkl_vim::dispatch_input(
e,
Input {
key: k,
ctrl: false,
alt: false,
shift: false,
},
);
}
fn ctrl_key(e: &mut Editor, c: char) {
hjkl_vim::dispatch_input(
e,
Input {
key: Key::Char(c),
ctrl: true,
alt: false,
shift: false,
},
);
}
fn keys(e: &mut Editor, s: &str) {
for c in s.chars() {
key(e, Key::Char(c));
}
}
fn marks(e: &Editor) -> ((usize, usize), (usize, usize)) {
(
e.mark('<').expect("'< set on visual exit"),
e.mark('>').expect("'> set on visual exit"),
)
}
#[test]
fn charwise_reversed_exit_marks_are_position_ordered() {
let mut e = editor_with("abcde\nfghij\n");
keys(&mut e, "jlll"); keys(&mut e, "v");
keys(&mut e, "khh"); key(&mut e, Key::Esc);
assert_eq!(marks(&e), ((0, 1), (1, 3)));
}
#[test]
fn charwise_reversed_bridge_exit_marks_are_position_ordered() {
let mut e = editor_with("abcde\nfghij\n");
e.jump_cursor(1, 3);
e.enter_visual_char();
e.jump_cursor(0, 1);
e.exit_visual_to_normal();
assert_eq!(marks(&e), ((0, 1), (1, 3)));
}
#[test]
fn linewise_exit_marks_clamp_to_short_bottom_row() {
let mut e = editor_with("aaaaa\nbb\nccccc\n");
keys(&mut e, "lll"); keys(&mut e, "V");
keys(&mut e, "j"); key(&mut e, Key::Esc);
assert_eq!(marks(&e), ((0, 0), (1, 1)));
}
#[test]
fn linewise_bridge_exit_marks_clamp_to_short_bottom_row() {
let mut e = editor_with("aaaaa\nbb\nccccc\n");
e.jump_cursor(0, 3);
e.enter_visual_line();
e.jump_cursor(1, 0);
e.exit_visual_to_normal();
assert_eq!(marks(&e), ((0, 0), (1, 1)));
}
#[test]
fn linewise_exit_last_col_counts_chars_not_bytes() {
let mut e = editor_with("aaaaa\néé\nccccc\n");
e.jump_cursor(0, 0);
e.enter_visual_line();
e.jump_cursor(1, 0);
e.exit_visual_to_normal();
assert_eq!(marks(&e), ((0, 0), (1, 1)));
}
#[test]
fn block_exit_marks_normalize_reversed_corners() {
let mut e = editor_with("aaaaa\nbbbbb\nccccc\n");
keys(&mut e, "llll"); ctrl_key(&mut e, 'v');
keys(&mut e, "jhh"); key(&mut e, Key::Esc);
assert_eq!(marks(&e), ((0, 2), (1, 4)));
}
#[test]
fn block_bridge_exit_marks_normalize_reversed_corners() {
let mut e = editor_with("aaaaa\nbbbbb\nccccc\n");
e.jump_cursor(0, 4);
e.enter_visual_block();
e.jump_cursor(1, 2);
e.exit_visual_to_normal();
assert_eq!(marks(&e), ((0, 2), (1, 4)));
}