cranpose-ui 0.1.140

UI primitives for Cranpose
Documentation
use cranpose_ui_graphics::{CursorIcon, ImageBitmap};

use super::*;
use crate::render_state::AppContext;

fn custom_icon() -> PointerIcon {
    PointerIcon::custom(
        ImageBitmap::from_rgba8(4, 4, vec![255; 64]).expect("bitmap"),
        1,
        2,
    )
    .expect("icon")
}

#[test]
fn a_fresh_session_holds_the_default_icon_and_no_change() {
    let context = AppContext::new();
    context.enter(|| {
        assert_eq!(current_pointer_icon(), PointerIcon::DEFAULT);
        assert_eq!(take_pointer_icon_change(), None);
    });
}

#[test]
fn setting_a_new_icon_yields_one_change() {
    let context = AppContext::new();
    context.enter(|| {
        set_pointer_icon(PointerIcon::POINTER);
        assert_eq!(current_pointer_icon(), PointerIcon::POINTER);
        assert_eq!(take_pointer_icon_change(), Some(PointerIcon::POINTER));
        assert_eq!(take_pointer_icon_change(), None);
    });
}

#[test]
fn re_setting_the_same_icon_reports_no_change() {
    let context = AppContext::new();
    context.enter(|| {
        set_pointer_icon(PointerIcon::TEXT);
        assert_eq!(take_pointer_icon_change(), Some(PointerIcon::TEXT));
        set_pointer_icon(PointerIcon::TEXT);
        assert_eq!(take_pointer_icon_change(), None);
    });
}

#[test]
fn the_latest_icon_wins_when_the_platform_has_not_polled() {
    let context = AppContext::new();
    context.enter(|| {
        set_pointer_icon(PointerIcon::POINTER);
        set_pointer_icon(PointerIcon::System(CursorIcon::Crosshair));
        assert_eq!(
            take_pointer_icon_change(),
            Some(PointerIcon::System(CursorIcon::Crosshair))
        );
        assert_eq!(take_pointer_icon_change(), None);
    });
}

#[test]
fn custom_icons_round_trip_through_the_session() {
    let context = AppContext::new();
    context.enter(|| {
        let icon = custom_icon();
        set_pointer_icon(icon.clone());
        assert_eq!(take_pointer_icon_change(), Some(icon.clone()));
        set_pointer_icon(icon);
        assert_eq!(take_pointer_icon_change(), None);
    });
}

#[test]
fn a_refresh_offers_the_icon_the_region_already_asked_for() {
    let context = AppContext::new();
    context.enter(|| {
        set_pointer_icon(PointerIcon::POINTER);
        assert_eq!(take_pointer_icon_change(), Some(PointerIcon::POINTER));
        assert_eq!(take_pointer_icon_change(), None);

        refresh_pointer_icon();
        assert_eq!(
            take_pointer_icon_change(),
            Some(PointerIcon::POINTER),
            "coming back to the window re-applies the region's own cursor"
        );
    });
}

#[test]
fn a_refresh_on_a_window_that_asked_for_nothing_restores_the_default() {
    let context = AppContext::new();
    context.enter(|| {
        refresh_pointer_icon();
        assert_eq!(take_pointer_icon_change(), Some(PointerIcon::DEFAULT));
    });
}

#[test]
fn each_app_context_carries_its_own_icon() {
    let first = AppContext::new();
    let second = AppContext::new();
    first.enter(|| set_pointer_icon(PointerIcon::POINTER));
    second.enter(|| {
        assert_eq!(current_pointer_icon(), PointerIcon::DEFAULT);
        assert_eq!(take_pointer_icon_change(), None);
    });
    first.enter(|| {
        assert_eq!(take_pointer_icon_change(), Some(PointerIcon::POINTER));
    });
}