use super::super::*;
#[test]
fn test_bracket_delete_rules_created() {
let rules = create_bracket_delete_rules();
assert_eq!(rules.len(), 1);
}
#[test]
fn test_bracket_delete_rule_matches_backspace() {
let rules = create_bracket_delete_rules();
let rule = &rules[0];
let backspace_event = ReedlineEvent::Edit(vec![EditCommand::Backspace]);
assert!((rule.match_event)(&backspace_event));
let delete_event = ReedlineEvent::Edit(vec![EditCommand::Delete]);
assert!(!(rule.match_event)(&delete_event));
let multiple_event = ReedlineEvent::Edit(vec![EditCommand::Backspace, EditCommand::Delete]);
assert!(!(rule.match_event)(&multiple_event));
}
#[test]
fn test_bracket_delete_condition_not_inside_pair() {
let rules = create_bracket_delete_rules();
let rule = &rules[0];
let mut state = EditorState::new();
state.buffer = "abc".to_string();
state.buffer_len = 3;
state.cursor_pos = 2;
assert!(rule.condition.check(&state));
}
#[test]
fn test_bracket_delete_condition_inside_pair() {
let rules = create_bracket_delete_rules();
let rule = &rules[0];
let mut state = EditorState::new();
state.buffer = "()".to_string();
state.buffer_len = 2;
state.cursor_pos = 1;
assert!(!rule.condition.check(&state));
}
#[test]
fn test_bracket_delete_fallback_event() {
let rules = create_bracket_delete_rules();
let rule = &rules[0];
match &rule.fallback_event {
ReedlineEvent::Edit(cmds) => {
assert_eq!(cmds.len(), 2);
assert!(matches!(&cmds[0], EditCommand::Backspace));
assert!(matches!(&cmds[1], EditCommand::Delete));
}
_ => panic!("Expected Edit event"),
}
}
#[test]
fn test_bracket_delete_full_flow() {
let mut state = EditorState::new();
state.update_from_event(&ReedlineEvent::Edit(vec![
EditCommand::InsertString("()".to_string()),
EditCommand::MoveLeft { select: false },
]));
assert_eq!(state.buffer, "()");
assert_eq!(state.cursor_pos, 1);
assert!(state.is_inside_empty_pair());
state.update_from_event(&ReedlineEvent::Edit(vec![
EditCommand::Backspace,
EditCommand::Delete,
]));
assert_eq!(state.buffer, "");
assert_eq!(state.cursor_pos, 0);
assert_eq!(state.buffer_len, 0);
}
#[test]
fn test_bracket_delete_all_pair_types() {
let pairs = [
("()", 1),
("[]", 1),
("{}", 1),
(r#""""#, 1),
("''", 1),
("``", 1),
];
for (pair, cursor_pos) in pairs {
let mut state = EditorState::new();
state.buffer = pair.to_string();
state.buffer_len = 2;
state.cursor_pos = cursor_pos;
assert!(
state.is_inside_empty_pair(),
"Expected to be inside empty pair for: {}",
pair
);
state.update_from_event(&ReedlineEvent::Edit(vec![
EditCommand::Backspace,
EditCommand::Delete,
]));
assert_eq!(
state.buffer, "",
"Buffer should be empty after deleting {}",
pair
);
}
}
#[test]
fn test_bracket_delete_uncertain_state() {
let rules = create_bracket_delete_rules();
let rule = &rules[0];
let mut state = EditorState::new();
state.buffer = "()".to_string();
state.buffer_len = 2;
state.cursor_pos = 1;
state.uncertain = true;
assert!(!state.is_inside_empty_pair());
assert!(rule.condition.check(&state));
}
#[test]
fn test_backspace_after_newline_not_inside_empty_pair() {
let mut state = EditorState::new();
state.update_from_event(&ReedlineEvent::Edit(vec![
EditCommand::InsertString("()".to_string()),
EditCommand::MoveLeft { select: false },
]));
assert_eq!(state.buffer, "()");
assert_eq!(state.cursor_pos, 1);
assert!(state.is_inside_empty_pair());
state.update_from_event(&ReedlineEvent::Edit(vec![EditCommand::InsertNewline]));
assert_eq!(state.buffer, "(\n)");
assert_eq!(state.cursor_pos, 2);
assert!(!state.is_inside_empty_pair());
assert_eq!(state.char_before_cursor(), Some('\n'));
assert_eq!(state.char_after_cursor(), Some(')'));
}
#[test]
fn test_bracket_delete_condition_after_newline() {
let rules = create_bracket_delete_rules();
let rule = &rules[0];
let mut state = EditorState::new();
state.buffer = "(\n)".to_string();
state.buffer_len = 3;
state.cursor_pos = 2;
assert!(!state.is_inside_empty_pair());
assert!(rule.condition.check(&state));
}
#[test]
fn test_backspace_after_newline_deletes_only_newline() {
let mut state = EditorState::new();
state.buffer = "(\n)".to_string();
state.buffer_len = 3;
state.cursor_pos = 2;
state.update_from_event(&ReedlineEvent::Edit(vec![EditCommand::Backspace]));
assert_eq!(state.buffer, "()");
assert_eq!(state.cursor_pos, 1);
assert_eq!(state.buffer_len, 2);
}