buoyant 0.6.1

SwiftUI-like UIs in Rust for embedded devices
Documentation
use buoyant::{
    font::CharacterBufferFont, primitives::Size, render::Render as _,
    render_target::FixedTextBuffer, view::prelude::*,
};
mod common;
use common::{make_render_tree, tap};

#[test]
fn geometry_group_retains_text_offset() {
    let font = CharacterBufferFont {};
    let content = VStack::new((
        Text::new("aa aa", &font).foreground_color(' '),
        Text::new("bb", &font).geometry_group(),
        Text::new("ccc", &font),
    ))
    .geometry_group();
    let mut buffer = FixedTextBuffer::<6, 4>::default();
    let tree = make_render_tree(&content, buffer.size(), &mut ());
    tree.render(&mut buffer, &' ');
    assert_eq!(buffer.text[0].iter().collect::<String>(), "aa aa ");
    assert_eq!(buffer.text[1].iter().collect::<String>(), " bb   ");
    assert_eq!(buffer.text[2].iter().collect::<String>(), " ccc  ");
    assert_eq!(buffer.text[3].iter().collect::<String>(), "      ");
}

#[test]
fn geometry_group_retains_fill_offset() {
    let font = CharacterBufferFont {};
    let content = VStack::new((
        Text::new("aa aa", &font).foreground_color(' '),
        Rectangle
            .frame_sized(2, 1)
            .foreground_color('b')
            .geometry_group(),
        Text::new("ccc", &font),
    ))
    .geometry_group();
    let mut buffer = FixedTextBuffer::<6, 4>::default();
    let tree = make_render_tree(&content, buffer.size(), &mut ());
    tree.render(&mut buffer, &' ');
    assert_eq!(buffer.text[0].iter().collect::<String>(), "aa aa ");
    assert_eq!(buffer.text[1].iter().collect::<String>(), " bb   ");
    assert_eq!(buffer.text[2].iter().collect::<String>(), " ccc  ");
    assert_eq!(buffer.text[3].iter().collect::<String>(), "      ");
}

#[test]
fn event_offset_is_preserved() {
    let view = Button::new(|x: &mut u32| *x += 1, |_| Rectangle)
        .geometry_group()
        .offset(3, 3);
    let mut x = 0;
    let mut state = view.build_state(&mut x);
    let size = Size::new(3, 3);

    tap(&view, &mut x, &mut state, size, 0, 0);
    assert_eq!(x, 0);

    tap(&view, &mut x, &mut state, size, 1, 1);
    assert_eq!(x, 0);

    tap(&view, &mut x, &mut state, size, 3, 3);
    assert_eq!(x, 1);

    tap(&view, &mut x, &mut state, size, 6, 3);
    assert_eq!(x, 1);
}