cranpose-liquid 0.10.0

Glass controls, themes and motion for Cranpose apps
Documentation
use super::*;

#[test]
fn pointer_position_is_the_clamped_lens_center() {
    let width = 100.0;
    assert_eq!(segment_lens_left(50.0, width, 3), 0.0);
    assert_eq!(segment_lens_left(150.0, width, 3), 100.0);
    assert_eq!(segment_lens_left(250.0, width, 3), 200.0);
    assert_eq!(segment_lens_left(-50.0, width, 3), 0.0);
    assert_eq!(segment_lens_left(400.0, width, 3), 200.0);
}

#[test]
fn segmented_contact_matches_native_presentation_bounds() {
    for (progress, width, height) in [(0.0, 96.0, 28.0), (0.5, 108.0, 36.0), (1.0, 120.0, 44.0)] {
        let size = segmented_lens_base_size(100.0, 32.0, progress);
        assert_eq!(size.width, width);
        assert_eq!(size.height, height);
    }
}

#[test]
fn a_scope_records_what_each_segment_announces() {
    let drawn = Rc::new(std::cell::Cell::new(0u32));
    let counted = Rc::clone(&drawn);
    let segments = collect_segments(|scope| {
        scope.segment("Sending");
        scope.segment_content("Received", move |selected| {
            counted.set(counted.get() + u32::from(selected));
        });
    });

    assert_eq!(segments.len(), 2);
    assert_eq!(segments[0].description(), "Sending");
    assert_eq!(segments[1].description(), "Received");
    assert_eq!(drawn.get(), 0);
    let LiquidSegment::Content { content, .. } = &segments[1] else {
        panic!("segment_content declares caller content");
    };
    content(true);
    assert_eq!(drawn.get(), 1);
}

#[test]
fn a_control_with_no_segments_declares_none() {
    assert!(collect_segments(|_| {}).is_empty());
}