lgui-core 0.2.2

Platform-neutral runtime and UI primitives for LGUI
Documentation
use super::*;

fn work(width: i32, height: i32) -> WorkArea {
    WorkArea {
        rect: PhysicalRect::new(0, 0, width, height),
    }
}

#[test]
fn automatic_scale_fits_the_work_area() {
    let context = ScaleContext::resolve(
        144,
        work(1920, 1040),
        Size::new(1432.0, 860.0),
        ScalePreference::Auto,
    );

    assert!(context.scale.factor() < 1.5);
    assert!(context.physical_window_size.width <= 1920);
    assert!(context.physical_window_size.height <= 1040);
}

#[test]
fn manual_scale_is_relative_to_monitor_dpi() {
    let context = ScaleContext::resolve(
        144,
        work(2560, 1400),
        Size::new(1432.0, 860.0),
        ScalePreference::Multiplier(0.8),
    );

    assert_eq!(context.scale, UiScale::new(1.2));
}

#[test]
fn very_small_work_area_switches_to_compact_viewport() {
    let context = ScaleContext::resolve(
        120,
        work(1024, 700),
        Size::new(1432.0, 860.0),
        ScalePreference::Multiplier(1.0),
    );

    assert!(context.compact);
    assert!(context.physical_window_size.width < 1024);
    assert!(context.physical_window_size.height < 700);
}

#[test]
fn clamp_origin_preserves_negative_monitor_coordinates() {
    let context = ScaleContext::resolve(
        96,
        WorkArea {
            rect: PhysicalRect::new(-1920, 0, 0, 1080),
        },
        Size::new(800.0, 600.0),
        ScalePreference::Multiplier(1.0),
    );

    assert_eq!(
        context.clamp_origin(PhysicalPoint::new(-2200, -100), PhysicalSize::new(800, 600)),
        PhysicalPoint::new(-1920, 0)
    );
}

#[test]
fn monitor_metrics_include_work_area_and_preference() {
    let primary = ScaleContext::resolve(
        96,
        work(2560, 1400),
        Size::new(1432.0, 860.0),
        ScalePreference::Auto,
    );
    let secondary = ScaleContext::resolve(
        96,
        WorkArea {
            rect: PhysicalRect::new(-1920, 0, 0, 1040),
        },
        Size::new(1432.0, 860.0),
        ScalePreference::Auto,
    );
    let manual = ScaleContext::resolve(
        96,
        work(2560, 1400),
        Size::new(1432.0, 860.0),
        ScalePreference::Multiplier(1.0),
    );

    assert!(!primary.same_monitor_metrics(secondary));
    assert!(!primary.same_monitor_metrics(manual));
    assert!(primary.same_monitor_metrics(primary));
}

#[test]
fn auto_scale_targets_ninety_percent_on_a_1080p_work_area() {
    let context = ScaleContext::resolve(
        96,
        work(1920, 1032),
        Size::new(1432.0, 860.0),
        ScalePreference::Auto,
    );

    assert!((context.scale.factor() - 0.9).abs() < 0.001);
    assert_eq!(context.physical_window_size, PhysicalSize::new(1289, 774));
}

#[test]
fn explicit_half_scale_is_allowed_below_the_auto_minimum() {
    let context = ScaleContext::resolve(
        96,
        work(1920, 1032),
        Size::new(1432.0, 860.0),
        ScalePreference::Multiplier(0.5),
    );

    assert_eq!(context.scale, UiScale::new(0.5));
    assert_eq!(context.physical_window_size, PhysicalSize::new(716, 430));
}