use ratatui_core::text::{Line, Span};
use crate::components::{Boxed, Flex, Scroll, ScrollState, StatusBar, Text};
use crate::overlay::OverlaySpec;
use crate::style::Theme;
use crate::surface::Surface;
use crate::test_support::{buffer, row};
use crate::view::{RenderCtx, View, element};
#[test]
fn scroll_and_overlay_survive_tiny_screens() {
use ratatui_core::layout::Rect;
let lines: Vec<Line<'static>> = (0..50).map(|i| Line::from(format!("l{i}"))).collect();
let mut st = ScrollState::new();
st.clamp(50, 1);
let theme = Theme::default();
let ctx = RenderCtx::new(&theme);
let mut buf = buffer(1, 1);
let area = buf.area;
let mut surface = Surface::new(&mut buf, area);
Scroll::new(lines, &st).render(area, &mut surface, &ctx);
for (w, h) in [(0u16, 0u16), (1, 1), (2, 3), (5, 5)] {
let screen = Rect::new(0, 0, w, h);
let rect = OverlaySpec::centered(80, 80).min_size(4, 4).resolve(screen);
assert!(rect.right() <= screen.right(), "overlay exceeds {screen:?}");
assert!(
rect.bottom() <= screen.bottom(),
"overlay exceeds {screen:?}"
);
}
}
#[test]
fn nested_flex_tree_lays_out_status_and_body() {
let theme = Theme::default();
let mut buf = buffer(24, 6);
let area = buf.area;
let body = Boxed::new(element(Text::raw("hi"))).title("Body");
let status = StatusBar::new().left(vec![Span::raw("model: sim")]);
let tree = Flex::column()
.grow(1, element(body))
.fixed(1, element(status));
let ctx = RenderCtx::new(&theme);
let mut surface = Surface::new(&mut buf, area);
tree.render(area, &mut surface, &ctx);
assert!(row(&buf, 5).starts_with("model: sim"));
assert!(row(&buf, 0).contains("Body"));
assert_eq!(buf[(0, 0)].symbol(), "╭");
}