use abstracttui::base::{Rect, Size};
use abstracttui::layout::{measure, solve, Align, Edges, LayoutId, LayoutTree, Style, Track};
fn wrapping_leaf(tree: &mut LayoutTree, style: Style) -> LayoutId {
tree.add_leaf(
style,
Box::new(|inner: Size| {
let w = inner.w.max(1);
Size::new(inner.w, ((120 + w - 1) / w).max(1))
}),
)
}
fn side_margins() -> Style {
Style::default().margin(Edges::hv(3, 0))
}
fn needed_rows(w: i32) -> i32 {
(120 + w.max(1) - 1) / w.max(1)
}
fn assert_tall_enough(tree: &LayoutTree, leaf: LayoutId, path: &str) {
let l = tree.rect(leaf);
let needs = needed_rows(l.w);
assert!(
l.h >= needs,
"{path}: leaf {l:?} is solved to {} columns, which wraps to \
{needs} rows, but it was given only {}",
l.w,
l.h
);
}
#[test]
fn control_flex_column_is_tall_enough() {
let mut tree = LayoutTree::new();
let root = tree.add(Style::column());
let leaf = wrapping_leaf(&mut tree, side_margins());
tree.add_child(root, leaf);
solve(&mut tree, root, Rect::new(0, 0, 40, 20));
assert_eq!(tree.rect(leaf).w, 34, "control: solved width");
assert_tall_enough(&tree, leaf, "flex");
}
#[test]
fn wrap_column_child_is_tall_enough_for_its_own_wrap() {
let mut tree = LayoutTree::new();
let root = tree.add(Style::column().wrap());
let leaf = wrapping_leaf(&mut tree, side_margins());
tree.add_child(root, leaf);
solve(&mut tree, root, Rect::new(0, 0, 40, 20));
assert_tall_enough(&tree, leaf, "wrap column");
}
#[test]
fn wrap_row_child_is_tall_enough_with_align_start() {
let mut tree = LayoutTree::new();
let root = tree.add(Style::row().wrap().align_items(Align::Start));
let leaf = wrapping_leaf(&mut tree, side_margins());
tree.add_child(root, leaf);
solve(&mut tree, root, Rect::new(0, 0, 40, 20));
assert_tall_enough(&tree, leaf, "wrap row align-start");
}
#[test]
fn grid_child_is_tall_enough_for_its_own_wrap() {
let mut tree = LayoutTree::new();
let root = tree.add(
Style::default()
.grid(vec![Track::Auto], vec![])
.align_items(Align::Start),
);
let leaf = wrapping_leaf(&mut tree, side_margins());
tree.add_child(root, leaf);
solve(&mut tree, root, Rect::new(0, 0, 40, 20));
assert_tall_enough(&tree, leaf, "grid");
}
#[test]
fn intrinsic_measure_of_a_wrap_container_deducts_child_margins() {
let mut tree = LayoutTree::new();
let wrapper = tree.add(Style::column().wrap());
let leaf = wrapping_leaf(&mut tree, side_margins());
tree.add_child(wrapper, leaf);
let m = measure(&tree, wrapper, Size::new(40, 20));
assert_eq!(m.h, 4, "wrap container measured height");
}