Compare commits

...

3 Commits

Author SHA1 Message Date
Dheepak Krishnamurthy
13de3daf73 test(Scrollbar): port test 🚨 2024-01-19 16:41:39 -05:00
Dheepak Krishnamurthy
61e3ab5f99 test(Scrollbar): backport scrollbar tests and make the tests pass 🚨 2024-01-19 10:59:10 -05:00
Dheepak Krishnamurthy
942aad5796 test(Scrollbar): backport scrollbar tests 🚨 2024-01-19 10:50:54 -05:00

View File

@@ -631,7 +631,10 @@ impl<'a> StatefulWidget for Scrollbar<'a> {
#[cfg(test)]
mod tests {
use itertools::Itertools;
use rstest::rstest;
use strum::ParseError;
use unicode_width::UnicodeWidthStr;
use super::*;
use crate::{
@@ -705,29 +708,34 @@ mod tests {
);
}
#[test]
fn test_renders_empty_with_content_length_is_zero() {
let mut buffer = Buffer::empty(Rect::new(0, 0, 2, 8));
let mut state = ScrollbarState::default().position(0);
#[rstest]
#[case(" ", 0)]
#[case("████████", 1)]
#[case("████████", 2)]
#[case("████████", 3)]
#[case("████████", 4)]
#[case("████████", 5)]
#[case("████████", 6)]
#[case("████████", 7)]
#[case("████████", 8)]
fn test_renders_empty_with_content_length_is_zero(
#[case] expected: &str,
#[case] content_length: usize,
) {
let size = expected.width();
let mut buffer = Buffer::empty(Rect::new(0, 0, 2, size as u16));
let mut state = ScrollbarState::new(content_length).position(0);
Scrollbar::default()
.begin_symbol(None)
.end_symbol(None)
.render(buffer.area, &mut buffer, &mut state);
assert_buffer_eq!(
buffer,
Buffer::with_lines(vec![" ", " ", " ", " ", " ", " ", " ", " "])
);
let mut buffer = Buffer::empty(Rect::new(0, 0, 2, 8));
let mut state = ScrollbarState::new(8).position(0);
Scrollbar::default()
.begin_symbol(None)
.end_symbol(None)
.render(buffer.area, &mut buffer, &mut state);
assert_buffer_eq!(
buffer,
Buffer::with_lines(vec!["", "", "", "", "", "", "", ""])
);
let empty_string: String = " ".repeat(size);
let bar = empty_string
.chars()
.zip(expected.chars())
.map(|(a, b)| format!("{a}{b}"))
.collect_vec();
assert_buffer_eq!(buffer, Buffer::with_lines(bar));
}
#[test]
@@ -1128,4 +1136,341 @@ mod tests {
assert_buffer_eq!(buffer, Buffer::with_lines(expected.clone()));
}
}
#[rstest]
#[case("██", 0, 2, "position_0")]
#[case("██", 1, 2, "position_1")]
fn render_scrollbar_simplest(
#[case] expected: &str,
#[case] position: usize,
#[case] content_length: usize,
#[case] assertion_message: &str,
) {
let size = expected.width() as u16;
let mut buffer = Buffer::empty(Rect::new(0, 0, size, 1));
let mut state = ScrollbarState::default()
.position(position)
.content_length(content_length);
Scrollbar::default()
.orientation(ScrollbarOrientation::HorizontalBottom)
.begin_symbol(None)
.end_symbol(None)
.render(buffer.area, &mut buffer, &mut state);
assert_eq!(
buffer,
Buffer::with_lines(vec![expected]),
"{}",
assertion_message
);
}
#[rstest]
#[case("##########", 0, 10, "position_0")]
#[case("##########", 1, 10, "position_1")]
#[case("##########", 2, 10, "position_2")]
#[case("##########", 3, 10, "position_3")]
#[case("##########", 4, 10, "position_4")]
#[case("##########", 5, 10, "position_5")]
#[case("##########", 6, 10, "position_6")]
#[case("##########", 7, 10, "position_7")]
#[case("##########", 8, 10, "position_8")]
#[case("##########", 9, 10, "position_9")]
fn render_scrollbar_simple(
#[case] expected: &str,
#[case] position: usize,
#[case] content_length: usize,
#[case] assertion_message: &str,
) {
let size = expected.width();
let mut buffer = Buffer::empty(Rect::new(0, 0, size as u16, 1));
let mut state = ScrollbarState::default()
.position(position)
.content_length(content_length);
Scrollbar::default()
.orientation(ScrollbarOrientation::HorizontalTop)
.begin_symbol(None)
.end_symbol(None)
.track_symbol(Some("-"))
.thumb_symbol("#")
.render(buffer.area, &mut buffer, &mut state);
assert_eq!(
buffer,
Buffer::with_lines(vec![expected]),
"{}",
assertion_message,
);
}
#[rstest]
#[case(" ", 0, 0, "position_0")]
fn render_scrollbar_nobar(
#[case] expected: &str,
#[case] position: usize,
#[case] content_length: usize,
#[case] assertion_message: &str,
) {
let size = expected.width();
let mut buffer = Buffer::empty(Rect::new(0, 0, size as u16, 1));
let mut state = ScrollbarState::default()
.position(position)
.content_length(content_length);
Scrollbar::default()
.orientation(ScrollbarOrientation::HorizontalTop)
.begin_symbol(None)
.end_symbol(None)
.track_symbol(Some("-"))
.thumb_symbol("#")
.render(buffer.area, &mut buffer, &mut state);
assert_eq!(
buffer,
Buffer::with_lines(vec![expected]),
"{}",
assertion_message,
);
}
#[rstest]
#[case("##########", 0, 1, "position_0")]
fn render_scrollbar_fullbar(
#[case] expected: &str,
#[case] position: usize,
#[case] content_length: usize,
#[case] assertion_message: &str,
) {
let size = expected.width();
let mut buffer = Buffer::empty(Rect::new(0, 0, size as u16, 1));
let mut state = ScrollbarState::default()
.position(position)
.content_length(content_length);
Scrollbar::default()
.orientation(ScrollbarOrientation::HorizontalTop)
.begin_symbol(None)
.end_symbol(None)
.track_symbol(Some("-"))
.thumb_symbol("#")
.render(buffer.area, &mut buffer, &mut state);
assert_eq!(
buffer,
Buffer::with_lines(vec![expected]),
"{}",
assertion_message,
);
}
#[rstest]
#[case("##########", 0, 2, "position_0")]
#[case("##########", 1, 2, "position_1")]
fn render_scrollbar_almost_fullbar(
#[case] expected: &str,
#[case] position: usize,
#[case] content_length: usize,
#[case] assertion_message: &str,
) {
let size = expected.width();
let mut buffer = Buffer::empty(Rect::new(0, 0, size as u16, 1));
let mut state = ScrollbarState::default()
.position(position)
.content_length(content_length);
Scrollbar::default()
.orientation(ScrollbarOrientation::HorizontalTop)
.begin_symbol(None)
.end_symbol(None)
.track_symbol(Some("-"))
.thumb_symbol("#")
.render(buffer.area, &mut buffer, &mut state);
assert_eq!(
buffer,
Buffer::with_lines(vec![expected]),
"{}",
assertion_message,
);
}
#[rstest]
#[case("██████████", 0, 10, "position_0")]
#[case("██████████", 1, 10, "position_1")]
#[case("██████████", 2, 10, "position_2")]
#[case("██████████", 3, 10, "position_3")]
#[case("██████████", 4, 10, "position_4")]
#[case("██████████", 5, 10, "position_5")]
#[case("██████████", 6, 10, "position_6")]
#[case("██████████", 7, 10, "position_7")]
#[case("██████████", 8, 10, "position_8")]
#[case("██████████", 9, 10, "position_9")]
#[case("██████████", 100, 10, "position_out_of_bounds")]
fn render_scrollbar_without_symbols(
#[case] expected: &str,
#[case] position: usize,
#[case] content_length: usize,
#[case] assertion_message: &str,
) {
let size = expected.width() as u16;
let mut buffer = Buffer::empty(Rect::new(0, 0, size, 1));
let mut state = ScrollbarState::default()
.position(position)
.content_length(content_length);
Scrollbar::default()
.orientation(ScrollbarOrientation::HorizontalBottom)
.begin_symbol(None)
.end_symbol(None)
.render(buffer.area, &mut buffer, &mut state);
assert_eq!(
buffer,
Buffer::with_lines(vec![expected]),
"{}",
assertion_message
);
}
#[rstest]
#[case("<######-->", 0, 10, "position_0")]
#[case("<######-->", 1, 10, "position_1")]
#[case("<######-->", 2, 10, "position_2")]
#[case("<-######->", 3, 10, "position_3")]
#[case("<-######->", 4, 10, "position_4")]
#[case("<-######->", 5, 10, "position_5")]
#[case("<-######->", 6, 10, "position_6")]
#[case("<-######->", 7, 10, "position_7")]
#[case("<--######>", 8, 10, "position_8")]
#[case("<--######>", 9, 10, "position_9")]
#[case("<--######>", 10, 10, "position_one_out_of_bounds")]
#[case("<--######>", 15, 10, "position_few_out_of_bounds")]
#[case("<--######>", 500, 10, "position_very_many_out_of_bounds")]
fn render_scrollbar_with_symbols(
#[case] expected: &str,
#[case] position: usize,
#[case] content_length: usize,
#[case] assertion_message: &str,
) {
let size = expected.width() as u16;
let mut buffer = Buffer::empty(Rect::new(0, 0, size, 1));
let mut state = ScrollbarState::default()
.position(position)
.content_length(content_length);
Scrollbar::default()
.orientation(ScrollbarOrientation::HorizontalTop)
.begin_symbol(Some("<"))
.end_symbol(Some(">"))
.track_symbol(Some("-"))
.thumb_symbol("#")
.render(buffer.area, &mut buffer, &mut state);
assert_eq!(
buffer,
Buffer::with_lines(vec![expected]),
"{}",
assertion_message,
);
}
#[rstest]
#[case("██████████", 0, 10, "position_0")]
#[case("██████████", 1, 10, "position_1")]
#[case("██████████", 2, 10, "position_2")]
#[case("██████████", 3, 10, "position_3")]
#[case("██████████", 4, 10, "position_4")]
#[case("██████████", 5, 10, "position_5")]
#[case("██████████", 6, 10, "position_6")]
#[case("██████████", 7, 10, "position_7")]
#[case("██████████", 8, 10, "position_8")]
#[case("██████████", 9, 10, "position_9")]
#[case("██████████", 100, 10, "position_out_of_bounds")]
fn render_scrollbar_twoline_horizontal(
#[case] expected: &str,
#[case] position: usize,
#[case] content_length: usize,
#[case] assertion_message: &str,
) {
let size = expected.width() as u16;
let mut buffer = Buffer::empty(Rect::new(0, 0, size, 2));
let mut state = ScrollbarState::default()
.position(position)
.content_length(content_length);
Scrollbar::default()
.orientation(ScrollbarOrientation::HorizontalBottom)
.begin_symbol(None)
.end_symbol(None)
.render(buffer.area, &mut buffer, &mut state);
let empty_string: String = " ".repeat(size as usize);
assert_eq!(
buffer,
Buffer::with_lines(vec![&empty_string, expected]),
"{}",
assertion_message
);
let mut buffer = Buffer::empty(Rect::new(0, 0, size, 2));
let mut state = ScrollbarState::default()
.position(position)
.content_length(content_length);
Scrollbar::default()
.orientation(ScrollbarOrientation::HorizontalTop)
.begin_symbol(None)
.end_symbol(None)
.render(buffer.area, &mut buffer, &mut state);
let empty_string: String = " ".repeat(size as usize);
assert_eq!(
buffer,
Buffer::with_lines(vec![expected, &empty_string]),
"{}",
assertion_message
);
}
#[rstest]
#[case("<######-->", 0, 10, "position_0")]
#[case("<######-->", 1, 10, "position_1")]
#[case("<######-->", 2, 10, "position_2")]
#[case("<-######->", 3, 10, "position_3")]
#[case("<-######->", 4, 10, "position_4")]
#[case("<-######->", 5, 10, "position_5")]
#[case("<-######->", 6, 10, "position_6")]
#[case("<-######->", 7, 10, "position_7")]
#[case("<--######>", 8, 10, "position_8")]
#[case("<--######>", 9, 10, "position_9")]
#[case("<--######>", 10, 10, "position_one_out_of_bounds")]
fn render_scrollbar_twoline_vertical(
#[case] expected: &str,
#[case] position: usize,
#[case] content_length: usize,
#[case] assertion_message: &str,
) {
let size = expected.width() as u16;
let mut buffer = Buffer::empty(Rect::new(0, 0, 2, size));
let mut state = ScrollbarState::default()
.position(position)
.content_length(content_length);
Scrollbar::default()
.orientation(ScrollbarOrientation::VerticalRight)
.begin_symbol(Some("<"))
.end_symbol(Some(">"))
.track_symbol(Some("-"))
.thumb_symbol("#")
.render(buffer.area, &mut buffer, &mut state);
let empty_string: String = " ".repeat(size as usize);
let bar = empty_string
.chars()
.zip(expected.chars())
.map(|(a, b)| format!("{a}{b}"))
.collect_vec();
assert_eq!(buffer, Buffer::with_lines(bar), "{}", assertion_message);
let mut buffer = Buffer::empty(Rect::new(0, 0, 2, size));
let mut state = ScrollbarState::default()
.position(position)
.content_length(content_length);
Scrollbar::default()
.orientation(ScrollbarOrientation::VerticalLeft)
.begin_symbol(Some("<"))
.end_symbol(Some(">"))
.track_symbol(Some("-"))
.thumb_symbol("#")
.render(buffer.area, &mut buffer, &mut state);
let empty_string: String = " ".repeat(size as usize);
let bar = expected
.chars()
.zip(empty_string.chars())
.map(|(a, b)| format!("{a}{b}"))
.collect_vec();
assert_eq!(buffer, Buffer::with_lines(bar), "{}", assertion_message);
}
}