argui-platform 0.2.0

Native platform integrations for Argui applications
Documentation
use argui_platform::{TrayAction, TrayConfig, TrayItemId, TrayMenuItem, WindowKey};

#[test]
fn tray_items_expose_only_stable_actionable_ids() {
    let item = TrayMenuItem::Action {
        id: TrayItemId::new("show"),
        label: "Show".into(),
        enabled: true,
        action: TrayAction::ShowWindow(WindowKey::main()),
    };
    assert_eq!(item.id().unwrap().as_str(), "show");
    let checked = TrayMenuItem::Check {
        id: TrayItemId::new("checked"),
        label: "Checked".into(),
        enabled: true,
        checked: true,
        action: TrayAction::Custom("checked".into()),
    };
    assert_eq!(checked.id().unwrap().as_str(), "checked");
    let submenu = TrayMenuItem::Submenu {
        id: TrayItemId::new("more"),
        label: "More".into(),
        enabled: true,
        items: Vec::new(),
    };
    assert_eq!(submenu.id().unwrap().as_str(), "more");
    assert!(TrayMenuItem::Separator.id().is_none());
}

#[test]
fn tray_configs_reject_duplicate_ids_across_submenus() {
    let action = || TrayMenuItem::Action {
        id: TrayItemId::new("show"),
        label: "Show".into(),
        enabled: true,
        action: TrayAction::ShowWindow(WindowKey::main()),
    };
    let config = TrayConfig {
        menu: vec![
            action(),
            TrayMenuItem::Submenu {
                id: TrayItemId::new("more"),
                label: "More".into(),
                enabled: true,
                items: vec![action()],
            },
        ],
        ..TrayConfig::default()
    };
    assert!(config.validate().is_err());
}

#[test]
fn tray_configs_accept_unique_nested_items_and_reject_empty_ids() {
    let valid = TrayConfig {
        menu: vec![TrayMenuItem::Submenu {
            id: TrayItemId::new("more"),
            label: "More".into(),
            enabled: true,
            items: vec![TrayMenuItem::Check {
                id: TrayItemId::new("enabled"),
                label: "Enabled".into(),
                enabled: true,
                checked: false,
                action: TrayAction::Custom("enabled".into()),
            }],
        }],
        ..TrayConfig::default()
    };
    assert!(valid.validate().is_ok());

    let invalid = TrayConfig {
        menu: vec![TrayMenuItem::Action {
            id: TrayItemId::new(""),
            label: "Invalid".into(),
            enabled: true,
            action: TrayAction::Quit,
        }],
        ..TrayConfig::default()
    };
    assert!(invalid.validate().is_err());
}