1
0
зеркало из https://github.com/glebtv/tui-textarea.git synced 2026-09-03 14:26:17 +03:00

add tests for TextArea::insert_str

Этот коммит содержится в:
rhysd
2023-11-01 21:27:59 +09:00
родитель 2a447d45c2
Коммит 8bc9ff4dba
2 изменённых файлов: 365 добавлений и 5 удалений

Просмотреть файл

@@ -13,7 +13,6 @@ use crate::widget::{Renderer, Viewport};
use crate::word::{find_word_end_forward, find_word_start_backward};
#[cfg(feature = "ratatui")]
use ratatui::text::Line;
use std::mem;
#[cfg(feature = "tuirs")]
use tui::text::Spans as Line;
use unicode_width::UnicodeWidthChar as _;
@@ -625,11 +624,11 @@ impl<'a> TextArea<'a> {
/// textarea.insert_str(", world\ngoodbye, world");
/// assert_eq!(textarea.lines(), ["hello, world", "goodbye, world"]);
/// ```
pub fn insert_str(&mut self, s: &str) -> bool {
let mut lines: Vec<_> = s.lines().map(ToString::to_string).collect();
pub fn insert_str<S: AsRef<str>>(&mut self, s: S) -> bool {
let mut lines: Vec<_> = s.as_ref().lines().map(ToString::to_string).collect();
match lines.len() {
0 => false,
1 => self.insert_piece(mem::take(&mut lines[0])),
1 => self.insert_piece(lines.remove(0)),
_ => self.insert_chunk(lines),
}
}
@@ -647,7 +646,7 @@ impl<'a> TextArea<'a> {
self.cursor = (
row + chunk.len() - 1,
col + chunk[chunk.len() - 1].chars().count(),
chunk[chunk.len() - 1].chars().count(),
);
let edit = EditKind::InsertChunk(chunk, i);

Просмотреть файл

@@ -24,3 +24,364 @@ fn test_insert_soft_tab() {
assert_eq!(line, expected, "{:?}", test);
}
}
#[test]
fn test_insert_str_one_line() {
for i in 0..="ab".len() {
let mut t = TextArea::from(["ab"]);
t.move_cursor(CursorMove::Jump(0, i as u16));
assert!(t.insert_str("x"), "{}", i);
let have = &t.lines()[0];
let mut want = "ab".to_string();
want.insert(i, 'x');
assert_eq!(&want, have, "{}", i);
}
}
#[test]
fn test_insert_str_empty_line() {
let mut t = TextArea::from(["ab"]);
assert!(!t.insert_str(""));
assert_eq!(t.lines(), ["ab"]);
}
#[test]
fn test_insert_str_multiple_lines() {
#[rustfmt::skip]
let tests = [
// Positions
(
// Text before edit
&[
"ab",
"cd",
"ef",
][..],
// (row, offset) position before edit
(0, 0),
// String to be inserted
"x\ny",
// (row, offset) position after edit
(1, 1),
// Text after edit
&[
"x",
"yab",
"cd",
"ef",
][..],
),
(
&[
"ab",
"cd",
"ef",
][..],
(0, 1),
"x\ny",
(1, 1),
&[
"ax",
"yb",
"cd",
"ef",
][..],
),
(
&[
"ab",
"cd",
"ef",
][..],
(0, 2),
"x\ny",
(1, 1),
&[
"abx",
"y",
"cd",
"ef",
][..],
),
(
&[
"ab",
"cd",
"ef",
][..],
(1, 0),
"x\ny",
(2, 1),
&[
"ab",
"x",
"ycd",
"ef",
][..],
),
(
&[
"ab",
"cd",
"ef",
][..],
(1, 1),
"x\ny",
(2, 1),
&[
"ab",
"cx",
"yd",
"ef",
][..],
),
(
&[
"ab",
"cd",
"ef",
][..],
(1, 2),
"x\ny",
(2, 1),
&[
"ab",
"cdx",
"y",
"ef",
][..],
),
(
&[
"ab",
"cd",
"ef",
][..],
(2, 0),
"x\ny",
(3, 1),
&[
"ab",
"cd",
"x",
"yef",
][..],
),
(
&[
"ab",
"cd",
"ef",
][..],
(2, 1),
"x\ny",
(3, 1),
&[
"ab",
"cd",
"ex",
"yf",
][..],
),
(
&[
"ab",
"cd",
"ef",
][..],
(2, 2),
"x\ny",
(3, 1),
&[
"ab",
"cd",
"efx",
"y",
][..],
),
// More than 2 lines
(
&[
"ab",
"cd",
"ef",
][..],
(1, 1),
"x\ny\nz\nw",
(4, 1),
&[
"ab",
"cx",
"y",
"z",
"wd",
"ef",
][..],
),
// Empty lines
(
&[
"",
"",
"",
][..],
(0, 0),
"x\ny\nz",
(2, 1),
&[
"x",
"y",
"z",
"",
"",
][..],
),
(
&[
"",
"",
"",
][..],
(1, 0),
"x\ny\nz",
(3, 1),
&[
"",
"x",
"y",
"z",
"",
][..],
),
(
&[
"",
"",
"",
][..],
(2, 0),
"x\ny\nz",
(4, 1),
&[
"",
"",
"x",
"y",
"z",
][..],
),
// Empty buffer
(
&[
"",
][..],
(0, 0),
"x\ny\nz",
(2, 1),
&[
"x",
"y",
"z",
][..],
),
// Insert empty lines
(
&[
"ab",
"cd",
"ef",
][..],
(0, 0),
"\n\n\n",
(2, 0),
&[
"",
"",
"ab",
"cd",
"ef",
][..],
),
(
&[
"ab",
"cd",
"ef",
][..],
(1, 0),
"\n\n\n",
(3, 0),
&[
"ab",
"",
"",
"cd",
"ef",
][..],
),
(
&[
"ab",
"cd",
"ef",
][..],
(1, 1),
"\n\n\n",
(3, 0),
&[
"ab",
"c",
"",
"d",
"ef",
][..],
),
(
&[
"ab",
"cd",
"ef",
][..],
(1, 2),
"\n\n\n",
(3, 0),
&[
"ab",
"cd",
"",
"",
"ef",
][..],
),
(
&[
"ab",
"cd",
"ef",
][..],
(2, 2),
"\n\n\n",
(4, 0),
&[
"ab",
"cd",
"ef",
"",
"",
][..],
),
];
for test in tests {
let (before, before_pos, input, after_pos, expected) = test;
let mut t = TextArea::from(before.iter().map(|s| s.to_string()));
let (row, col) = before_pos;
t.move_cursor(CursorMove::Jump(row, col));
assert!(t.insert_str(input), "{:?}", test);
assert_eq!(t.cursor(), after_pos, "{:?}", test);
assert_eq!(t.lines(), expected, "{:?}", test);
}
}