cranpose-ui-layout 0.9.5

Layout contracts & policies for Cranpose
Documentation
use super::{Arrangement, LinearArrangement};

fn arranged(arrangement: LinearArrangement, density: f32, total: f32, sizes: &[f32]) -> Vec<f32> {
    let mut positions = vec![0.0; sizes.len()];
    arrangement.arrange(density, total, sizes, &mut positions);
    positions
}

#[test]
fn space_evenly_rounds_each_position_to_a_device_pixel() {
    let sizes = [10.0, 10.0, 10.0];
    assert_eq!(
        arranged(LinearArrangement::SpaceEvenly, 1.0, 100.0, &sizes),
        [18.0, 45.0, 73.0]
    );
    assert_eq!(
        arranged(LinearArrangement::SpaceEvenly, 2.0, 100.0, &sizes),
        [17.5, 45.0, 72.5]
    );
}

#[test]
fn center_sends_a_half_pixel_up_as_kotlin_does() {
    assert_eq!(
        arranged(LinearArrangement::Center, 1.0, 101.0, &[10.0]),
        [46.0]
    );
    assert_eq!(
        arranged(LinearArrangement::Center, 1.0, 9.0, &[10.0]),
        [0.0]
    );
}

#[test]
fn space_between_puts_a_lone_child_at_the_start() {
    assert_eq!(
        arranged(LinearArrangement::SpaceBetween, 1.0, 100.0, &[10.0]),
        [0.0]
    );
    assert_eq!(
        arranged(LinearArrangement::SpaceBetween, 1.0, 100.0, &[10.0, 10.0]),
        [0.0, 90.0]
    );
}

#[test]
fn space_around_and_end_follow_the_remaining_space() {
    assert_eq!(
        arranged(LinearArrangement::SpaceAround, 1.0, 100.0, &[10.0, 10.0]),
        [20.0, 70.0]
    );
    assert_eq!(
        arranged(LinearArrangement::End, 1.0, 100.0, &[10.0, 10.0]),
        [80.0, 90.0]
    );
    assert_eq!(
        arranged(LinearArrangement::Start, 1.0, 100.0, &[10.0, 10.0]),
        [0.0, 10.0]
    );
}

#[test]
fn spaced_by_puts_a_device_pixel_spacing_between_children() {
    assert_eq!(
        arranged(LinearArrangement::spaced_by(5.0), 1.0, 40.0, &[10.0, 10.0]),
        [0.0, 15.0]
    );
    assert_eq!(
        arranged(
            LinearArrangement::spaced_by(12.4),
            1.0,
            100.0,
            &[10.0, 10.0]
        ),
        [0.0, 22.0]
    );
    assert_eq!(LinearArrangement::spaced_by(12.4).spacing(1.0), 12.0);
    assert_eq!(LinearArrangement::spaced_by(-3.0).spacing(1.0), 0.0);
    assert_eq!(LinearArrangement::Center.spacing(1.0), 0.0);
}

#[test]
fn spaced_by_keeps_every_child_inside_the_container() {
    assert_eq!(
        arranged(
            LinearArrangement::spaced_by(12.0),
            1.0,
            100.0,
            &[95.0, 10.0]
        ),
        [0.0, 90.0]
    );
    assert_eq!(
        arranged(LinearArrangement::spaced_by(12.0), 1.0, 100.0, &[95.0, 0.0]),
        [0.0, 100.0]
    );
}

#[test]
fn spaced_by_aligned_places_the_spaced_block_by_its_alignment() {
    let arrange = |arrangement: LinearArrangement, total: f32| {
        let mut positions = [0.0; 3];
        arrangement.arrange(1.0, total, &[10.0, 20.0, 5.0], &mut positions);
        positions
    };
    // 10 + 4 + 20 + 4 + 5 = 43 of 100: 57 left over.
    let end = LinearArrangement::spaced_by_aligned(4.0, crate::HorizontalAlignment::End);
    assert_eq!(arrange(end, 100.0), [57.0, 71.0, 95.0]);
    let center =
        LinearArrangement::spaced_by_aligned(4.0, crate::VerticalAlignment::CenterVertically);
    assert_eq!(
        arrange(center, 100.0),
        [29.0, 43.0, 67.0],
        "57 / 2 rounds half up"
    );
    let start = LinearArrangement::spaced_by_aligned(4.0, crate::HorizontalAlignment::Start);
    assert_eq!(
        arrange(start, 100.0),
        arrange(LinearArrangement::spaced_by(4.0), 100.0)
    );
    // A block that overflows is placed as plain spacing places it.
    assert_eq!(
        arrange(end, 30.0),
        arrange(LinearArrangement::spaced_by(4.0), 30.0)
    );
    assert!(end.is_spaced());
    assert_eq!(end.spacing(2.0), 4.0);
}