use kaolin::{
Kaolin, fit, fixed, grow, sizing,
style::{
FlexStyle, TextStyle,
layout::{Alignment, Direction, Justification, Layout},
padding::Padding,
},
};
mod common;
use common::*;
#[test]
fn basic_nested_containers() {
let kaolin = Kaolin::new((800, 600), measure_text);
let mut commands = kaolin.draw::<()>(|k| {
k.styled(
FlexStyle::new().sizing(sizing!(fixed!(800.0), fixed!(600.0))),
|k| {
k.styled(
FlexStyle::new().sizing(sizing!(fixed!(400.0), fixed!(300.0))),
|k| k.text("Nested Text", TextStyle::new()),
)
},
)
});
assert_multiple!(
commands.next(),
assert_size((800.0, 600.0)),
assert_position((0.0, 0.0))
);
assert_multiple!(
commands.next(),
assert_size((400.0, 300.0)),
assert_position((0.0, 0.0))
);
assert_multiple!(
commands.next(),
assert_text_content("Nested Text"),
assert_position((0.0, 0.0))
);
}
#[test]
fn multi_level_nesting_different_directions() {
let kaolin = Kaolin::new((800, 600), measure_text);
let mut commands = kaolin.draw::<()>(|k| {
k.styled(
FlexStyle::new()
.sizing(sizing!(fixed!(800.0), fixed!(600.0)))
.layout(Layout::new().direction(Direction::LeftToRight)),
|k| {
k.styled(
FlexStyle::new()
.sizing(sizing!(fixed!(400.0), fixed!(600.0)))
.layout(Layout::new().direction(Direction::TopToBottom)),
|k| {
k.styled(
FlexStyle::new().sizing(sizing!(fixed!(400.0), fixed!(200.0))),
|k| k.text("Top", TextStyle::new()),
)
.styled(
FlexStyle::new().sizing(sizing!(fixed!(400.0), fixed!(200.0))),
|k| k.text("Bottom", TextStyle::new()),
)
},
)
.styled(
FlexStyle::new().sizing(sizing!(fixed!(400.0), fixed!(600.0))),
|k| k.text("Right Side", TextStyle::new()),
)
},
)
});
assert_size!(commands.next(), (800.0, 600.0)); assert_size!(commands.next(), (400.0, 600.0)); assert_multiple!(
commands.next(),
assert_size((400.0, 200.0)), assert_position((0.0, 0.0))
);
assert_position!(commands.next(), (0.0, 0.0)); assert_multiple!(
commands.next(),
assert_size((400.0, 200.0)), assert_position((0.0, 200.0))
);
assert_position!(commands.next(), (0.0, 200.0)); assert_multiple!(
commands.next(),
assert_size((400.0, 600.0)), assert_position((400.0, 0.0))
);
assert_position!(commands.next(), (400.0, 0.0)); }
#[test]
fn nested_containers_with_growth() {
let kaolin = Kaolin::new((800, 600), measure_text);
let mut commands = kaolin.draw::<()>(|k| {
k.styled(FlexStyle::new().sizing(sizing!(grow!(1.0))), |k| {
k.styled(FlexStyle::new().sizing(sizing!(grow!(1.0), fit!())), |k| {
k.text("Inner Growth", TextStyle::new())
})
})
.styled(FlexStyle::new().sizing(sizing!(grow!(1.0))), |k| {
k.text("Sibling", TextStyle::new())
})
});
assert_size!(commands.next(), (400.0, 600.0)); assert_size!(commands.next(), (400.0, 20.0)); assert_position!(commands.next(), (0.0, 0.0)); assert_multiple!(
commands.next(),
assert_size((400.0, 600.0)), assert_position((400.0, 0.0))
);
assert_position!(commands.next(), (400.0, 0.0)); }
#[test]
fn nested_containers_different_alignments() {
let kaolin = Kaolin::new((600, 400), measure_text);
let mut commands = kaolin.draw::<()>(|k| {
k.styled(
FlexStyle::new()
.sizing(sizing!(fixed!(600.0), fixed!(400.0)))
.layout(
Layout::new()
.alignment(Alignment::Center)
.justification(Justification::Center),
),
|k| {
k.styled(
FlexStyle::new()
.sizing(sizing!(fixed!(200.0), fixed!(100.0)))
.layout(
Layout::new()
.alignment(Alignment::End)
.justification(Justification::End),
),
|k| k.text("Nested", TextStyle::new()), )
},
)
});
assert_size!(commands.next(), (600.0, 400.0)); assert_multiple!(
commands.next(),
assert_size((200.0, 100.0)),
assert_position((200.0, 150.0))
);
assert_position!(commands.next(), (340.0, 230.0));
}
#[test]
fn nested_containers_with_padding() {
let kaolin = Kaolin::new((800, 600), measure_text);
let mut commands = kaolin.draw::<()>(|k| {
k.styled(
FlexStyle::new()
.sizing(sizing!(fixed!(800.0), fixed!(600.0)))
.padding(Padding::all(50.0)),
|k| {
k.styled(
FlexStyle::new()
.sizing(sizing!(fixed!(300.0), fixed!(200.0)))
.padding(Padding::all(25.0)),
|k| k.text("Padded Text", TextStyle::new()),
)
},
)
});
assert_size!(commands.next(), (800.0, 600.0)); assert_multiple!(
commands.next(),
assert_size((300.0, 200.0)),
assert_position((50.0, 50.0))
);
assert_position!(commands.next(), (75.0, 75.0));
}
#[test]
fn deeply_nested_containers() {
let kaolin = Kaolin::new((400, 300), measure_text);
let mut commands = kaolin.draw::<()>(|k| {
k.styled(
FlexStyle::new().sizing(sizing!(fixed!(400.0), fixed!(300.0))),
|k| {
k.styled(
FlexStyle::new().sizing(sizing!(fixed!(300.0), fixed!(200.0))),
|k| {
k.styled(
FlexStyle::new().sizing(sizing!(fixed!(200.0), fixed!(100.0))),
|k| {
k.styled(
FlexStyle::new().sizing(sizing!(fixed!(100.0), fixed!(50.0))),
|k| k.text("Deep", TextStyle::new()),
)
},
)
},
)
},
)
});
assert_size!(commands.next(), (400.0, 300.0)); assert_size!(commands.next(), (300.0, 200.0)); assert_size!(commands.next(), (200.0, 100.0)); assert_size!(commands.next(), (100.0, 50.0)); assert_position!(commands.next(), (0.0, 0.0)); }
#[test]
fn nested_fit_and_fixed_sizing() {
let kaolin = Kaolin::new((800, 600), measure_text);
let mut commands = kaolin.draw::<()>(|k| {
k.styled(
FlexStyle::new().sizing(sizing!(fixed!(800.0), fixed!(600.0))),
|k| {
k.styled(
FlexStyle::new(), |k| {
k.text("Auto Size Content", TextStyle::new()) },
)
},
)
});
assert_size!(commands.next(), (800.0, 600.0)); assert_size!(commands.next(), (170.0, 20.0)); assert_position!(commands.next(), (0.0, 0.0)); }