oxiforge 0.3.0

YAML-to-Rust code generator for oxivgl LVGL UIs
Documentation
// SPDX-License-Identifier: GPL-3.0-only
//! Runtime integration test for core_obj.yaml generated code.

use oxiforge::prelude::*;

// ── Generated code (copied from snapshot) ────────────────────────────────────

#[derive(Debug)]
pub struct ObjPageWidgets {
    pub card_container: Obj<'static>,
}

pub fn create_obj_page(screen: &Screen) -> Result<ObjPageWidgets, WidgetError> {
    screen.bg_color(0x0A0A0A);
    screen.remove_scrollable();
    let card_container = Obj::new(screen)?;
    card_container.width(280);
    card_container.height(160);
    card_container.align(Align::TopMid, 0, 10);
    let card_container_inline = {
        let mut b = StyleBuilder::new();
        b.bg_color_hex(0x1E1E2E);
        b.border_color_hex(0x333366);
        b.border_width(1);
        b.pad_all(8_i32);
        b.radius(10);
        b.build()
    };
    card_container.add_style(&card_container_inline, Selector::DEFAULT);
    card_container.remove_scrollable();
    let _w1 = Label::new(&card_container)?;
    _w1.text("Card Title");
    _w1.align(Align::TopLeft, 0, 0);
    let _w1_inline = {
        let mut b = StyleBuilder::new();
        b.text_color_hex(0xFFFFFF);
        b.build()
    };
    _w1.add_style(&_w1_inline, Selector::DEFAULT);
    core::mem::forget(_w1);
    let _w2 = Label::new(&card_container)?;
    _w2.text("Card body content");
    _w2.align(Align::LeftMid, 0, 0);
    let _w2_inline = {
        let mut b = StyleBuilder::new();
        b.text_color_hex(0xAAAAAA);
        b.build()
    };
    _w2.add_style(&_w2_inline, Selector::DEFAULT);
    core::mem::forget(_w2);
    let _w3 = Obj::new(screen)?;
    _w3.width(280);
    _w3.height(60);
    _w3.align(Align::BottomMid, 0, -10);
    let _w3_inline = {
        let mut b = StyleBuilder::new();
        b.bg_color_hex(0x1A1A2E);
        b.border_width(0);
        b.pad_all(4_i32);
        b.build()
    };
    _w3.add_style(&_w3_inline, Selector::DEFAULT);
    _w3.set_layout(Layout::Flex);
    _w3.set_flex_flow(FlexFlow::Row);
    _w3.set_flex_align(FlexAlign::SpaceBetween, FlexAlign::Center, FlexAlign::Start);
    let _w4 = Label::new(&_w3)?;
    _w4.text("Left");
    let _w4_inline = {
        let mut b = StyleBuilder::new();
        b.text_color_hex(0x888888);
        b.build()
    };
    _w4.add_style(&_w4_inline, Selector::DEFAULT);
    core::mem::forget(_w4);
    let _w5 = Label::new(&_w3)?;
    _w5.text("Right");
    let _w5_inline = {
        let mut b = StyleBuilder::new();
        b.text_color_hex(0x888888);
        b.build()
    };
    _w5.add_style(&_w5_inline, Selector::DEFAULT);
    core::mem::forget(_w5);
    core::mem::forget(_w3);
    Ok(ObjPageWidgets { card_container })
}

// ── Tests ─────────────────────────────────────────────────────────────────────

#[test]
fn test_obj_page_creation_succeeds() {
    let screen = super::common::fresh_screen();
    let widgets = create_obj_page(&screen).expect("create_obj_page must succeed");
    super::common::pump();

    // card_container handle must be non-null
    assert!(!widgets.card_container.lv_handle().is_null(), "card_container handle must be non-null");

    // Screen must have 2 children: card_container and _w3 (flex row)
    // Both were returned/forgotten, so LVGL still owns them
    // SAFETY: screen handle is non-null (fresh_screen guarantees this).
    let screen_child_count = unsafe { super::common::child_count_raw(super::common::as_raw(&screen)) };
    assert_eq!(screen_child_count, 2, "screen must have 2 children (card_container and flex row)");

    // card_container must have 2 children: _w1 (Card Title) and _w2 (body)
    let container_children = widgets.card_container.get_child_count();
    assert_eq!(container_children, 2, "card_container must have 2 label children");

    // The flex row (_w3) is the second child of screen; it must have 2 children.
    // SAFETY: screen handle non-null; child at index 1 is _w3 (the flex row).
    let flex_row = unsafe { super::common::get_child_raw(super::common::as_raw(&screen), 1) };
    assert!(!flex_row.is_null(), "flex row (_w3) must exist as second screen child");
    // SAFETY: flex_row is non-null (asserted above).
    let flex_children = unsafe { super::common::child_count_raw(flex_row) };
    assert_eq!(flex_children, 2, "flex row must have 2 children (Left, Right labels)");

    core::mem::forget(widgets);
}