use typ_buffer::{Position, Selection};
use typ_core::{Action, Panel};
use typ_panel_editor::EditorPanel;
fn pos(line: usize, col: usize) -> Position {
Position { line, col }
}
fn ranges(panel: &EditorPanel) -> Vec<(Position, Position)> {
panel.selections().iter().map(|s| s.range()).collect()
}
#[test]
fn the_first_press_selects_the_word_under_the_cursor() {
let mut panel = EditorPanel::from_str("let value = value + 1;\n");
panel.set_selections_for_test(vec![Selection::caret(pos(0, 5))]);
panel.apply_action(Action::SelectNextOccurrence);
assert_eq!(ranges(&panel), vec![(pos(0, 4), pos(0, 9))]);
}
#[test]
fn the_second_press_adds_a_cursor_at_the_next_occurrence() {
let mut panel = EditorPanel::from_str("let value = value + 1;\n");
panel.set_selections_for_test(vec![Selection::caret(pos(0, 5))]);
panel.apply_action(Action::SelectNextOccurrence);
panel.apply_action(Action::SelectNextOccurrence);
assert_eq!(
ranges(&panel),
vec![(pos(0, 4), pos(0, 9)), (pos(0, 12), pos(0, 17))]
);
}
#[test]
fn the_newly_added_occurrence_becomes_the_primary() {
let mut panel = EditorPanel::from_str("value value\n");
panel.set_selections_for_test(vec![Selection::caret(pos(0, 0))]);
panel.apply_action(Action::SelectNextOccurrence);
panel.apply_action(Action::SelectNextOccurrence);
assert_eq!(
panel.selections().primary().range(),
(pos(0, 6), pos(0, 11))
);
}
#[test]
fn it_wraps_to_occurrences_above_the_cursor() {
let mut panel = EditorPanel::from_str("value\nother\nvalue\n");
panel.set_selections_for_test(vec![Selection::caret(pos(2, 0))]);
panel.apply_action(Action::SelectNextOccurrence);
panel.apply_action(Action::SelectNextOccurrence);
assert_eq!(
ranges(&panel),
vec![(pos(0, 0), pos(0, 5)), (pos(2, 0), pos(2, 5))]
);
}
#[test]
fn it_stops_once_every_occurrence_is_selected() {
let mut panel = EditorPanel::from_str("value value\n");
panel.set_selections_for_test(vec![Selection::caret(pos(0, 0))]);
for _ in 0..10 {
panel.apply_action(Action::SelectNextOccurrence);
}
assert_eq!(panel.selections().len(), 2);
}
#[test]
fn a_word_with_only_one_occurrence_selects_once_and_stays_put() {
let mut panel = EditorPanel::from_str("unique thing\n");
panel.set_selections_for_test(vec![Selection::caret(pos(0, 0))]);
panel.apply_action(Action::SelectNextOccurrence);
panel.apply_action(Action::SelectNextOccurrence);
assert_eq!(ranges(&panel), vec![(pos(0, 0), pos(0, 6))]);
}
#[test]
fn matching_is_case_sensitive_unlike_the_search_box() {
let mut panel = EditorPanel::from_str("value Value value\n");
panel.set_selections_for_test(vec![Selection::caret(pos(0, 0))]);
panel.apply_action(Action::SelectNextOccurrence);
panel.apply_action(Action::SelectNextOccurrence);
assert_eq!(
ranges(&panel),
vec![(pos(0, 0), pos(0, 5)), (pos(0, 12), pos(0, 17))]
);
}
#[test]
fn an_existing_selection_is_used_verbatim_rather_than_its_word() {
let mut panel = EditorPanel::from_str("ab_cd xx ab_cd\n");
panel.set_selections_for_test(vec![Selection {
anchor: pos(0, 1),
head: pos(0, 4),
}]);
panel.apply_action(Action::SelectNextOccurrence);
assert_eq!(
ranges(&panel),
vec![(pos(0, 1), pos(0, 4)), (pos(0, 10), pos(0, 13))]
);
}
#[test]
fn a_cursor_in_whitespace_has_no_word_to_select() {
let mut panel = EditorPanel::from_str("a b\n");
panel.set_selections_for_test(vec![Selection::caret(pos(0, 2))]);
let events = panel.apply_action(Action::SelectNextOccurrence);
assert!(events.is_some());
assert_eq!(ranges(&panel), vec![(pos(0, 2), pos(0, 2))]);
}
#[test]
fn select_all_occurrences_takes_them_in_one_press() {
let mut panel = EditorPanel::from_str("v\nv\nv\nv\n");
panel.set_selections_for_test(vec![Selection::caret(pos(0, 0))]);
panel.apply_action(Action::SelectAllOccurrences);
assert_eq!(panel.selections().len(), 4);
assert_eq!(ranges(&panel)[3], (pos(3, 0), pos(3, 1)));
}
#[test]
fn select_all_occurrences_starts_from_the_word_under_the_cursor_too() {
let mut panel = EditorPanel::from_str("let value = value;\n");
panel.set_selections_for_test(vec![Selection::caret(pos(0, 6))]);
panel.apply_action(Action::SelectAllOccurrences);
assert_eq!(
ranges(&panel),
vec![(pos(0, 4), pos(0, 9)), (pos(0, 12), pos(0, 17))]
);
}
#[test]
fn typing_after_selecting_occurrences_edits_every_one() {
let mut panel = EditorPanel::from_str("foo\nfoo\n");
panel.set_selections_for_test(vec![Selection::caret(pos(0, 0))]);
panel.apply_action(Action::SelectAllOccurrences);
panel.apply_action(Action::InsertChar('X'));
assert_eq!(panel.line_text(0), "X");
assert_eq!(panel.line_text(1), "X");
}