iced-cube 0.0.6

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

use iced::Element;
use iced::widget::Id;
use iced_cube::forms::label::State;
use iced_cube::{field, input, label};
use iced_test::{Error, simulator};

#[derive(Debug, Clone, PartialEq)]
enum Message {
    Email(String),
}

fn view(error: Option<&str>) -> Element<'_, Message> {
    field(
        "Email",
        input("you@example.com", "ada")
            .id("email")
            .on_input(Message::Email),
    )
    .description("We only use it for receipts.")
    .error_maybe(error)
    .required(true)
    .into()
}

#[test]
fn field_renders_label_description_and_required_marker() {
    let mut ui = simulator(view(None));
    assert!(ui.find("Email").is_ok());
    assert!(ui.find("*").is_ok());
    assert!(ui.find("We only use it for receipts.").is_ok());
    assert!(ui.find("Enter a valid email").is_err());
}

#[test]
fn field_renders_error_text() {
    let mut ui = simulator(view(Some("Enter a valid email")));
    assert!(ui.find("Enter a valid email").is_ok());
}

#[test]
fn control_inside_a_field_still_emits_messages() -> Result<(), Error> {
    let mut ui = simulator(view(None));
    ui.click(Id::new("email"))?;
    ui.typewrite("!");

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

#[test]
fn every_label_state_renders() {
    for state in State::ALL {
        let element: Element<'_, Message> = label("Name").state(state).required(true).into();
        let mut ui = simulator(element);
        assert!(ui.find("Name").is_ok(), "{state:?}");
    }
}