use super::super::*;
#[test]
fn test_skip_over_rules_created() {
let rules = create_skip_over_rules();
assert_eq!(rules.len(), 6);
}
#[test]
fn test_skip_over_bracket_rules_match_insert_char() {
let rules = create_skip_over_rules();
for (i, close_char) in [')', ']', '}'].iter().enumerate() {
let rule = &rules[i];
let insert_char_event = ReedlineEvent::Edit(vec![EditCommand::InsertChar(*close_char)]);
assert!(
(rule.match_event)(&insert_char_event),
"Rule {} should match InsertChar('{}')",
i,
close_char
);
let pair = match close_char {
')' => "()",
']' => "[]",
'}' => "{}",
_ => unreachable!(),
};
let insert_string_event = ReedlineEvent::Edit(vec![
EditCommand::InsertString(pair.to_string()),
EditCommand::MoveLeft { select: false },
]);
assert!(
!(rule.match_event)(&insert_string_event),
"Rule {} should NOT match InsertString for pair '{}'",
i,
pair
);
}
}
#[test]
fn test_skip_over_quote_rules_match_insert_string() {
let rules = create_skip_over_rules();
let quote_pairs: [(char, &str); 3] = [('"', r#""""#), ('\'', "''"), ('`', "``")];
for (i, (quote_char, pair)) in quote_pairs.iter().enumerate() {
let rule = &rules[3 + i];
let insert_string_event = ReedlineEvent::Edit(vec![
EditCommand::InsertString(pair.to_string()),
EditCommand::MoveLeft { select: false },
]);
assert!(
(rule.match_event)(&insert_string_event),
"Quote rule {} should match InsertString for pair '{}'",
i,
pair
);
let insert_char_event = ReedlineEvent::Edit(vec![EditCommand::InsertChar(*quote_char)]);
assert!(
!(rule.match_event)(&insert_char_event),
"Quote rule {} should NOT match InsertChar('{}')",
i,
quote_char
);
}
}
#[test]
fn test_opening_bracket_not_matched_by_skip_over_regression() {
let skip_over_rules = create_skip_over_rules();
let auto_match_rules = create_auto_match_rules();
let open_paren_event = ReedlineEvent::Edit(vec![
EditCommand::InsertString("()".to_string()),
EditCommand::MoveLeft { select: false },
]);
let close_paren_skip_rule = &skip_over_rules[0]; assert!(
!(close_paren_skip_rule.match_event)(&open_paren_event),
"Skip-over rule for ')' should NOT match opening '(' event"
);
let open_paren_auto_match_rule = &auto_match_rules[0]; assert!(
(open_paren_auto_match_rule.match_event)(&open_paren_event),
"Auto-match rule for '(' should match opening '(' event"
);
}
#[test]
fn test_open_bracket_inside_parens_full_flow() {
let mut state = EditorState::new();
let skip_over_rules = create_skip_over_rules();
let auto_match_rules = create_auto_match_rules();
state.buffer = "foo(c)".to_string();
state.buffer_len = 6;
state.cursor_pos = 5;
assert_eq!(state.char_after_cursor(), Some(')'));
assert!(!state.cursor_at_end());
let open_paren_event = ReedlineEvent::Edit(vec![
EditCommand::InsertString("()".to_string()),
EditCommand::MoveLeft { select: false },
]);
let close_paren_skip_rule = &skip_over_rules[0];
assert!(!(close_paren_skip_rule.match_event)(&open_paren_event));
let open_paren_auto_match_rule = &auto_match_rules[0];
assert!((open_paren_auto_match_rule.match_event)(&open_paren_event));
assert!(
open_paren_auto_match_rule.condition.check(&state),
"Auto-match condition should pass when cursor is before ')'"
);
state.update_from_event(&open_paren_event);
assert_eq!(state.buffer, "foo(c())");
assert_eq!(state.cursor_pos, 6); }
#[test]
fn test_close_bracket_skip_over() {
let mut state = EditorState::new();
let skip_over_rules = create_skip_over_rules();
state.buffer = "foo()".to_string();
state.buffer_len = 5;
state.cursor_pos = 4;
assert_eq!(state.char_after_cursor(), Some(')'));
let close_paren_event = ReedlineEvent::Edit(vec![EditCommand::InsertChar(')')]);
let close_paren_skip_rule = &skip_over_rules[0];
assert!((close_paren_skip_rule.match_event)(&close_paren_event));
assert!(
!close_paren_skip_rule.condition.check(&state),
"Condition should fail when cursor is before ')'"
);
state.update_from_event(&ReedlineEvent::Edit(vec![EditCommand::MoveRight {
select: false,
}]));
assert_eq!(state.cursor_pos, 5); assert_eq!(state.buffer, "foo()"); }