iced-cube 0.0.2

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

use iced::widget::{column, row, text};
use iced::{Element, Length};
use iced_cube::primitives::scroll_area::Direction;
use iced_cube::{button, scroll_area};
use iced_test::simulator;

#[derive(Debug, Clone, PartialEq)]
enum Message {
    Open(usize),
}

fn items() -> Element<'static, Message> {
    column((0..40).map(|i| text(format!("Item {i}")).into())).into()
}

#[test]
fn visible_content_is_findable_in_every_direction() {
    for direction in Direction::ALL {
        let element: Element<'_, Message> = scroll_area(items())
            .direction(direction)
            .height(200)
            .width(Length::Fill)
            .into();
        let mut ui = simulator(element);
        assert!(ui.find("Item 0").is_ok(), "{direction:?}");
    }
}

#[test]
fn wide_content_is_findable_horizontally() {
    let wide = row((0..30).map(|i| text(format!("Column {i}")).into())).spacing(24);
    let element: Element<'_, Message> = scroll_area(wide)
        .direction(Direction::Horizontal)
        .width(300)
        .into();
    let mut ui = simulator(element);
    assert!(ui.find("Column 0").is_ok());
}

#[test]
fn buttons_inside_a_scroll_area_are_clickable() {
    let content = column((0..3).map(|i| {
        button(format!("Open {i}"))
            .on_press(Message::Open(i))
            .into()
    }));
    let element: Element<'_, Message> = scroll_area(content).height(200).into();
    let mut ui = simulator(element);
    ui.click("Open 1").expect("Open 1 is rendered");

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