aboutsummaryrefslogtreecommitdiff
path: root/helix-tui/tests/widgets_list.rs
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-05-09 08:52:55 +0000
committerBlaž Hrastnik2021-05-09 08:52:55 +0000
commit35606a3daa7ee273845a12f3e03728e0ae23928e (patch)
tree643684eaff6627dbebc4156d33fdb541bf87bbd9 /helix-tui/tests/widgets_list.rs
parent6c705f09e88a4b63c4ed854bc9e956b0539ca8af (diff)
Inline tui as helix-tui fork.
We only rely on some of the rendering primitives and implement our Cursive-style compositor on top.
Diffstat (limited to 'helix-tui/tests/widgets_list.rs')
-rw-r--r--helix-tui/tests/widgets_list.rs88
1 files changed, 88 insertions, 0 deletions
diff --git a/helix-tui/tests/widgets_list.rs b/helix-tui/tests/widgets_list.rs
new file mode 100644
index 00000000..e59accd8
--- /dev/null
+++ b/helix-tui/tests/widgets_list.rs
@@ -0,0 +1,88 @@
+use helix_tui::{
+ backend::TestBackend,
+ buffer::Buffer,
+ layout::Rect,
+ style::{Color, Style},
+ symbols,
+ widgets::{Block, Borders, List, ListItem, ListState},
+ Terminal,
+};
+
+#[test]
+fn widgets_list_should_highlight_the_selected_item() {
+ let backend = TestBackend::new(10, 3);
+ let mut terminal = Terminal::new(backend).unwrap();
+ let mut state = ListState::default();
+ state.select(Some(1));
+ terminal
+ .draw(|f| {
+ let size = f.size();
+ let items = vec![
+ ListItem::new("Item 1"),
+ ListItem::new("Item 2"),
+ ListItem::new("Item 3"),
+ ];
+ let list = List::new(items)
+ .highlight_style(Style::default().bg(Color::Yellow))
+ .highlight_symbol(">> ");
+ f.render_stateful_widget(list, size, &mut state);
+ })
+ .unwrap();
+ let mut expected = Buffer::with_lines(vec![" Item 1 ", ">> Item 2 ", " Item 3 "]);
+ for x in 0..10 {
+ expected.get_mut(x, 1).set_bg(Color::Yellow);
+ }
+ terminal.backend().assert_buffer(&expected);
+}
+
+#[test]
+fn widgets_list_should_truncate_items() {
+ let backend = TestBackend::new(10, 2);
+ let mut terminal = Terminal::new(backend).unwrap();
+
+ struct TruncateTestCase<'a> {
+ selected: Option<usize>,
+ items: Vec<ListItem<'a>>,
+ expected: Buffer,
+ }
+
+ let cases = vec![
+ // An item is selected
+ TruncateTestCase {
+ selected: Some(0),
+ items: vec![
+ ListItem::new("A very long line"),
+ ListItem::new("A very long line"),
+ ],
+ expected: Buffer::with_lines(vec![
+ format!(">> A ve{} ", symbols::line::VERTICAL),
+ format!(" A ve{} ", symbols::line::VERTICAL),
+ ]),
+ },
+ // No item is selected
+ TruncateTestCase {
+ selected: None,
+ items: vec![
+ ListItem::new("A very long line"),
+ ListItem::new("A very long line"),
+ ],
+ expected: Buffer::with_lines(vec![
+ format!("A very {} ", symbols::line::VERTICAL),
+ format!("A very {} ", symbols::line::VERTICAL),
+ ]),
+ },
+ ];
+ for case in cases {
+ let mut state = ListState::default();
+ state.select(case.selected);
+ terminal
+ .draw(|f| {
+ let list = List::new(case.items.clone())
+ .block(Block::default().borders(Borders::RIGHT))
+ .highlight_symbol(">> ");
+ f.render_stateful_widget(list, Rect::new(0, 0, 8, 2), &mut state);
+ })
+ .unwrap();
+ terminal.backend().assert_buffer(&case.expected);
+ }
+}