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, items: Vec>, 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); } }