cranpose-services 0.21.1

Multiplatform service contracts and platform integrations for Cranpose apps
Documentation
use std::{path::PathBuf, sync::Arc};

use super::*;
use crate::{HostController, PlatformDirectories, clear_host_controller, set_host_controller};

#[derive(Default)]
struct RecordingHost(Mutex<Vec<SystemBarIcons>>);

impl RecordingHost {
    fn shown(&self) -> Vec<SystemBarIcons> {
        self.0
            .lock()
            .unwrap_or_else(PoisonError::into_inner)
            .clone()
    }
}

impl HostController for RecordingHost {
    fn set_keep_screen_on(&self, _enabled: bool) {}
    fn set_system_bar_icons(&self, icons: SystemBarIcons) {
        self.0
            .lock()
            .unwrap_or_else(PoisonError::into_inner)
            .push(icons);
    }
    fn platform_directories(&self) -> Option<PlatformDirectories> {
        Some(PlatformDirectories {
            data: PathBuf::from("data"),
            config: PathBuf::from("config"),
            cache: PathBuf::from("cache"),
            documents: None,
            temporary: PathBuf::from("temporary"),
            shared: None,
        })
    }
    fn exit(&self) {}
    fn background(&self) {}
}

#[test]
fn the_latest_request_wins_and_the_one_before_returns_when_it_goes() {
    let _guard = crate::host::tests::test_lock();
    let host = Arc::new(RecordingHost::default());
    set_host_controller(Arc::clone(&host) as _);

    let dark = request(SystemBarIcons::Dark);
    let light = request(SystemBarIcons::Light);
    assert_eq!(system_bar_icons(), SystemBarIcons::Light);
    withdraw(light);
    withdraw(dark);

    assert_eq!(system_bar_icons(), SystemBarIcons::FollowSystem);
    assert_eq!(
        host.shown(),
        [
            SystemBarIcons::FollowSystem,
            SystemBarIcons::Dark,
            SystemBarIcons::Light,
            SystemBarIcons::Dark,
            SystemBarIcons::FollowSystem,
        ]
    );
    clear_host_controller();
}

#[test]
fn withdrawing_an_older_request_keeps_the_latest() {
    let _guard = crate::host::tests::test_lock();
    let dark = request(SystemBarIcons::Dark);
    let light = request(SystemBarIcons::Light);

    withdraw(dark);
    assert_eq!(system_bar_icons(), SystemBarIcons::Light);
    withdraw(light);
    assert_eq!(system_bar_icons(), SystemBarIcons::FollowSystem);
}

#[test]
fn a_new_host_is_shown_the_icons_already_asked_for() {
    let _guard = crate::host::tests::test_lock();
    let dark = request(SystemBarIcons::Dark);
    let host = Arc::new(RecordingHost::default());

    set_host_controller(Arc::clone(&host) as _);

    assert_eq!(host.shown(), [SystemBarIcons::Dark]);
    withdraw(dark);
    clear_host_controller();
}