use super::*;
fn make_buffer(content: &str) -> Buffer {
Buffer::from_string(content)
}
#[test]
fn test_text_object_from_chars() {
assert_eq!(
TextObject::from_chars('i', 'w'),
Some(TextObject::InnerWord(WordBoundary::Word))
);
assert_eq!(TextObject::from_chars('a', 'W'), Some(TextObject::AWord(WordBoundary::BigWord)));
assert_eq!(TextObject::from_chars('i', '('), Some(TextObject::InnerBracket('(')));
assert_eq!(TextObject::from_chars('a', '"'), Some(TextObject::AQuote('"')));
assert_eq!(TextObject::from_chars('x', 'w'), None);
}
#[test]
fn test_inner_word() {
let buffer = make_buffer("hello world");
let pos = Position::new(0, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerWord(WordBoundary::Word), 1);
assert_eq!(
range,
Some((Position::new(0, 0), Position::new(0, 4))) );
}
#[test]
fn test_a_word() {
let buffer = make_buffer("hello world");
let pos = Position::new(0, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::AWord(WordBoundary::Word), 1);
assert_eq!(range, Some((Position::new(0, 0), Position::new(0, 5))));
}
#[test]
fn test_inner_bracket() {
let buffer = make_buffer("(hello)");
let pos = Position::new(0, 3);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert_eq!(range, Some((Position::new(0, 1), Position::new(0, 5))));
}
#[test]
fn test_a_bracket() {
let buffer = make_buffer("(hello)");
let pos = Position::new(0, 3);
let range = TextObjectEngine::range(&buffer, pos, TextObject::ABracket('('), 1);
assert_eq!(range, Some((Position::new(0, 0), Position::new(0, 6))));
}
#[test]
fn test_nested_brackets() {
let buffer = make_buffer("((inner))");
let pos = Position::new(0, 4);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert_eq!(range, Some((Position::new(0, 2), Position::new(0, 6))));
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 2);
assert_eq!(range, Some((Position::new(0, 1), Position::new(0, 7)))); }
#[test]
fn test_inner_quote() {
let buffer = make_buffer("\"hello\"");
let pos = Position::new(0, 3);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerQuote('"'), 1);
assert_eq!(range, Some((Position::new(0, 1), Position::new(0, 5))));
}
#[test]
fn test_a_quote() {
let buffer = make_buffer("\"hello\"");
let pos = Position::new(0, 3);
let range = TextObjectEngine::range(&buffer, pos, TextObject::AQuote('"'), 1);
assert_eq!(range, Some((Position::new(0, 0), Position::new(0, 6))));
}
#[test]
fn test_inner_paragraph() {
let buffer = make_buffer("line1\nline2\n\nline3");
let pos = Position::new(0, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerParagraph, 1);
assert_eq!(range, Some((Position::new(0, 0), Position::new(1, 4))));
}
#[test]
fn test_is_inner_around() {
assert!(TextObject::InnerWord(WordBoundary::Word).is_inner());
assert!(!TextObject::InnerWord(WordBoundary::Word).is_around());
assert!(!TextObject::AWord(WordBoundary::Word).is_inner());
assert!(TextObject::AWord(WordBoundary::Word).is_around());
}
#[test]
fn test_from_chars_big_word() {
assert_eq!(
TextObject::from_chars('i', 'W'),
Some(TextObject::InnerWord(WordBoundary::BigWord))
);
assert_eq!(TextObject::from_chars('a', 'W'), Some(TextObject::AWord(WordBoundary::BigWord)));
}
#[test]
fn test_from_chars_paragraph() {
assert_eq!(TextObject::from_chars('i', 'p'), Some(TextObject::InnerParagraph));
assert_eq!(TextObject::from_chars('a', 'p'), Some(TextObject::AParagraph));
}
#[test]
fn test_from_chars_brackets() {
assert_eq!(TextObject::from_chars('i', '['), Some(TextObject::InnerBracket('[')));
assert_eq!(TextObject::from_chars('a', ']'), Some(TextObject::ABracket('[')));
assert_eq!(TextObject::from_chars('i', '{'), Some(TextObject::InnerBracket('{')));
assert_eq!(TextObject::from_chars('a', '}'), Some(TextObject::ABracket('{')));
assert_eq!(TextObject::from_chars('i', 'B'), Some(TextObject::InnerBracket('{')));
assert_eq!(TextObject::from_chars('a', 'B'), Some(TextObject::ABracket('{')));
assert_eq!(TextObject::from_chars('i', '<'), Some(TextObject::InnerBracket('<')));
assert_eq!(TextObject::from_chars('a', '>'), Some(TextObject::ABracket('<')));
assert_eq!(TextObject::from_chars('i', ')'), Some(TextObject::InnerBracket('(')));
assert_eq!(TextObject::from_chars('a', 'b'), Some(TextObject::ABracket('(')));
}
#[test]
fn test_from_chars_quotes() {
assert_eq!(TextObject::from_chars('i', '\''), Some(TextObject::InnerQuote('\'')));
assert_eq!(TextObject::from_chars('a', '\''), Some(TextObject::AQuote('\'')));
assert_eq!(TextObject::from_chars('i', '`'), Some(TextObject::InnerQuote('`')));
assert_eq!(TextObject::from_chars('a', '`'), Some(TextObject::AQuote('`')));
}
#[test]
fn test_from_chars_invalid_object() {
assert_eq!(TextObject::from_chars('i', 'z'), None);
assert_eq!(TextObject::from_chars('a', '!'), None);
}
#[test]
fn test_inner_word_big_word() {
let buffer = make_buffer("hello.world foo");
let pos = Position::new(0, 0);
let range =
TextObjectEngine::range(&buffer, pos, TextObject::InnerWord(WordBoundary::BigWord), 1);
assert_eq!(range, Some((Position::new(0, 0), Position::new(0, 10))));
}
#[test]
fn test_inner_word_punctuation() {
let buffer = make_buffer("foo...bar");
let pos = Position::new(0, 3); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerWord(WordBoundary::Word), 1);
assert_eq!(range, Some((Position::new(0, 3), Position::new(0, 5))));
}
#[test]
fn test_inner_word_whitespace() {
let buffer = make_buffer("hello world");
let pos = Position::new(0, 6); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerWord(WordBoundary::Word), 1);
assert_eq!(range, Some((Position::new(0, 5), Position::new(0, 7))));
}
#[test]
fn test_a_word_leading_whitespace() {
let buffer = make_buffer(" word");
let pos = Position::new(0, 3); let range = TextObjectEngine::range(&buffer, pos, TextObject::AWord(WordBoundary::Word), 1);
assert_eq!(range, Some((Position::new(0, 0), Position::new(0, 6))));
}
#[test]
fn test_inner_paragraph_empty_line() {
let buffer = make_buffer("line1\n\nline3");
let pos = Position::new(1, 0); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerParagraph, 1);
assert!(range.is_some());
let (start, _end) = range.unwrap();
assert_eq!(start.line, 1);
}
#[test]
fn test_a_paragraph_trailing_blank_lines() {
let buffer = make_buffer("line1\nline2\n\n\nline5");
let pos = Position::new(0, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::AParagraph, 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start.line, 0);
assert!(end.line >= 3);
}
#[test]
fn test_a_paragraph_leading_blank_lines() {
let buffer = make_buffer("\n\nline3\nline4");
let pos = Position::new(2, 0); let range = TextObjectEngine::range(&buffer, pos, TextObject::AParagraph, 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start.line, 0);
assert_eq!(end.line, 3);
}
#[test]
fn test_inner_quote_empty() {
let buffer = make_buffer("\"\"");
let pos = Position::new(0, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerQuote('"'), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, end);
}
#[test]
fn test_inner_quote_cursor_before_first_quote() {
let buffer = make_buffer("xx \"hello\" yy");
let pos = Position::new(0, 0); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerQuote('"'), 1);
assert!(range.is_some());
}
#[test]
fn test_inner_quote_cursor_after_last_quote() {
let buffer = make_buffer("\"hello\" xx");
let pos = Position::new(0, 9); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerQuote('"'), 1);
assert!(range.is_some());
}
#[test]
fn test_inner_quote_single_quote_char() {
let buffer = make_buffer("it's");
let pos = Position::new(0, 2); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerQuote('\''), 1);
assert!(range.is_none());
}
#[test]
fn test_inner_bracket_multiline() {
let buffer = make_buffer("{\n hello\n}");
let pos = Position::new(1, 2);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('{'), 1);
assert!(range.is_some());
let (_start, end) = range.unwrap();
assert!(end.line <= 2);
}
#[test]
fn test_inner_bracket_empty_brackets() {
let buffer = make_buffer("()");
let pos = Position::new(0, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
}
#[test]
fn test_inner_bracket_end_of_buffer() {
let buffer = make_buffer("(x)");
let pos = Position::new(0, 1);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert_eq!(range, Some((Position::new(0, 1), Position::new(0, 1))));
}
#[test]
fn test_prev_position_at_start() {
let buffer = make_buffer("(a)b(c)");
let pos = Position::new(0, 1);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
}
#[test]
fn test_inner_word_empty_line() {
let buffer = make_buffer("hello\n\nworld");
let pos = Position::new(1, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerWord(WordBoundary::Word), 1);
assert_eq!(range, Some((Position::new(1, 0), Position::new(1, 0))));
}
#[test]
fn test_inner_paragraph_empty_buffer() {
let buffer = Buffer::new();
let range =
TextObjectEngine::range(&buffer, Position::new(0, 0), TextObject::InnerParagraph, 1);
assert!(range.is_none());
}
#[test]
fn test_range_count_zero_clamped() {
let buffer = make_buffer("hello world");
let pos = Position::new(0, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerWord(WordBoundary::Word), 0);
assert!(range.is_some());
}
#[test]
fn test_is_inner_around_all_variants() {
assert!(TextObject::InnerParagraph.is_inner());
assert!(!TextObject::InnerParagraph.is_around());
assert!(!TextObject::AParagraph.is_inner());
assert!(TextObject::AParagraph.is_around());
assert!(TextObject::InnerQuote('"').is_inner());
assert!(!TextObject::AQuote('"').is_inner());
assert!(TextObject::InnerBracket('(').is_inner());
assert!(!TextObject::ABracket('(').is_inner());
}
#[test]
fn test_from_chars_bigword() {
assert_eq!(
TextObject::from_chars('i', 'W'),
Some(TextObject::InnerWord(WordBoundary::BigWord))
);
assert_eq!(TextObject::from_chars('a', 'w'), Some(TextObject::AWord(WordBoundary::Word)));
}
#[test]
fn test_from_chars_all_brackets() {
assert_eq!(TextObject::from_chars('i', ')'), Some(TextObject::InnerBracket('(')));
assert_eq!(TextObject::from_chars('a', 'b'), Some(TextObject::ABracket('(')));
assert_eq!(TextObject::from_chars('i', ']'), Some(TextObject::InnerBracket('[')));
assert_eq!(TextObject::from_chars('a', '['), Some(TextObject::ABracket('[')));
assert_eq!(TextObject::from_chars('i', '}'), Some(TextObject::InnerBracket('{')));
assert_eq!(TextObject::from_chars('a', 'B'), Some(TextObject::ABracket('{')));
assert_eq!(TextObject::from_chars('i', '<'), Some(TextObject::InnerBracket('<')));
assert_eq!(TextObject::from_chars('a', '>'), Some(TextObject::ABracket('<')));
}
#[test]
fn test_from_chars_all_quotes() {
assert_eq!(TextObject::from_chars('i', '"'), Some(TextObject::InnerQuote('"')));
assert_eq!(TextObject::from_chars('a', '\''), Some(TextObject::AQuote('\'')));
assert_eq!(TextObject::from_chars('i', '`'), Some(TextObject::InnerQuote('`')));
assert_eq!(TextObject::from_chars('a', '`'), Some(TextObject::AQuote('`')));
}
#[test]
fn test_from_chars_invalid_object_z() {
assert_eq!(TextObject::from_chars('i', 'z'), None);
}
#[test]
fn test_inner_word_bigword_boundary() {
let buffer = make_buffer("hello.world foo");
let pos = Position::new(0, 5);
let range =
TextObjectEngine::range(&buffer, pos, TextObject::InnerWord(WordBoundary::BigWord), 1);
assert_eq!(range, Some((Position::new(0, 0), Position::new(0, 10))));
}
#[test]
fn test_inner_bracket_multiline_deep() {
let buffer = make_buffer("{\n (inner)\n}");
let pos = Position::new(1, 4);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('{'), 1);
assert!(range.is_some());
}
#[test]
fn test_inner_bracket_open_on_prev_line() {
let buffer = make_buffer("(\n hello\n)");
let pos = Position::new(1, 2);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (_start, end) = range.unwrap();
assert!(end.line <= 2);
}
#[test]
fn test_inner_bracket_at_buffer_start() {
let buffer = make_buffer("(x)");
let pos = Position::new(0, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
}
#[test]
fn test_a_quote_basic() {
let buffer = make_buffer("\"hello\"");
let pos = Position::new(0, 3);
let range = TextObjectEngine::range(&buffer, pos, TextObject::AQuote('"'), 1);
assert_eq!(range, Some((Position::new(0, 0), Position::new(0, 6))));
}
#[test]
fn test_a_quote_cursor_after_last() {
let buffer = make_buffer("\"hello\" yy");
let pos = Position::new(0, 9);
let range = TextObjectEngine::range(&buffer, pos, TextObject::AQuote('"'), 1);
assert!(range.is_some());
}
#[test]
fn test_inner_bracket_count_nested() {
let buffer = make_buffer("((inner))");
let pos = Position::new(0, 4);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 2);
assert!(range.is_some());
}
#[test]
fn test_inner_bracket_all_types() {
let buffer_sq = make_buffer("[hello]");
let range =
TextObjectEngine::range(&buffer_sq, Position::new(0, 3), TextObject::InnerBracket('['), 1);
assert_eq!(range, Some((Position::new(0, 1), Position::new(0, 5))));
let buffer_cu = make_buffer("{hello}");
let range =
TextObjectEngine::range(&buffer_cu, Position::new(0, 3), TextObject::InnerBracket('{'), 1);
assert_eq!(range, Some((Position::new(0, 1), Position::new(0, 5))));
let buffer_an = make_buffer("<hello>");
let range =
TextObjectEngine::range(&buffer_an, Position::new(0, 3), TextObject::InnerBracket('<'), 1);
assert_eq!(range, Some((Position::new(0, 1), Position::new(0, 5))));
}
#[test]
fn test_bracket_multiline_closing() {
let buffer = make_buffer("[\n a\n b\n]");
let pos = Position::new(1, 2);
let range = TextObjectEngine::range(&buffer, pos, TextObject::ABracket('['), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(0, 0));
assert_eq!(end, Position::new(3, 0));
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[test]
fn test_find_quote_pair_odd_quotes() {
let buffer = make_buffer("\"a\"b\"");
let pos = Position::new(0, 3); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerQuote('"'), 1);
assert!(range.is_some() || range.is_none()); }
#[test]
fn test_bracket_pair_closing_chars() {
let buffer_paren = make_buffer("(hello)");
let range = TextObjectEngine::range(
&buffer_paren,
Position::new(0, 3),
TextObject::InnerBracket(')'),
1,
);
assert_eq!(range, Some((Position::new(0, 1), Position::new(0, 5))));
let buffer_sq = make_buffer("[hello]");
let range =
TextObjectEngine::range(&buffer_sq, Position::new(0, 3), TextObject::InnerBracket(']'), 1);
assert_eq!(range, Some((Position::new(0, 1), Position::new(0, 5))));
let buffer_cu = make_buffer("{hello}");
let range =
TextObjectEngine::range(&buffer_cu, Position::new(0, 3), TextObject::InnerBracket('}'), 1);
assert_eq!(range, Some((Position::new(0, 1), Position::new(0, 5))));
let buffer_an = make_buffer("<hello>");
let range =
TextObjectEngine::range(&buffer_an, Position::new(0, 3), TextObject::InnerBracket('>'), 1);
assert_eq!(range, Some((Position::new(0, 1), Position::new(0, 5))));
}
#[test]
fn test_bracket_pair_invalid_char() {
let buffer = make_buffer("hello");
let range =
TextObjectEngine::range(&buffer, Position::new(0, 2), TextObject::InnerBracket('!'), 1);
assert!(range.is_none());
}
#[test]
fn test_next_position_wraps_to_next_line() {
let buffer = make_buffer("(\nhello\n)");
let pos = Position::new(0, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (start, _end) = range.unwrap();
assert_eq!(start, Position::new(1, 0));
}
#[test]
fn test_prev_position_wraps_to_prev_line() {
let buffer = make_buffer("(\nhello\n)");
let pos = Position::new(1, 2);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (_start, end) = range.unwrap();
assert!(end.line <= 1);
}
#[test]
fn test_find_closing_bracket_not_found() {
let buffer = make_buffer("(unclosed");
let pos = Position::new(0, 3);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_none());
}
#[test]
fn test_a_word_bigword() {
let buffer = make_buffer("hello.world foo");
let pos = Position::new(0, 5); let range = TextObjectEngine::range(&buffer, pos, TextObject::AWord(WordBoundary::BigWord), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start.column, 0);
assert!(end.column >= 11);
}
#[test]
fn test_inner_word_column_clamped() {
let buffer = make_buffer("hi");
let pos = Position::new(0, 100); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerWord(WordBoundary::Word), 1);
assert!(range.is_some());
}
#[test]
fn test_find_opening_bracket_with_close_before_cursor() {
let buffer = make_buffer("( () hello )");
let pos = Position::new(0, 8); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (start, _end) = range.unwrap();
assert_eq!(start, Position::new(0, 1));
}
#[test]
fn test_inner_word_punctuation_cluster() {
let buffer = make_buffer("foo...bar");
let pos = Position::new(0, 4); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerWord(WordBoundary::Word), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(0, 3)); assert_eq!(end, Position::new(0, 5)); }
#[test]
fn test_inner_bracket_nested_closing_on_prev_line() {
let buffer = make_buffer("(\n( )\nx\n)");
let pos = Position::new(2, 0); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(1, 0));
assert_eq!(end, Position::new(2, 0));
}
#[test]
fn test_next_position_at_buffer_end() {
let buffer = make_buffer("(text)");
let pos = Position::new(0, 1); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(0, 1));
assert_eq!(end, Position::new(0, 4));
}
#[test]
fn test_prev_position_at_buffer_start() {
let buffer = make_buffer("(hello)");
let pos = Position::new(0, 0); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(0, 1));
assert_eq!(end, Position::new(0, 5));
}
#[test]
fn test_inner_paragraph_multiline_backward_expansion() {
let buffer = make_buffer("aaa\nbbb\nccc\n\nddd");
let pos = Position::new(1, 0); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerParagraph, 1);
assert!(range.is_some());
let (start, _end) = range.unwrap();
assert_eq!(start.line, 0); }
#[test]
fn test_find_quote_pair_cursor_after_last_quote() {
let buffer = make_buffer("say \"hello\" end");
let pos = Position::new(0, 12); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerQuote('"'), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert!(start.column <= 5); assert!(end.column >= 9); }
#[test]
fn test_inner_bracket_opening_on_previous_line() {
let buffer = make_buffer("(\nhello\nworld\n)");
let pos = Position::new(2, 0); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
}
#[test]
fn test_find_closing_bracket_forward_multiline() {
let buffer = make_buffer("(\nfoo\nbar\n)");
let pos = Position::new(1, 0); let range = TextObjectEngine::range(&buffer, pos, TextObject::ABracket('('), 1);
assert!(range.is_some());
}
#[test]
fn test_find_quote_pair_after_last_with_4_quotes() {
let buffer = make_buffer("\"hello\" \"world\" x");
let pos = Position::new(0, 16); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerQuote('"'), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start.column, 9); assert_eq!(end.column, 13); }
#[test]
fn test_a_quote_cursor_well_past_last_quote() {
let buffer = make_buffer("\"hi\" \"bye\" zzzzz");
let pos = Position::new(0, 15); let range = TextObjectEngine::range(&buffer, pos, TextObject::AQuote('"'), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start.column, 5); assert_eq!(end.column, 9); }
#[test]
fn test_inner_bracket_open_on_distant_prev_line() {
let buffer = make_buffer("(\n (nested)\n content\n)");
let pos = Position::new(2, 2);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(1, 0));
assert!(end.line <= 2);
}
#[test]
fn test_inner_bracket_prev_lines_depth_increment() {
let buffer = make_buffer("(\n)\n(\nx\n)");
let pos = Position::new(3, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(3, 0));
assert_eq!(end.line, 3);
}
#[test]
fn test_inner_bracket_prev_lines_multiple_depth() {
let buffer = make_buffer("(outer\n (inner1)\n (inner2)\n middle\n)");
let pos = Position::new(3, 2);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(0, 1));
assert!(end.line <= 3);
}
#[test]
fn test_find_closing_bracket_skips_lines_without_brackets() {
let buffer = make_buffer("(\nfoo\nbar\nbaz\n)");
let pos = Position::new(0, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(1, 0));
assert_eq!(end.line, 3);
}
#[test]
fn test_find_closing_bracket_with_nested_on_different_lines() {
let buffer = make_buffer("(\n (\n )\n)");
let pos = Position::new(0, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(1, 0));
assert_eq!(end.line, 2);
}
#[test]
fn test_next_position_at_buffer_boundary() {
let buffer = make_buffer("(\nx)");
let pos = Position::new(1, 0); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
}
#[test]
fn test_inner_bracket_close_at_buffer_end() {
let buffer = make_buffer("(hello)");
let pos = Position::new(0, 3);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(0, 1));
assert_eq!(end, Position::new(0, 5));
}
#[test]
fn test_prev_position_at_origin() {
let buffer = make_buffer("()");
let pos = Position::new(0, 0);
let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
}
#[test]
fn test_inner_bracket_three_line_content() {
let buffer = make_buffer("(\nfoo\n)");
let pos = Position::new(1, 1); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(1, 0));
assert_eq!(end.line, 1);
}
#[test]
fn test_inner_bracket_five_line_content() {
let buffer = make_buffer("{\n aaa\n bbb\n ccc\n}");
let pos = Position::new(2, 3); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('{'), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(1, 0));
assert_eq!(end.line, 3);
}
#[test]
fn test_a_bracket_multiline_three_lines() {
let buffer = make_buffer("(\nfoo\n)");
let pos = Position::new(1, 1);
let range = TextObjectEngine::range(&buffer, pos, TextObject::ABracket('('), 1);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(0, 0));
assert_eq!(end, Position::new(2, 0));
}
#[test]
fn test_inner_bracket_count2_opening_on_prev_lines() {
let buffer = make_buffer("(\n (\n hello\n )\n)");
let pos = Position::new(2, 4); let range = TextObjectEngine::range(&buffer, pos, TextObject::InnerBracket('('), 2);
assert!(range.is_some());
let (start, end) = range.unwrap();
assert_eq!(start, Position::new(1, 0));
assert_eq!(end.line, 3);
}