argui-platform 0.2.0

Native platform integrations for Argui applications
Documentation
use argui_platform::{
    ApplicationConfig, ApplicationId, ApplicationIdentity, IconSet, TrayAction, TrayConfig,
    TrayItemId, TrayMenuItem, WindowConfig, WindowKey, WindowSpec,
};

fn identity() -> ApplicationIdentity {
    ApplicationIdentity::new(
        ApplicationId::new("dev.argui.test").unwrap(),
        "Test",
        IconSet::new(),
    )
}

#[test]
fn application_configs_reject_duplicate_or_empty_window_keys() {
    assert!(
        ApplicationConfig::new(identity(), WindowConfig::default())
            .validate()
            .is_ok()
    );

    let config = ApplicationConfig::new(identity(), WindowConfig::default())
        .with_window(WindowSpec::new(WindowKey::main(), WindowConfig::default()));
    assert!(config.validate().is_err());

    let config = ApplicationConfig::new(identity(), WindowConfig::default())
        .with_window(WindowSpec::new(WindowKey::new(""), WindowConfig::default()));
    assert!(config.validate().is_err());
}

#[test]
fn application_configs_validate_their_optional_tray() {
    let valid = ApplicationConfig::new(identity(), WindowConfig::default()).with_tray(TrayConfig {
        menu: vec![TrayMenuItem::Action {
            id: TrayItemId::new("quit"),
            label: "Quit".into(),
            enabled: true,
            action: TrayAction::Quit,
        }],
        ..TrayConfig::default()
    });
    assert!(valid.validate().is_ok());

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

#[test]
fn invalid_configuration_diagnostics_identify_the_offending_window_or_tray() {
    use argui_platform::{ApplicationConfigError, PreferenceOverrides};
    let config = ApplicationConfig::new(identity(), WindowConfig::default()).with_preferences(
        PreferenceOverrides {
            color_scheme: Some(argui_core::ColorScheme::Dark),
            ..Default::default()
        },
    );
    assert_eq!(
        config.preferences.color_scheme,
        Some(argui_core::ColorScheme::Dark)
    );
    assert_eq!(
        ApplicationConfigError::EmptyWindowKey.to_string(),
        "window keys cannot be empty"
    );
    assert_eq!(
        ApplicationConfigError::DuplicateWindowKey(WindowKey::new("settings")).to_string(),
        "duplicate window key: settings"
    );
    assert_eq!(
        ApplicationConfigError::InvalidTray("duplicate action".into()).to_string(),
        "duplicate action"
    );
}