buoyant 0.5.2

SwiftUI-like UIs in Rust for embedded devices
Documentation
use buoyant::font::CharacterBufferFont;
use buoyant::if_view;
use buoyant::layout::Layout;
use buoyant::primitives::{Point, Size};
use buoyant::render::{Render as _, Renderable as _};
use buoyant::render_target::FixedTextBuffer;
use buoyant::view::{Text, ViewExt as _};
use common::TestEnv;

mod common;

#[test]
fn test_conditional_view_layout() {
    let font = CharacterBufferFont;
    let make_view = |condition| {
        if_view!((condition) {
            Text::new("true\n!!!", &font)
        } else {
            Text::new("f", &font).foreground_color(' ')
        })
    };
    let mut buffer = FixedTextBuffer::<5, 5>::default();
    let env = TestEnv::default();

    let view = make_view(true);
    let layout = view.layout(&buffer.size().into(), &env);
    assert_eq!(layout.resolved_size, Size::new(4, 2).into());
    let tree = view.render_tree(&layout, Point::zero(), &env);
    tree.render(&mut buffer, &env.foreground_color, Point::zero());
    assert_eq!(buffer.text[0].iter().collect::<String>(), "true ");
    assert_eq!(buffer.text[1].iter().collect::<String>(), "!!!  ");
    assert_eq!(buffer.text[2].iter().collect::<String>(), "     ");

    buffer.clear();

    let view = make_view(false);
    let layout = view.layout(&buffer.size().into(), &env);
    assert_eq!(layout.resolved_size, Size::new(1, 1).into());
    let tree = view.render_tree(&layout, Point::zero(), &env);
    tree.render(&mut buffer, &env.foreground_color, Point::zero());
    assert_eq!(buffer.text[0].iter().collect::<String>(), "f    ");
    assert_eq!(buffer.text[1].iter().collect::<String>(), "     ");
    assert_eq!(buffer.text[2].iter().collect::<String>(), "     ");
}

#[test]
fn one_arm_if() {
    let font = CharacterBufferFont;
    let make_view = |condition| {
        if_view!((condition) {
            Text::new("true\n!!!", &font).foreground_color(' ')
        })
    };
    let mut buffer = FixedTextBuffer::<5, 5>::default();
    let env = TestEnv::default();

    let view = make_view(true);
    assert!(!view.is_empty());
    let layout = view.layout(&buffer.size().into(), &env);
    assert_eq!(layout.resolved_size, Size::new(4, 2).into());
    let tree = view.render_tree(&layout, Point::zero(), &env);
    tree.render(&mut buffer, &env.foreground_color, Point::zero());
    assert_eq!(buffer.text[0].iter().collect::<String>(), "true ");
    assert_eq!(buffer.text[1].iter().collect::<String>(), "!!!  ");
    assert_eq!(buffer.text[2].iter().collect::<String>(), "     ");

    buffer.clear();

    let view = make_view(false);
    assert!(view.is_empty());
    let layout = view.layout(&buffer.size().into(), &env);
    assert_eq!(layout.resolved_size, Size::new(0, 0).into());
    let tree = view.render_tree(&layout, Point::zero(), &env);
    tree.render(&mut buffer, &env.foreground_color, Point::zero());
    assert_eq!(buffer.text[0].iter().collect::<String>(), "     ");
    assert_eq!(buffer.text[1].iter().collect::<String>(), "     ");
    assert_eq!(buffer.text[2].iter().collect::<String>(), "     ");
}