iced-cube 0.0.6

Themeable application components for the iced GUI library, with Lucide icons
Documentation
#![cfg(feature = "button")]

use iced::widget::column;
use iced::{Element, Length};
use iced_cube::primitives::button::{Size, Variant};
use iced_cube::{button, lucide};
use iced_test::simulator;

#[derive(Debug, Clone, PartialEq)]
enum Message {
    Save,
    Delete,
}

fn view(enabled: bool) -> Element<'static, Message> {
    column![
        button("Save").on_press(Message::Save),
        button("Delete")
            .variant(Variant::Destructive)
            .on_press_maybe(enabled.then_some(Message::Delete)),
    ]
    .into()
}

#[test]
fn clicking_a_label_emits_its_message() -> Result<(), iced_test::Error> {
    let mut ui = simulator(view(true));
    ui.click("Save")?;
    ui.click("Delete")?;

    let messages: Vec<_> = ui.into_messages().collect();
    assert_eq!(messages, vec![Message::Save, Message::Delete]);
    Ok(())
}

#[test]
fn disabled_button_emits_nothing() -> Result<(), iced_test::Error> {
    let mut ui = simulator(view(false));
    ui.click("Delete")?;

    assert_eq!(ui.into_messages().count(), 0);
    Ok(())
}

#[test]
fn label_stays_on_one_line_in_a_narrow_container() -> Result<(), iced_test::Error> {
    let element: Element<'_, Message> = column![
        button("Save changes")
            .icon(lucide!(Save))
            .on_press(Message::Save)
    ]
    .width(40)
    .into();
    let mut ui = simulator(element);

    let bounds = ui.find("Save changes")?.bounds();
    assert!(bounds.height < 24.0, "one line, got {}", bounds.height);
    assert!(
        bounds.width > 40.0,
        "sized to its label, got {}",
        bounds.width
    );

    ui.click("Save changes")?;
    assert_eq!(ui.into_messages().collect::<Vec<_>>(), vec![Message::Save]);
    Ok(())
}

#[test]
fn fill_width_button_keeps_the_container_width() -> Result<(), iced_test::Error> {
    let element: Element<'_, Message> =
        column![button("Save").width(Length::Fill).on_press(Message::Save)]
            .width(300)
            .into();
    let mut ui = simulator(element);

    let label = ui.find("Save")?.bounds();
    let centre = label.x + label.width / 2.0;
    assert!(
        (centre - 150.0).abs() < 1.0,
        "label centred in 300px, got {centre}"
    );
    Ok(())
}

#[test]
fn every_variant_and_size_renders() {
    for variant in Variant::ALL {
        for size in Size::ALL {
            let element: Element<'_, Message> = button("Label")
                .variant(variant)
                .size(size)
                .on_press(Message::Save)
                .into();
            let mut ui = simulator(element);
            assert!(ui.find("Label").is_ok(), "{variant:?} {size:?}");
        }
    }
}