| use tui::{ |
| backend::TestBackend, |
| buffer::Buffer, |
| layout::{Alignment, Rect}, |
| style::{Color, Style}, |
| text::Span, |
| widgets::{Block, Borders}, |
| Terminal, |
| }; |
| |
| #[test] |
| fn widgets_block_renders() { |
| let backend = TestBackend::new(10, 10); |
| let mut terminal = Terminal::new(backend).unwrap(); |
| terminal |
| .draw(|f| { |
| let block = Block::default() |
| .title(Span::styled("Title", Style::default().fg(Color::LightBlue))) |
| .borders(Borders::ALL); |
| f.render_widget( |
| block, |
| Rect { |
| x: 0, |
| y: 0, |
| width: 8, |
| height: 8, |
| }, |
| ); |
| }) |
| .unwrap(); |
| let mut expected = Buffer::with_lines(vec![ |
| "┌Title─┐ ", |
| "│ │ ", |
| "│ │ ", |
| "│ │ ", |
| "│ │ ", |
| "│ │ ", |
| "│ │ ", |
| "└──────┘ ", |
| " ", |
| " ", |
| ]); |
| for x in 1..=5 { |
| expected.get_mut(x, 0).set_fg(Color::LightBlue); |
| } |
| terminal.backend().assert_buffer(&expected); |
| } |
| |
| #[test] |
| fn widgets_block_renders_on_small_areas() { |
| let test_case = |block, area: Rect, expected| { |
| let backend = TestBackend::new(area.width, area.height); |
| let mut terminal = Terminal::new(backend).unwrap(); |
| terminal |
| .draw(|f| { |
| f.render_widget(block, area); |
| }) |
| .unwrap(); |
| terminal.backend().assert_buffer(&expected); |
| }; |
| |
| let one_cell_test_cases = [ |
| (Borders::NONE, "T"), |
| (Borders::LEFT, "│"), |
| (Borders::TOP, "T"), |
| (Borders::RIGHT, "│"), |
| (Borders::BOTTOM, "T"), |
| (Borders::ALL, "┌"), |
| ]; |
| for (borders, symbol) in one_cell_test_cases.iter().cloned() { |
| test_case( |
| Block::default().title("Test").borders(borders), |
| Rect { |
| x: 0, |
| y: 0, |
| width: 0, |
| height: 0, |
| }, |
| Buffer::empty(Rect { |
| x: 0, |
| y: 0, |
| width: 0, |
| height: 0, |
| }), |
| ); |
| test_case( |
| Block::default().title("Test").borders(borders), |
| Rect { |
| x: 0, |
| y: 0, |
| width: 1, |
| height: 0, |
| }, |
| Buffer::empty(Rect { |
| x: 0, |
| y: 0, |
| width: 1, |
| height: 0, |
| }), |
| ); |
| test_case( |
| Block::default().title("Test").borders(borders), |
| Rect { |
| x: 0, |
| y: 0, |
| width: 0, |
| height: 1, |
| }, |
| Buffer::empty(Rect { |
| x: 0, |
| y: 0, |
| width: 0, |
| height: 1, |
| }), |
| ); |
| test_case( |
| Block::default().title("Test").borders(borders), |
| Rect { |
| x: 0, |
| y: 0, |
| width: 1, |
| height: 1, |
| }, |
| Buffer::with_lines(vec![symbol]), |
| ); |
| } |
| test_case( |
| Block::default().title("Test").borders(Borders::LEFT), |
| Rect { |
| x: 0, |
| y: 0, |
| width: 4, |
| height: 1, |
| }, |
| Buffer::with_lines(vec!["│Tes"]), |
| ); |
| test_case( |
| Block::default().title("Test").borders(Borders::RIGHT), |
| Rect { |
| x: 0, |
| y: 0, |
| width: 4, |
| height: 1, |
| }, |
| Buffer::with_lines(vec!["Tes│"]), |
| ); |
| test_case( |
| Block::default().title("Test").borders(Borders::RIGHT), |
| Rect { |
| x: 0, |
| y: 0, |
| width: 4, |
| height: 1, |
| }, |
| Buffer::with_lines(vec!["Tes│"]), |
| ); |
| test_case( |
| Block::default() |
| .title("Test") |
| .borders(Borders::LEFT | Borders::RIGHT), |
| Rect { |
| x: 0, |
| y: 0, |
| width: 4, |
| height: 1, |
| }, |
| Buffer::with_lines(vec!["│Te│"]), |
| ); |
| test_case( |
| Block::default().title("Test").borders(Borders::TOP), |
| Rect { |
| x: 0, |
| y: 0, |
| width: 4, |
| height: 1, |
| }, |
| Buffer::with_lines(vec!["Test"]), |
| ); |
| test_case( |
| Block::default().title("Test").borders(Borders::TOP), |
| Rect { |
| x: 0, |
| y: 0, |
| width: 5, |
| height: 1, |
| }, |
| Buffer::with_lines(vec!["Test─"]), |
| ); |
| test_case( |
| Block::default() |
| .title("Test") |
| .borders(Borders::LEFT | Borders::TOP), |
| Rect { |
| x: 0, |
| y: 0, |
| width: 5, |
| height: 1, |
| }, |
| Buffer::with_lines(vec!["┌Test"]), |
| ); |
| test_case( |
| Block::default() |
| .title("Test") |
| .borders(Borders::LEFT | Borders::TOP), |
| Rect { |
| x: 0, |
| y: 0, |
| width: 6, |
| height: 1, |
| }, |
| Buffer::with_lines(vec!["┌Test─"]), |
| ); |
| } |
| |
| #[test] |
| fn widgets_block_title_alignment() { |
| let test_case = |alignment, borders, expected| { |
| let backend = TestBackend::new(15, 2); |
| let mut terminal = Terminal::new(backend).unwrap(); |
| |
| let block = Block::default() |
| .title(Span::styled("Title", Style::default())) |
| .title_alignment(alignment) |
| .borders(borders); |
| |
| let area = Rect { |
| x: 1, |
| y: 0, |
| width: 13, |
| height: 2, |
| }; |
| |
| terminal |
| .draw(|f| { |
| f.render_widget(block, area); |
| }) |
| .unwrap(); |
| |
| terminal.backend().assert_buffer(&expected); |
| }; |
| |
| // title top-left with all borders |
| test_case( |
| Alignment::Left, |
| Borders::ALL, |
| Buffer::with_lines(vec![" ┌Title──────┐ ", " └───────────┘ "]), |
| ); |
| |
| // title top-left without top border |
| test_case( |
| Alignment::Left, |
| Borders::LEFT | Borders::BOTTOM | Borders::RIGHT, |
| Buffer::with_lines(vec![" │Title │ ", " └───────────┘ "]), |
| ); |
| |
| // title top-left with no left border |
| test_case( |
| Alignment::Left, |
| Borders::TOP | Borders::RIGHT | Borders::BOTTOM, |
| Buffer::with_lines(vec![" Title───────┐ ", " ────────────┘ "]), |
| ); |
| |
| // title top-left without right border |
| test_case( |
| Alignment::Left, |
| Borders::LEFT | Borders::TOP | Borders::BOTTOM, |
| Buffer::with_lines(vec![" ┌Title─────── ", " └──────────── "]), |
| ); |
| |
| // title top-left without borders |
| test_case( |
| Alignment::Left, |
| Borders::NONE, |
| Buffer::with_lines(vec![" Title ", " "]), |
| ); |
| |
| // title center with all borders |
| test_case( |
| Alignment::Center, |
| Borders::ALL, |
| Buffer::with_lines(vec![" ┌───Title───┐ ", " └───────────┘ "]), |
| ); |
| |
| // title center without top border |
| test_case( |
| Alignment::Center, |
| Borders::LEFT | Borders::BOTTOM | Borders::RIGHT, |
| Buffer::with_lines(vec![" │ Title │ ", " └───────────┘ "]), |
| ); |
| |
| // title center with no left border |
| test_case( |
| Alignment::Center, |
| Borders::TOP | Borders::RIGHT | Borders::BOTTOM, |
| Buffer::with_lines(vec![" ────Title───┐ ", " ────────────┘ "]), |
| ); |
| |
| // title center without right border |
| test_case( |
| Alignment::Center, |
| Borders::LEFT | Borders::TOP | Borders::BOTTOM, |
| Buffer::with_lines(vec![" ┌───Title──── ", " └──────────── "]), |
| ); |
| |
| // title center without borders |
| test_case( |
| Alignment::Center, |
| Borders::NONE, |
| Buffer::with_lines(vec![" Title ", " "]), |
| ); |
| |
| // title top-right with all borders |
| test_case( |
| Alignment::Right, |
| Borders::ALL, |
| Buffer::with_lines(vec![" ┌──────Title┐ ", " └───────────┘ "]), |
| ); |
| |
| // title top-right without top border |
| test_case( |
| Alignment::Right, |
| Borders::LEFT | Borders::BOTTOM | Borders::RIGHT, |
| Buffer::with_lines(vec![" │ Title│ ", " └───────────┘ "]), |
| ); |
| |
| // title top-right with no left border |
| test_case( |
| Alignment::Right, |
| Borders::TOP | Borders::RIGHT | Borders::BOTTOM, |
| Buffer::with_lines(vec![" ───────Title┐ ", " ────────────┘ "]), |
| ); |
| |
| // title top-right without right border |
| test_case( |
| Alignment::Right, |
| Borders::LEFT | Borders::TOP | Borders::BOTTOM, |
| Buffer::with_lines(vec![" ┌───────Title ", " └──────────── "]), |
| ); |
| |
| // title top-right without borders |
| test_case( |
| Alignment::Right, |
| Borders::NONE, |
| Buffer::with_lines(vec![" Title ", " "]), |
| ); |
| } |