use super::*;
#[test]
fn test_find_symmetric_quotes() {
let buffer = Buffer::from_string("\"hello world\"");
let result = find_delimiter_pair(&buffer, Position::new(0, 5), '"', '"');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 0));
assert_eq!(close, Position::new(0, 12));
}
#[test]
fn test_find_asymmetric_parens() {
let buffer = Buffer::from_string("fn foo(bar)");
let result = find_delimiter_pair(&buffer, Position::new(0, 8), '(', ')');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 6));
assert_eq!(close, Position::new(0, 10));
}
#[test]
fn test_find_asymmetric_brackets() {
let buffer = Buffer::from_string("arr[idx]");
let result = find_delimiter_pair(&buffer, Position::new(0, 5), '[', ']');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 3));
assert_eq!(close, Position::new(0, 7));
}
#[test]
fn test_find_nested_delimiters() {
let buffer = Buffer::from_string("((inner))");
let result = find_delimiter_pair(&buffer, Position::new(0, 4), '(', ')');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 1));
assert_eq!(close, Position::new(0, 7));
}
#[test]
fn test_find_multiline_delimiters() {
let buffer = Buffer::from_string("{\n content\n}");
let result = find_delimiter_pair(&buffer, Position::new(1, 2), '{', '}');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 0));
assert_eq!(close, Position::new(2, 0));
}
#[test]
fn test_find_no_match() {
let buffer = Buffer::from_string("no brackets here");
let result = find_delimiter_pair(&buffer, Position::new(0, 5), '(', ')');
assert!(result.is_none());
}
#[test]
fn test_find_at_delimiter() {
let buffer = Buffer::from_string("(hello)");
let result = find_delimiter_pair(&buffer, Position::new(0, 0), '(', ')');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 0));
assert_eq!(close, Position::new(0, 6));
}
#[test]
fn test_find_delimiter_empty_buffer() {
let buffer = Buffer::new();
let result = find_delimiter_pair(&buffer, Position::new(0, 0), '(', ')');
assert!(result.is_none());
}
#[test]
fn test_find_delimiter_unbalanced() {
let buffer = Buffer::from_string("(unclosed");
let result = find_delimiter_pair(&buffer, Position::new(0, 5), '(', ')');
assert!(result.is_none());
}
#[test]
fn test_find_matching_delimiter_paren() {
let buffer = Buffer::from_string("(hello)");
let result = find_matching_delimiter(&buffer, Position::new(0, 0));
assert_eq!(result, Some(Position::new(0, 6)));
}
#[test]
fn test_find_matching_delimiter_bracket() {
let buffer = Buffer::from_string("[item]");
let result = find_matching_delimiter(&buffer, Position::new(0, 0));
assert_eq!(result, Some(Position::new(0, 5)));
}
#[test]
fn test_find_matching_delimiter_brace() {
let buffer = Buffer::from_string("{block}");
let result = find_matching_delimiter(&buffer, Position::new(0, 0));
assert_eq!(result, Some(Position::new(0, 6)));
}
#[test]
fn test_multiple_quote_pairs() {
let buffer = Buffer::from_string("\"a\" \"b\"");
let result1 = find_delimiter_pair(&buffer, Position::new(0, 1), '"', '"');
assert!(result1.is_some());
let (open1, close1) = result1.unwrap();
assert_eq!(open1, Position::new(0, 0));
assert_eq!(close1, Position::new(0, 2));
let result2 = find_delimiter_pair(&buffer, Position::new(0, 5), '"', '"');
assert!(result2.is_some());
let (open2, close2) = result2.unwrap();
assert_eq!(open2, Position::new(0, 4));
assert_eq!(close2, Position::new(0, 6));
}
#[test]
fn test_find_matching_delimiter_close_paren() {
let buffer = Buffer::from_string("(hello)");
let result = find_matching_delimiter(&buffer, Position::new(0, 6));
assert_eq!(result, Some(Position::new(0, 0)));
}
#[test]
fn test_find_matching_delimiter_close_bracket() {
let buffer = Buffer::from_string("[item]");
let result = find_matching_delimiter(&buffer, Position::new(0, 5));
assert_eq!(result, Some(Position::new(0, 0)));
}
#[test]
fn test_find_matching_delimiter_close_brace() {
let buffer = Buffer::from_string("{block}");
let result = find_matching_delimiter(&buffer, Position::new(0, 6));
assert_eq!(result, Some(Position::new(0, 0)));
}
#[test]
fn test_find_matching_delimiter_angle_brackets() {
let buffer = Buffer::from_string("<item>");
let result = find_matching_delimiter(&buffer, Position::new(0, 0));
assert_eq!(result, Some(Position::new(0, 5)));
let result = find_matching_delimiter(&buffer, Position::new(0, 5));
assert_eq!(result, Some(Position::new(0, 0)));
}
#[test]
fn test_find_asymmetric_pair_at_closing() {
let buffer = Buffer::from_string("(hello)");
let result = find_delimiter_pair(&buffer, Position::new(0, 6), '(', ')');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 0));
assert_eq!(close, Position::new(0, 6));
}
#[test]
fn test_symmetric_pair_outside() {
let buffer = Buffer::from_string("\"a\" hello \"b\"");
let result = find_delimiter_pair(&buffer, Position::new(0, 4), '"', '"');
assert!(result.is_none());
}
#[test]
fn test_find_matching_delimiter_non_delimiter() {
let buffer = Buffer::from_string("hello");
let result = find_matching_delimiter(&buffer, Position::new(0, 2));
assert!(result.is_none());
}
#[test]
fn test_symmetric_single_quote() {
let buffer = Buffer::from_string("no quotes");
let result = find_delimiter_pair(&buffer, Position::new(0, 3), '"', '"');
assert!(result.is_none());
}
#[test]
fn test_find_backward_previous_lines() {
let buffer = Buffer::from_string("(\n content\n )");
let result = find_delimiter_pair(&buffer, Position::new(2, 2), '(', ')');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 0));
assert_eq!(close, Position::new(2, 2));
}
#[test]
fn test_find_forward_subsequent_lines() {
let buffer = Buffer::from_string("(\n content\n more\n)");
let result = find_delimiter_pair(&buffer, Position::new(1, 2), '(', ')');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 0));
assert_eq!(close, Position::new(3, 0));
}
#[test]
fn test_find_asymmetric_deep_nesting() {
let buffer = Buffer::from_string("(a (b (c) d) e)");
let result = find_delimiter_pair(&buffer, Position::new(0, 7), '(', ')');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 6));
assert_eq!(close, Position::new(0, 8));
}
#[test]
fn test_find_asymmetric_pair_at_closing_multiline() {
let buffer = Buffer::from_string("{ content }");
let result = find_delimiter_pair(&buffer, Position::new(0, 10), '{', '}');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 0));
assert_eq!(close, Position::new(0, 10));
}
#[test]
fn test_find_matching_delimiter_multiline_forward() {
let buffer = Buffer::from_string("(\n hello\n)");
let result = find_matching_delimiter(&buffer, Position::new(0, 0));
assert_eq!(result, Some(Position::new(2, 0)));
}
#[test]
fn test_find_matching_delimiter_multiline_backward() {
let buffer = Buffer::from_string("( hello )");
let result = find_matching_delimiter(&buffer, Position::new(0, 8));
assert_eq!(result, Some(Position::new(0, 0)));
}
#[test]
fn test_symmetric_odd_quotes() {
let buffer = Buffer::from_string("\"a\" b \"c");
let result = find_delimiter_pair(&buffer, Position::new(0, 5), '"', '"');
assert!(result.is_none());
}
#[test]
fn test_find_backward_with_nested_close() {
let buffer = Buffer::from_string("( () ) x");
let result = find_delimiter_pair(&buffer, Position::new(0, 5), '(', ')');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 0));
assert_eq!(close, Position::new(0, 5));
}
#[test]
fn test_find_forward_unmatched() {
let buffer = Buffer::from_string("(no close");
let result = find_delimiter_pair(&buffer, Position::new(0, 0), '(', ')');
assert!(result.is_none());
}
#[test]
fn test_find_matching_delimiter_angle_backward() {
let buffer = Buffer::from_string("<a>");
let result = find_matching_delimiter(&buffer, Position::new(0, 2));
assert_eq!(result, Some(Position::new(0, 0)));
}
#[test]
fn test_find_forward_nested_depth() {
let buffer = Buffer::from_string("( ( ) )");
let result = find_delimiter_pair(&buffer, Position::new(0, 0), '(', ')');
assert!(result.is_some());
let (open_pos, close_pos) = result.unwrap();
assert_eq!(open_pos, Position::new(0, 0));
assert_eq!(close_pos, Position::new(0, 6));
}
#[test]
fn test_cursor_on_close_no_matching_open() {
let buffer = Buffer::from_string(") hello");
let result = find_delimiter_pair(&buffer, Position::new(0, 0), '(', ')');
assert!(result.is_none());
}
#[test]
fn test_find_backward_multiline_search() {
let buffer = Buffer::from_string("(\nhello\n)");
let pos = Position::new(1, 2); let result = find_delimiter_pair(&buffer, pos, '(', ')');
assert!(result.is_some());
let (open, close) = result.unwrap();
assert_eq!(open, Position::new(0, 0));
assert_eq!(close, Position::new(2, 0));
}
#[test]
fn test_find_forward_multiline_no_match() {
let buffer = Buffer::from_string("( hello\nworld");
let result = find_delimiter_pair(&buffer, Position::new(0, 0), '(', ')');
assert!(result.is_none());
}