From 150ee9d360cea30a97f6406a31916bf3303270c2 Mon Sep 17 00:00:00 2001 From: rhysd Date: Mon, 5 Aug 2024 00:02:11 +0900 Subject: [PATCH] add more tests for `search` feature --- src/search.rs | 17 +++++++++++++ tests/search.rs | 63 +++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 73 insertions(+), 7 deletions(-) diff --git a/src/search.rs b/src/search.rs index e0b706b..abf9270 100644 --- a/src/search.rs +++ b/src/search.rs @@ -151,3 +151,20 @@ impl Search { None } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn matches() { + let mut s = Search::default(); + s.set_pattern("fo+").unwrap(); + + let m: Vec<_> = s.matches("fo foo bar fooo").unwrap().collect(); + assert_eq!(m, [(0, 2), (3, 6), (11, 15)]); + + s.set_pattern("").unwrap(); + assert!(s.matches("fo foo bar fooo").is_none()); + } +} diff --git a/tests/search.rs b/tests/search.rs index 9ea4bab..16570cf 100644 --- a/tests/search.rs +++ b/tests/search.rs @@ -3,7 +3,7 @@ use tui_textarea::{CursorMove, TextArea}; #[test] -fn search_forward() { +fn search_lines_forward() { #[rustfmt::skip] let mut textarea = TextArea::from([ "fooo foo", @@ -20,13 +20,13 @@ fn search_forward() { for (i, pos) in expected.into_iter().enumerate() { let moved = textarea.search_forward(false); let cursor = textarea.cursor(); - assert!(moved, "{}th move didn't happen: {:?}", i, cursor); - assert_eq!(pos, cursor, "{}th move is unexpected", i); + assert!(moved, "{}th move didn't happen: {:?}", i + 1, cursor); + assert_eq!(pos, cursor, "{}th position is unexpected", i + 1); } } #[test] -fn search_backward() { +fn search_lines_backward() { #[rustfmt::skip] let mut textarea = TextArea::from([ "fooo foo", @@ -43,8 +43,44 @@ fn search_backward() { for (i, pos) in expected.into_iter().enumerate() { let moved = textarea.search_back(false); let cursor = textarea.cursor(); - assert!(moved, "{}th move didn't happen: {:?}", i, cursor); - assert_eq!(pos, cursor, "{}th move is unexpected", i); + assert!(moved, "{}th move didn't happen: {:?}", i + 1, cursor); + assert_eq!(pos, cursor, "{}th position is unexpected", i + 1); + } +} + +#[test] +fn search_forward_within_line() { + let mut textarea = TextArea::from(["foo fo foo fooo"]); + + // Move to 'f' on 'fo' + textarea.move_cursor(CursorMove::Jump(0, 4)); + + textarea.set_search_pattern("fo+").unwrap(); + + let expected = [(0, 7), (0, 11), (0, 0), (0, 4)]; + for (i, pos) in expected.into_iter().enumerate() { + let moved = textarea.search_forward(false); + let cursor = textarea.cursor(); + assert!(moved, "{}th move didn't happen: {:?}", i + 1, cursor); + assert_eq!(pos, cursor, "{}th position is unexpected", i + 1); + } +} + +#[test] +fn search_backward_within_line() { + let mut textarea = TextArea::from(["foo fo foo fooo"]); + + // Move to 'f' on 'fo' + textarea.move_cursor(CursorMove::Jump(0, 4)); + + textarea.set_search_pattern("fo+").unwrap(); + + let expected = [(0, 0), (0, 11), (0, 7), (0, 4)]; + for (i, pos) in expected.into_iter().enumerate() { + let moved = textarea.search_back(false); + let cursor = textarea.cursor(); + assert!(moved, "{}th move didn't happen: {:?}", i + 1, cursor); + assert_eq!(pos, cursor, "{}th position is unexpected", i + 1); } } @@ -71,13 +107,26 @@ fn accept_cursor_position() { #[test] fn set_search_pattern() { - let mut textarea = TextArea::default(); + let mut textarea = TextArea::from(["foo"]); assert!(textarea.search_pattern().is_none()); + assert!(!textarea.search_forward(true)); + assert!(!textarea.search_forward(false)); + assert!(!textarea.search_back(true)); + assert!(!textarea.search_back(false)); + textarea.set_search_pattern("(foo").unwrap_err(); assert!(textarea.search_pattern().is_none()); textarea.set_search_pattern("(fo+)ba+r").unwrap(); let pat = textarea.search_pattern().unwrap(); assert_eq!(pat.as_str(), "(fo+)ba+r"); + + textarea.set_search_pattern("fo+").unwrap(); + textarea.set_search_pattern("").unwrap(); + assert!(textarea.search_pattern().is_none()); + assert!(!textarea.search_forward(true)); + assert!(!textarea.search_forward(false)); + assert!(!textarea.search_back(true)); + assert!(!textarea.search_back(false)); }