use hjkl_buffer::View;
use hjkl_engine::Editor;
use hjkl_engine::types::{DefaultHost, Options};
use hjkl_vim::VimEditorExt;
fn make_ed(content: &str) -> Editor<View, DefaultHost> {
let buf = View::from_str(content);
let mut ed = hjkl_vim::vim_editor(buf, DefaultHost::default(), Options::default());
ed.enter_insert_i(1);
ed
}
fn make_ed_exclusive(content: &str) -> Editor<View, DefaultHost> {
let mut ed = make_ed(content);
ed.settings_mut().selection_exclusive = true;
ed
}
#[test]
fn inclusive_default_single_char_right() {
let mut ed = make_ed("abc");
ed.exit_visual_to_normal();
ed.set_cursor_doc(0, 0);
ed.enter_visual_char();
ed.set_cursor_doc(0, 1);
let hl = ed.char_highlight();
assert_eq!(hl, Some(((0, 0), (0, 1))));
}
#[test]
fn inclusive_default_not_none_for_same_pos() {
let mut ed = make_ed("abc");
ed.exit_visual_to_normal();
ed.set_cursor_doc(0, 0);
ed.enter_visual_char();
let hl = ed.char_highlight();
assert_eq!(hl, Some(((0, 0), (0, 0))));
}
#[test]
fn exclusive_single_char_right() {
let mut ed = make_ed_exclusive("hello");
ed.exit_visual_to_normal();
ed.set_cursor_doc(0, 0);
ed.enter_visual_char();
ed.set_cursor_doc(0, 1);
let hl = ed.char_highlight();
assert_eq!(hl, Some(((0, 0), (0, 1))));
}
#[test]
fn exclusive_multi_char() {
let mut ed = make_ed_exclusive("hello");
ed.exit_visual_to_normal();
ed.set_cursor_doc(0, 0);
ed.enter_visual_char();
ed.set_cursor_doc(0, 3);
let hl = ed.char_highlight();
assert_eq!(hl, Some(((0, 0), (0, 3))));
}
#[test]
fn exclusive_leftward_cursor_before_anchor() {
let mut ed = make_ed_exclusive("hello");
ed.exit_visual_to_normal();
ed.set_cursor_doc(0, 3);
ed.enter_visual_char();
ed.set_cursor_doc(0, 1);
let hl = ed.char_highlight();
assert_eq!(hl, Some(((0, 1), (0, 3))));
}
#[test]
fn exclusive_multi_line() {
let mut ed = make_ed_exclusive("abc\ndef");
ed.exit_visual_to_normal();
ed.set_cursor_doc(0, 2);
ed.enter_visual_char();
ed.set_cursor_doc(1, 1);
let hl = ed.char_highlight();
assert_eq!(hl, Some(((0, 2), (1, 1))));
}
#[test]
fn exclusive_empty_returns_none() {
let mut ed = make_ed_exclusive("hello");
ed.exit_visual_to_normal();
ed.set_cursor_doc(0, 2);
ed.enter_visual_char();
let hl = ed.char_highlight();
assert_eq!(hl, None, "exclusive empty selection should be None");
}
#[test]
fn range_exclusive_rightward() {
let mut ed = make_ed("hello");
ed.exit_visual_to_normal();
ed.set_cursor_doc(0, 0);
ed.enter_visual_char();
ed.set_cursor_doc(0, 2);
let r = ed.visual_char_range_exclusive();
assert_eq!(r, Some(((0, 0), (0, 2))));
}
#[test]
fn range_exclusive_leftward() {
let mut ed = make_ed("hello");
ed.exit_visual_to_normal();
ed.set_cursor_doc(0, 4);
ed.enter_visual_char();
ed.set_cursor_doc(0, 1);
let r = ed.visual_char_range_exclusive();
assert_eq!(r, Some(((0, 1), (0, 4))));
}
#[test]
fn range_exclusive_empty_returns_none() {
let mut ed = make_ed("hello");
ed.exit_visual_to_normal();
ed.set_cursor_doc(0, 2);
ed.enter_visual_char();
let r = ed.visual_char_range_exclusive();
assert_eq!(r, None);
}
#[test]
fn buffer_selection_exclusive_drops_head_cell() {
use hjkl_buffer::{Position, Selection};
let mut ed = make_ed_exclusive("hello");
ed.exit_visual_to_normal();
ed.set_cursor_doc(0, 5);
ed.enter_visual_char();
ed.set_cursor_doc(0, 3);
match ed.buffer_selection() {
Some(Selection::Char { anchor, head }) => {
assert_eq!(anchor, Position::new(0, 3));
assert_eq!(head, Position::new(0, 4), "head cell must be dropped");
}
other => panic!("expected exclusive Char selection, got {other:?}"),
}
}
#[test]
fn buffer_selection_inclusive_keeps_head_cell() {
use hjkl_buffer::{Position, Selection};
let mut ed = make_ed("hello");
ed.exit_visual_to_normal();
ed.set_cursor_doc(0, 5);
ed.enter_visual_char();
ed.set_cursor_doc(0, 3);
match ed.buffer_selection() {
Some(Selection::Char { anchor, head }) => {
assert_eq!(anchor, Position::new(0, 5));
assert_eq!(head, Position::new(0, 3));
}
other => panic!("expected Char selection, got {other:?}"),
}
}