cranpose-services 0.1.161

Multiplatform system services for Cranpose (HTTP, URI, and OS integrations)
Documentation
use std::{cell::RefCell, rc::Rc};

use cranpose_core::CompositionLocalProvider;

use super::*;
use crate::run_test_composition;

#[test]
fn default_system_theme_returns_supported_variant() {
    assert!(matches!(
        default_system_theme(),
        SystemTheme::Light | SystemTheme::Dark
    ));
}

#[test]
fn platform_pushed_theme_wins_over_detection() {
    clear_platform_system_theme();
    set_platform_system_theme(SystemTheme::Dark);
    assert_eq!(default_system_theme(), SystemTheme::Dark);
    set_platform_system_theme(SystemTheme::Light);
    assert_eq!(default_system_theme(), SystemTheme::Light);
    clear_platform_system_theme();
}

#[test]
fn local_system_theme_can_be_overridden() {
    let local = local_system_theme();
    let captured = Rc::new(RefCell::new(None));

    {
        let captured = Rc::clone(&captured);
        let local_for_provider = local.clone();
        run_test_composition(move || {
            let captured = Rc::clone(&captured);
            let local = local.clone();
            CompositionLocalProvider(
                vec![local_for_provider.provides(SystemTheme::Dark)],
                move || {
                    *captured.borrow_mut() = Some(local.current());
                },
            );
        });
    }

    assert_eq!(*captured.borrow(), Some(SystemTheme::Dark));
}

#[test]
fn provide_system_theme_sets_current_theme() {
    let local = local_system_theme();
    let captured = Rc::new(RefCell::new(None));

    {
        let captured = Rc::clone(&captured);
        run_test_composition(move || {
            let captured = Rc::clone(&captured);
            let local = local.clone();
            ProvideSystemTheme(SystemTheme::Dark, move || {
                *captured.borrow_mut() = Some(local.current());
            });
        });
    }

    assert_eq!(*captured.borrow(), Some(SystemTheme::Dark));
}

#[test]
fn is_system_in_dark_theme_reads_current_theme() {
    let captured = Rc::new(RefCell::new(None));

    {
        let captured = Rc::clone(&captured);
        run_test_composition(move || {
            let captured = Rc::clone(&captured);
            ProvideSystemTheme(SystemTheme::Dark, move || {
                *captured.borrow_mut() = Some(isSystemInDarkTheme());
            });
        });
    }

    assert_eq!(*captured.borrow(), Some(true));
}

#[cfg(all(
    not(target_arch = "wasm32"),
    not(target_os = "android"),
    not(target_os = "ios"),
    feature = "system-theme"
))]
#[test]
fn theme_from_text_reads_common_native_values() {
    assert_eq!(theme_from_text("'prefer-dark'"), Some(SystemTheme::Dark));
    assert_eq!(theme_from_text("Breeze Light"), Some(SystemTheme::Light));
    assert_eq!(theme_from_text("Adwaita"), None);
}