iced-cube 0.0.5

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

use iced::widget::column;
use iced::{Element, Point};
use iced_cube::primitives::checkbox;
use iced_cube::primitives::checkbox::{BOX_SIZE, CheckState};
use iced_test::simulator;
use iced_test::simulator::click;

#[derive(Debug, Clone, PartialEq)]
enum Message {
    Terms(bool),
    All(bool),
    Newsletter(bool),
}

fn view(enabled: bool) -> Element<'static, Message> {
    column![
        checkbox(false)
            .label("Accept terms")
            .on_toggle(Message::Terms),
        checkbox(CheckState::Indeterminate)
            .label("Select all")
            .on_toggle(Message::All),
        checkbox(true)
            .label("Newsletter")
            .on_toggle_maybe(enabled.then_some(Message::Newsletter)),
    ]
    .spacing(12)
    .into()
}

#[test]
fn clicking_a_label_emits_the_next_value() {
    let mut ui = simulator(view(true));
    ui.click("Accept terms").expect("label is rendered");
    ui.click("Select all").expect("label is rendered");
    ui.click("Newsletter").expect("label is rendered");

    let messages: Vec<_> = ui.into_messages().collect();
    assert_eq!(
        messages,
        vec![
            Message::Terms(true),
            Message::All(true),
            Message::Newsletter(false)
        ]
    );
}

#[test]
fn clicking_the_box_toggles() {
    let mut ui = simulator(view(true));
    ui.point_at(Point::new(BOX_SIZE / 2.0, BOX_SIZE / 2.0));
    ui.simulate(click());

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

#[test]
fn disabled_checkbox_emits_nothing() {
    let mut ui = simulator(view(false));
    ui.click("Newsletter").expect("label is still rendered");

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

#[test]
fn every_state_renders_its_label() {
    for state in CheckState::ALL {
        let element: Element<'_, Message> = checkbox(state)
            .label("Label")
            .on_toggle(Message::Terms)
            .into();
        let mut ui = simulator(element);
        assert!(ui.find("Label").is_ok(), "{state:?}");
    }
}