lgui-core 0.2.2

Platform-neutral runtime and UI primitives for LGUI
Documentation
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};

use super::*;

#[test]
fn default_transform_is_identity() {
    let transform = LayerTransform::default();
    assert!(transform.is_identity());
    assert_eq!(transform.rotation_degrees_f32(), 0.0);
    assert_eq!((transform.scale_x(), transform.scale_y()), (1.0, 1.0));
    assert_eq!((transform.origin_x(), transform.origin_y()), (0.5, 0.5));
    assert_eq!(
        (transform.translation_x(), transform.translation_y()),
        (0.0, 0.0)
    );
}

#[test]
fn transform_values_are_normalized_and_stably_hashable() {
    let first = LayerTransform::identity()
        .rotation_degrees(450.0)
        .scale_xy(1.25, 0.75)
        .origin(-1.0, 2.0);
    let second = LayerTransform::identity()
        .rotation_degrees(90.0)
        .scale_xy(1.25, 0.75)
        .origin(0.0, 1.0);
    assert_eq!(first, second);
    assert_eq!(first.rotation_degrees_f32(), 90.0);
    assert_eq!((first.origin_x(), first.origin_y()), (0.0, 1.0));

    let hash = |value: LayerTransform| {
        let mut hasher = DefaultHasher::new();
        value.hash(&mut hasher);
        hasher.finish()
    };
    assert_eq!(hash(first), hash(second));
}

#[test]
fn transformed_bounds_include_scaled_rotation() {
    let transform = LayerTransform::identity()
        .rotation_degrees(90.0)
        .scale_xy(2.0, 1.0);
    assert_eq!(
        transform.transformed_bounds(super::super::UiRect::new(10.0, 20.0, 30.0, 60.0)),
        super::super::UiRect::new(0.0, 20.0, 40.0, 60.0)
    );
}

#[test]
fn transformed_bounds_include_translation() {
    let transform = LayerTransform::identity().translation(120.5, -30.25);
    assert_eq!(
        transform.transformed_bounds(super::super::UiRect::new(0.0, 0.0, 80.0, 80.0)),
        super::super::UiRect::new(120.5, -30.25, 200.5, 49.75)
    );
}

#[test]
fn physical_projection_scales_only_translation() {
    let transform = LayerTransform::identity()
        .rotation_degrees(45.0)
        .scale(1.25)
        .translation(100.0, -20.0)
        .project_to_physical(super::super::UiScale::new(1.5));
    assert_eq!(transform.rotation_degrees_f32(), 45.0);
    assert_eq!((transform.scale_x(), transform.scale_y()), (1.25, 1.25));
    assert_eq!(
        (transform.translation_x(), transform.translation_y()),
        (150.0, -30.0)
    );
}