argui-core 0.2.1

Geometry, color, identifiers and shared primitives for Argui
Documentation
use argui_core::{Insets, Point, Rect, Size};

#[test]
fn insets_store_each_edge_and_sum_the_axes() {
    let insets = Insets::new(11.0, 13.0, 17.0, 19.0);

    assert_eq!(insets.top, 11.0);
    assert_eq!(insets.right, 13.0);
    assert_eq!(insets.bottom, 17.0);
    assert_eq!(insets.left, 19.0);
    assert_eq!(insets.horizontal(), 32.0);
    assert_eq!(insets.vertical(), 28.0);
}

#[test]
fn physical_rect_conversion_accounts_for_origin_and_scale() {
    let window = Rect::new(Point::new(100.0, 200.0), Size::new(400.0, 800.0));
    let safe = Rect::new(Point::new(120.0, 230.0), Size::new(340.0, 730.0));

    assert_eq!(
        Insets::from_physical_rects(window, safe, 2.0),
        Insets::new(15.0, 20.0, 20.0, 10.0)
    );
}

#[test]
fn physical_rect_conversion_clips_safe_rects_and_handles_invalid_scale() {
    let window = Rect::new(Point::default(), Size::new(400.0, 800.0));
    let outside = Rect::new(Point::new(-20.0, -30.0), Size::new(500.0, 900.0));
    assert_eq!(
        Insets::from_physical_rects(window, outside, f32::NAN),
        Insets::ZERO
    );

    let disjoint = Rect::new(Point::new(450.0, 900.0), Size::new(10.0, 10.0));
    assert_eq!(
        Insets::from_physical_rects(window, disjoint, 1.0),
        Insets::new(800.0, 0.0, 0.0, 400.0)
    );
}

#[test]
fn try_physical_rect_conversion_rejects_empty_or_disjoint_areas() {
    let window = Rect::new(Point::default(), Size::new(400.0, 800.0));
    let empty = Rect::new(Point::default(), Size::default());
    let outside = Rect::new(Point::new(500.0, 900.0), Size::new(20.0, 30.0));

    assert_eq!(Insets::try_from_physical_rects(window, empty, 1.0), None);
    assert_eq!(Insets::try_from_physical_rects(empty, window, 1.0), None);
    assert_eq!(Insets::try_from_physical_rects(window, outside, 1.0), None);
}

#[test]
fn zero_is_the_default_inset_value() {
    assert_eq!(Insets::default(), Insets::ZERO);
}