use ratatui::prelude::*;
use ratatui::widgets::Paragraph;
use super::{font, theme};
pub fn frame(f: &mut Frame, area: Rect, title: &str) -> Rect {
let block = theme::panel_block(title, false);
let inner = block.inner(area);
f.render_widget(block, area);
inner
}
pub fn unavailable(f: &mut Frame, inner: Rect) {
f.render_widget(Paragraph::new("n/a").style(Style::default().fg(theme::DIM)), inner);
}
pub const HERO_ROWS: u16 = 5;
pub fn hero(f: &mut Frame, area: Rect, precise: &str, coarse: &str, color: Color) {
f.render_widget(Paragraph::new(font::hero_lines(precise, coarse, area.width, color)), area);
}
pub fn readout(f: &mut Frame, area: Rect, text: &str, color: Color) {
f.render_widget(
Paragraph::new(Span::styled(text.to_string(), Style::default().fg(color).bold())),
area,
);
}
#[cfg(test)]
mod tests {
use ratatui::backend::TestBackend;
use ratatui::layout::Rect;
use ratatui::Terminal;
use super::super::theme;
use crate::app::App;
type CardFn = fn(&mut ratatui::Frame, Rect, &App);
#[test]
fn every_gauge_card_renders_the_same_empty_state() {
let app = App::new(false);
let cards: [(&str, CardFn); 4] = [
("CPU", crate::ui::cpu::render),
("Temp", crate::ui::temp::render),
("Power", crate::ui::power::render),
("Memory", crate::ui::memory::render),
];
for (title, render) in cards {
let mut t = Terminal::new(TestBackend::new(40, 12)).unwrap();
t.draw(|f| render(f, f.area(), &app)).unwrap();
let buf = t.backend().buffer().clone();
let text: String = buf.content().iter().map(|c| c.symbol()).collect();
assert!(text.contains(title), "{title} card lost its title");
assert!(text.contains("n/a"), "{title} card should say n/a with no sample");
assert!(
buf.content().iter().all(|c| c.style().bg != Some(theme::ACCENT)),
"{title} card painted a hero number with no data behind it"
);
}
}
}