cranpose 0.1.162

Cranpose runtime and UI facade
Documentation
use cranpose_services::LifecycleState;
use winit::{dpi::PhysicalSize, event::WindowEvent, window::WindowId};

use super::WindowPresence;

const PRIMARY: WindowId = WindowId::from_raw(1);
const SECONDARY: WindowId = WindowId::from_raw(2);

fn settle(
    presence: &mut WindowPresence,
    events: &[(WindowId, WindowEvent)],
) -> Option<LifecycleState> {
    for (window, event) in events {
        presence.observe(*window, event);
    }
    presence.settled()
}

#[test]
fn focus_occlusion_and_minimizing_move_the_window_lifecycle() {
    let mut presence = WindowPresence::shown(PRIMARY);
    let batches = [
        vec![(PRIMARY, WindowEvent::Focused(false))],
        vec![(PRIMARY, WindowEvent::Focused(false))],
        vec![(PRIMARY, WindowEvent::Occluded(true))],
        vec![(PRIMARY, WindowEvent::Occluded(false))],
        vec![(PRIMARY, WindowEvent::Focused(true))],
        vec![(
            PRIMARY,
            WindowEvent::SurfaceResized(PhysicalSize::new(0, 0)),
        )],
        vec![(
            PRIMARY,
            WindowEvent::SurfaceResized(PhysicalSize::new(800, 600)),
        )],
        vec![(
            PRIMARY,
            WindowEvent::SurfaceResized(PhysicalSize::new(900, 600)),
        )],
        vec![(PRIMARY, WindowEvent::CloseRequested)],
    ];
    let published: Vec<Option<LifecycleState>> = batches
        .iter()
        .map(|batch| settle(&mut presence, batch))
        .collect();
    assert_eq!(
        published,
        vec![
            Some(LifecycleState::Paused),
            None,
            Some(LifecycleState::Stopped),
            Some(LifecycleState::Paused),
            Some(LifecycleState::Resumed),
            Some(LifecycleState::Stopped),
            Some(LifecycleState::Resumed),
            None,
            None,
        ]
    );
}

#[test]
fn moving_focus_between_the_apps_own_windows_keeps_it_resumed() {
    let mut presence = WindowPresence::shown(PRIMARY);
    let handoff = [
        (PRIMARY, WindowEvent::Focused(false)),
        (SECONDARY, WindowEvent::Focused(true)),
    ];
    assert_eq!(settle(&mut presence, &handoff), None);
    let hidden_secondary = [
        (SECONDARY, WindowEvent::Occluded(true)),
        (
            SECONDARY,
            WindowEvent::SurfaceResized(PhysicalSize::new(0, 0)),
        ),
    ];
    assert_eq!(
        settle(&mut presence, &hidden_secondary),
        None,
        "only the primary window's visibility counts"
    );
    assert_eq!(
        settle(&mut presence, &[(SECONDARY, WindowEvent::Destroyed)]),
        Some(LifecycleState::Paused),
        "a closed window no longer holds focus"
    );
}