use escriba_buffer::BufferSet;
use escriba_keymap::Key;
use escriba_madoguchi::{Snapshot, cap, caps};
use escriba_runtime::EditorState;
fn searched() -> EditorState {
let mut bufs = BufferSet::new();
let id = bufs.scratch("foo bar foo baz foo\n");
let mut st = EditorState::new_with_buffer(bufs, id);
for k in ['/', 'f', 'o', 'o'] {
st.on_key(&Key::Char(k));
}
st.on_key(&Key::Enter);
st
}
#[test]
fn a_handler_can_finally_read_the_search() {
let st = searched();
let w = st.window();
assert_eq!(w.search().pattern(), Some("foo"));
assert_eq!(w.search().match_count(), Some(3));
assert!(!w.search().is_prompting());
}
#[test]
fn noh_clears_the_highlight_without_forgetting_the_pattern() {
let mut st = searched();
assert!(!st.search.highlights().is_empty());
for k in [':', 'n', 'o', 'h'] {
st.on_key(&Key::Char(k));
}
st.on_key(&Key::Enter);
assert!(st.search.highlights().is_empty(), ":noh clears highlights");
let w = st.window();
assert_eq!(
w.search().pattern(),
Some("foo"),
"…and must NOT forget the pattern",
);
assert_eq!(
w.search().match_count(),
Some(3),
"…nor report zero matches, which would make `n` look broken",
);
}
#[test]
fn nothing_searched_is_none_not_zero() {
let mut bufs = BufferSet::new();
let id = bufs.scratch("x\n");
let st = EditorState::new_with_buffer(bufs, id);
let w = st.window();
assert_eq!(w.search().pattern(), None);
assert_eq!(w.search().match_count(), None);
}
#[test]
fn the_window_narrows_to_exactly_what_is_asked_for() {
let st = searched();
let w = st.window();
let narrow: escriba_madoguchi::View<'_, caps!(cap::Search)> = escriba_madoguchi::View::new(&w);
assert_eq!(narrow.search().pattern(), w.search().pattern());
}