ratatui 0.26.2

A library that's all about cooking up terminal user interfaces
Documentation
use std::io;

use ratatui::{
    backend::TestBackend,
    buffer::Buffer,
    layout::Rect,
    style::{Color, Style, Stylize},
    widgets::{BarChart, Block, Borders, Paragraph},
    Terminal,
};

#[test]
fn barchart_can_be_stylized() {
    let barchart = BarChart::default()
        .on_white()
        .bar_style(Style::new().red())
        .bar_width(2)
        .value_style(Style::new().green())
        .label_style(Style::new().blue())
        .data(&[("A", 1), ("B", 2), ("C", 3)])
        .max(3);

    let area = Rect::new(0, 0, 9, 5);
    let mut terminal = Terminal::new(TestBackend::new(9, 6)).unwrap();
    terminal
        .draw(|f| {
            f.render_widget(barchart, area);
        })
        .unwrap();

    let mut expected = Buffer::with_lines(vec![
        "      ██ ",
        "   ▅▅ ██ ",
        "▂▂ ██ ██ ",
        "1█ 2█ 3█ ",
        "A  B  C  ",
        "         ",
    ]);
    for y in area.y..area.height {
        // background
        for x in area.x..area.width {
            expected.get_mut(x, y).set_bg(Color::White);
        }
        // bars
        for x in [0, 1, 3, 4, 6, 7] {
            expected.get_mut(x, y).set_fg(Color::Red);
        }
    }
    // values
    for x in 0..3 {
        expected.get_mut(x * 3, 3).set_fg(Color::Green);
    }
    // labels
    for x in 0..3 {
        expected.get_mut(x * 3, 4).set_fg(Color::Blue);
        expected.get_mut(x * 3 + 1, 4).set_fg(Color::Reset);
    }

    terminal.backend().assert_buffer(&expected);
}

#[test]
fn block_can_be_stylized() -> io::Result<()> {
    let block = Block::default()
        .title("Title".light_blue())
        .on_cyan()
        .cyan()
        .borders(Borders::ALL);

    let area = Rect::new(0, 0, 8, 3);
    let mut terminal = Terminal::new(TestBackend::new(11, 4))?;
    terminal.draw(|f| {
        f.render_widget(block, area);
    })?;

    let mut expected = Buffer::with_lines(vec![
        "┌Title─┐   ",
        "│      │   ",
        "└──────┘   ",
        "           ",
    ]);
    for x in area.x..area.width {
        for y in area.y..area.height {
            expected
                .get_mut(x, y)
                .set_fg(Color::Cyan)
                .set_bg(Color::Cyan);
        }
    }
    for x in 1..=5 {
        expected.get_mut(x, 0).set_fg(Color::LightBlue);
    }

    terminal.backend().assert_buffer(&expected);
    Ok(())
}

#[test]
fn paragraph_can_be_stylized() -> io::Result<()> {
    let paragraph = Paragraph::new("Text".cyan());

    let area = Rect::new(0, 0, 10, 1);
    let mut terminal = Terminal::new(TestBackend::new(10, 1))?;
    terminal.draw(|f| {
        f.render_widget(paragraph, area);
    })?;

    let mut expected = Buffer::with_lines(vec!["Text      "]);
    for x in 0..4 {
        expected.get_mut(x, 0).set_fg(Color::Cyan);
    }
    terminal.backend().assert_buffer(&expected);
    Ok(())
}